Skip to content

Commit 44db640

Browse files
Peter N. SteinmetzPeter N. Steinmetz
authored andcommitted
Combining into one set of header patterns with two for open and close.
1 parent 4cef438 commit 44db640

File tree

2 files changed

+36
-51
lines changed

2 files changed

+36
-51
lines changed

neo/rawio/neuralynxrawio/nlxheader.py

Lines changed: 26 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -277,32 +277,21 @@ def convert_channel_ids_names(self, filename):
277277
# ## File Name: L:\McHugh Lab\Recording\2015-06-24_18-05-11\NeuraviewEventMarkers-20151214_SleepScore.nev
278278
# ## Date Opened: (mm/dd/yyy): 12/14/2015 At Time: 15:58:32
279279
# ## Date Closed: (mm/dd/yyy): 12/14/2015 At Time: 15:58:32
280-
"neuraview2": dict(
281-
datetime1_regex=r"## (Time|Date) Opened:* \((m/d/y|mm/dd/yyy)\): (?P<date>\S+)" \
282-
r" At Time: (?P<time>\S+)",
283-
datetime2_regex=r"## (Time|Date) Closed:* \((m/d/y|mm/dd/yyy)\): (?P<date>\S+)" \
284-
r" At Time: (?P<time>\S+)",
285-
),
280+
286281
# pegasus version 2.1.1 and Cheetah beyond version 5.6.4 - example
287282
# ######## Neuralynx Data File Header
288283
# and then properties
289284
# -OriginalFileName D:\Pegasus Data\Dr_NM\1902\2019-06-28_17-36-50\Events_0008.nev
290285
# -TimeCreated 2019/06/28 17:36:50
291286
# -TimeClosed 2019/06/28 17:45:48
292-
"inProps": dict(
293-
datetime1_regex=r"-TimeCreated (?P<date>\S+) (?P<time>\S+)",
294-
datetime2_regex=r"-TimeClosed (?P<date>\S+) (?P<time>\S+)",
295-
),
296-
# general version for date and time in ## header lines
297-
"inHeader": dict(
298-
datetime1_regex=r"## Time Opened: \(m/d/y\): (?P<date>\S+)" r" At Time: (?P<time>\S+)",
299-
),
300-
# version with time open and closed in ## header lines
301-
"openClosedInHeader": dict(
302-
datetime1_regex=r"## (Time|Date) Opened:* \(m/d/y\): (?P<date>\S+)" \
303-
r" (\(h:m:s\.ms\)|At Time:) (?P<time>\S+)",
304-
datetime2_regex=r"## (Time|Date) Closed:* \(m/d/y\): (?P<date>\S+)" \
305-
r" (\(h:m:s\.ms\)|At Time:) (?P<time>\S+)",
287+
288+
"combined": dict(
289+
openDatetime1_regex=r"## (Time|Date) Opened:* \((m/d/y|mm/dd/yyy)\): (?P<date>\S+)" \
290+
r"\s+(\(h:m:s\.ms\)|At Time:) (?P<time>\S+)",
291+
openDatetime2_regex=r"-TimeCreated (?P<date>\S+) (?P<time>\S+)",
292+
closeDatetime1_regex=r"## (Time|Date) Closed:* \((m/d/y|mm/dd/yyy)\): (?P<date>\S+)" \
293+
r"\s+(\(h:m:s\.ms\)|At Time:) (?P<time>\S+)",
294+
closeDatetime2_regex=r"-TimeClosed (?P<date>\S+) (?P<time>\S+)",
306295
)
307296
}
308297

@@ -321,33 +310,34 @@ def readTimeDate(self, txt_header):
321310
if an == "Cheetah":
322311
av = self["ApplicationVersion"]
323312
if av <= Version("2"): # version 1 uses same as older versions
324-
hpd = NlxHeader.header_pattern_dicts["openClosedInHeader"]
313+
hpd = NlxHeader.header_pattern_dicts["combined"]
325314
elif av < Version("5"):
326-
hpd = NlxHeader.header_pattern_dicts["inHeader"]
315+
hpd = NlxHeader.header_pattern_dicts["combined"]
327316
elif av <= Version("5.4.0"):
328-
hpd = NlxHeader.header_pattern_dicts["openClosedInHeader"]
317+
hpd = NlxHeader.header_pattern_dicts["combined"]
329318
elif av == Version("5.6.0"):
330-
hpd = NlxHeader.header_pattern_dicts["inHeader"]
319+
hpd = NlxHeader.header_pattern_dicts["combined"]
331320
elif av <= Version("5.6.4"):
332-
hpd = NlxHeader.header_pattern_dicts["openClosedInHeader"]
321+
hpd = NlxHeader.header_pattern_dicts["combined"]
333322
else:
334-
hpd = NlxHeader.header_pattern_dicts["inProps"]
323+
hpd = NlxHeader.header_pattern_dicts["combined"]
335324
elif an == "BML":
336-
hpd = NlxHeader.header_pattern_dicts["inHeader"]
325+
hpd = NlxHeader.header_pattern_dicts["combined"]
337326
av = Version("2")
338327
elif an == "Neuraview":
339-
hpd = NlxHeader.header_pattern_dicts["neuraview2"]
328+
hpd = NlxHeader.header_pattern_dicts["combined"]
340329
av = Version("2")
341330
elif an == "Pegasus":
342-
hpd = NlxHeader.header_pattern_dicts["inProps"]
331+
hpd = NlxHeader.header_pattern_dicts["combined"]
343332
av = Version("2")
344333
else:
345334
an = "Unknown"
346335
av = "NA"
347-
hpd = NlxHeader.header_pattern_dicts["inProps"]
336+
hpd = NlxHeader.header_pattern_dicts["combined"]
348337

349338
# opening time
350-
sr = re.search(hpd["datetime1_regex"], txt_header)
339+
sr = re.search(hpd["openDatetime1_regex"], txt_header)
340+
if not sr: sr=re.search(hpd["openDatetime2_regex"], txt_header)
351341
if not sr:
352342
raise IOError(
353343
f"No matching header open date/time for application {an} " + f"version {av}. Please contact developers."
@@ -357,16 +347,11 @@ def readTimeDate(self, txt_header):
357347
self['recording_opened'] = dateutil.parser.parse(f"{dt1['date']} {dt1['time']}")
358348

359349
# close time, if available
360-
if "datetime2_regex" in hpd:
361-
sr = re.search(hpd["datetime2_regex"], txt_header)
362-
if not sr:
363-
raise IOError(
364-
f"No matching header close date/time for application {an} "
365-
+ f"version {av}. Please contact developers."
366-
)
367-
else:
368-
dt2 = sr.groupdict()
369-
self['recording_closed'] = dateutil.parser.parse(f"{dt2['date']} {dt2['time']}")
350+
sr = re.search(hpd["closeDatetime1_regex"], txt_header)
351+
if not sr: sr=re.search(hpd["closeDatetime2_regex"], txt_header)
352+
if sr:
353+
dt2 = sr.groupdict()
354+
self['recording_closed'] = dateutil.parser.parse(f"{dt2['date']} {dt2['time']}")
370355

371356
def type_of_recording(self):
372357
"""

neo/test/rawiotest/test_neuralynxrawio.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -392,24 +392,26 @@ def get_text_header(self, filename):
392392

393393
def check_dateutil_parse(self, hdrTxt, hdrPatternName, openDate, closeDate):
394394
hpd = NlxHeader.header_pattern_dicts[hdrPatternName]
395-
mtch = re.search(hpd["datetime1_regex"], hdrTxt)
395+
mtch = re.search(hpd["openDatetime1_regex"], hdrTxt)
396+
if mtch is None: mtch = re.search(hpd["openDatetime2_regex"], hdrTxt)
396397
self.assertIsNotNone(mtch)
397398
dt = mtch.groupdict()
398399
date = dateutil.parser.parse(f"{dt['date']} {dt['time']}")
399400
self.assertEqual(openDate, date)
400401
if closeDate is not None:
401-
mtch = re.search(hpd["datetime2_regex"], hdrTxt)
402+
mtch = re.search(hpd["closeDatetime1_regex"], hdrTxt)
403+
if mtch is None: mtch = re.search(hpd["closeDatetime2_regex"], hdrTxt)
402404
self.assertIsNotNone(mtch)
403405
dt = mtch.groupdict()
404406
date = dateutil.parser.parse(f"{dt['date']} {dt['time']}")
405407
self.assertEqual(closeDate, date)
406408

407409
def test_datetime_parsing(self):
408410

409-
# neuraview2 'neuraview2'
411+
# neuraview2
410412
filename = self.get_local_path("neuralynx/Neuraview_v2/original_data/NeuraviewEventMarkers-sample.nev")
411413
txt_header = self.get_text_header(filename)
412-
self.check_dateutil_parse(txt_header, 'neuraview2',
414+
self.check_dateutil_parse(txt_header, 'combined',
413415
datetime.datetime(2015,12,14, 15,58,32),
414416
datetime.datetime(2015,12,14, 15,58,32))
415417
hdr = NlxHeader(filename)
@@ -421,7 +423,7 @@ def test_datetime_parsing(self):
421423
# Cheetah 5.7.4 'inProps'
422424
filename = self.get_local_path("neuralynx/Cheetah_v5.7.4/original_data/CSC1.ncs")
423425
txt_header = self.get_text_header(filename)
424-
self.check_dateutil_parse(txt_header, 'inProps',
426+
self.check_dateutil_parse(txt_header, 'combined',
425427
datetime.datetime(2017,2,16, 17,56,4),
426428
datetime.datetime(2017,2,16, 18,1,18))
427429
hdr = NlxHeader(filename)
@@ -430,10 +432,10 @@ def test_datetime_parsing(self):
430432
self.assertEqual(datetime.datetime(2017,2,16, 18,1,18),
431433
hdr['recording_closed'])
432434

433-
# Cheetah 4.0.2 'inHeader'
435+
# Cheetah 4.0.2
434436
filename = self.get_local_path("neuralynx/Cheetah_v4.0.2/original_data/CSC14_trunc.Ncs")
435437
txt_header = self.get_text_header(filename)
436-
self.check_dateutil_parse(txt_header, 'inHeader',
438+
self.check_dateutil_parse(txt_header, 'combined',
437439
datetime.datetime(2003,10,4, 10,3,0, 578000),
438440
None)
439441
hdr = NlxHeader(filename)
@@ -444,7 +446,7 @@ def test_datetime_parsing(self):
444446
# Cheetah 5.4.0 'openClosedInHeader'
445447
filename = self.get_local_path("neuralynx/Cheetah_v5.4.0/original_data/CSC5_trunc.Ncs")
446448
txt_header = self.get_text_header(filename)
447-
self.check_dateutil_parse(txt_header, 'openClosedInHeader',
449+
self.check_dateutil_parse(txt_header, 'combined',
448450
datetime.datetime(2001,1,1, 0,0,0, 0),
449451
datetime.datetime(2001,1,1, 0,0,0, 0))
450452
hdr = NlxHeader(filename)
@@ -453,7 +455,5 @@ def test_datetime_parsing(self):
453455
self.assertEqual(datetime.datetime(2001,1,1, 0,0,0, 0),
454456
hdr['recording_closed'])
455457

456-
457-
458458
if __name__ == "__main__":
459459
unittest.main()

0 commit comments

Comments
 (0)