Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rework data nodes #356

Merged
merged 15 commits into from
May 29, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/Core/ARCtrl.Core.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
<Compile Include="Table\ArcTableAux.fs" />
<Compile Include="Table\ArcTable.fs" />
<Compile Include="Table\ArcTables.fs" />
<Compile Include="Table\DataMap.fs" />
<Compile Include="ArcTypes.fs" />
<Compile Include="Template.fs" />
<Compile Include="Templates.fs" />
Expand All @@ -60,6 +61,9 @@
<Content Include="*.fsproj; **\*.fs; **\*.fsi" PackagePath="fable\" />
<None Include="../../build/logo.png" Pack="true" PackagePath="\" />
</ItemGroup>
<ItemGroup>
<PackageReference Update="FSharp.Core" Version="7.0.401" />
</ItemGroup>
<PropertyGroup>
<Authors>nfdi4plants, Lukas Weil, Kevin Frey, Kevin Schneider, Oliver Maus</Authors>
<Description>ARC and ISA compliant experimental metadata toolkit in F#. This project is meant as an easy means to open, manipulate and save ISA (Investigation,Study,Assay) metadata files in the dotnet environment.</Description>
Expand Down
22 changes: 10 additions & 12 deletions src/Core/Conversion.fs
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Uploading image.png…

Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,7 @@
| CompositeHeader.Input IOType.Source -> ProcessInput.createSource(value.ToString())
| CompositeHeader.Input IOType.Sample -> ProcessInput.createSample(value.ToString())
| CompositeHeader.Input IOType.Material -> ProcessInput.createMaterial(value.ToString())
| CompositeHeader.Input IOType.ImageFile -> ProcessInput.createImageFile(value.ToString())
| CompositeHeader.Input IOType.RawDataFile -> ProcessInput.createRawData(value.ToString())
| CompositeHeader.Input IOType.DerivedDataFile -> ProcessInput.createDerivedData(value.ToString())
| CompositeHeader.Input IOType.Data -> ProcessInput.createRawData(value.ToString())
| _ ->
failwithf "Could not parse input header %O" header

Expand All @@ -117,9 +115,9 @@
match header with
| CompositeHeader.Output IOType.Sample -> ProcessOutput.createSample(value.ToString())
| CompositeHeader.Output IOType.Material -> ProcessOutput.createMaterial(value.ToString())
| CompositeHeader.Output IOType.ImageFile -> ProcessOutput.createImageFile(value.ToString())
| CompositeHeader.Output IOType.RawDataFile -> ProcessOutput.createRawData(value.ToString())
| CompositeHeader.Output IOType.DerivedDataFile -> ProcessOutput.createDerivedData(value.ToString())
| CompositeHeader.Output IOType.Data -> ProcessOutput.createImageFile(value.ToString())
| CompositeHeader.Output IOType.Data -> ProcessOutput.createRawData(value.ToString())

Check warning on line 119 in src/Core/Conversion.fs

View workflow job for this annotation

GitHub Actions / test (ubuntu-latest)

This rule will never be matched

Check warning on line 119 in src/Core/Conversion.fs

View workflow job for this annotation

GitHub Actions / test (ubuntu-latest)

This rule will never be matched

Check warning on line 119 in src/Core/Conversion.fs

View workflow job for this annotation

GitHub Actions / test (windows-latest)

This rule will never be matched

Check warning on line 119 in src/Core/Conversion.fs

View workflow job for this annotation

GitHub Actions / test (windows-latest)

This rule will never be matched
| CompositeHeader.Output IOType.Data -> ProcessOutput.createDerivedData(value.ToString())

Check warning on line 120 in src/Core/Conversion.fs

View workflow job for this annotation

GitHub Actions / test (ubuntu-latest)

This rule will never be matched

Check warning on line 120 in src/Core/Conversion.fs

View workflow job for this annotation

GitHub Actions / test (ubuntu-latest)

This rule will never be matched

Check warning on line 120 in src/Core/Conversion.fs

View workflow job for this annotation

GitHub Actions / test (windows-latest)

This rule will never be matched

Check warning on line 120 in src/Core/Conversion.fs

View workflow job for this annotation

GitHub Actions / test (windows-latest)

This rule will never be matched
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

image

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will do!

| _ ->
failwithf "Could not parse output header %O" header

Expand Down Expand Up @@ -167,9 +165,9 @@
| ProcessInput.Data d ->
let dataType = d.DataType.Value
match dataType with
| DataFile.ImageFile -> CompositeHeader.Input IOType.ImageFile, CompositeCell.FreeText (d.Name |> Option.defaultValue "")
| DataFile.RawDataFile -> CompositeHeader.Input IOType.RawDataFile, CompositeCell.FreeText (d.Name |> Option.defaultValue "")
| DataFile.DerivedDataFile -> CompositeHeader.Input IOType.DerivedDataFile, CompositeCell.FreeText (d.Name |> Option.defaultValue "")
| DataFile.ImageFile -> CompositeHeader.Input IOType.Data, CompositeCell.FreeText (d.Name |> Option.defaultValue "")
| DataFile.RawDataFile -> CompositeHeader.Input IOType.Data, CompositeCell.FreeText (d.Name |> Option.defaultValue "")
| DataFile.DerivedDataFile -> CompositeHeader.Input IOType.Data, CompositeCell.FreeText (d.Name |> Option.defaultValue "")

/// Convert an ISA ProcessOutput to a CompositeHeader and Cell tuple
let decomposeProcessOutput (po : ProcessOutput) : CompositeHeader*CompositeCell =
Expand All @@ -179,9 +177,9 @@
| ProcessOutput.Data d ->
let dataType = d.DataType.Value
match dataType with
| DataFile.ImageFile -> CompositeHeader.Output IOType.ImageFile, CompositeCell.FreeText (d.Name |> Option.defaultValue "")
| DataFile.RawDataFile -> CompositeHeader.Output IOType.RawDataFile, CompositeCell.FreeText (d.Name |> Option.defaultValue "")
| DataFile.DerivedDataFile -> CompositeHeader.Output IOType.DerivedDataFile, CompositeCell.FreeText (d.Name |> Option.defaultValue "")
| DataFile.ImageFile -> CompositeHeader.Output IOType.Data, CompositeCell.FreeText (d.Name |> Option.defaultValue "")
| DataFile.RawDataFile -> CompositeHeader.Output IOType.Data, CompositeCell.FreeText (d.Name |> Option.defaultValue "")
| DataFile.DerivedDataFile -> CompositeHeader.Output IOType.Data, CompositeCell.FreeText (d.Name |> Option.defaultValue "")


/// This function creates a string containing the name and the ontology short-string of the given ontology annotation term
Expand Down
57 changes: 17 additions & 40 deletions src/Core/Table/CompositeHeader.fs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,7 @@ open ARCtrl.Helper
type IOType =
| Source
| Sample
| RawDataFile
| DerivedDataFile
| ImageFile
| Data
| Material
| FreeText of string

Expand All @@ -21,9 +19,7 @@ type IOType =
static member All = [|
Source
Sample
RawDataFile
DerivedDataFile
ImageFile
Data
Material
|]

Expand Down Expand Up @@ -52,21 +48,8 @@ type IOType =
| FreeText s1, FreeText s2 when s1 = s2 -> FreeText (s1)
| FreeText s1, FreeText s2 -> failwith $"FreeText IO column names {s1} and {s2} do differ"
| FreeText s, _ -> failwith $"FreeText IO column and {other} can not be merged"
| ImageFile, Source -> ImageFile
| ImageFile, RawDataFile -> ImageFile
| ImageFile, DerivedDataFile -> ImageFile
| ImageFile, ImageFile -> ImageFile
| ImageFile, _ -> failwith $"ImageFile IO column and {other} can not be merged"
| DerivedDataFile, Source -> DerivedDataFile
| DerivedDataFile, RawDataFile -> DerivedDataFile
| DerivedDataFile, DerivedDataFile -> DerivedDataFile
| DerivedDataFile, ImageFile -> ImageFile
| DerivedDataFile, _ -> failwith $"DerivedDataFile IO column and {other} can not be merged"
| RawDataFile, Source -> RawDataFile
| RawDataFile, RawDataFile -> RawDataFile
| RawDataFile, DerivedDataFile -> DerivedDataFile
| RawDataFile, ImageFile -> ImageFile
| RawDataFile, _ -> failwith $"RawDataFile IO column and {other} can not be merged"
| Data, Source -> Data
| Data, _ -> failwith $"Data IO column and {other} can not be merged"
| Sample, Source -> Sample
| Sample, Sample -> Sample
| Sample, _ -> failwith $"Sample IO column and {other} can not be merged"
Expand All @@ -79,13 +62,11 @@ type IOType =

override this.ToString() =
match this with
| Source -> "Source Name"
| Sample -> "Sample Name"
| RawDataFile -> "Raw Data File"
| DerivedDataFile -> "Derived Data File"
| ImageFile -> "Image File"
| Material -> "Material"
| FreeText s -> s
| Source -> "Source Name"
| Sample -> "Sample Name"
| Data -> "Data"
| Material -> "Material"
| FreeText s -> s

/// Used to match only(!) IOType string to IOType (without Input/Output). This matching is case sensitive.
///
Expand All @@ -96,9 +77,10 @@ type IOType =
match str with
| "Source" | "Source Name" -> Source
| "Sample" | "Sample Name" -> Sample
| "RawDataFile" | "Raw Data File" -> RawDataFile
| "DerivedDataFile" | "Derived Data File" -> DerivedDataFile
| "ImageFile" | "Image File" -> ImageFile
| "RawDataFile" | "Raw Data File"
| "DerivedDataFile" | "Derived Data File"
| "ImageFile" | "Image File"
| "Data" -> Data
| "Material" -> Material
| _ -> FreeText str // use str to not store `str.ToLower()`

Expand All @@ -118,29 +100,24 @@ type IOType =
"The source value must be a unique identifier for an organism or a sample."
| U2.Case1 Sample | U2.Case2 "Sample" ->
"The Sample Name column describes specifc laboratory samples with a unique identifier."
| U2.Case1 RawDataFile | U2.Case2 "RawDataFile" ->
| U2.Case1 Data | U2.Case2 "RawDataFile" ->
"The Raw Data File column defines untransformed and unprocessed data files."
| U2.Case1 DerivedDataFile | U2.Case2 "DerivedDataFile" ->
| U2.Case1 Data | U2.Case2 "DerivedDataFile" ->
"The Derived Data File column defines transformed and/or processed data files."
| U2.Case1 ImageFile | U2.Case2 "ImageFile" ->
| U2.Case1 Data | U2.Case2 "ImageFile" ->
"Placeholder"
| U2.Case1 Material | U2.Case2 "Material" ->
"Placeholder"
| U2.Case1 (FreeText _) | U2.Case2 "FreeText" ->
"Placeholder"
| _ -> failwith $"Unable to parse combination to existing IOType: `{iotype}`"

#if FABLE_COMPILER

static member source() = IOType.Source

static member sample() = IOType.Sample

static member rawDataFile() = IOType.RawDataFile

static member derivedDataFile() = IOType.DerivedDataFile

static member imageFile() = IOType.ImageFile
static member data() = IOType.Data

static member material() = IOType.Material

Expand Down
25 changes: 25 additions & 0 deletions src/Core/Table/DataMap.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
namespace ARCtrl

open System.Collections.Generic
open ARCtrl.Helper
open ARCtrl

module DataMapAux =

[<Literal>]
let dataMapName = "DataMap"

let explicationHeader = CompositeHeader.Parameter

let allowedHeaders = 1

let validate (headers : ResizeArray<CompositeHeader>) (values : System.Collections.Generic.Dictionary<int*int,CompositeCell>) =

1

type DataMap(headers: ResizeArray<CompositeHeader>, values: System.Collections.Generic.Dictionary<int*int,CompositeCell>) =

let _ = DataMapAux.validate headers values

let table = ArcTable(DataMapAux.dataMapName, headers, values)

6 changes: 3 additions & 3 deletions tests/ARCtrl/ARCtrl.Tests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -427,17 +427,17 @@ let private ``payload_file_filters`` =

let assay = ArcAssay("registered_assay")
let assayTable = assay.InitTable("MyAssayTable")
assayTable.AppendColumn(CompositeHeader.Input (IOType.RawDataFile), [|CompositeCell.createFreeText "registered_assay_input.txt"|])
assayTable.AppendColumn(CompositeHeader.Input (IOType.Data), [|CompositeCell.createFreeText "registered_assay_input.txt"|])
assayTable.AppendColumn(CompositeHeader.ProtocolREF, [|CompositeCell.createFreeText "assay_protocol.rtf"|])
assayTable.AppendColumn(CompositeHeader.Output (IOType.DerivedDataFile), [|CompositeCell.createFreeText "registered_assay_output.txt"|])
assayTable.AppendColumn(CompositeHeader.Output (IOType.Data), [|CompositeCell.createFreeText "registered_assay_output.txt"|])

let study = ArcStudy("registered_study")
inv.AddRegisteredStudy(study)
let studyTable = study.InitTable("MyStudyTable")
studyTable.AppendColumn(CompositeHeader.Input (IOType.Sample), [|CompositeCell.createFreeText "some_study_input_material"|])
studyTable.AppendColumn(CompositeHeader.FreeText "Some File", [|CompositeCell.createFreeText "xd/some_file_that_lies_in_slashxd.txt"|])
studyTable.AppendColumn(CompositeHeader.ProtocolREF, [|CompositeCell.createFreeText "study_protocol.pdf"|])
studyTable.AppendColumn(CompositeHeader.Output (IOType.RawDataFile), [|CompositeCell.createFreeText "registered_study_output.txt"|])
studyTable.AppendColumn(CompositeHeader.Output (IOType.Data), [|CompositeCell.createFreeText "registered_study_output.txt"|])
study.AddRegisteredAssay(assay)


Expand Down
2 changes: 1 addition & 1 deletion tests/ARCtrl/ARCtrl.Tests.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,6 @@
<ProjectReference Include="..\TestingUtils\TestingUtils.fsproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Update="FSharp.Core" Version="7.0.401" />
<PackageReference Update="FSharp.Core" Version="8.0.200" />
</ItemGroup>
</Project>
4 changes: 2 additions & 2 deletions tests/Core/ArcInvestigation.Tests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -627,7 +627,7 @@ let tests_UpdateIOTypeByEntityIDTypes = testList "UpdateIOTypeByEntityIDType" [
CompositeColumn.create (CompositeHeader.Output IOType.Sample, Array.init 3 (fun i -> CompositeCell.createFreeText (sprintf "Sample %i" i)))
|]
t2.AddColumns [|
CompositeColumn.create (CompositeHeader.Input IOType.DerivedDataFile, Array.init 3 (fun i -> CompositeCell.createFreeText (sprintf "Sample %i" i)))
CompositeColumn.create (CompositeHeader.Input IOType.Data, Array.init 3 (fun i -> CompositeCell.createFreeText (sprintf "Sample %i" i)))
CompositeColumn.create (CompositeHeader.Output IOType.Sample, Array.init 3 (fun i -> CompositeCell.createFreeText (sprintf "Sample_Alt %i" i)))
|]
Expect.throws (fun () -> i.UpdateIOTypeByEntityID()) "Update should fail as sample and data can not be updated against each other."
Expand Down Expand Up @@ -680,7 +680,7 @@ let tests_UpdateIOTypeByEntityIDTypes = testList "UpdateIOTypeByEntityIDType" [
CompositeColumn.create (CompositeHeader.Output IOType.Sample, Array.init 3 (fun i -> CompositeCell.createFreeText (sprintf "Sample %i" i)))
|]
t2.AddColumns [|
CompositeColumn.create (CompositeHeader.Input IOType.DerivedDataFile, Array.init 3 (fun i -> CompositeCell.createFreeText (sprintf "Sample %i" i)))
CompositeColumn.create (CompositeHeader.Input IOType.Data, Array.init 3 (fun i -> CompositeCell.createFreeText (sprintf "Sample %i" i)))
CompositeColumn.create (CompositeHeader.Output IOType.Sample, Array.init 3 (fun i -> CompositeCell.createFreeText (sprintf "Sample_Alt %i" i)))
|]
Expect.throws (fun () -> i.UpdateIOTypeByEntityID()) "Update should fail as sample and data can not be updated against each other."
Expand Down
8 changes: 4 additions & 4 deletions tests/Core/ArcJsonConversion.Tests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,9 @@ module Helper =
let singleRowDataInputWithCharacteristic =
let columns =
[|
CompositeColumn.create(CompositeHeader.Input IOType.RawDataFile, createCells_FreeText "RData" 1)
CompositeColumn.create(CompositeHeader.Input IOType.Data, createCells_FreeText "RData" 1)
CompositeColumn.create(CompositeHeader.Characteristic oa_species, createCells_chlamy 1)
CompositeColumn.create(CompositeHeader.Output IOType.DerivedDataFile, createCells_FreeText "DData" 1)
CompositeColumn.create(CompositeHeader.Output IOType.Data, createCells_FreeText "DData" 1)
|]
let t = ArcTable.init(tableName1)
t.AddColumns(columns)
Expand All @@ -71,9 +71,9 @@ module Helper =
let singleRowDataOutputWithFactor =
let columns =
[|
CompositeColumn.create(CompositeHeader.Input IOType.RawDataFile, createCells_FreeText "RData" 1)
CompositeColumn.create(CompositeHeader.Input IOType.Data, createCells_FreeText "RData" 1)
CompositeColumn.create(CompositeHeader.Factor oa_temperature, createCells_DegreeCelsius 1)
CompositeColumn.create(CompositeHeader.Output IOType.DerivedDataFile, createCells_FreeText "DData" 1)
CompositeColumn.create(CompositeHeader.Output IOType.Data, createCells_FreeText "DData" 1)
|]
let t = ArcTable.init(tableName1)
t.AddColumns(columns)
Expand Down
Loading
Loading