public void Execute(object sender, DoWorkEventArgs e) { bw = (BackgroundWorker)sender; bw.ReportProgress(0, "Starting BDFConverter"); CCIUtilities.Log.writeToLog("Starting BDFConverter on records in " + Path.Combine(directory, FileName)); /***** Open BDF file *****/ Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog(); dlg.Title = "Save as BDF file ..."; dlg.AddExtension = true; dlg.DefaultExt = ".bdf"; // Default file extension dlg.Filter = "BDF Files (.bdf)|*.bdf"; // Filter files by extension dlg.FileName = FileName + "-converted"; bool? result = dlg.ShowDialog(); if (result == false) { e.Result = new int[] { 0, 0 }; return; } newRecordLengthPts = oldRecordLengthPts / decimation; BDFWriter = new BDFEDFFileWriter(File.Open(dlg.FileName, FileMode.Create, FileAccess.ReadWrite), channels.Count + 1, /* Extra channel named Status will have group variable value in it */ newRecordLengthSec, /* Record length in seconds */ newRecordLengthPts, /* Record length in points */ true); /* BDF format */ log = new LogFile(dlg.FileName + ".log.xml", GVMapElements); bigBuff = new float[edfPlus.NumberOfChannels - 1, newRecordLengthPts]; //have to dimension to old channels rather than new //in case we need for reference calculations later /***** Create BDF header record *****/ BDFWriter.LocalRecordingId = edfPlus.LocalRecordingId; BDFWriter.LocalSubjectId = edfPlus.LocalSubjectId; int chan; for (int i = 0; i < channels.Count; i++) { chan = channels[i]; BDFWriter.channelLabel(i, edfPlus.channelLabel(chan)); BDFWriter.transducer(i, edfPlus.transducer(chan)); BDFWriter.dimension(i, edfPlus.dimension(chan)); BDFWriter.pMax(i, edfPlus.pMax(chan)); BDFWriter.pMin(i, edfPlus.pMin(chan)); BDFWriter.dMax(i, edfPlus.dMax(chan)); BDFWriter.dMin(i, edfPlus.dMin(chan)); BDFWriter.prefilter(i, edfPlus.prefilter(chan)); } chan = channels.Count; BDFWriter.channelLabel(chan, "Status"); //Make entries for Status channel BDFWriter.transducer(chan, "None"); BDFWriter.dimension(chan, ""); BDFWriter.pMax(chan, 32767); BDFWriter.pMin(chan, -32768); BDFWriter.dMax(chan, 32767); BDFWriter.dMin(chan, -32768); BDFWriter.prefilter(chan, "None"); BDFWriter.writeHeader(); log.registerHeader(this); BDFLoc stp = edfPlus.LocationFactory.New(); BDFLoc lastEvent = edfPlus.LocationFactory.New(); outLoc = BDFWriter.LocationFactory.New(); lastStatus = 0; /***** MAIN LOOP *****/ foreach (EventMark em in Events) //Loop through Event file { bw.ReportProgress(0, "Processing event " + em.Time.ToString("0.000")); //Report progress stp.FromSecs(em.Time + offset); //set stopping point, where Status transition should occur if (!runEDFtoMark(ref lastEvent, stp, lastStatus)) throw new Exception("Reached EOF before reaching event at " + em.Time.ToString("0.000") + "secs"); if (GVMapElements.Contains(em.GV)) lastStatus = em.GV.Value; else if (deleteAsZero) lastStatus = 0; } stp.EOF(); //copy out to end of file runEDFtoMark(ref lastEvent, stp, lastStatus); e.Result = new int[] { BDFWriter.NumberOfRecords, outLoc.Rec }; //both numbers should be the same BDFWriter.Close(); log.Close(); }
public void Execute(object sender, DoWorkEventArgs e) { bw = (BackgroundWorker)sender; bw.ReportProgress(0, "Starting FMConverter"); CCIUtilities.Log.writeToLog("Starting FMConverter on records in " + Path.Combine(directory, FileName)); /***** Open FILMAN file *****/ SaveFileDialog dlg = new SaveFileDialog(); dlg.Title = "Save as FILMAN file ..."; dlg.AddExtension = true; dlg.DefaultExt = ".fmn"; // Default file extension dlg.Filter = "FILMAN Files (.fmn)|*.fmn"; // Filter files by extension dlg.FileName = FileName; bool? result = dlg.ShowDialog(); if (result == null || !(bool)result) { e.Result = new int[] { 0, 0 }; return; } newRecordLengthPts = oldRecordLengthPts / decimation; FMStream = new FILMANOutputStream( File.Open(dlg.FileName, FileMode.Create, FileAccess.ReadWrite), 3, 0, channels.Count, newRecordLengthPts, FILMANFileStream.FILMANFileStream.Format.Real); log = new LogFile(dlg.FileName + ".log.xml", GVMapElements); FMStream.IS = Convert.ToInt32((double)newRecordLengthPts / newRecordLengthSec); //rounding method bigBuff = new float[edfPlus.NumberOfChannels - 1, FMStream.ND]; //have to dimension to BDF rather than FMStream //in case we need for reference calculations /***** Create FILMAN header records *****/ FMStream.GVNames(0, "Channel"); FMStream.GVNames(1, "Montage"); FMStream.GVNames(2, GVName); for (int i = 0; i < FMStream.NC; i++) //copy across channel labels { string s = edfPlus.channelLabel(channels[i]); FMStream.ChannelNames(i, s); } FMStream.Description(0, " Date: " + edfPlus.timeOfRecording().ToShortDateString() + " Time: " + edfPlus.timeOfRecording().ToShortTimeString()); FMStream.Description(1, "Based on file: " + Path.Combine(directory, FileName)); FMStream.Description(2, edfPlus.LocalSubjectId); StringBuilder sb = new StringBuilder(" Offset=" + offset.ToString("0.00")); sb.Append(" Length=" + newRecordLengthSec.ToString("0.000")); if (referenceGroups == null || referenceGroups.Count == 0) sb.Append(" No reference"); else if (referenceGroups.Count == 1) { sb.Append(" Single ref group with"); if (referenceGroups[0].Count >= FMStream.NC) if (referenceChannels[0].Count == edfPlus.NumberOfChannels) sb.Append(" common average ref"); else if (referenceChannels[0].Count == 1) sb.Append(" ref channel " + referenceChannels[0][0].ToString("0") + "=" + edfPlus.channelLabel(referenceChannels[0][0])); else sb.Append(" multiple ref channels=" + referenceChannels[0].Count.ToString("0")); } else // complex reference expression { sb.Append(" Multiple reference groups=" + referenceGroups.Count.ToString("0")); } FMStream.Description(3, sb.ToString()); sb = new StringBuilder("#Group var=" + GVName); sb.Append(" #Channels=" + FMStream.NC.ToString("0")); sb.Append(" #Samples=" + FMStream.ND.ToString("0")); sb.Append(" Samp rate=" + FMStream.IS.ToString("0")); FMStream.Description(4, sb.ToString()); FMStream.Description(5, edfPlus.LocalRecordingId); FMStream.writeHeader(); log.registerHeader(this); BDFLoc stp = edfPlus.LocationFactory.New(); BDFLoc end = edfPlus.LocationFactory.New(); /***** MAIN LOOP *****/ for (int ev = 0; ev < Events.Count; ev++) //Loop through Events list { EventMark currentEvent = Events[ev]; //check to make sure we haven't deleted this event type from GV map GVMapElement gv = currentEvent.GV; if (GVMapElements.Contains(gv)) { stp.FromSecs(currentEvent.Time + offset); currentGVValue = gv.Value; //map to integer if (ev < (Events.Count - 1)) end.FromSecs(Events[ev + 1].Time + offset); else end.EOF(); bw.ReportProgress(0, "Processing event at " + currentEvent.Time.ToString("0.000")); //Report progress int n = 0; while (createFILMANRecord(ref stp, end)) n++; /*Create FILMAN recordset around this found point*/ gv.RecordCount += n; log.registerEvent(currentEvent, offset, n); } } int recs = FMStream.NR / FMStream.NC; e.Result = new int[] { FMStream.NR, recs }; FMStream.Close(); CCIUtilities.Log.writeToLog("Ending FMConverter, producing " + recs.ToString("0") + " records in file " + dlg.FileName); log.registerSummary(GVMapElements, recs); log.Close(); }