Skip to content

Commit 9b4884c

Browse files
committed
small adjustemt to assay file sample column handling
1 parent e6d53bf commit 9b4884c

3 files changed

Lines changed: 107 additions & 13 deletions

File tree

src/ISADotNet.XLSX/AssayFile/AnnotationTable.fs

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@ module AnnotationTable =
1212
let isSource header = AnnotationColumn.tryParseSourceName header |> Option.isSome
1313

1414
match Seq.filter isSource headers |> Seq.length, Seq.filter isSample headers |> Seq.length with
15-
| 1,1 | 0,1 -> headers |> Seq.singleton
15+
| 1,1 ->
16+
Seq.filter isSample headers
17+
|> Seq.append (Seq.filter (fun s -> (isSample s || isSource s) |> not) headers)
18+
|> Seq.append (Seq.filter isSource headers)
19+
|> Seq.singleton
20+
| 0,1 -> Seq.append (Seq.filter (isSample>>not) headers) (Seq.filter isSample headers) |> Seq.singleton
1621
| 0,2 when Seq.head headers |> isSample && Seq.last headers |> isSample -> headers |> Seq.singleton
1722
| _ -> Seq.groupWhen true (fun header -> isSample header || isSource header) headers
1823

@@ -105,19 +110,24 @@ module AnnotationTable =
105110
(factorValueGetters |> List.map (fun f -> f matrix i) |> API.Option.fromValueWithDefault [])
106111
(inputGetter matrix i |> List.singleton |> Some)
107112
|> Sample
108-
(fun matrix i -> inputGetter matrix i |> Source),outputGetter
113+
(fun matrix i -> inputGetter matrix i |> Source |> Some),outputGetter
109114
| None ->
110115
let inputNameGetter = nodes |> Seq.head |> AnnotationNode.tryGetSampleNameGetter
111116
let outputNameGetter = nodes |> Seq.last |> AnnotationNode.tryGetSampleNameGetter
112117
let inputGetter =
113-
fun matrix i ->
114-
Sample.create
115-
None
116-
(inputNameGetter |> Option.bind (fun o -> o matrix i))
117-
(characteristicValueGetters |> List.map (fun f -> f matrix i) |> API.Option.fromValueWithDefault [])
118-
None
119-
None
120-
|> ProcessInput.Sample
118+
119+
fun matrix i ->
120+
inputNameGetter
121+
|> Option.map (fun ing ->
122+
Sample.create
123+
None
124+
(ing matrix i)
125+
(characteristicValueGetters |> List.map (fun f -> f matrix i) |> API.Option.fromValueWithDefault [])
126+
None
127+
None
128+
|> ProcessInput.Sample
129+
)
130+
121131
let outputGetter =
122132
fun matrix i ->
123133
Sample.create
@@ -144,7 +154,7 @@ module AnnotationTable =
144154
None
145155
None
146156
None
147-
(inputGetter matrix i |> List.singleton |> Some)
157+
(inputGetter matrix i |> Option.map List.singleton)
148158
(outputGetter matrix i |> List.singleton |> Some)
149159
None
150160

tests/ISADotNet.Tests/ISADotNet.XLSX/AssayFileTests.fs

Lines changed: 86 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ let testHeaderSplittingFunctions =
7676
let resultHeaders = AnnotationTable.splitBySamples headers
7777

7878
Expect.hasLength resultHeaders 1 "Shouldn't have split headers, as only one sample column was set"
79-
Expect.sequenceEqual headers (resultHeaders |> Seq.head) "Shouldn't have split headers, as only one sample column was set"
79+
Expect.sequenceEqual (resultHeaders |> Seq.head) ["Paramer [MyDude]";"Characteristic [MyGuy]";"Sample Name"] "Should have moved sample to the end"
8080
)
8181
testCase "SplitBySamplesOnlySourceAndSample" (fun () ->
8282

@@ -85,7 +85,7 @@ let testHeaderSplittingFunctions =
8585
let resultHeaders = AnnotationTable.splitBySamples headers
8686

8787
Expect.hasLength resultHeaders 1 "Shouldn't have split headers, as only one source column and sample column was set"
88-
Expect.sequenceEqual headers (resultHeaders |> Seq.head) "Shouldn't have split headers, as only one source column and sample column was set"
88+
Expect.sequenceEqual (resultHeaders |> Seq.head) ["Source Name";"Paramer [MyDude]";"Characteristic [MyGuy]";"Sample Name"] "Should have put source at front and sample at end"
8989
)
9090
testCase "SplitBySamplesManySamples" (fun () ->
9191

@@ -352,6 +352,90 @@ let testNodeGetterFunctions =
352352
)
353353
]
354354

355+
[<Tests>]
356+
let testProcessGetter =
357+
358+
let sourceDirectory = __SOURCE_DIRECTORY__ + @"/TestFiles/"
359+
360+
let assayFilePath = System.IO.Path.Combine(sourceDirectory,"AssayTableTestFile.xlsx")
361+
362+
let doc = Spreadsheet.fromFile assayFilePath false
363+
let sst = Spreadsheet.tryGetSharedStringTable doc
364+
let wsp = Spreadsheet.tryGetWorksheetPartBySheetIndex 0u doc |> Option.get
365+
let table = Table.tryGetByNameBy (fun s -> s.Contains "annotationTable") wsp |> Option.get
366+
367+
let m = Table.toSparseValueMatrix sst (Worksheet.getSheetData wsp.Worksheet) table
368+
369+
let characteristicHeaders = ["Characteristics [leaf size]";"Term Source REF [leaf size] (#h; #tTO:0002637)";"Term Accession Number [leaf size] (#h; #tTO:0002637)";"Unit [square centimeter] (#h; #tUO:0000081; #u)";"Term Source REF [square centimeter] (#h; #tUO:0000081; #u)";"Term Accession Number [square centimeter] (#h; #tUO:0000081; #u)"]
370+
let expectedCharacteristic = MaterialAttribute.fromString "leaf size" "0002637" "TO"
371+
let expectedCharacteristicUnit = OntologyAnnotation.fromString "square centimeter" "http://purl.obolibrary.org/obo/UO_0000081" "UO" |> Some
372+
let expectedCharacteristicValue = MaterialAttributeValue.create None (Some expectedCharacteristic) (Value.fromOptions (Some "10") None None) expectedCharacteristicUnit
373+
374+
let factorHeaders = ["Factor [time]";"Term Source REF [time] (#h; #tPATO:0000165)";"Term Accession Number [time] (#h; #tPATO:0000165)";"Unit [hour] (#h; #tUO:0000032; #u)";"Term Source REF [hour] (#h; #tUO:0000032; #u)";"Term Accession Number [hour] (#h; #tUO:0000032; #u)"]
375+
let expectedFactor = Factor.fromString "time" "time" "0000165" "PATO"
376+
let expectedFactorUnit = OntologyAnnotation.fromString "hour" "http://purl.obolibrary.org/obo/UO_0000032" "UO" |> Some
377+
let expectedFactorValue = FactorValue.create None (Some expectedFactor) (Value.fromOptions (Some "5") None None) expectedFactorUnit
378+
379+
let parameterHeaders = ["Parameter [temperature unit]";"Term Source REF [temperature unit] (#h; #tUO:0000005)";"Term Accession Number [temperature unit] (#h; #tUO:0000005)";"Unit [degree Celsius] (#h; #tUO:0000027; #u)";"Term Source REF [degree Celsius] (#h; #tUO:0000027; #u)";"Term Accession Number [degree Celsius] (#h; #tUO:0000027; #u)"]
380+
let expectedParameter = ProtocolParameter.fromString "temperature unit" "0000005" "UO"
381+
let expectedParameterUnit = OntologyAnnotation.fromString "degree Celsius" "http://purl.obolibrary.org/obo/UO_0000027" "UO" |> Some
382+
let expectedParameterValue = ProcessParameterValue.create (Some expectedParameter) (Value.fromOptions (Some "27") None None) expectedParameterUnit
383+
384+
let sourceHeader = ["Source Name"]
385+
let expectedSourceName = "Source1"
386+
387+
let sampleHeader = ["Sample Name"]
388+
let expectedSampleName = "Sample1"
389+
390+
testList "ProcessGetterTests" [
391+
testCase "ProcessGetterSourceParamsSample" (fun () ->
392+
393+
let headers = sourceHeader @ characteristicHeaders @ factorHeaders @ parameterHeaders @ sampleHeader
394+
395+
let expectedSource = Source.create None (Some expectedSourceName) (Some [expectedCharacteristicValue])
396+
let expectedInput = ProcessInput.Source expectedSource
397+
let expectedOutput = ProcessOutput.Sample (Sample.create None (Some expectedSampleName) (Some [expectedCharacteristicValue]) (Some [expectedFactorValue]) (Some [expectedSource]) )
398+
399+
let expectedProtocol = Protocol.create None None None None None None (Some [expectedParameter]) None None
400+
401+
let expectedProcess = Process.create None None (Some expectedProtocol) (Some [expectedParameterValue]) None None None None (Some [expectedInput]) (Some [expectedOutput]) None
402+
403+
let characteristics,factors,protocol,processGetter = AnnotationTable.getProcessGetter Protocol.empty (headers |> AnnotationNode.splitIntoNodes)
404+
405+
Expect.sequenceEqual characteristics [expectedCharacteristic] "Characteristics were parsed incorrectly"
406+
Expect.sequenceEqual factors [expectedFactor] "Factors were parsed incorrectly"
407+
Expect.equal protocol expectedProtocol "Protocol was parsed incorrectly"
408+
409+
let processV = processGetter m 0
410+
411+
Expect.equal processV expectedProcess "Process was retrieved incorrectly"
412+
413+
)
414+
testCase "ProcessGetterSampleParams" (fun () ->
415+
416+
let headers =
417+
sampleHeader @ characteristicHeaders @ factorHeaders @ parameterHeaders
418+
|> AnnotationTable.splitBySamples
419+
|> Seq.head
420+
421+
let expectedOutput = ProcessOutput.Sample (Sample.create None (Some expectedSampleName) (Some [expectedCharacteristicValue]) (Some [expectedFactorValue]) None )
422+
423+
let expectedProtocol = Protocol.create None None None None None None (Some [expectedParameter]) None None
424+
425+
let expectedProcess = Process.create None None (Some expectedProtocol) (Some [expectedParameterValue]) None None None None None (Some [expectedOutput]) None
426+
427+
let characteristics,factors,protocol,processGetter = AnnotationTable.getProcessGetter Protocol.empty (headers |> AnnotationNode.splitIntoNodes)
428+
429+
Expect.sequenceEqual characteristics [expectedCharacteristic] "Characteristics were parsed incorrectly"
430+
Expect.sequenceEqual factors [expectedFactor] "Factors were parsed incorrectly"
431+
Expect.equal protocol expectedProtocol "Protocol was parsed incorrectly"
432+
433+
let processV = processGetter m 0
434+
435+
Expect.equal processV expectedProcess "Process was retrieved incorrectly"
436+
437+
)
438+
]
355439

356440
[<Tests>]
357441
let testProcessComparisonFunctions =
Binary file not shown.

0 commit comments

Comments
 (0)