Changeset 167
- Timestamp:
- May 5, 2010 5:29:42 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
dc2mda/src/pythonlib/dc2mda.py
r165 r167 21 21 22 22 23 SVN_ID = "$Id$" 23 24 DC2MDA_DEBUG = False 24 25 #DC2MDA_DEBUG = True … … 27 28 NUM_DETECTORS = 15 28 29 MDA_VERSION_FOR_MDAEXPLORER = 1.3 # this number is expected by mdaExplorer.py 30 31 TEST_1D_MDA_FILE = '../cha_0001.mda' 32 TEST_2D_MDA_FILE = '../cha_0023.mda' 33 TEST_1D_DC_FILE = '../UNLV_Aug09' 34 TEST_1D_DC_FILE = '../topo/2020U125SEB' 35 TEST_2D_DC_FILE = '../AlGe311.feb09' 36 TEST_2D_DC_FILE = '../topo/19BM2_Finger' 37 TEST_2D_DC_FILE = '../topo/AliASMLmirror#1_jan03' 29 38 30 39 … … 77 86 @note: There are no useful instance variables to be accessed 78 87 ''' 88 89 FILE_TEMPLATE_1D = '%s_%04d.mda' 90 FILE_TEMPLATE_2D = '%s_2D_%04d.mda' 91 ENV_PV_TEMPLATE = 'env:pv_%s' 79 92 80 93 def __init__(self): … … 135 148 return struct.unpack("!d", fp.read(8))[0] 136 149 137 def read_STRING(self, fp, numChars, strip = True, indexFile =False):150 def read_STRING(self, fp, numChars, strip=True, indexFile=False): 138 151 ''' 139 152 Read and return a STRING from file descriptor fp. … … 154 167 return data 155 168 156 def u_read(self, fp, isIndexFile =False):169 def u_read(self, fp, isIndexFile=False): 157 170 ''' 158 171 @param fp: file descriptor … … 306 319 data = [] 307 320 for i in range(nx): 308 data.append(self.read_STRING(fp, 309 numChars = s4, strip = True, indexFile =isIndexFile))321 data.append(self.read_STRING(fp, 322 numChars=s4, strip=True, indexFile=isIndexFile)) 310 323 if not isIndexFile: 311 324 self.align_DWORD(fp) 312 325 else: 313 data = self.read_STRING(fp, 314 numChars = s4, strip = False, indexFile =isIndexFile)326 data = self.read_STRING(fp, 327 numChars=s4, strip=False, indexFile=isIndexFile) 315 328 if not isIndexFile: 316 329 self.align_DWORD(fp) # align file pointer to next DWORD boundary … … 350 363 # not implemented yet 351 364 pass 365 366 def getFileNames(self, file): 367 ''' 368 get the names of the EPICS Data Catcher files that are available 369 @param file: name of file to test 370 @return: names of (data.file, data.file.index, data.file.image) files 371 @note: file names are empty if they do not exist 372 ''' 373 dcFile = file 374 while os.path.splitext(dcFile)[1] in ['.index', '.image']: 375 dcFile = os.path.splitext(dcFile)[0] 376 indexFile = dcFile + '.index' 377 imageFile = dcFile + '.image' 378 379 if not os.path.exists(dcFile): 380 dcFile = '' 381 if not os.path.exists(indexFile): 382 indexFile = '' 383 if not os.path.exists(imageFile): 384 imageFile = '' 385 if not self.isCatcherV1(dcFile): 386 dcFile = indexFile = imageFile = '' 387 return (dcFile, indexFile, imageFile) 388 389 390 def isImageFileName(self, file): 391 ''' 392 test if a given file name is a catcher data.file.image name 393 @param file: full path name of file to test 394 @return: True or False 395 @note: strategy: 396 * simple test of file extension 397 ''' 398 return os.path.splitext(file)[1] == ".image" 399 400 def isIndexFileName(self, file): 401 ''' 402 test if a given file name is a catcher data.file.index name 403 @param file: full path name of file to test 404 @return: True or False 405 @note: strategy: 406 * simple test of file extension 407 ''' 408 return os.path.splitext(file)[1] == ".index" 352 409 353 410 def isCatcherV1(self, file): … … 395 452 self.open(file) 396 453 extension = os.path.splitext(file)[1] 397 isIndexFile = extension == ".index"398 isImageFile = extension == ".image"399 records = [ isIndexFile, isImageFile]454 isIndexFile = self.isIndexFileName(file) 455 isImageFile = self.isImageFileName(file) 456 records = [] 400 457 while self.fp.tell() < size: 401 rec = self.u_read(self.fp, isIndexFile =isIndexFile)458 rec = self.u_read(self.fp, isIndexFile=isIndexFile) 402 459 records.append(rec) 403 460 self.close() 404 461 return records 405 462 463 def recordView(self, file): 464 ''' 465 read and print the records in any of 466 the three types of catcher files 467 @param file: any/path/to/datafile 468 ''' 469 records = self.readFileRecords(file) 470 if len(records) > 0: 471 if DC2MDA_DEBUG: 472 for rec in records: 473 print "%s: %s" % (rec['offsetHex'], rec) 474 if self.isIndexFileName(file): 475 index = self.parseIndexRecords(records) 476 if DC2MDA_DEBUG: 477 pprint.pprint(index) 478 elif self.isImageFileName(file): 479 images = self.parseImageRecords(records) 480 if DC2MDA_DEBUG: 481 for image in images: 482 pprint.pprint(image) 483 else: 484 print len(images), file 485 else: 486 scans = self.parse1dDataRecords(records) 487 if DC2MDA_DEBUG: 488 for scan in scans: 489 pprint.pprint(scan) 490 else: 491 print len(scans), file 492 sys.stdout.flush() 493 pass 494 406 495 def parseIndexRecords(self, records): 407 496 ''' 408 parse the records as read by readFileRecords( 0497 parse the records as read by readFileRecords() 409 498 @param records: as needed by data.file.index specification 410 499 @note: this is very easy! … … 419 508 def parseImageRecords(self, records): 420 509 ''' 421 parse the records as read by readFileRecords( 0510 parse the records as read by readFileRecords() 422 511 @param records: as needed by data.file.image specification 423 512 @return: list of dictionaries, each dictionary describes an image … … 434 523 'x', 'y', 'image' 435 524 ''' 436 scans = []525 images = [] 437 526 numScans = len(records) / 5 438 527 for i in range(numScans): 439 name = records[i *5 + 0]440 qno = records[i *5 + 1]528 name = records[i * 5 + 0] 529 qno = records[i * 5 + 1] 441 530 dict = { 442 531 'PV inner scan': name['data'][0], … … 453 542 dict['2D scanno'] = qno['data'][4] 454 543 dict['max Y height'] = qno['data'][5] 455 dict['x'] = records[i*5 + 2]['data'] 456 dict['y'] = records[i*5 + 3]['data'] 457 dict['image'] = records[i*5 + 4]['data'] 458 scans.append(dict) 459 return scans 460 461 def parseDataRecords(self, records): 462 ''' 463 parse the records as read by readFileRecords(0 544 dict['x'] = records[i * 5 + 2]['data'] 545 dict['y'] = records[i * 5 + 3]['data'] 546 dict['image'] = records[i * 5 + 4]['data'] 547 #print 'DEBUG:', dict['2D scanno'], dict['1D scanno'] 548 images.append(dict) 549 return images 550 551 def parse1dDataRecords(self, records): 552 ''' 553 parse the records as read by readFileRecords() 464 554 @param records: as needed by data.file specification 465 555 @return: list of dictionaries, each dictionary describes a scan … … 472 562 dict['version'] = records[recNum]['data']; recNum += 1 473 563 dict['pv'] = records[recNum]['data']; recNum += 1 474 dict['n um_pts'] = records[recNum]['data']; recNum += 1564 dict['npts'] = records[recNum]['data']; recNum += 1 475 565 inUse = records[recNum]['data']; recNum += 1 476 566 dict['dim'] = records[recNum]['data']; recNum += 1 … … 482 572 det = [] 483 573 for num in range(NUM_DETECTORS): 484 det.append({ 'defined': inUse[NUM_POSITIONERS +num] })574 det.append({ 'defined': inUse[NUM_POSITIONERS + num] }) 485 575 if det[num]['defined']: 486 576 det[num]['data'] = records[recNum]['data']; recNum += 1 … … 488 578 for num in range(NUM_POSITIONERS): 489 579 pos[num]['pv'] = labels[num].strip() 490 pos[num]['description'] = labels[num +19].strip()491 pos[num]['units'] = labels[num +38].strip()580 pos[num]['description'] = labels[num + 19].strip() 581 pos[num]['units'] = labels[num + 38].strip() 492 582 for num in range(NUM_DETECTORS): 493 det[num]['pv'] = labels[NUM_POSITIONERS +num].strip()494 det[num]['description'] = labels[NUM_POSITIONERS +num+(NUM_POSITIONERS+NUM_DETECTORS)].strip()495 det[num]['units'] = labels[NUM_POSITIONERS +num+2*(NUM_POSITIONERS+NUM_DETECTORS)].strip()583 det[num]['pv'] = labels[NUM_POSITIONERS + num].strip() 584 det[num]['description'] = labels[NUM_POSITIONERS + num + (NUM_POSITIONERS + NUM_DETECTORS)].strip() 585 det[num]['units'] = labels[NUM_POSITIONERS + num + 2 * (NUM_POSITIONERS + NUM_DETECTORS)].strip() 496 586 dict['pos'] = pos 497 587 dict['det'] = det … … 518 608 env = records[recNum]['data']; recNum += 1 519 609 for item in env: 520 dict['env'].append( 610 dict['env'].append({ 521 611 'pv': item[0:29].strip(), 522 612 'value': item[29:69].strip(), 523 613 'description': item[69:-1].strip() 524 } 614 }) 525 615 scans.append(dict) 526 616 return scans 527 617 528 529 def constructMDA_1D(scan): 530 ''' 531 parse the catcher_v1 scan dictionary 532 and assemble the MDA structure 533 @param dc: one item of the Python structure returned from parseDataRecords() 534 @return: Python structure expected by mda.writeMDA() 535 ''' 536 #------------ header 537 header = { 538 'sampleEntry': ("description", "unit string", "value", 539 "EPICS_type", "count") 540 } 541 header['filename'] = scan['filename'] 542 header['version'] = MDA_VERSION_FOR_MDAEXPLORER # float 543 header['rank'] = 1 544 header['scan_number'] = scan['1D scan number, zero based'] 545 header['dimensions'] = scan['num_pts'] 546 header['isRegular'] = 1 # What else could it be but regular? 547 header['ourKeys'] = ['sampleEntry', 'filename', 'version', 'scan_number', 548 'rank', 'dimensions', 'isRegular', 'ourKeys'] 549 header['ourKeys'].append('time') 550 header['time'] = scan['time'] 551 for entry in scan['env']: 552 header[entry['pv']] = (entry['description'], '', entry['value'], 0, 1) 553 #------------ 1-D scan data_1D 554 data_1D = mda.scanDim() 555 data_1D.rank = 1 # this is 1-D catcher file 556 data_1D.dim = scan['dim'] 557 data_1D.npts = scan['num_pts'][0] 558 data_1D.name = scan['pv'] 559 data_1D.time = scan['time'] 560 number_points = None # actual number of points 561 for i in range(NUM_POSITIONERS): 562 if scan['pos'][i]['defined'] == 1: 618 def keyToPv(self, key): 619 ''' 620 given a proposed environment variable key, returns a safe version of that key 621 @param key: proposed key 622 @return: safe key 623 ''' 624 key = key.replace(" ", "_") 625 key = key.replace(",", "_") 626 return self.ENV_PV_TEMPLATE % key[0:27] 627 628 def constructMDA_1D(self, scan): 629 ''' 630 parse the catcher_v1 scan dictionary 631 and assemble the MDA structure 632 @param dc: one item of the Python structure returned from parse1dDataRecords() 633 @return: Python structure expected by mda.writeMDA() 634 ''' 635 #------------ header 636 header = { 637 'sampleEntry': ("description", "unit string", "value", 638 "EPICS_type", "count") 639 } 640 header['filename'] = scan['filename'] 641 header['version'] = MDA_VERSION_FOR_MDAEXPLORER # float 642 header['rank'] = 1 643 header['scan_number'] = scan['1D scan number, zero based'] 644 header['dimensions'] = scan['npts'] 645 header['isRegular'] = 1 # What else could it be but regular? 646 header['ourKeys'] = ['sampleEntry', 'filename', 'version', 'scan_number', 647 'rank', 'dimensions', 'isRegular', 'ourKeys'] 648 header['ourKeys'].append('time') 649 header['time'] = scan['time'] 650 for entry in scan['env']: 651 header[entry['pv']] = (entry['description'], '', entry['value'], 0, 1) 652 # add metadata from the catcher file as "environment" data 653 EPICS_datatype = 0 654 envKeys = ['userID', 'version', 'comment', 'time'] 655 for i in range(len(envKeys)): 656 key = envKeys[i] 657 value = scan[key] 658 pv = self.keyToPv(key) 659 header[pv] = (key, '', value, EPICS_datatype, 1) 660 # strings 661 envKeys = ['Plot title', 'Plot x label', 'Plot y label', 'Scan data file name', 'pv', 'filename'] 662 for i in range(len(envKeys)): 663 key = envKeys[i] 664 value = scan[key] 665 pv = self.keyToPv(key) 666 header[pv] = (key, '', value, EPICS_datatype, 1) 667 header['filename_short'] = ('short file name', '', scan['filename'], EPICS_datatype, 1) 668 # floats 669 EPICS_datatype = data_types.EPICS_types_dict_REVERSE['DBR_CTRL_DOUBLE'] 670 envKeys = ['Y positioner value at given 2D scan number'] 671 for i in range(len(envKeys)): 672 key = envKeys[i] 673 value = scan[key] 674 pv = self.keyToPv(key) 675 header[pv] = (key, '', [value], EPICS_datatype, 1) 676 # ints 677 EPICS_datatype = data_types.EPICS_types_dict_REVERSE['DBR_CTRL_LONG'] 678 envKeys = [ 679 '1D scan number, zero based', 680 '1D scan starting reference case number', 681 '2D scanning sequence number, Y loop index number', 682 '2D scan number, zero based', 683 '2D scanning indicator', 684 '2D scan requested number of data points', 685 '2D scan current acquired number' 686 ] 687 for i in range(len(envKeys)): 688 key = envKeys[i] 689 value = scan[key] 690 pv = self.keyToPv(key) 691 header[pv] = (key, '', [value], EPICS_datatype, 1) 692 #------------ 1-D scan data_1D 693 data_1D = mda.scanDim() 694 data_1D.rank = 1 # this is 1-D catcher file 695 data_1D.dim = scan['dim'] 696 data_1D.npts = scan['npts'][0] 697 data_1D.name = scan['pv'] 698 data_1D.time = scan['time'] 699 curr_pt = None # actual number of points 700 for posNum in range(NUM_POSITIONERS): 701 if scan['pos'][posNum]['defined'] == 1: 702 pos = mda.scanPositioner() 703 pos.number = posNum 704 pos.fieldName = mda.posName(posNum) # scan-record field (e.g., 'P1') 705 pos.name = scan['pos'][posNum]['pv'] 706 pos.desc = scan['pos'][posNum]['description'] 707 pos.unit = scan['pos'][posNum]['units'] 708 pos.step_mode = "LINEAR" 709 #pos.readback_name = "" 710 #pos.readback_desc = "" 711 #pos.readback_unit = "" 712 pos.data = scan['pos'][posNum]['data'] 713 if curr_pt == None: 714 curr_pt = len(pos.data) 715 data_1D.p.append(pos) 716 for detNum in range(NUM_DETECTORS): 717 if scan['det'][detNum]['defined'] == 1: 718 det = mda.scanDetector() 719 det.number = detNum 720 det.fieldName = mda.detName(detNum) # scan-record field (e.g., 'D01') 721 det.name = scan['det'][detNum]['pv'] 722 det.desc = scan['det'][detNum]['description'] 723 det.unit = scan['det'][detNum]['units'] 724 det.data = scan['det'][detNum]['data'] 725 data_1D.d.append(det) 726 data_1D.np = len(data_1D.p) # number of positioners 727 data_1D.nd = len(data_1D.d) # number of detectors 728 data_1D.curr_pt = curr_pt # number of points actually recorded 729 if curr_pt > data_1D.npts: 730 data_1D.npts = curr_pt 731 #------------ final assembly 732 return [ header, data_1D ] # list: 0: header, 1: 1-D info 733 734 def translateMDA_1D(self, file): 735 ''' 736 translate a catcher 1D file into a set of MDA files 737 @param file: 1-D data catcher file name 738 ''' 739 records = self.readFileRecords(dcFile) 740 scans = self.parse1dDataRecords(records) 741 print dcFile + ":", 742 for scan in scans: 743 mdaScan = self.constructMDA_1D(scan) 744 scanNumber = scan['1D scan number, zero based'] + 1 745 mdaFile = self.FILE_TEMPLATE_1D % (dcFile, scanNumber) 746 mda.writeMDA(mdaScan, mdaFile) 747 print scanNumber, 748 sys.stdout.flush() 749 print 750 751 def collateFrameSets(self, images): 752 ''' 753 Gather the frame sets from the acquired images 754 @param images: entries from records in data.file.image. 755 Determine how many different 2-D scans (frameSets) we have. 756 That is the number of MDA files we will create. 757 @return: list frameSet dictionaries 758 ''' 759 frameSets = {} 760 for image_index in range(len(images)): 761 image = images[image_index] 762 # index of 1st 1D scan (X data) 763 n1D = image['1D scanno'] - image['ny'] 764 n2D = image['2D scanno'] # one-based 765 if not n2D in frameSets.keys(): 766 frameSets[n2D] = { 767 'first 1D scan num': n1D, 768 '2D scan num': n2D, 769 'detector pv list': [], 770 '1D scan list' : range(n1D, image['1D scanno']), 771 'image frame list': [] 772 } 773 detPv1 = image['PV Detector 1'] 774 frameSets[n2D]['detector pv list'].append(detPv1) 775 frameSets[n2D]['image frame list'].append(image_index) 776 if DC2MDA_DEBUG: pprint.pprint(frameSets) 777 return frameSets 778 779 def translateMDA_2D(self, dcFile, indexFile, imageFile): 780 ''' 781 translate a catcher 2D file into a set of MDA files 782 @param dcFile: data.file name 783 @param indexFile: data.file.index name 784 @param imageFile: data.file.image name 785 ''' 786 # data.file 787 scans = self.parse1dDataRecords(self.readFileRecords(dcFile)) 788 print dcFile + ":", 789 790 # data.file.index 791 index = self.parseIndexRecords(self.readFileRecords(indexFile)) 792 793 # data.file.image 794 images = self.parseImageRecords(self.readFileRecords(imageFile)) 795 796 # Determine how many different 2-D scans (frameSets) we have. 797 # That is the number of MDA files we will create. 798 frameSets = self.collateFrameSets(images) 799 800 for frameNum in frameSets: 801 frameSet = frameSets[frameNum] 802 outputMdaFileName = self.FILE_TEMPLATE_2D % (dcFile, frameNum) 803 scan1Num = frameSet['1D scan list'][0] 804 scan1 = scans[scan1Num] 805 image1Num = frameSet['image frame list'][0] 806 image1 = images[image1Num] 807 #-------------------------- MDA header ------------------------ 808 header = { 809 'sampleEntry': ("description", "unit string", "value", 810 "EPICS_type", "count") 811 } 812 header['filename'] = outputMdaFileName 813 header['version'] = MDA_VERSION_FOR_MDAEXPLORER # float 814 header['rank'] = 2 815 header['scan_number'] = frameSet['2D scan num'] # one-based 816 scan1_len = image1['nx'] 817 scan2_len = image1['ny'] 818 header['dimensions'] = [scan2_len, scan1_len] 819 header['isRegular'] = 1 # What else could it be but regular? 820 header['ourKeys'] = ['sampleEntry', 'filename', 'version', 'scan_number', 821 'rank', 'dimensions', 'isRegular', 'ourKeys'] 822 header['ourKeys'].append('time') 823 header['time'] = scan1['time'] 824 #----- environment data 825 for entry in scan1['env']: # env variables from first 1-D scan 826 header[entry['pv']] = (entry['description'], '', entry['value'], 0, 1) 827 # add metadata from the catcher files as "environment" data 828 envKeys = ['userID', 'version', 'comment', 'time'] 829 for i in range(len(envKeys)): 830 key = envKeys[i] 831 value = scan1[key] 832 pv = self.keyToPv(key) 833 header[pv] = (key, '', value, 0, 1) 834 envKeys = ['nx', 'ny'] 835 for i in range(len(envKeys)): 836 key = envKeys[i] 837 value = [image1[key]] # integers must be in lists 838 pv = self.keyToPv(key) 839 header[pv] = (key, '', value, data_types.EPICS_types_dict_REVERSE['DBR_CTRL_LONG'], 1) 840 del pv, key, value, i, envKeys 841 header['filename_short'] = ('short file name', '', scan1['Scan data file name'], 0, 1) 842 header['filename_long'] = ('long file name', '', index['filename'], 0, 1) 843 header['filename_current'] = ('current file name', '', dcFile, 0, 1) 844 header['filename_1D_data'] = ('1-D data file name', '', image1['file 1D data'], 0, 1) 845 header['filename_2D_data'] = ('2-D data file name', '', imageFile, 0, 1) 846 header['PV_outer_scan'] = ('outer scan record PV', '', image1['PV outer scan'], 0, 1) 847 header['PV_inner_scan'] = ('inner scan record PV', '', image1['PV inner scan'], 0, 1) 848 header['PV_detector_1'] = ('detector 1 PV', '', image1['PV Detector 1'], 0, 1) 849 header['PV_pos_1_inner'] = ('positioner 1 PV, inner scan', '', image1['PV 2D scan positioner 1'], 0, 1) 850 header['PV_pos_1_outer'] = ('positioner 1 PV, outer scan', '', image1['PV 1D scan positioner 1'], 0, 1) 851 #-------------------------- MDA outer scan ------------------------ 852 outer = mda.scanDim() 853 outer.rank = 2 854 outer.dim = 1 855 outer.name = image1['PV outer scan'] 856 outer.npts = scan2_len # requested 857 outer.curr_pt = len(image1['y']) # actual number of points 858 if outer.curr_pt > outer.npts: 859 outer.npts = outer.curr_pt 860 outer.time = scan1['time'] 861 # ......... 862 # only 1 positioner in outer scan is saved in catcher image file 563 863 pos = mda.scanPositioner() 564 pos.number = i 565 pos.fieldName = mda.posName(i) 566 pos.name = scan['pos'][i]['pv'] 567 pos.desc = scan['pos'][i]['description'] 568 pos.unit = scan['pos'][i]['units'] 569 #pos.step_mode = "" 570 #pos.readback_name = "" 571 #pos.readback_desc = "" 572 #pos.readback_unit = "" 573 pos.data = scan['pos'][i]['data'] 574 if number_points == None: 575 number_points = len(pos.data) 576 data_1D.p.append(pos) 577 for i in range(NUM_DETECTORS): 578 if scan['det'][i]['defined'] == 1: 579 det = mda.scanDetector() 580 det.number = i 581 det.fieldName = mda.detName(i) 582 det.name = scan['det'][i]['pv'] 583 det.desc = scan['det'][i]['description'] 584 det.unit = scan['det'][i]['units'] 585 det.data = scan['det'][i]['data'] 586 data_1D.d.append(det) 587 data_1D.np = len(data_1D.p) # number of positioners 588 data_1D.nd = len(data_1D.d) # number of detectors 589 data_1D.npts = number_points # number of points requested (from above) 590 data_1D.curr_pt = number_points # number of points actually recorded 591 #------------ final assembly 592 return [ header, data_1D ] # list: 0: header, 1: 1-D info 864 pos.number = 0 865 pos.fieldName = 'P1' # scan-record field (e.g., 'P1') 866 pos.name = image1['PV 2D scan positioner 1'] 867 pos.desc = pos.name 868 pos.unit = '' 869 pos.step_mode = "LINEAR" 870 pos.data = image1['y'] 871 outer.p.append(pos) 872 # .......... 873 outer.d = [] 874 # .......... 875 outer.np = len(outer.p) 876 outer.nd = len(outer.d) 877 #-------------------------- MDA inner scan ------------------------ 878 inner = mda.scanDim() 879 inner.rank = 1 880 inner.dim = 2 881 inner.name = image1['PV inner scan'] 882 inner.npts = scan1_len # requested 883 inner.time = scan1['time'] 884 inner.curr_pt = len(image1['x']) # actual number of points 885 if inner.curr_pt > inner.npts: 886 inner.npts = inner.curr_pt 887 # .......... 888 for posNum in range(len(scan1['pos'])): 889 if scan1['pos'][posNum]['defined'] == 1: 890 pos = mda.scanPositioner() 891 pos.number = posNum 892 pos.fieldName = mda.posName(posNum) # scan-record field (e.g., 'P1') 893 pos.name = scan1['pos'][posNum]['pv'] 894 pos.desc = scan1['pos'][posNum]['description'] 895 pos.unit = scan1['pos'][posNum]['units'] 896 pos.step_mode = "LINEAR" 897 pos.data = [] 898 for scanNum in frameSet['1D scan list']: 899 pos.data.append(scans[scanNum]['pos'][posNum]['data']) 900 inner.p.append(pos) 901 del pos 902 # .......... 903 for detNum in range(len(scan1['det'])): 904 if scan1['det'][detNum]['defined'] == 1: 905 det = mda.scanDetector() 906 det.number = detNum 907 det.fieldName = mda.detName(detNum) # scan-record field (e.g., 'D01') 908 det.name = scan1['det'][detNum]['pv'] 909 det.desc = scan1['det'][detNum]['description'] 910 det.unit = scan1['det'][detNum]['units'] 911 det.data = [] 912 for scanNum in frameSet['1D scan list']: 913 det.data.append(scans[scanNum]['det'][detNum]['data']) 914 inner.d.append(det) 915 # .......... 916 inner.np = len(inner.p) 917 inner.nd = len(inner.d) 918 #-------------------------- write the MDA file ------------------------ 919 dim = [header, outer, inner] 920 mda.writeMDA(dim, outputMdaFileName) 921 print outputMdaFileName, 922 pass 593 923 594 924 595 925 def dc2mda(file): 596 926 ''' 597 Convert one EPICS Data Catcher file to MDA files927 Convert one EPICS Data Catcher 1-D file to MDA files 598 928 @param file: name of data catcher file to be converted 599 929 @return: none … … 603 933 called silver_0001.mda, silver_0002.mda, ... 604 934 ''' 605 fileTemplate = '%s_%04d.mda'606 935 dc = catcher_v1() 607 fc = dc.isCatcherV1(file)608 if not fc:936 dcFile, indexFile, imageFile = dc.getFileNames(file) 937 if len(dcFile) == 0: 609 938 return # not data.file 610 records = dc.readFileRecords(file) 611 scans = dc.parseDataRecords(records[2:]) 612 print file + ":", 613 for scan in scans: 614 mdaScan = constructMDA_1D(scan) 615 scanNumber = scan['1D scan number, zero based'] + 1 616 mdaFile = fileTemplate % (file, scanNumber) 617 mda.writeMDA(mdaScan, mdaFile) 618 print scanNumber, 619 sys.stdout.flush() 620 print 621 622 623 def recordView(file): 624 ''' 625 read and print the records in any of the three types of catcher files 626 ''' 627 dc = catcher_v1() 628 records = dc.readFileRecords(file) 629 if len(records) > 1: 630 isIndexFile = records[0] 631 isImageFile = records[1] 939 if len(imageFile) == 0: 940 dc.translateMDA_1D(dcFile) 941 else: 942 dc.translateMDA_2D(dcFile, indexFile, imageFile) 943 944 945 def __ideas__(): 946 ''' 947 try out some ideas 948 ''' 949 ideaNumber = 3 950 if ideaNumber == 1: 951 dc2mda(TEST_1D_DC_FILE) # for code development 952 elif ideaNumber == 2: 953 testCases = [ 954 '../AlGe311.feb09.index', 955 '../AlGe311.feb09.image', 956 '../AlGe311.feb09' 957 ] 958 print testCases 959 for file in testCases: 960 #dc2mda(file) 961 catcher_v1().recordView(file) 962 pass 963 elif ideaNumber == 3: 964 # try to translate the 2-D data to MDA 632 965 if DC2MDA_DEBUG: 633 for rec in records[2:]: 634 print "%s: %s" % (rec['offsetHex'], rec) 635 if isIndexFile: 636 index = dc.parseIndexRecords(records[2:]) 637 if DC2MDA_DEBUG: 638 pprint.pprint(index) 639 elif isImageFile: 640 images = dc.parseImageRecords(records[2:]) 641 if DC2MDA_DEBUG: 642 for image in images: 643 pprint.pprint(image) 644 else: 645 print len(images), file 646 else: 647 scans = dc.parseDataRecords(records[2:]) 648 if DC2MDA_DEBUG: 649 for scan in scans: 650 pprint.pprint(scan) 651 else: 652 print len(scans), file 653 sys.stdout.flush() 654 pass 966 # help and verbose options print stuff out 967 mdaRef = mda.readMDA(TEST_2D_MDA_FILE, help=1, verbose=1) 968 dc2mda(TEST_2D_DC_FILE) 655 969 656 970 657 971 if __name__ == '__main__': 658 dcFile = '../UNLV_Aug09' # for code development 659 if len(sys.argv) == 2: 660 dcFile = sys.argv[1] 661 elif not os.path.exists(dcFile): 662 print "usage: ", sys.argv[0], " path/to/data_catcher_file" 663 exit(1) 664 dc2mda(dcFile) 665 testCases = [ 666 '../UNLV_Aug09', 667 '../UNLV_Aug09.index', 668 '../AlGe311.feb09.index', 669 '../AlGe311.feb09.image', 670 '../AlGe311.feb09', 671 '../topo/19BM2_Finger', 672 '../topo/19BM2_Finger.image', 673 '../topo/19BM2_Finger.index', 674 '../topo/19BM2_NoSlot_Thin', 675 '../topo/19BM2_NoSlot_Thin.image', 676 '../topo/19BM2_NoSlot_Thin.index', 677 '../topo/2020U125SEB', 678 '../topo/2020U125SEB.index', 679 '../topo/AlGe311.feb09', 680 '../topo/AlGe311.feb09.image', 681 '../topo/AlGe311.feb09.index', 682 '../topo/AlGe333.feb08', 683 '../topo/AlGe333.feb08.image', 684 '../topo/AlGe333.feb08.index', 685 '../topo/AliA.jul00', 686 '../topo/AliA.jul00.image', 687 '../topo/AliA.jul00.index', 688 '../topo/AliASMLmirror#1_jan03', 689 '../topo/AliASMLmirror#1_jan03.image', 690 '../topo/AliASMLmirror#1_jan03.index', 691 '../topo/AliAb.mar00', 692 '../topo/AliAb.mar00.image', 693 '../topo/AliAb.mar00.index', 694 '../topo/Ali_Si220_2a.jul05', 695 '../topo/Ali_Si220_2a.jul05.image', 696 '../topo/Ali_Si220_2a.jul05.index' 697 ] 698 for file in testCases: 699 #dc2mda(file) 700 #recordView(file) 701 pass 972 print SVN_ID 973 #__ideas__() 974 if True: # ignore this code while developing the 2D reader 975 dcFile = TEST_1D_DC_FILE # for code development 976 dcFile = TEST_2D_DC_FILE # for code development 977 if len(sys.argv) == 2: 978 dcFile = sys.argv[1] 979 elif not os.path.exists(dcFile): 980 print "usage: ", sys.argv[0], " path/to/data_catcher_file" 981 exit(1) 982 dc2mda(dcFile)
Note: See TracChangeset
for help on using the changeset viewer.