Skip to content

Commit 544ffdc

Browse files
committed
add some additional information to failing spreadsheet parsers
#306
1 parent 4d6de35 commit 544ffdc

File tree

3 files changed

+112
-96
lines changed

3 files changed

+112
-96
lines changed

src/ISA/ISA.Spreadsheet/AnnotationTable/ArcTable.fs

+15-11
Original file line numberDiff line numberDiff line change
@@ -85,17 +85,21 @@ let composeColumns (columns : seq<FsColumn>) : CompositeColumn [] =
8585

8686
/// Returns the protocol described by the headers and a function for parsing the values of the matrix to the processes of this protocol
8787
let tryFromFsWorksheet (sheet : FsWorksheet) =
88-
match tryAnnotationTable sheet with
89-
| Some (t: FsTable) ->
90-
let compositeColumns =
91-
t.GetColumns(sheet.CellCollection)
92-
|> Seq.map CompositeColumn.fixDeprecatedIOHeader
93-
|> composeColumns
94-
ArcTable.init sheet.Name
95-
|> ArcTable.addColumns(compositeColumns,SkipFillMissing = true)
96-
|> Some
97-
| None ->
98-
None
88+
try
89+
match tryAnnotationTable sheet with
90+
| Some (t: FsTable) ->
91+
let compositeColumns =
92+
t.GetColumns(sheet.CellCollection)
93+
|> Seq.map CompositeColumn.fixDeprecatedIOHeader
94+
|> composeColumns
95+
ArcTable.init sheet.Name
96+
|> ArcTable.addColumns(compositeColumns,SkipFillMissing = true)
97+
|> Some
98+
| None ->
99+
None
100+
with
101+
| err -> failwithf "Could not parse table with name \"%s\":\n%s" sheet.Name err.Message
102+
99103

100104
let toFsWorksheet (table : ArcTable) =
101105
/// This dictionary is used to add spaces at the end of duplicate headers.

src/ISA/ISA.Spreadsheet/ArcAssay.fs

+56-50
Original file line numberDiff line numberDiff line change
@@ -29,69 +29,75 @@ let toMetadataSheet (assay : ArcAssay) : FsWorksheet =
2929
sheet
3030

3131
let fromMetadataSheet (sheet : FsWorksheet) : ArcAssay =
32-
let fromRows (usePrefixes : bool) (rows: seq<SparseRow>) =
33-
let aPrefix,cPrefix =
34-
if usePrefixes then
35-
Some assaysPrefix,Some contactsPrefix
36-
else None,None
37-
let en = rows.GetEnumerator()
38-
let rec loop lastLine assays contacts lineNumber =
32+
try
33+
let fromRows (usePrefixes : bool) (rows: seq<SparseRow>) =
34+
let aPrefix,cPrefix =
35+
if usePrefixes then
36+
Some assaysPrefix,Some contactsPrefix
37+
else None,None
38+
let en = rows.GetEnumerator()
39+
let rec loop lastLine assays contacts lineNumber =
3940

40-
match lastLine with
41+
match lastLine with
4142

42-
| Some k when k = assaysLabel || k = obsoleteAssaysLabel ->
43-
let currentLine,lineNumber,_,assays = Assays.fromRows aPrefix (lineNumber + 1) en
44-
loop currentLine assays contacts lineNumber
43+
| Some k when k = assaysLabel || k = obsoleteAssaysLabel ->
44+
let currentLine,lineNumber,_,assays = Assays.fromRows aPrefix (lineNumber + 1) en
45+
loop currentLine assays contacts lineNumber
4546

46-
| Some k when k = contactsLabel ->
47-
let currentLine,lineNumber,_,contacts = Contacts.fromRows cPrefix (lineNumber + 1) en
48-
loop currentLine assays contacts lineNumber
49-
| k ->
50-
match assays, contacts with
51-
| [], [] -> ArcAssay.create(Identifier.createMissingIdentifier())
52-
| assays, contacts ->
53-
assays
54-
|> Seq.tryHead
55-
|> Option.defaultValue (ArcAssay.create(Identifier.createMissingIdentifier()))
56-
|> ArcAssay.setPerformers (Array.ofList contacts)
47+
| Some k when k = contactsLabel ->
48+
let currentLine,lineNumber,_,contacts = Contacts.fromRows cPrefix (lineNumber + 1) en
49+
loop currentLine assays contacts lineNumber
50+
| k ->
51+
match assays, contacts with
52+
| [], [] -> ArcAssay.create(Identifier.createMissingIdentifier())
53+
| assays, contacts ->
54+
assays
55+
|> Seq.tryHead
56+
|> Option.defaultValue (ArcAssay.create(Identifier.createMissingIdentifier()))
57+
|> ArcAssay.setPerformers (Array.ofList contacts)
5758

58-
if en.MoveNext () then
59-
let currentLine = en.Current |> SparseRow.tryGetValueAt 0
60-
loop currentLine [] [] 1
59+
if en.MoveNext () then
60+
let currentLine = en.Current |> SparseRow.tryGetValueAt 0
61+
loop currentLine [] [] 1
6162

62-
else
63-
failwith "empty assay metadata sheet"
64-
let rows =
65-
sheet.Rows
66-
|> Seq.map SparseRow.fromFsRow
67-
let hasPrefix =
63+
else
64+
failwith "empty assay metadata sheet"
65+
let rows =
66+
sheet.Rows
67+
|> Seq.map SparseRow.fromFsRow
68+
let hasPrefix =
69+
rows
70+
|> Seq.exists (fun row -> row |> Seq.head |> snd |> fun s -> s.StartsWith(assaysPrefix))
6871
rows
69-
|> Seq.exists (fun row -> row |> Seq.head |> snd |> fun s -> s.StartsWith(assaysPrefix))
70-
rows
71-
|> fromRows hasPrefix
72+
|> fromRows hasPrefix
73+
with
74+
| err -> failwithf "Failed while parsing metadatasheet: %s" err.Message
7275

7376
/// Reads an assay from a spreadsheet
7477
let fromFsWorkbook (doc:FsWorkbook) =
75-
// Reading the "Assay" metadata sheet. Here metadata
76-
let assayMetaData =
78+
try
79+
// Reading the "Assay" metadata sheet. Here metadata
80+
let assayMetaData =
7781

78-
match doc.TryGetWorksheetByName metaDataSheetName with
79-
| Option.Some sheet ->
80-
fromMetadataSheet sheet
81-
| None ->
82-
match doc.TryGetWorksheetByName obsoleteMetaDataSheetName with
82+
match doc.TryGetWorksheetByName metaDataSheetName with
8383
| Option.Some sheet ->
8484
fromMetadataSheet sheet
8585
| None ->
86-
printfn "Cannot retrieve metadata: Assay file does not contain \"%s\" or \"%s\" sheet." metaDataSheetName obsoleteMetaDataSheetName
87-
ArcAssay.create(Identifier.createMissingIdentifier())
88-
let annotationTables =
89-
doc.GetWorksheets()
90-
|> Seq.choose ArcTable.tryFromFsWorksheet
91-
if annotationTables |> Seq.isEmpty |> not then
92-
assayMetaData.Tables <- ResizeArray annotationTables
93-
assayMetaData
94-
86+
match doc.TryGetWorksheetByName obsoleteMetaDataSheetName with
87+
| Option.Some sheet ->
88+
fromMetadataSheet sheet
89+
| None ->
90+
printfn "Cannot retrieve metadata: Assay file does not contain \"%s\" or \"%s\" sheet." metaDataSheetName obsoleteMetaDataSheetName
91+
ArcAssay.create(Identifier.createMissingIdentifier())
92+
let annotationTables =
93+
doc.GetWorksheets()
94+
|> Seq.choose ArcTable.tryFromFsWorksheet
95+
if annotationTables |> Seq.isEmpty |> not then
96+
assayMetaData.Tables <- ResizeArray annotationTables
97+
assayMetaData
98+
with
99+
| err -> failwithf "Could not parse assay: \n%s" err.Message
100+
95101
let toFsWorkbook (assay : ArcAssay) =
96102
let doc = new FsWorkbook()
97103
let metaDataSheet = toMetadataSheet (assay)

src/ISA/ISA.Spreadsheet/ArcStudy.fs

+41-35
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,18 @@ module ArcStudy =
2626
sheet
2727

2828
let fromMetadataSheet (sheet : FsWorksheet) : ArcStudy*ArcAssay list =
29-
let fromRows (rows: seq<SparseRow>) =
30-
let en = rows.GetEnumerator()
31-
en.MoveNext() |> ignore
32-
let _,_,_,study = Studies.fromRows 2 en
33-
study
34-
sheet.Rows
35-
|> Seq.map SparseRow.fromFsRow
36-
|> fromRows
37-
|> Option.defaultValue (ArcStudy.create(Identifier.createMissingIdentifier()),[])
29+
try
30+
let fromRows (rows: seq<SparseRow>) =
31+
let en = rows.GetEnumerator()
32+
en.MoveNext() |> ignore
33+
let _,_,_,study = Studies.fromRows 2 en
34+
study
35+
sheet.Rows
36+
|> Seq.map SparseRow.fromFsRow
37+
|> fromRows
38+
|> Option.defaultValue (ArcStudy.create(Identifier.createMissingIdentifier()),[])
39+
with
40+
| err -> failwithf "Failed while parsing metadatasheet: %s" err.Message
3841

3942
[<AutoOpen>]
4043
module Extensions =
@@ -43,36 +46,39 @@ module Extensions =
4346

4447
/// Reads an assay from a spreadsheet
4548
static member fromFsWorkbook (doc:FsWorkbook) =
46-
// Reading the "Assay" metadata sheet. Here metadata
47-
let studyMetadata,assays =
49+
try
50+
// Reading the "Assay" metadata sheet. Here metadata
51+
let studyMetadata,assays =
4852

49-
match doc.TryGetWorksheetByName ArcStudy.metaDataSheetName with
50-
| Option.Some sheet ->
51-
ArcStudy.fromMetadataSheet sheet
52-
| None ->
53-
match doc.TryGetWorksheetByName ArcStudy.obsoleteMetaDataSheetName with
53+
match doc.TryGetWorksheetByName ArcStudy.metaDataSheetName with
5454
| Option.Some sheet ->
5555
ArcStudy.fromMetadataSheet sheet
56-
| None ->
57-
printfn "Cannot retrieve metadata: Study file does not contain \"%s\" or \"%s\" sheet." ArcStudy.metaDataSheetName ArcStudy.obsoleteMetaDataSheetName
58-
ArcStudy.create(Identifier.createMissingIdentifier()),[]
56+
| None ->
57+
match doc.TryGetWorksheetByName ArcStudy.obsoleteMetaDataSheetName with
58+
| Option.Some sheet ->
59+
ArcStudy.fromMetadataSheet sheet
60+
| None ->
61+
printfn "Cannot retrieve metadata: Study file does not contain \"%s\" or \"%s\" sheet." ArcStudy.metaDataSheetName ArcStudy.obsoleteMetaDataSheetName
62+
ArcStudy.create(Identifier.createMissingIdentifier()),[]
5963

60-
let annotationTables =
61-
doc.GetWorksheets()
62-
|> ResizeArray.choose ArcTable.tryFromFsWorksheet
63-
// Performance hotfix. This change is tested in ISA.Spreadsheet/Performance.Tests.fs and results in 2 pendings tests in ARCtrl/ARCtrl.Tests.fs.
64-
//if annotationTables |> Seq.isEmpty |> not then
65-
// let updatedTables =
66-
// ArcTables.updateReferenceTablesBySheets( // This only kills performance with ProtocolREF
67-
// (ArcTables studyMetadata.Tables),
68-
// (ArcTables (ResizeArray annotationTables)),
69-
// keepUnusedRefTables = true
70-
// )
71-
// studyMetadata.Tables <- updatedTables.Tables
72-
if annotationTables |> ResizeArray.isEmpty |> not then
73-
studyMetadata.Tables <- annotationTables
74-
studyMetadata
75-
,assays
64+
let annotationTables =
65+
doc.GetWorksheets()
66+
|> ResizeArray.choose ArcTable.tryFromFsWorksheet
67+
// Performance hotfix. This change is tested in ISA.Spreadsheet/Performance.Tests.fs and results in 2 pendings tests in ARCtrl/ARCtrl.Tests.fs.
68+
//if annotationTables |> Seq.isEmpty |> not then
69+
// let updatedTables =
70+
// ArcTables.updateReferenceTablesBySheets( // This only kills performance with ProtocolREF
71+
// (ArcTables studyMetadata.Tables),
72+
// (ArcTables (ResizeArray annotationTables)),
73+
// keepUnusedRefTables = true
74+
// )
75+
// studyMetadata.Tables <- updatedTables.Tables
76+
if annotationTables |> ResizeArray.isEmpty |> not then
77+
studyMetadata.Tables <- annotationTables
78+
studyMetadata
79+
,assays
80+
with
81+
| err -> failwithf "Could not parse study: \n%s" err.Message
7682

7783
static member toFsWorkbook (study : ArcStudy,?assays : ArcAssay list) =
7884
let doc = new FsWorkbook()

0 commit comments

Comments
 (0)