|
1 | 1 | import datetime |
| 2 | +import dateutil |
2 | 3 | import unittest |
3 | 4 |
|
4 | 5 | import os |
5 | 6 | import numpy as np |
| 7 | +import re |
6 | 8 |
|
7 | 9 | from neo.rawio.neuralynxrawio.neuralynxrawio import NeuralynxRawIO |
8 | 10 | from neo.rawio.neuralynxrawio.nlxheader import NlxHeader |
@@ -383,5 +385,75 @@ def test_neuraview2(self): |
383 | 385 | self.assertEqual(datetime.datetime(2015,12,14, 15,58,32), hdr['recording_opened']) |
384 | 386 | self.assertEqual(datetime.datetime(2015,12,14, 15,58,32), hdr['recording_closed']) |
385 | 387 |
|
| 388 | + def get_text_header(self, filename): |
| 389 | + with open(filename, "rb") as f: |
| 390 | + txt_header = f.read(NlxHeader.HEADER_SIZE) |
| 391 | + return txt_header.strip(b"\x00").decode("latin-1") |
| 392 | + |
| 393 | + def check_dateutil_parse(self, hdrTxt, hdrPatternName, openDate, closeDate): |
| 394 | + hpd = NlxHeader.header_pattern_dicts[hdrPatternName] |
| 395 | + mtch = re.search(hpd["datetime1_regex"], hdrTxt) |
| 396 | + self.assertIsNotNone(mtch) |
| 397 | + dt = mtch.groupdict() |
| 398 | + date = dateutil.parser.parse(f"{dt['date']} {dt['time']}") |
| 399 | + self.assertEqual(openDate, date) |
| 400 | + if closeDate is not None: |
| 401 | + mtch = re.search(hpd["datetime2_regex"], hdrTxt) |
| 402 | + self.assertIsNotNone(mtch) |
| 403 | + dt = mtch.groupdict() |
| 404 | + date = dateutil.parser.parse(f"{dt['date']} {dt['time']}") |
| 405 | + self.assertEqual(closeDate, date) |
| 406 | + |
| 407 | + def test_datetime_parsing(self): |
| 408 | + |
| 409 | + # neuraview2 'neuraview2' |
| 410 | + filename = self.get_local_path("neuralynx/Neuraview_v2/original_data/NeuraviewEventMarkers-sample.nev") |
| 411 | + txt_header = self.get_text_header(filename) |
| 412 | + self.check_dateutil_parse(txt_header, 'neuraview2', |
| 413 | + datetime.datetime(2015,12,14, 15,58,32), |
| 414 | + datetime.datetime(2015,12,14, 15,58,32)) |
| 415 | + hdr = NlxHeader(filename) |
| 416 | + self.assertEqual(datetime.datetime(2015,12,14, 15,58,32), |
| 417 | + hdr['recording_opened']) |
| 418 | + self.assertEqual(datetime.datetime(2015,12,14, 15,58,32), |
| 419 | + hdr['recording_closed']) |
| 420 | + |
| 421 | + # Cheetah 5.7.4 'inProps' |
| 422 | + filename = self.get_local_path("neuralynx/Cheetah_v5.7.4/original_data/CSC1.ncs") |
| 423 | + txt_header = self.get_text_header(filename) |
| 424 | + self.check_dateutil_parse(txt_header, 'inProps', |
| 425 | + datetime.datetime(2017,2,16, 17,56,4), |
| 426 | + datetime.datetime(2017,2,16, 18,1,18)) |
| 427 | + hdr = NlxHeader(filename) |
| 428 | + self.assertEqual(datetime.datetime(2017,2,16, 17,56,4), |
| 429 | + hdr['recording_opened']) |
| 430 | + self.assertEqual(datetime.datetime(2017,2,16, 18,1,18), |
| 431 | + hdr['recording_closed']) |
| 432 | + |
| 433 | + # Cheetah 4.0.2 'inHeader' |
| 434 | + filename = self.get_local_path("neuralynx/Cheetah_v4.0.2/original_data/CSC14_trunc.Ncs") |
| 435 | + txt_header = self.get_text_header(filename) |
| 436 | + self.check_dateutil_parse(txt_header, 'inHeader', |
| 437 | + datetime.datetime(2003,10,4, 10,3,0, 578000), |
| 438 | + None) |
| 439 | + hdr = NlxHeader(filename) |
| 440 | + self.assertEqual(datetime.datetime(2003,10,4, 10,3,0, 578000), |
| 441 | + hdr['recording_opened']) |
| 442 | + self.assertIsNone(hdr.get('recording_closed')) |
| 443 | + |
| 444 | + # Cheetah 5.4.0 'openClosedInHeader' |
| 445 | + filename = self.get_local_path("neuralynx/Cheetah_v5.4.0/original_data/CSC5_trunc.Ncs") |
| 446 | + txt_header = self.get_text_header(filename) |
| 447 | + self.check_dateutil_parse(txt_header, 'openClosedInHeader', |
| 448 | + datetime.datetime(2001,1,1, 0,0,0, 0), |
| 449 | + datetime.datetime(2001,1,1, 0,0,0, 0)) |
| 450 | + hdr = NlxHeader(filename) |
| 451 | + self.assertEqual(datetime.datetime(2001,1,1, 0,0,0, 0), |
| 452 | + hdr['recording_opened']) |
| 453 | + self.assertEqual(datetime.datetime(2001,1,1, 0,0,0, 0), |
| 454 | + hdr['recording_closed']) |
| 455 | + |
| 456 | + |
| 457 | + |
386 | 458 | if __name__ == "__main__": |
387 | 459 | unittest.main() |
0 commit comments