diff --git a/.gitignore b/.gitignore index d0f4298..be59cc8 100755 --- a/.gitignore +++ b/.gitignore @@ -139,10 +139,11 @@ doc/source/_generated_images/* # Backups *.pybak +.ipynb_checkpoints/ *.visionenv # Audio Files *.wav # Users scripts -users/ \ No newline at end of file +users/ diff --git a/acceptance_tests/01_count_pilatus300.py b/acceptance_tests/01_count_pilatus.py similarity index 100% rename from acceptance_tests/01_count_pilatus300.py rename to acceptance_tests/01_count_pilatus.py diff --git a/startup/.cms_config b/startup/.cms_config index cb7dd27..f3fe37b 100644 --- a/startup/.cms_config +++ b/startup/.cms_config @@ -1313,3 +1313,14 @@ 1311,44.45,62.8,5.0,4.0,"[-96.3, -197.0, -122.5, -1.0]","[0.0, -101.80002499999999, -93.79981875, 89.2]","[0.0, -104.9, 0.0, 90.0]","[-97.5121875, -100.80002499999999, -93.79981875, 89.2]","[51.5, -1.87]","[-30.0, -2.37]",,,-17.900453,Thu Jul 24 16:38:26 2025 1312,44.45,62.8,5.0,4.0,"[-96.3, -197.0, -122.5, -1.0]","[0.0, -101.80002499999999, -93.79981875, 89.2]","[0.0, -104.9, 0.0, 90.0]","[-97.5121875, -100.80002499999999, -93.79981875, 89.2]","[51.5, -1.87]","[-30.0, -2.37]",,,-17.900453,Thu Jul 24 16:40:16 2025 1313,44.45,62.8,5.0,4.0,"[-96.3, -197.0, -122.5, -1.0]","[0.0, -101.80002499999999, -93.79981875, 89.2]","[0.0, -104.9, 0.0, 90.0]","[-97.5121875, -100.80002499999999, -93.79981875, 89.2]","[51.5, -1.87]","[-30.0, -2.37]",,,-17.900600999999998,Tue Jul 29 17:14:22 2025 +1314,44.45,62.8,5.0,4.0,"[-96.3, -197.0, -122.5, -1.0]","[0.0, -101.80002499999999, -93.79981875, 89.2]","[0.0, -104.9, 0.0, 90.0]","[-97.5121875, -100.80002499999999, -93.79981875, 89.2]","[51.5, -1.87]","[-30.0, -2.37]",,,-16.300307999999998,Wed Jul 30 19:32:07 2025 +1315,44.45,62.8,5.0,4.0,"[-96.3, -197.0, -122.5, -1.0]","[0.0, -101.80002499999999, -93.79981875, 89.2]","[0.0, -104.9, 0.0, 90.0]","[-97.5121875, -100.80002499999999, -93.79981875, 89.2]","[51.5, -1.87]","[-30.0, -2.37]",,,-16.900647,Wed Jul 30 19:33:32 2025 +1316,44.45,62.8,5.0,4.0,"[-96.3, -197.0, -122.5, -1.0]","[0.0, -101.80002499999999, -93.79981875, 89.2]","[0.0, -104.9, 0.0, 90.0]","[-97.5121875, -100.80002499999999, -93.79981875, 89.2]","[51.5, -1.87]","[-30.0, -2.37]",,,-17.900453,Thu Jul 31 10:21:45 2025 +1317,44.45,62.8,5.0,4.0,"[-96.3, -197.0, -122.5, -1.0]","[0.0, -101.80002499999999, -93.79981875, 89.2]","[0.0, -104.9, 0.0, 90.0]","[-97.5121875, -100.80002499999999, -93.79981875, 89.2]","[51.5, -1.87]","[-30.0, -2.37]",,,-17.800403,Thu Jul 31 10:22:06 2025 +1318,44.45,62.8,5.0,4.0,"[-96.3, -197.0, -122.5, -1.0]","[0.0, -101.80002499999999, -93.79981875, 89.2]","[0.0, -104.9, 0.0, 90.0]","[-97.5121875, -100.80002499999999, -93.79981875, 89.2]","[51.5, -1.87]","[-30.0, -2.37]",,,-18.000816,Thu Jul 31 10:23:39 2025 +1319,44.45,62.8,5.0,4.0,"[-96.3, -197.0, -122.5, -1.0]","[0.0, -101.80002499999999, -93.79981875, 89.2]","[0.0, -104.9, 0.0, 90.0]","[-97.5121875, -100.80002499999999, -93.79981875, 89.2]","[51.5, -1.87]","[-30.0, -2.37]",,,-18.000816,Thu Jul 31 10:23:50 2025 +1320,44.45,62.8,5.0,4.0,"[-96.3, -197.0, -122.5, -1.0]","[0.0, -101.80002499999999, -93.79981875, 89.2]","[0.0, -104.9, 0.0, 90.0]","[-97.5121875, -100.80002499999999, -93.79981875, 89.2]","[51.5, -1.87]","[-30.0, -2.37]",,,-18.000816,Thu Jul 31 12:07:26 2025 +1321,44.45,62.8,5.0,4.0,"[-96.3, -197.0, -122.5, -1.0]","[0.0, -101.80002499999999, -93.79981875, 89.2]","[0.0, -104.9, 0.0, 90.0]","[-97.5121875, -100.80002499999999, -93.79981875, 89.2]","[51.5, -1.87]","[-30.0, -2.37]",,,-17.900453,Thu Jul 31 12:07:39 2025 +1322,44.45,62.8,5.0,4.0,"[-96.3, -197.0, -122.5, -1.0]","[0.0, -101.80002499999999, -93.79981875, 89.2]","[0.0, -104.9, 0.0, 90.0]","[-97.5121875, -100.80002499999999, -93.79981875, 89.2]","[51.5, -1.87]","[-30.0, -2.37]",,,-18.200816,Thu Jul 31 15:23:43 2025 +1323,44.45,62.8,5.0,4.0,"[-96.3, -197.0, -122.5, -1.0]","[0.0, -101.80002499999999, -93.79981875, 89.2]","[0.0, -104.9, 0.0, 90.0]","[-97.5121875, -100.80002499999999, -93.79981875, 89.2]","[51.5, -1.87]","[-30.0, -2.37]",,,-18.000816,Thu Jul 31 15:33:26 2025 +1324,44.45,62.8,5.0,4.0,"[-96.3, -197.0, -122.5, -1.0]","[0.0, -101.80002499999999, -93.79981875, 89.2]","[0.0, -104.9, 0.0, 90.0]","[-97.5121875, -100.80002499999999, -93.79981875, 89.2]","[51.5, -1.87]","[-30.0, -2.37]",,,-16.800351,Mon Aug 4 17:20:11 2025 diff --git a/startup/.ipynb_checkpoints/94-sample-checkpoint.py b/startup/.ipynb_checkpoints/94-sample-checkpoint.py index 743c62c..15677a2 100644 --- a/startup/.ipynb_checkpoints/94-sample-checkpoint.py +++ b/startup/.ipynb_checkpoints/94-sample-checkpoint.py @@ -1746,9 +1746,9 @@ def get_measurement_md(self, prefix=None, **md): # md_current['detector_sequence_ID'] = caget('XF:11BMB-ES{Det:SAXS}:cam1:FileNumber_RBV') # md_current['detector_sequence_ID'] = caget('XF:11BMB-ES{}:cam1:FileNumber_RBV'.format(pilatus_Epicsname)) - if get_beamline().detector[0].name is "pilatus300": + if get_beamline().detector[0].name is "pilatus300k-1": md_current["detector_sequence_ID"] = caget("XF:11BMB-ES{Det:SAXS}:cam1:FileNumber_RBV") - elif get_beamline().detector[0].name is "pilatus2M": + elif get_beamline().detector[0].name is "pilatus2m-1": md_current["detector_sequence_ID"] = caget("XF:11BMB-ES{Det:PIL2M}:cam1:FileNumber_RBV") md_current.update(get_beamline().get_md()) @@ -1778,10 +1778,10 @@ def _expose_manual(self, exposure_time=None, verbosity=3, poling_period=0.1, **m # caput('XF:11BMB-ES{}:cam1:AcquireTime'.format(pilatus_Epicsname), exposure_time) # caput('XF:11BMB-ES{}:cam1:AcquirePeriod'.format(pilatus_Epicsname), exposure_time+0.1) - if get_beamline().detector[0].name is "pilatus300": + if get_beamline().detector[0].name is "pilatus300k-1": caput("XF:11BMB-ES{Det:SAXS}:cam1:AcquireTime", exposure_time) caput("XF:11BMB-ES{Det:SAXS}:cam1:AcquirePeriod", exposure_time + 0.1) - elif get_beamline().detector[0].name is "pilatus2M": + elif get_beamline().detector[0].name is "pilatus2m-1": caput("XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime", exposure_time) caput("XF:11BMB-ES{Det:PIL2M}:cam1:AcquirePeriod", exposure_time + 0.1) @@ -1826,9 +1826,9 @@ def expose(self, exposure_time=None, extra=None, handlefile=True, verbosity=3, p exposure_time != detector.cam.acquire_time.get() ): # caget('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime'): RE(detector.setExposureTime(exposure_time, verbosity=verbosity)) - # if detector.name is 'pilatus800' and exposure_time != detector.cam.acquire_time.get(): #caget('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime'): + # if detector.name is "pilatus800k-1" and exposure_time != detector.cam.acquire_time.get(): #caget('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime'): # RE(detector.setExposureTime(exposure_time, verbosity=verbosity)) - # if detector.name is 'pilatus300' and exposure_time != detector.cam.acquire_time.get(): + # if detector.name is "pilatus300k-1" and exposure_time != detector.cam.acquire_time.get(): # detector.setExposureTime(exposure_time, verbosity=verbosity) ##extra wait time when changing the exposure time. ##time.sleep(2) @@ -1864,23 +1864,23 @@ def expose(self, exposure_time=None, extra=None, handlefile=True, verbosity=3, p # Wait for detectors to be ready max_exposure_time = 0.1 for detector in get_beamline().detector: - if detector.name is "pilatus300": + if detector.name is "pilatus300k-1": current_exposure_time = detector.cam.acquire_time.get() max_exposure_time = max(max_exposure_time, current_exposure_time) - elif detector.name is "pilatus2M": + elif detector.name is "pilatus2m-1": current_exposure_time = detector.cam.acquire_time.get() max_exposure_time = max(max_exposure_time, current_exposure_time) - elif detector.name is "pilatus800" or detector.name is "pilatus8002": + elif detector.name is "pilatus800k-1" or detector.name is "pilatus800k-2": current_exposure_time = detector.cam.acquire_time.get() max_exposure_time = max(max_exposure_time, current_exposure_time) - # if detector.name is 'pilatus300': + # if detector.name is "pilatus300k-1": # current_exposure_time = caget('XF:11BMB-ES{Det:SAXS}:cam1:AcquireTime') # max_exposure_time = max(max_exposure_time, current_exposure_time) - # elif detector.name is 'pilatus2M': + # elif detector.name is "pilatus2m-1": # current_exposure_time = caget('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime') # max_exposure_time = max(max_exposure_time, current_exposure_time) - # elif detector.name is 'pilatus800': + # elif detector.name is "pilatus800k-1": # current_exposure_time = caget('XF:11BMB-ES{Det:PIL800K}:cam1:AcquireTime') # max_exposure_time = max(max_exposure_time, current_exposure_time) # elif detector.name is 'PhotonicSciences_CMS': @@ -1927,66 +1927,22 @@ def expose(self, exposure_time=None, extra=None, handlefile=True, verbosity=3, p # Wait for detectors to be ready max_exposure_time = 0.1 for detector in get_beamline().detector: - if detector.name is "pilatus300": + if detector.name is "pilatus300k-1": current_exposure_time = detector.cam.acquire_time.get() max_exposure_time = max(max_exposure_time, current_exposure_time) - elif detector.name is "pilatus2M": + elif detector.name is "pilatus2m-1": current_exposure_time = detector.cam.acquire_time.get() max_exposure_time = max(max_exposure_time, current_exposure_time) - elif detector.name is "pilatus800" or detector.name is "pilatus8002": + elif detector.name is "pilatus800k-1" or detector.name is "pilatus800k-2": current_exposure_time = detector.cam.acquire_time.get() max_exposure_time = max(max_exposure_time, current_exposure_time) percentage = 100 * (time.time() - start_time) / max_exposure_time print("After re-exposing .... percentage = {} ".format(percentage)) - # if detector.name is 'pilatus300': - # if caget('XF:11BMB-ES{Det:SAXS}:cam1:Acquire')==1: - # status *= 0 - # elif detector.name is 'pilatus2M': - # if caget('XF:11BMB-ES{Det:PIL2M}:cam1:Acquire')==1: - # status *= 0 - # elif detector.name is 'pilatus800': - # if caget('XF:11BMB-ES{Det:PIL800K}:cam1:Acquire')==1: - # status *= 0 - # elif detector.name is 'PhotonicSciences_CMS': - # if not detector.detector_is_ready(verbosity=0): - # status *= 0 - - # if verbosity>=3 and caget('XF:11BMB-ES{Det:PIL800K}:cam1:Acquire')==1: - # print('Warning: Detector pilatus300 still not done acquiring.') - - # #if verbosity>=3 and caget('XF:11BMB-ES{Det:SAXS}:cam1:Acquire')==1: - # #print('Warning: Detector pilatus300 still not done acquiring.') - - # if verbosity>=3 and caget('XF:11BMB-ES{Det:PIL2M}:cam1:Acquire')==1: - # print('Warning: Detector pilatus2M still not done acquiring.') get_beamline().beam.off() - # save the percentage information - # if verbosity>=5: - # folder = '/nsls2/data/cms/legacy/xf11bm/data/2022_1/TKoga2/' - # # filename = '' - - # current_data = {'a_sample': self.name, - # 'b_exposure_time': detector.cam.acquire_time.get(), - # 'c_exposure_percentage': percentage, - # 'd_align_time': md['filename'] - # } - - # temp_data = pds.DataFrame([current_data]) - - # # INT_FILENAME='{}/data/{}.csv'.format(os.path.dirname(__file__) , 'alignment_results.csv') - # INT_FILENAME='{}/data/{}.csv'.format(folder , 'exposure_info.csv') - - # if os.path.isfile(INT_FILENAME): - # output_data = pds.read_csv(INT_FILENAME, index_col=0) - # output_data = output_data.append(temp_data, ignore_index=True) - # output_data.to_csv(INT_FILENAME) - # else: - # temp_data.to_csv(INT_FILENAME) - if handlefile == True: for detector in get_beamline().detector: self.handle_file(detector, extra=extra, verbosity=verbosity, **md) @@ -2011,9 +1967,9 @@ def _expose_test(self, exposure_time=None, extra=None, handlefile=True, verbosit exposure_time != detector.cam.acquire_time.get() ): # caget('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime'): RE(detector.setExposureTime(exposure_time, verbosity=verbosity)) - # if detector.name is 'pilatus800' and exposure_time != detector.cam.acquire_time.get(): #caget('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime'): + # if detector.name is "pilatus800k-1" and exposure_time != detector.cam.acquire_time.get(): #caget('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime'): # RE(detector.setExposureTime(exposure_time, verbosity=verbosity)) - # if detector.name is 'pilatus300' and exposure_time != detector.cam.acquire_time.get(): + # if detector.name is "pilatus300k-1" and exposure_time != detector.cam.acquire_time.get(): # detector.setExposureTime(exposure_time, verbosity=verbosity) ##extra wait time when changing the exposure time. ##time.sleep(2) @@ -2053,13 +2009,13 @@ def _expose_test(self, exposure_time=None, extra=None, handlefile=True, verbosit # Wait for detectors to be ready max_exposure_time = 0.1 for detector in get_beamline().detector: - if detector.name is "pilatus300": + if detector.name is "pilatus300k-1": current_exposure_time = caget("XF:11BMB-ES{Det:SAXS}:cam1:AcquireTime") max_exposure_time = max(max_exposure_time, current_exposure_time) - elif detector.name is "pilatus2M": + elif detector.name is "pilatus2m-1": current_exposure_time = caget("XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime") max_exposure_time = max(max_exposure_time, current_exposure_time) - elif detector.name is "pilatus800": + elif detector.name is "pilatus800k-1": current_exposure_time = caget("XF:11BMB-ES{Det:PIL800K}:cam1:AcquireTime") max_exposure_time = max(max_exposure_time, current_exposure_time) # elif detector.name is 'PhotonicSciences_CMS': @@ -2082,13 +2038,13 @@ def _expose_test(self, exposure_time=None, extra=None, handlefile=True, verbosit status = 1 for detector in get_beamline().detector: - if detector.name is "pilatus300": + if detector.name is "pilatus300k-1": if caget("XF:11BMB-ES{Det:SAXS}:cam1:Acquire") == 1: status *= 0 - elif detector.name is "pilatus2M": + elif detector.name is "pilatus2m-1": if caget("XF:11BMB-ES{Det:PIL2M}:cam1:Acquire") == 1: status *= 0 - elif detector.name is "pilatus800": + elif detector.name is "pilatus800k-1": if caget("XF:11BMB-ES{Det:PIL800K}:cam1:Acquire") == 1: status *= 0 # elif detector.name is 'PhotonicSciences_CMS': @@ -2117,13 +2073,13 @@ def _expose_test(self, exposure_time=None, extra=None, handlefile=True, verbosit def handle_file(self, detector, extra=None, verbosity=3, subdirs=True, linksave=True, **md): subdir = "" if subdirs: - if detector.name is "pilatus300" or detector.name is "pilatus8002": + if detector.name is "pilatus300k-1" or detector.name is "pilatus800k-2": subdir = "/maxs/raw/" detname = "maxs" - elif detector.name is "pilatus2M": + elif detector.name is "pilatus2m-1": subdir = "/saxs/raw/" detname = "saxs" - elif detector.name is "pilatus800": + elif detector.name is "pilatus800k-1": subdir = "/waxs/raw/" detname = "waxs" else: @@ -2169,7 +2125,7 @@ def handle_file(self, detector, extra=None, verbosity=3, subdirs=True, linksave= def _old_handle_file(self, detector, extra=None, verbosity=3, subdirs=True, linksave=True, **md): subdir = "" - if detector.name is "pilatus300" or detector.name is "pilatus8002": + if detector.name is "pilatus300k-1" or detector.name is "pilatus800k-2": # chars = caget('XF:11BMB-ES{Det:SAXS}:TIFF1:FullFileName_RBV') # filename = ''.join(chr(char) for char in chars)[:-1] filename = detector.tiff.full_file_name.get() # RL, 20210831 @@ -2209,7 +2165,7 @@ def _old_handle_file(self, detector, extra=None, verbosity=3, subdirs=True, link if verbosity >= 3: print(" Data linked as: {}".format(link_name)) - elif detector.name is "pilatus2M": + elif detector.name is "pilatus2m-1": foldername = "/nsls2/xf11bm/" # chars = caget('XF:11BMB-ES{Det:PIL2M}:TIFF1:FullFileName_RBV') @@ -2256,7 +2212,7 @@ def _old_handle_file(self, detector, extra=None, verbosity=3, subdirs=True, link if verbosity >= 3: print(" Data linked as: {}".format(link_name)) - elif detector.name is "pilatus800": + elif detector.name is "pilatus800k-1": foldername = "/nsls2/xf11bm/" # chars = caget('XF:11BMB-ES{Det:PIL800K}:TIFF1:FullFileName_RBV') @@ -2807,7 +2763,7 @@ def measureRock( exposure_time != detector.cam.acquire_time.get() ): # caget('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime'): RE(detector.setExposureTime(exposure_time, verbosity=verbosity)) - # if detector.name is 'pilatus300' and exposure_time != detector.cam.acquire_time.get(): + # if detector.name is "pilatus300k-1" and exposure_time != detector.cam.acquire_time.get(): # detector.setExposureTime(exposure_time, verbosity=verbosity) ##extra wait time when changing the exposure time. ##time.sleep(2) @@ -2844,16 +2800,16 @@ def measureRock( # Wait for detectors to be ready max_exposure_time = 0 for detector in get_beamline().detector: - if detector.name is "pilatus300" or "pilatus800" or "pilatus2M" or "pilatus8002": + if detector.name is "pilatus300k-1" or "pilatus800k-1" or "pilatus2m-1" or "pilatus800k-2": max_exposure_time = detector.cam.acquire_time.get() - # if detector.name is 'pilatus300': + # if detector.name is "pilatus300k-1": # current_exposure_time = caget('XF:11BMB-ES{Det:SAXS}:cam1:AcquireTime') # max_exposure_time = max(max_exposure_time, current_exposure_time) - # elif detector.name is 'pilatus2M': + # elif detector.name is "pilatus2m-1": # current_exposure_time = caget('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime') # max_exposure_time = max(max_exposure_time, current_exposure_time) - # elif detector.name is 'pilatus800': + # elif detector.name is "pilatus800k-1": # current_exposure_time = caget('XF:11BMB-ES{Det:PIL800K}:cam1:AcquireTime') # max_exposure_time = max(max_exposure_time, current_exposure_time) # elif detector.name is 'PhotonicSciences_CMS': @@ -2878,13 +2834,13 @@ def measureRock( if detector.cam.acquire.get(): status *= 0 - # if detector.name is 'pilatus300': + # if detector.name is "pilatus300k-1": # if caget('XF:11BMB-ES{Det:SAXS}:cam1:Acquire')==1: # status *= 0 - # elif detector.name is 'pilatus2M': + # elif detector.name is "pilatus2m-1": # if caget('XF:11BMB-ES{Det:PIL2M}:cam1:Acquire')==1: # status *= 0 - # elif detector.name is 'pilatus800': + # elif detector.name is "pilatus800k-1": # if caget('XF:11BMB-ES{Det:PIL800K}:cam1:Acquire')==1: # status *= 0 # elif detector.name is 'PhotonicSciences_CMS': @@ -3059,7 +3015,7 @@ def _test_expose( # Wait for detectors to be ready max_exposure_time = 0 for detector in get_beamline().detector: - if detector.name is "pilatus300" or "pilatus2M": + if detector.name is "pilatus300k-1" or "pilatus2m-1": current_exposure_time = caget("XF:11BMB-ES{}:cam1:AcquireTime".format(pilatus_Epicsname)) max_exposure_time = max(max_exposure_time, current_exposure_time) elif detector.name is "PhotonicSciences_CMS": @@ -3088,7 +3044,7 @@ def _test_expose( status = 1 for detector in get_beamline().detector: - if detector.name is "pilatus300" or "pilatus2M": + if detector.name is "pilatus300k-1" or "pilatus2m-1": print("status2.5 = ", status) if caget("XF:11BMB-ES{}:cam1:Acquire".format(pilatus_Epicsname)) == 1: status = 0 @@ -3592,28 +3548,28 @@ def series_measure( print("handling the file names") self.handle_fileseries(detector, num_frames=num_frames, extra=extra, verbosity=verbosity, **md) - # if detector.name is 'pilatus2M': + # if detector.name is "pilatus2m-1": # caput('XF:11BMB-ES{Det:PIL2M}:cam1:NumImages', 1) - # if detector.name is 'pilatus300' : + # if detector.name is "pilatus300k-1" : # caput('XF:11BMB-ES{Det:SAXS}:cam1:NumImages', 1) - # if detector.name is 'pilatus800' : + # if detector.name is "pilatus800k-1" : # caput('XF:11BMB-ES{Det:PIL800K}:cam1:NumImages', 1) def initialDetector(self): # reset the num_frame back to 1 for detector in get_beamline().detector: detector.cam.num_images.put(1) - # if detector.name is 'pilatus2M': + # if detector.name is "pilatus2m-1": # caput('XF:11BMB-ES{Det:PIL2M}:cam1:NumImages', 1) - # if detector.name is 'pilatus300' : + # if detector.name is "pilatus300k-1" : # caput('XF:11BMB-ES{Det:SAXS}:cam1:NumImages', 1) - # if detector.name is 'pilatus800' : + # if detector.name is "pilatus800k-1" : # caput('XF:11BMB-ES{Det:PIL800K}:cam1:NumImages', 1) def _old_handle_fileseries(self, detector, num_frames=None, extra=None, verbosity=3, subdirs=True, **md): subdir = "" - if detector.name == "pilatus300" or detector.name == "pilatus8002": + if detector.name == "pilatus300k-1" or detector.name == "pilatus800k-2": # chars = caget('XF:11BMB-ES{Det:SAXS}:TIFF1:FullFileName_RBV') # filename = ''.join(chr(char) for char in chars)[:-1] # filename_part1 = ''.join(chr(char) for char in chars)[:-13] @@ -3666,7 +3622,7 @@ def _old_handle_fileseries(self, detector, num_frames=None, extra=None, verbosit if num_frame == 0 or num_frame == np.max(num_frames): print(" Data {} linked as: {}".format(filename_new, link_name_new)) - elif detector.name == "pilatus2M": + elif detector.name == "pilatus2m-1": # chars = caget('XF:11BMB-ES{Det:PIL2M}:TIFF1:FullFileName_RBV') # filename = ''.join(chr(char) for char in chars)[:-1] # filename_part1 = ''.join(chr(char) for char in chars)[:-13] @@ -3723,12 +3679,12 @@ def _old_handle_fileseries(self, detector, num_frames=None, extra=None, verbosit if num_frame == 0 or num_frame == np.max(num_frames): print(" Data {} linked as: {}".format(filename_new, link_name_new)) - # elif detector.name is 'pilatus800': + # elif detector.name is "pilatus800k-1": # chars = caget('XF:11BMB-ES{Det:PIL800K}:TIFF1:FullFileName_RBV') # filename = ''.join(chr(char) for char in chars)[:-1] # filename_part1 = ''.join(chr(char) for char in chars)[:-13] - elif detector.name == "pilatus800": + elif detector.name == "pilatus800k-1": foldername = "/nsls2/xf11bm/" # chars = caget('XF:11BMB-ES{Det:PIL800K}:TIFF1:FullFileName_RBV') @@ -3795,15 +3751,15 @@ def _old_handle_fileseries(self, detector, num_frames=None, extra=None, verbosit def handle_fileseries(self, detector, num_frames=None, extra=None, verbosity=3, subdirs=True, **md): subdir = "" if subdirs: - if detector.name == "pilatus300" or detector.name == "pilatus8002": + if detector.name == "pilatus300k-1" or detector.name == "pilatus800k-2": subdir = "/maxs/raw/" detname = "maxs" print("{} data handling".format(detector.name)) - elif detector.name == "pilatus2M": + elif detector.name == "pilatus2m-1": subdir = "/saxs/raw/" detname = "saxs" print("pilatus2M data handling") - elif detector.name == "pilatus800": + elif detector.name == "pilatus800k-1": subdir = "/waxs/raw/" detname = "waxs" print("pilatus800k data handling") diff --git a/startup/00-startup.py b/startup/00-startup.py index 9172316..e43b2d6 100644 --- a/startup/00-startup.py +++ b/startup/00-startup.py @@ -1,204 +1,79 @@ print(f'Loading {__file__}') -# import logging -# import caproto -# handler = logging.FileHandler('pilatus-trigger-log.txt') -# from caproto._log import LogFormatter, color_log_format, log_date_format -# handler.setFormatter( -# LogFormatter(color_log_format, datefmt=log_date_format)) -# caproto_log = logging.getLogger('caproto') -# caproto_log.handlers.clear() -# caproto_log.addHandler(handler) -# logging.getLogger('caproto.ch').setLevel('DEBUG') import nslsii -import redis +import os -from redis_json_dict import RedisJSONDict - -nslsii.configure_base(get_ipython().user_ns, "cms", publish_documents_with_kafka=True, redis_url="info.cms.nsls2.bnl.gov") - -from bluesky.magics import BlueskyMagics -from bluesky.preprocessors import pchain +os.environ.pop('TILED_API_KEY') # Make sure no user-defined API key is set -# At the end of every run, verify that files were saved and -# print a confirmation message. -from bluesky.callbacks.broker import verify_files_saved +from tiled.client import from_profile +from databroker import Broker +from redis_json_dict import RedisJSONDict -# RE.subscribe(post_run(verify_files_saved), 'stop') +from IPython import get_ipython +from IPython.terminal.prompts import Prompts, Token + +class ProposalIDPrompt(Prompts): + def in_prompt_tokens(self, cli=None): + return [ + ( + Token.Prompt, + f"{RE.md.get('data_session', 'N/A')} [", + ), + (Token.PromptNum, str(self.shell.execution_count)), + (Token.Prompt, "]: "), + ] + +ip = get_ipython() +ip.prompts = ProposalIDPrompt(ip) + +# Configure a Tiled writing client +tiled_writing_client = from_profile("nsls2", api_key=os.environ["TILED_BLUESKY_WRITING_API_KEY_CMS"])["cms"]["raw"] + +class TiledInserter: + + name = 'cms' + def insert(self, name, doc): + ATTEMPTS = 20 + error = None + for _ in range(ATTEMPTS): + try: + tiled_writing_client.post_document(name, doc) + except Exception as exc: + print("Document saving failure:", repr(exc)) + error = exc + else: + break + time.sleep(2) + else: + # Out of attempts + raise error + +tiled_inserter = TiledInserter() + +nslsii.configure_base(get_ipython().user_ns, + tiled_inserter, + publish_documents_with_kafka=True, + redis_url="info.cms.nsls2.bnl.gov") + +print("Initializing Tiled reading client...\nMake sure you check for duo push.") +tiled_reading_client = cat = from_profile("nsls2", username=None)["cms"]["raw"] + +db = Broker(tiled_reading_client) # Keep for backcompatibility with older code that uses databroker from pyOlog.ophyd_tools import * -# Uncomment the following lines to turn on verbose messages for -# debugging. -# import logging -# ophyd.logger.setLevel(logging.DEBUG) -# logging.basicConfig(level=logging.DEBUG) - -# Add a callback that prints scan IDs at the start of each scan. -# def print_scan_ids(name, start_doc): -# print("Transient Scan ID: {0} @ {1}".format(start_doc['scan_id'],time.strftime("%Y/%m/%d %H:%M:%S"))) -# print("Persistent Unique Scan ID: '{0}'".format(start_doc['uid'])) -# -# RE.subscribe(print_scan_ids, 'start') - -# - HACK #1 - patch EpicsSignal.get to retry when timeouts happen stolen from HXN -import ophyd - - -def _epicssignal_get(self, *, as_string=None, connection_timeout=1.0, **kwargs): - """Get the readback value through an explicit call to EPICS - Parameters - ---------- - count : int, optional - Explicitly limit count for array data - as_string : bool, optional - Get a string representation of the value, defaults to as_string - from this signal, optional - as_numpy : bool - Use numpy array as the return type for array data. - timeout : float, optional - maximum time to wait for value to be received. - (default = 0.5 + log10(count) seconds) - use_monitor : bool, optional - to use value from latest monitor callback or to make an - explicit CA call for the value. (default: True) - connection_timeout : float, optional - If not already connected, allow up to `connection_timeout` seconds - for the connection to complete. - """ - if as_string is None: - as_string = self._string - - with self._metadata_lock: - if not self._read_pv.connected: - if not self._read_pv.wait_for_connection(connection_timeout): - raise TimeoutError("Failed to connect to %s" % self._read_pv.pvname) - - ret = None - attempts = 0 - max_attempts = 4 - while ret is None and attempts < max_attempts: - attempts += 1 - ret = self._read_pv.get(as_string=as_string, **kwargs) - if ret is None: - print(f"*** PV GET TIMED OUT {self._read_pv.pvname} *** attempt #{attempts}/{max_attempts}") - if ret is None: - print(f"*** PV GET TIMED OUT {self._read_pv.pvname} *** return `None` as value :(") - # TODO we really want to raise TimeoutError here, but that may cause more - # issues in the codebase than we have the time to fix... - # If this causes issues, remove it to keep the old functionality... - raise TimeoutError("Failed to get %s after %d attempts" % (self._read_pv.pvname, attempts)) - if attempts > 1: - print(f"*** PV GET succeeded {self._read_pv.pvname} on attempt #{attempts}") - - if as_string: - return ophyd.signal.waveform_to_string(ret) - - return ret - - -from ophyd import EpicsSignal -from ophyd import EpicsSignalRO - -# from ophyd import EpicsSignalBase - -from ophyd.areadetector import EpicsSignalWithRBV - # Increase the timeout for EpicsSignal.get() # This beamline was occasionally getting ReadTimeoutErrors -# EpicsSignal.set_defaults(timeout=10) -# EpicsSignalRO.set_defaults(timeout=10) +import ophyd ophyd.signal.EpicsSignalBase.set_defaults(timeout=120) - -# We have commented this because we would like to identify the PVs that are causing problems. -# Then the controls group can investigate why it is not working as expected. -# Increasing the get() timeout argument is the prefered way to work around this problem. -# EpicsSignal.get = _epicssignal_get -# EpicsSignalRO.get = _epicssignal_get -# EpicsSignalWithRBV.get = _epicssignal_get - -from pathlib import Path - -import appdirs - - -try: - from bluesky.utils import PersistentDict -except ImportError: - import msgpack - import msgpack_numpy - import zict - - class PersistentDict(zict.Func): - """ - A MutableMapping which syncs it contents to disk. - The contents are stored as msgpack-serialized files, with one file per item - in the mapping. - Note that when an item is *mutated* it is not immediately synced: - >>> d['sample'] = {"color": "red"} # immediately synced - >>> d['sample']['shape'] = 'bar' # not immediately synced - but that the full contents are synced to disk when the PersistentDict - instance is garbage collected. - """ - - def __init__(self, directory): - self._directory = directory - self._file = zict.File(directory) - self._cache = {} - super().__init__(self._dump, self._load, self._file) - self.reload() - - # Similar to flush() or _do_update(), but without reference to self - # to avoid circular reference preventing collection. - # NOTE: This still doesn't guarantee call on delete or gc.collect()! - # Explicitly call flush() if immediate write to disk required. - def finalize(zfile, cache, dump): - zfile.update((k, dump(v)) for k, v in cache.items()) - - import weakref - - self._finalizer = weakref.finalize(self, finalize, self._file, self._cache, PersistentDict._dump) - - @property - def directory(self): - return self._directory - - def __setitem__(self, key, value): - self._cache[key] = value - super().__setitem__(key, value) - - def __getitem__(self, key): - return self._cache[key] - - def __delitem__(self, key): - del self._cache[key] - super().__delitem__(key) - - def __repr__(self): - return f"<{self.__class__.__name__} {dict(self)!r}>" - - @staticmethod - def _dump(obj): - "Encode as msgpack using numpy-aware encoder." - # See https://github.com/msgpack/msgpack-python#string-and-binary-type - # for more on use_bin_type. - return msgpack.packb(obj, default=msgpack_numpy.encode, use_bin_type=True) - - @staticmethod - def _load(file): - return msgpack.unpackb(file, object_hook=msgpack_numpy.decode, raw=False) - - def flush(self): - """Force a write of the current state to disk""" - for k, v in self.items(): - super().__setitem__(k, v) - - def reload(self): - """Force a reload from disk, overwriting current cache""" - self._cache = dict(super().items()) - - #this replaces RE() < from bluesky.utils import register_transform register_transform('RE', prefix='<') + +# Setup the path to the secure assets folder for the current proposal +def proposal_path(): + return f"/nsls2/data/cms/proposals/{RE.md['cycle']}/{RE.md['data_session']}/" + +def assets_path(): + return proposal_path() + "assets/" \ No newline at end of file diff --git a/startup/02-data_security.py b/startup/02-data_security.py new file mode 100644 index 0000000..9687124 --- /dev/null +++ b/startup/02-data_security.py @@ -0,0 +1,12 @@ +# To be deleted when DS is done + +RE.md.pop('experiment_alias_directory', None) +RE.md.pop('experiment_user', None) +RE.md.pop('experiment_SAF_number', None) +RE.md.pop('experiment_proposal_number', None) +RE.md.pop('experiment_project', None) +RE.md.pop('experiment_group', None) +RE.md.pop('experiment_cycle', None) +RE.md.pop('userpy_alias_directory', None) + +RE.md["experiment_alias_directory"] = "data_security_test" #NOTE TO SELF: Don't forget to delete this \ No newline at end of file diff --git a/startup/10-motors.py b/startup/10-motors.py index cfeee2a..fcd1a00 100644 --- a/startup/10-motors.py +++ b/startup/10-motors.py @@ -8,8 +8,8 @@ # class Slits(Device): # top = Cpt(EpicsMotor, '-Ax:T}Mtr') # bottom = Cpt(EpicsMotor, '-Ax:B}Mtr') -#beamline_stage = "default" #for AB, please also change Smpl2-Y from 3... to -5 -beamline_stage = 'open_MAXS' +beamline_stage = "default" #for AB, please also change Smpl2-Y from 3... to -5 +# beamline_stage = 'open_MAXS' # beamline_stage = 'BigHuber' print('Beamline_stage = {}'.format(beamline_stage)) diff --git a/startup/20-area-detectors.py b/startup/20-area-detectors.py index 49b951a..3fe5438 100644 --- a/startup/20-area-detectors.py +++ b/startup/20-area-detectors.py @@ -1,5 +1,5 @@ -# import time as ttime # tea time -# from datetime import datetime +print(f'Loading {__file__}') + from ophyd import ( ProsilicaDetector, SingleTrigger, @@ -28,14 +28,7 @@ from ophyd.areadetector.filestore_mixins import FileStoreHDF5IterativeWrite from ophyd.areadetector.plugins import HDF5Plugin #,register_plugin,PluginBase - -print(f'Loading {__file__}') - -# import filestore.api as fs - - -# class Elm(SingleTrigger, DetectorBase): -# pass +import time Pilatus2M_on = True @@ -54,16 +47,37 @@ Pilatus800_2_on = False # Pilatus800_on = False -# Pilatus800_2_on = True +Pilatus800_2_on = True # Pilatus800_2_on = False # Pilatus2M_on = False ''' H5Plugin = HDF5Plugin ''' - class TIFFPluginWithFileStore(TIFFPlugin, FileStoreTIFFIterativeWrite): - pass + def describe(self): + ret = super().describe() + key = self.parent._image_name + color_mode = self.parent.cam.color_mode.get(as_string=True) + if color_mode == 'Mono': + ret[key]['shape'] = [ + self.parent.cam.num_images.get(), + #self.array_size.depth.get(), + self.array_size.height.get(), + self.array_size.width.get() + ] + + elif color_mode in ['RGB1', 'Bayer']: + ret[key]['shape'] = [self.parent.cam.num_images.get(), *self.array_size.get()] + else: + raise RuntimeError("Color mode not supported") + + cam_dtype = self.parent.cam.data_type.get(as_string=True) + type_map = {'UInt8': '|u1', 'UInt16': '= 3: + print("This will guide you through adding some meta-data for the upcoming experiment.") + if verbosity >= 4: + print( + "You can accept default values (shown in square [] brackets) by pressing enter. You can leave a value blank (or put a space) to skip that entry." + ) + + # Set some values automatically + month = int(time.strftime("%m")) + if month <= 4: + cycle = 1 + elif month <= 8: + cycle = 2 + else: + cycle = 3 + RE.md["experiment_cycle"] = "{:s}_{:d}".format(time.strftime("%Y"), cycle) + + RE.md["calibration_energy_keV"] = float(round(self.beam.energy(verbosity=0), 3)) + RE.md["calibration_wavelength_A"] = float(round(self.beam.wavelength(verbosity=0), 5)) + + # TODO: + # RE.md['calibration_detector_distance_m'] = + # RE.md['calibration_detector_x0'] = + # RE.md['calibration_detector_y0'] = + + # Ask the user some questions + + questions = [ + ["experiment_proposal_number", "Proposal number"], + ["experiment_SAF_number", "SAF number"], + ["experiment_group", "User group (e.g. PI)"], + ["experiment_user", "The specific user/person running the experiment"], + ["experiment_project", "Project name/code"], + ["userpy_alias_directory", "Alias directory"], + ["experiment_alias_directory", "Alias directory"], + [ + "experiment_type", + "Type of experiments/measurements (SAXS, GIWAXS, etc.)", + ], + ] + + # TBD: + # Path where data will be stored? + + self._dialog_total_questions = len(questions) + self._dialog_question_number = 1 + + for key, text in questions: + try: + self._ask_question(key, text) + except KeyboardInterrupt: + return + + if verbosity >= 4: + print("You can also add/edit metadata directly using the RE.md object.") + + #RE.md["userpy_alias_directory"] = '/home/xf11bm/.ipython/profile_collection/users/2025-2/TKoga' + if os.path.exists(RE.md["userpy_alias_directory"]): + print("/n The folder has existed. Please change folder name if necessary./n") + else: + os.makedirs(RE.md["userpy_alias_directory"], exist_ok=True) + + #for double-checking folders + #/nsls2//data/cms/shared/config/bluesky/profile_collection/users/ + print('user.py will be saved in folder: {}'.format(RE.md["userpy_alias_directory"])) + print('data will be saved in folder: {}'.format(RE.md["experiment_alias_directory"])) + print('redo cms.setMeadata() if any folder is wrong! ') + + # if os.path.exists(RE.md["experiment_alias_directory"]): + # print("/n The folder has existed. Please change folder name if necessary./n") + # else: + # os.makedirs(RE.md["experiment_alias_directory"], exist_ok=True) + # os.makedirs(os.path.join(RE.md["experiment_alias_directory"], "waxs"), exist_ok=True) + # os.makedirs( + # os.path.join(RE.md["experiment_alias_directory"], "waxs/raw"), + # exist_ok=True, + # ) + # os.makedirs( + # os.path.join(RE.md["experiment_alias_directory"], "waxs/analysis"), + # exist_ok=True, + # ) + # os.makedirs(os.path.join(RE.md["experiment_alias_directory"], "saxs"), exist_ok=True) + # os.makedirs( + # os.path.join(RE.md["experiment_alias_directory"], "saxs/raw"), + # exist_ok=True, + # ) + # os.makedirs( + # os.path.join(RE.md["experiment_alias_directory"], "saxs/analysis"), + # exist_ok=True, + # ) + # os.makedirs(os.path.join(RE.md["experiment_alias_directory"], "data"), exist_ok=True) + # os.makedirs(os.path.join(RE.md['experiment_alias_directory'], 'saxs'), exist_ok=True) + # print( + # "/n The folder ::: {} ::: has been made for users. /n".format(RE.md["experiment_alias_directory"]) + # ) + def _ask_question(self, key, text, default=None): if default is None and key in RE.md: default = RE.md[key] @@ -3350,13 +3450,13 @@ def setDirectBeamROI(self, size=[10, 4], verbosity=3): The size is changed to [10, 4] for possible beam drift during a user run (changed at 08/16/17) """ - if pilatus_name.name == "pilatus2M": + if pilatus_name.name == "pilatus2m-1": detector = self.SAXS # These positions are updated based on current detector position det_md = detector.get_md() x0 = det_md["detector_SAXS_x0_pix"] y0 = det_md["detector_SAXS_y0_pix"] - if pilatus_name.name == "pilatus800": + if pilatus_name.name == "pilatus800k-1": detector = self.WAXS # These positions are updated based on current detector position @@ -3385,13 +3485,13 @@ def setReflectedBeamROI(self, total_angle=0.16, size=[10, 2], verbosity=3): The size argument controls the size (in pixels) of the ROI itself (in the format [width, height]). A size=[6,2] is reasonable.""" - if pilatus_name.name == "pilatus2M": + if pilatus_name.name == "pilatus2m-1": detector = self.SAXS # These positions are updated based on current detector position det_md = detector.get_md() x0 = det_md["detector_SAXS_x0_pix"] y0 = det_md["detector_SAXS_y0_pix"] - if pilatus_name.name == "pilatus800": + if pilatus_name.name == "pilatus800k-1": detector = self.WAXS # These positions are updated based on current detector position @@ -3438,13 +3538,13 @@ def setROI2ReflectBeamROI(self, total_angle=0.16, size=[10, 100], verbosity=3): The size argument controls the size (in pixels) of the ROI itself (in the format [width, height]). A size=[6,2] is reasonable.""" - if pilatus_name.name == "pilatus2M": + if pilatus_name.name == "pilatus2m-1": detector = self.SAXS # These positions are updated based on current detector position det_md = detector.get_md() x0 = det_md["detector_SAXS_x0_pix"] y0 = det_md["detector_SAXS_y0_pix"] - if pilatus_name.name == "pilatus800": + if pilatus_name.name == "pilatus800k-1": detector = self.WAXS # These positions are updated based on current detector position @@ -3521,14 +3621,14 @@ def setSpecularReflectivityROI(self, total_angle=0.16, size=[10, 10], default_SA y_offset_pix = y_offset_mm / pixel_size # for pilatus800k - if pilatus_name.name == "pilatus800": + if pilatus_name.name == "pilatus800k-1": y_pos = int(y0 - size[1] / 2 - y_offset_pix) # for pilatus2M, placed up-side down # y_pos = int( y0 - size[1]/2 + y_offset_pix ) # for pilatus2M, with pattern rotated 180deg. changed at 052918 - if pilatus_name.name == "pilatus2M": + if pilatus_name.name == "pilatus2m-1": y_pos = int(y0 - size[1] / 2 - y_offset_pix) # y pixels for intermodule gaps, for pilatus2M (195 pixels high module, 17 pixels high gap) diff --git a/startup/82-beamstop.py b/startup/82-beamstop.py index fee481f..4e71dd2 100644 --- a/startup/82-beamstop.py +++ b/startup/82-beamstop.py @@ -5,8 +5,10 @@ from pathlib import Path from datetime import datetime +folder = '/home/xf11bm/.ipython/profile_collection/startup/' + class Beamstop: - def __init__(self, name, config_file='/home/xf11bm/.ipython/profile_collection/startup/beamstop_config.cfg'): + def __init__(self, name, config_file = folder + 'beamstop_config.cfg'): self.name = name self.config_file = Path(config_file) self.positions = self._load_config() @@ -19,12 +21,12 @@ def _sync(self): self.bsphi = bsphi.position @classmethod - def get(cls, name, config_file='/home/xf11bm/.ipython/profile_collection/startup/beamstop_config.cfg'): + def get(cls, name, config_file = folder + 'beamstop_config.cfg'): print(f"Set current beamstop to '{name}' without moving.") return cls(name, config_file=config_file) @classmethod - def goto(cls, name, config_file='/home/xf11bm/.ipython/profile_collection/startup/beamstop_config.cfg'): + def goto(cls, name, config_file = folder + 'beamstop_config.cfg'): bs = cls(name, config_file=config_file) # bs._move() RE(bs._move()) diff --git a/startup/86-live-spec.py b/startup/86-live-spec.py index 278d7db..d68c761 100644 --- a/startup/86-live-spec.py +++ b/startup/86-live-spec.py @@ -10,7 +10,7 @@ def spec_factory(name, doc): - directory = "/nsls2/data/cms/legacy/xf11bm/ScanFiles" + directory = "/nsls2/data/cms/shared/config/operations/specfiles/" file_prefix = "cms_scan_" + time.strftime("%Y_%m_%d") # # skip multiple motor scans diff --git a/startup/90-bluesky.py b/startup/90-bluesky.py index f940a38..d23c338 100644 --- a/startup/90-bluesky.py +++ b/startup/90-bluesky.py @@ -354,9 +354,6 @@ def pump_chm(onoff, q=0): if q == 0: print(ss) - -# PROFILE_ROOT = os.path.dirname(__file__) -# PROFILE_ROOT = '/nsls2/data/cms/legacy/xf11bm/ipython_profiles/profile_collection/startup' PROFILE_ROOT = "/home/xf11bm/.ipython/profile_collection/startup" CMS_CONFIG_FILENAME = os.path.join(PROFILE_ROOT, ".cms_config") @@ -372,7 +369,7 @@ def config_update(): current_config = { "bsx_pos": cms.bsx_pos, - #'armr_absorber_o':beam.armr_absorber_o, + 'armr_absorber_o':beam.armr_absorber_o, "_delta_y_hover": robot._delta_y_hover, "_delta_y_slot": robot._delta_y_slot, "_delta_garage_x": robot._delta_garage_x, diff --git a/startup/91-fit_scan.py b/startup/91-fit_scan.py index 3eb7423..f7d59a8 100644 --- a/startup/91-fit_scan.py +++ b/startup/91-fit_scan.py @@ -951,7 +951,7 @@ def fit_scan( detectors = get_beamline().detector plot_y = get_beamline().PLOT_Y - # plot_y = pilatus2M.stats4.total + # plot_y = pilatus2m-1.stats4.total # print("plot_y is {}".format(plot_y)) else: @@ -1037,7 +1037,8 @@ def fit_scan( # md['exposure_time'] = exposure_time_last # if plot_y=='pilatus300_stats4_total' or plot_y=='pilatus300_stats3_total': - if plot_y == "pilatus2M_stats4_total" or plot_y == "pilatus2M_stats3_total": + if plot_y == "pilatus2m-1_stats4_total" or plot_y == "pilatus2m-1_stats3_total": + #TODO: if plot_y == detector.name + '_stats4_total': remove_last_Pilatus_series() # check save_flg and save the scan data thru databroker @@ -1162,7 +1163,7 @@ def fit_edge( bec.enable_table() # if plot_y=='pilatus300_stats4_total' or plot_y=='pilatus300_stats3_total': - if plot_y == "pilatus2M_stats4_total" or plot_y == "pilatus2M_stats3_total": + if plot_y == "pilatus2m-1_stats4_total" or plot_y == "pilatus2m-1_stats3_total": remove_last_Pilatus_series() x0_guess = np.average(livetable.xdata) @@ -1398,7 +1399,7 @@ def _fit_scan(): # RE(scan(list(detectors), motor, start, stop, num, per_step=per_step, md=md), subs ) # if plot_y=='pilatus300_stats4_total' or plot_y=='pilatus300_stats3_total': - if plot_y == "pilatus2M_stats4_total" or plot_y == "pilatus2M_stats3_total": + if plot_y == "pilatus2m-1_stats4_total" or plot_y == "pilatus2m-1_stats3_total": remove_last_Pilatus_series() if fit is None: @@ -1518,17 +1519,17 @@ def ps( if uid == "-1": uid = -1 if det == "default": - if db[uid].start['detectors'][0] == "pilatus2M" and suffix == "default": - intensity_field = "pilatus2M_stats4_total" + if db[uid].start['detectors'][0] == "pilatus2m-1" and suffix == "default": + intensity_field = "pilatus2m-1_stats4_total" # intensity_field = "elm_sum_all" - elif db[uid].start['detectors'][0] == "pilatus2M": + elif db[uid].start['detectors'][0] == "pilatus2m-1": intensity_field = "elm" + suffix elif suffix == "default": intensity_field = db[uid].start['detectors'][0] + "_stats1_total" else: intensity_field = db[uid].start['detectors'][0] + suffix else: - if det == "pilatus2M" and suffix == "default": + if det == "pilatus2m-1" and suffix == "default": intensity_field = "elm_sum_all" elif det == "elm": intensity_field = "elm" + suffix diff --git a/startup/92-magics.py b/startup/92-magics.py index 7b2230e..dfb0487 100644 --- a/startup/92-magics.py +++ b/startup/92-magics.py @@ -1,4 +1,4 @@ -# BlueskyMagics were imported and registered in 00-startup.py +from bluesky.magics import BlueskyMagics BlueskyMagics.detectors = [pilatus2M] BlueskyMagics.positioners = [ diff --git a/startup/94-sample.py b/startup/94-sample.py index b07fa09..23140d5 100644 --- a/startup/94-sample.py +++ b/startup/94-sample.py @@ -1782,9 +1782,9 @@ def get_measurement_md(self, prefix=None, **md): # md_current['detector_sequence_ID'] = caget('XF:11BMB-ES{Det:SAXS}:cam1:FileNumber_RBV') # md_current['detector_sequence_ID'] = caget('XF:11BMB-ES{}:cam1:FileNumber_RBV'.format(pilatus_Epicsname)) - if get_beamline().detector[0].name == "pilatus300": + if get_beamline().detector[0].name == "pilatus300k-1": md_current["detector_sequence_ID"] = caget("XF:11BMB-ES{Det:SAXS}:cam1:FileNumber_RBV") - elif get_beamline().detector[0].name == "pilatus2M": + elif get_beamline().detector[0].name == "pilatus2m-1": md_current["detector_sequence_ID"] = caget("XF:11BMB-ES{Det:PIL2M}:cam1:FileNumber_RBV") md_current.update(get_beamline().get_md()) @@ -1814,10 +1814,10 @@ def _expose_manual(self, exposure_time=None, verbosity=3, poling_period=0.1, **m # caput('XF:11BMB-ES{}:cam1:AcquireTime'.format(pilatus_Epicsname), exposure_time) # caput('XF:11BMB-ES{}:cam1:AcquirePeriod'.format(pilatus_Epicsname), exposure_time+0.1) - if get_beamline().detector[0].name == "pilatus300": + if get_beamline().detector[0].name == "pilatus300k-1": caput("XF:11BMB-ES{Det:SAXS}:cam1:AcquireTime", exposure_time) caput("XF:11BMB-ES{Det:SAXS}:cam1:AcquirePeriod", exposure_time + 0.1) - elif get_beamline().detector[0].name == "pilatus2M": + elif get_beamline().detector[0].name == "pilatus2m-1": caput("XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime", exposure_time) caput("XF:11BMB-ES{Det:PIL2M}:cam1:AcquirePeriod", exposure_time + 0.1) @@ -1862,9 +1862,9 @@ def expose(self, exposure_time=None, extra=None, handlefile=True, verbosity=3, p exposure_time != detector.cam.acquire_time.get() ): # caget('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime'): RE(detector.setExposureTime(exposure_time, verbosity=verbosity)) - # if detector.name is 'pilatus800' and exposure_time != detector.cam.acquire_time.get(): #caget('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime'): + # if detector.name is "pilatus800k-1" and exposure_time != detector.cam.acquire_time.get(): #caget('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime'): # RE(detector.setExposureTime(exposure_time, verbosity=verbosity)) - # if detector.name is 'pilatus300' and exposure_time != detector.cam.acquire_time.get(): + # if detector.name is "pilatus300k-1" and exposure_time != detector.cam.acquire_time.get(): # detector.setExposureTime(exposure_time, verbosity=verbosity) ##extra wait time when changing the exposure time. ##time.sleep(2) @@ -1887,6 +1887,9 @@ def expose(self, exposure_time=None, extra=None, handlefile=True, verbosity=3, p md["beam_int_bim3"] = beam.bim3.flux(verbosity=0) md["beam_int_bim4"] = beam.bim4.flux(verbosity=0) md["beam_int_bim5"] = beam.bim5.flux(verbosity=0) + + if 'temperature_Linkam' in self.naming_scheme: + md["temperature_Linkam"] = LThermal.temperature() # md['trigger_time'] = self.clock() # md.update(md_current) @@ -1900,23 +1903,28 @@ def expose(self, exposure_time=None, extra=None, handlefile=True, verbosity=3, p # Wait for detectors to be ready max_exposure_time = 0.1 for detector in get_beamline().detector: - if detector.name == "pilatus300": + # print('here in expose:', detector.name) + if detector.name == "pilatus300k-1": + current_exposure_time = detector.cam.acquire_time.get() + max_exposure_time = max(max_exposure_time, current_exposure_time) + elif detector.name == "pilatus2m-1": current_exposure_time = detector.cam.acquire_time.get() max_exposure_time = max(max_exposure_time, current_exposure_time) - elif detector.name == "pilatus2M": + elif detector.name == "pilatus800k-1" or detector.name == "pilatus800k-2": current_exposure_time = detector.cam.acquire_time.get() max_exposure_time = max(max_exposure_time, current_exposure_time) - elif detector.name == "pilatus800" or detector.name == "pilatus8002": + + elif 'webcam' in detector.name: current_exposure_time = detector.cam.acquire_time.get() max_exposure_time = max(max_exposure_time, current_exposure_time) - # if detector.name is 'pilatus300': + # if detector.name is "pilatus300k-1": # current_exposure_time = caget('XF:11BMB-ES{Det:SAXS}:cam1:AcquireTime') # max_exposure_time = max(max_exposure_time, current_exposure_time) - # elif detector.name is 'pilatus2M': + # elif detector.name is "pilatus2m-1": # current_exposure_time = caget('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime') # max_exposure_time = max(max_exposure_time, current_exposure_time) - # elif detector.name is 'pilatus800': + # elif detector.name is "pilatus800k-1": # current_exposure_time = caget('XF:11BMB-ES{Det:PIL800K}:cam1:AcquireTime') # max_exposure_time = max(max_exposure_time, current_exposure_time) # elif detector.name is 'PhotonicSciences_CMS': @@ -1926,63 +1934,63 @@ def expose(self, exposure_time=None, extra=None, handlefile=True, verbosity=3, p if verbosity >= 1: print("WARNING: Didn't recognize detector '{}'.".format(detector.name)) - if verbosity >= 2: - status = 0 - while (status == 0) and (time.time() - start_time) < (max_exposure_time + 20): - percentage = 100 * (time.time() - start_time) / max_exposure_time - print( - "Exposing {:6.2f} s ({:3.0f}%) \r".format((time.time() - start_time), percentage), - end="", - ) + # if verbosity >= 2: + # status = 0 + # while (status == 0) and (time.time() - start_time) < (max_exposure_time + 20): + # percentage = 100 * (time.time() - start_time) / max_exposure_time + # print( + # "Exposing {:6.2f} s ({:3.0f}%) \r".format((time.time() - start_time), percentage), + # end="", + # ) - time.sleep(poling_period) + # time.sleep(poling_period) - status = 1 - for detector in get_beamline().detector: - if detector.cam.acquire.get() == 1: - status *= 0 + # status = 1 + # for detector in get_beamline().detector: + # if detector.cam.acquire.get() == 1: + # status *= 0 # print('counting .... percentage = {}'.format(percentage)) else: time.sleep(max_exposure_time) - # special solution for 2022_1/TKoga2 - if verbosity >= 5: - print("verbosity = {}.".format(verbosity)) - pct_threshold = 90 - while percentage < pct_threshold: - print("sth is wrong .... percentage = {} < {}%".format(percentage, pct_threshold)) - start_time = time.time() - uids = RE(count(get_beamline().detector), **md) - # yield from (count(get_beamline().detector), **md) - - # get_beamline().beam.off() - # print('shutter is off') - - # Wait for detectors to be ready - max_exposure_time = 0.1 - for detector in get_beamline().detector: - if detector.name == "pilatus300": - current_exposure_time = detector.cam.acquire_time.get() - max_exposure_time = max(max_exposure_time, current_exposure_time) - elif detector.name == "pilatus2M": - current_exposure_time = detector.cam.acquire_time.get() - max_exposure_time = max(max_exposure_time, current_exposure_time) - elif detector.name == "pilatus800" or detector.name == "pilatus8002": - current_exposure_time = detector.cam.acquire_time.get() - max_exposure_time = max(max_exposure_time, current_exposure_time) - - percentage = 100 * (time.time() - start_time) / max_exposure_time - print("After re-exposing .... percentage = {} ".format(percentage)) - - # if detector.name is 'pilatus300': + # # special solution for 2022_1/TKoga2 + # if verbosity >= 5: + # print("verbosity = {}.".format(verbosity)) + # pct_threshold = 90 + # while percentage < pct_threshold: + # print("sth is wrong .... percentage = {} < {}%".format(percentage, pct_threshold)) + # start_time = time.time() + # uids = RE(count(get_beamline().detector), **md) + # # yield from (count(get_beamline().detector), **md) + + # # get_beamline().beam.off() + # # print('shutter is off') + + # # Wait for detectors to be ready + # max_exposure_time = 0.1 + # for detector in get_beamline().detector: + # if detector.name == "pilatus300k-1": + # current_exposure_time = detector.cam.acquire_time.get() + # max_exposure_time = max(max_exposure_time, current_exposure_time) + # elif detector.name == "pilatus2m-1": + # current_exposure_time = detector.cam.acquire_time.get() + # max_exposure_time = max(max_exposure_time, current_exposure_time) + # elif detector.name == "pilatus800k-1" or detector.name == "pilatus800k-2": + # current_exposure_time = detector.cam.acquire_time.get() + # max_exposure_time = max(max_exposure_time, current_exposure_time) + + # percentage = 100 * (time.time() - start_time) / max_exposure_time + # print("After re-exposing .... percentage = {} ".format(percentage)) + + # if detector.name is "pilatus300k-1": # if caget('XF:11BMB-ES{Det:SAXS}:cam1:Acquire')==1: # status *= 0 - # elif detector.name is 'pilatus2M': + # elif detector.name is "pilatus2m-1": # if caget('XF:11BMB-ES{Det:PIL2M}:cam1:Acquire')==1: # status *= 0 - # elif detector.name is 'pilatus800': + # elif detector.name is "pilatus800k-1": # if caget('XF:11BMB-ES{Det:PIL800K}:cam1:Acquire')==1: # status *= 0 # elif detector.name is 'PhotonicSciences_CMS': @@ -2000,29 +2008,6 @@ def expose(self, exposure_time=None, extra=None, handlefile=True, verbosity=3, p get_beamline().beam.off() - # save the percentage information - # if verbosity>=5: - # folder = '/nsls2/data/cms/legacy/xf11bm/data/2022_1/TKoga2/' - # # filename = '' - - # current_data = {'a_sample': self.name, - # 'b_exposure_time': detector.cam.acquire_time.get(), - # 'c_exposure_percentage': percentage, - # 'd_align_time': md['filename'] - # } - - # temp_data = pds.DataFrame([current_data]) - - # # INT_FILENAME='{}/data/{}.csv'.format(os.path.dirname(__file__) , 'alignment_results.csv') - # INT_FILENAME='{}/data/{}.csv'.format(folder , 'exposure_info.csv') - - # if os.path.isfile(INT_FILENAME): - # output_data = pds.read_csv(INT_FILENAME, index_col=0) - # output_data = output_data.append(temp_data, ignore_index=True) - # output_data.to_csv(INT_FILENAME) - # else: - # temp_data.to_csv(INT_FILENAME) - if handlefile == True: for detector in get_beamline().detector: self.handle_file(detector, extra=extra, verbosity=verbosity, **md) @@ -2047,9 +2032,9 @@ def _expose_test(self, exposure_time=None, extra=None, handlefile=True, verbosit exposure_time != detector.cam.acquire_time.get() ): # caget('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime'): RE(detector.setExposureTime(exposure_time, verbosity=verbosity)) - # if detector.name is 'pilatus800' and exposure_time != detector.cam.acquire_time.get(): #caget('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime'): + # if detector.name is "pilatus800k-1" and exposure_time != detector.cam.acquire_time.get(): #caget('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime'): # RE(detector.setExposureTime(exposure_time, verbosity=verbosity)) - # if detector.name is 'pilatus300' and exposure_time != detector.cam.acquire_time.get(): + # if detector.name is "pilatus300k-1" and exposure_time != detector.cam.acquire_time.get(): # detector.setExposureTime(exposure_time, verbosity=verbosity) ##extra wait time when changing the exposure time. ##time.sleep(2) @@ -2089,13 +2074,13 @@ def _expose_test(self, exposure_time=None, extra=None, handlefile=True, verbosit # Wait for detectors to be ready max_exposure_time = 0.1 for detector in get_beamline().detector: - if detector.name == "pilatus300": + if detector.name == "pilatus300k-1": current_exposure_time = caget("XF:11BMB-ES{Det:SAXS}:cam1:AcquireTime") max_exposure_time = max(max_exposure_time, current_exposure_time) - elif detector.name == "pilatus2M": + elif detector.name == "pilatus2m-1": current_exposure_time = caget("XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime") max_exposure_time = max(max_exposure_time, current_exposure_time) - elif detector.name == "pilatus800": + elif detector.name == "pilatus800k-1": current_exposure_time = caget("XF:11BMB-ES{Det:PIL800K}:cam1:AcquireTime") max_exposure_time = max(max_exposure_time, current_exposure_time) # elif detector.name is 'PhotonicSciences_CMS': @@ -2118,13 +2103,13 @@ def _expose_test(self, exposure_time=None, extra=None, handlefile=True, verbosit status = 1 for detector in get_beamline().detector: - if detector.name == "pilatus300": + if detector.name == "pilatus300k-1": if caget("XF:11BMB-ES{Det:SAXS}:cam1:Acquire") == 1: status *= 0 - elif detector.name == "pilatus2M": + elif detector.name == "pilatus2m-1": if caget("XF:11BMB-ES{Det:PIL2M}:cam1:Acquire") == 1: status *= 0 - elif detector.name == "pilatus800": + elif detector.name == "pilatus800k-1": if caget("XF:11BMB-ES{Det:PIL800K}:cam1:Acquire") == 1: status *= 0 # elif detector.name is 'PhotonicSciences_CMS': @@ -2153,24 +2138,25 @@ def _expose_test(self, exposure_time=None, extra=None, handlefile=True, verbosit def handle_file(self, detector, extra=None, verbosity=3, subdirs=True, linksave=True, **md): subdir = "" if subdirs: - if detector.name == "pilatus300" or detector.name == "pilatus8002": + if detector.name == "pilatus300k-1" or detector.name == "pilatus800k-2": subdir = "/maxs/raw/" detname = "maxs" - elif detector.name == "pilatus2M": + elif detector.name == "pilatus2m-1": subdir = "/saxs/raw/" detname = "saxs" - elif detector.name == "pilatus800": + elif detector.name == "pilatus800k-1": subdir = "/waxs/raw/" detname = "waxs" + elif 'webcam' in detector.name: + subdir = "/camera/" + detname = detector.name + else: if verbosity >= 1: print("WARNING: Can't do file handling for detector '{}'.".format(detector.name)) return filename = detector.tiff.full_file_name.get() # RL, 20210831 - if not os.path.isfile(filename): - print("File does not exist") - return # Alternate method to get the last filename # filename = '{:s}/{:s}.tiff'.format( detector.tiff.file_path.get(), detector.tiff.file_name.get() ) @@ -2189,32 +2175,35 @@ def handle_file(self, detector, extra=None, verbosity=3, subdirs=True, linksave= # savename = self.get_savename(savename_extra=extra) savename = md["filename"] # link_name = '{}/{}{}_{:04d}_maxs.tiff'.format(RE.md['experiment_alias_directory'], subdir, savename, RE.md['scan_id']-1) - link_name = "{}/{}{}_{}.tiff".format(RE.md["experiment_alias_directory"], subdir, savename, detname) - - if os.path.isfile(link_name): - i = 1 - while os.path.isfile("{}.{:d}".format(link_name, i)): - i += 1 - os.rename(link_name, "{}.{:d}".format(link_name, i)) - os.symlink(filename, link_name) - - - #debug the losing data issue on pil2m. suggested by T. Caswell - # with open(link_name, 'rb') as fin: - # h = hashlib.md5(fin.read(1024)).hexdigest() - # with open(link_name + '.md5', 'w') as fout: - # fout.write(h) - - - if verbosity >= 3: - print(" Data linked as: {}".format(link_name)) - if not os.path.isfile(os.readlink(link_name)): #added by RL, 20231109 - raise ValueError('NO IMAGE OUTPUT.') + link_name = "{}/{}{}_000000_{}.tiff".format(RE.md["experiment_alias_directory"], subdir, savename, detname).replace('//','/') + # if 'camera' in detector.name: + # link_name = "{}/{}{}_000000_{}.png".format(RE.md["experiment_alias_directory"], subdir, savename, detname).replace('//','/') + print(f" A symlink will be created at: {proposal_path()}experiments/{link_name}") + + # if os.path.isfile(link_name): + # i = 1 + # while os.path.isfile("{}.{:d}".format(link_name, i)): + # i += 1 + # os.rename(link_name, "{}.{:d}".format(link_name, i)) + # os.symlink(filename, link_name) + + + # #debug the losing data issue on pil2m. suggested by T. Caswell + # # with open(link_name, 'rb') as fin: + # # h = hashlib.md5(fin.read(1024)).hexdigest() + # # with open(link_name + '.md5', 'w') as fout: + # # fout.write(h) + + + # if verbosity >= 3: + # print(" Data linked as: {}".format(link_name)) + # if not os.path.isfile(os.readlink(link_name)): #added by RL, 20231109 + # raise ValueError('NO IMAGE OUTPUT.') def _old_handle_file(self, detector, extra=None, verbosity=3, subdirs=True, linksave=True, **md): subdir = "" - if detector.name == "pilatus300" or detector.name == "pilatus8002": + if detector.name == "pilatus300k-1" or detector.name == "pilatus800k-2": # chars = caget('XF:11BMB-ES{Det:SAXS}:TIFF1:FullFileName_RBV') # filename = ''.join(chr(char) for char in chars)[:-1] filename = detector.tiff.full_file_name.get() # RL, 20210831 @@ -2254,7 +2243,7 @@ def _old_handle_file(self, detector, extra=None, verbosity=3, subdirs=True, link if verbosity >= 3: print(" Data linked as: {}".format(link_name)) - elif detector.name == "pilatus2M": + elif detector.name == "pilatus2m-1": foldername = "/nsls2/xf11bm/" # chars = caget('XF:11BMB-ES{Det:PIL2M}:TIFF1:FullFileName_RBV') @@ -2301,7 +2290,7 @@ def _old_handle_file(self, detector, extra=None, verbosity=3, subdirs=True, link if verbosity >= 3: print(" Data linked as: {}".format(link_name)) - elif detector.name == "pilatus800": + elif detector.name == "pilatus800k-1": foldername = "/nsls2/xf11bm/" # chars = caget('XF:11BMB-ES{Det:PIL800K}:TIFF1:FullFileName_RBV') @@ -2829,7 +2818,7 @@ def measureRock( md_current["sample_savename"] = savename md_current["measure_type"] = measure_type # md_current['filename'] = '{:s}_{:04d}.tiff'.format(savename, md_current['detector_sequence_ID']) - md_current["filename"] = "{:s}_{:04d}.tiff".format(savename, RE.md["scan_id"]) + md_current["filename"] = "{:s}_{:04d}".format(savename, RE.md["scan_id"]) md_current["beam_int_bim3"] = beam.bim3.flux(verbosity=0) md_current["beam_int_bim4"] = beam.bim4.flux(verbosity=0) md_current["beam_int_bim5"] = beam.bim5.flux(verbosity=0) @@ -2874,7 +2863,7 @@ def measureRock( # Wait for detectors to be ready max_exposure_time = 0 for detector in get_beamline().detector: - if detector.name in {"pilatus300", "pilatus800", "pilatus2M", "pilatus8002"}: + if detector.name in {"pilatus300k-1", "pilatus800k-1", "pilatus2m-1", "pilatus800k-2"}: max_exposure_time = detector.cam.acquire_time.get() else: if verbosity >= 1: @@ -2939,8 +2928,8 @@ def measure_single(self, exposure_time=None, extra=None, measure_type="measure", md_current.update(self.get_measurement_md()) md_current["sample_savename"] = savename md_current["measure_type"] = measure_type - # md_current['filename'] = '{:s}_{:04d}.tiff'.format(savename, md_current['detector_sequence_ID']) - # md_current['filename'] = '{:s}_{:04d}.tiff'.format(savename, RE.md['scan_id']) + # md_current['filename'] = '{:s}_{:04d}'.format(savename, md_current['detector_sequence_ID']) + # md_current['filename'] = '{:s}_{:04d}'.format(savename, RE.md['scan_id']) md_current["filename"] = "{:s}_{:06d}".format(savename, RE.md["scan_id"]) md_current.update(md) @@ -2988,8 +2977,8 @@ def _test_measure_single( md_current["measure_type"] = measure_type md_current.update(self.get_measurement_md()) - # md_current['filename'] = '{:s}_{:04d}.tiff'.format(savename, md_current['detector_sequence_ID']) - md_current["filename"] = "{:s}_{:04d}.tiff".format(savename, RE.md["scan_id"]) + # md_current['filename'] = '{:s}_{:04d}'.format(savename, md_current['detector_sequence_ID']) + md_current["filename"] = "{:s}_{:04d}".format(savename, RE.md["scan_id"]) md_current.update(md) self._test_expose(exposure_time, shutteronoff=shutteronoff, extra=extra, verbosity=verbosity, **md_current) self.md["measurement_ID"] += 1 @@ -3039,7 +3028,7 @@ def _test_expose( # Wait for detectors to be ready max_exposure_time = 0 for detector in get_beamline().detector: - if detector.name in {"pilatus300", "pilatus2M"}: + if detector.name in {"pilatus300k-1", "pilatus2m-1"}: current_exposure_time = caget("XF:11BMB-ES{}:cam1:AcquireTime".format(pilatus_Epicsname)) max_exposure_time = max(max_exposure_time, current_exposure_time) elif detector.name == "PhotonicSciences_CMS": @@ -3068,7 +3057,7 @@ def _test_expose( status = 1 for detector in get_beamline().detector: - if detector.name == "pilatus300" or "pilatus2M": + if detector.name == "pilatus300k-1" or "pilatus2m-1": print("status2.5 = ", status) if caget("XF:11BMB-ES{}:cam1:Acquire".format(pilatus_Epicsname)) == 1: status = 0 @@ -3403,7 +3392,7 @@ def scan_measure( md_current["scan"] = "scan_measure" md_current.update(self.get_measurement_md()) md_current["measure_series_num_frames"] = num_frames - md_current["filename"] = "{:s}_{:04d}.tiff".format(savename, RE.md["scan_id"]) + md_current["filename"] = "{:s}_{:04d}".format(savename, RE.md["scan_id"]) md_current["measure_series_motor"] = motor.name md_current["measure_series_positions"] = [start, stop] md_current["exposure_time"] = exposure_time @@ -3508,16 +3497,16 @@ def series_measure( md_current["measure_type"] = measure_type md_current["series"] = "series_measure" md_current.update(self.get_measurement_md()) - # md_current['filename'] = '{:s}_{:04d}.tiff'.format(savename, md_current['detector_sequence_ID']) + # md_current['filename'] = '{:s}_{:04d}'.format(savename, md_current['detector_sequence_ID']) md_current["measure_series_num_frames"] = num_frames - md_current["filename"] = "{:s}_{:04d}.tiff".format(savename, RE.md["scan_id"]) - # md_current['filename'] = '{:s}_{:04d}.tiff'.format(savename, RE.md['scan_id']+1) + md_current["filename"] = "{:s}_{:04d}".format(savename, RE.md["scan_id"]) + # md_current['filename'] = '{:s}_{:04d}'.format(savename, RE.md['scan_id']+1) md_current["exposure_time"] = exposure_time md_current["exposure_period"] = exposure_period # md_current['measure_series_motor'] = motor.name # md_current['measure_series_positions'] = [start, stop] - # md_current['fileno'] = '{:s}_{:04d}.tiff'.format(savename, RE.md['scan_id']) + # md_current['fileno'] = '{:s}_{:04d}'.format(savename, RE.md['scan_id']) md_current.update(md) print(RE.md["scan_id"]) @@ -3651,7 +3640,7 @@ def initialDetector(self): def _old_handle_fileseries(self, detector, num_frames=None, extra=None, verbosity=3, subdirs=True, **md): subdir = "" - if detector.name == "pilatus300" or detector.name == "pilatus8002": + if detector.name == "pilatus300k-1" or detector.name == "pilatus800k-2": filename = detector.tiff.full_file_name.get() # RL, 20210831 print("pilatus300k data handling") @@ -3700,7 +3689,7 @@ def _old_handle_fileseries(self, detector, num_frames=None, extra=None, verbosit if num_frame == 0 or num_frame == np.max(num_frames): print(" Data {} linked as: {}".format(filename_new, link_name_new)) - elif detector.name == "pilatus2M": + elif detector.name == "pilatus2m-1": # chars = caget('XF:11BMB-ES{Det:PIL2M}:TIFF1:FullFileName_RBV') # filename = ''.join(chr(char) for char in chars)[:-1] # filename_part1 = ''.join(chr(char) for char in chars)[:-13] @@ -3757,12 +3746,12 @@ def _old_handle_fileseries(self, detector, num_frames=None, extra=None, verbosit if num_frame == 0 or num_frame == np.max(num_frames): print(" Data {} linked as: {}".format(filename_new, link_name_new)) - # elif detector.name is 'pilatus800': + # elif detector.name is "pilatus800k-1": # chars = caget('XF:11BMB-ES{Det:PIL800K}:TIFF1:FullFileName_RBV') # filename = ''.join(chr(char) for char in chars)[:-1] # filename_part1 = ''.join(chr(char) for char in chars)[:-13] - elif detector.name == "pilatus800": + elif detector.name == "pilatus800k-1": foldername = "/nsls2/xf11bm/" # chars = caget('XF:11BMB-ES{Det:PIL800K}:TIFF1:FullFileName_RBV') @@ -3829,15 +3818,15 @@ def _old_handle_fileseries(self, detector, num_frames=None, extra=None, verbosit def handle_fileseries(self, detector, num_frames=None, extra=None, verbosity=3, subdirs=True, **md): subdir = "" if subdirs: - if detector.name == "pilatus300" or detector.name == "pilatus8002": + if detector.name == "pilatus300k-1" or detector.name == "pilatus800k-2": subdir = "/maxs/raw/" detname = "maxs" print("{} data handling".format(detector.name)) - elif detector.name == "pilatus2M": + elif detector.name == "pilatus2m-1": subdir = "/saxs/raw/" detname = "saxs" print("pilatus2M data handling") - elif detector.name == "pilatus800": + elif detector.name == "pilatus800k-1": subdir = "/waxs/raw/" detname = "waxs" print("pilatus800k data handling") @@ -3846,8 +3835,8 @@ def handle_fileseries(self, detector, num_frames=None, extra=None, verbosity=3, print("WARNING: Can't do file handling for detector '{}'.".format(detector.name)) return - filename = detector.tiff.full_file_name.get() # RL, 20210831 - filename_part1 = "{:s}/{:s}".format(detector.tiff.file_path.get(), detector.tiff.file_name.get()) + # filename = detector.tiff.full_file_name.get() # RL, 20210831 + # filename_part1 = "{:s}/{:s}".format(detector.tiff.file_path.get(), detector.tiff.file_name.get()) # Alternate method to get the last filename # filename = '{:s}/{:s}.tiff'.format( detector.tiff.file_path.get(), detector.tiff.file_name.get() ) @@ -3864,42 +3853,37 @@ def handle_fileseries(self, detector, num_frames=None, extra=None, verbosity=3, # savename = md['filename'][:-5] savename = self.get_savename(savename_extra=extra) - link_name = "{}/{}{}_{:06d}_{}.tiff".format( - RE.md["experiment_alias_directory"], - subdir, - savename, - RE.md["scan_id"] - 1, - detname, - ) - link_name_part1 = "{}/{}{}_{:06d}".format( - RE.md["experiment_alias_directory"], - subdir, - savename, - RE.md["scan_id"] - 1, - ) + # savename = RE.md["filename"] + # link_name = "{}/{}{}_{:06d}_{}.tiff".format( + # RE.md["experiment_alias_directory"], + # subdir, + # savename, + # RE.md["scan_id"] - 1, + # detname, + # ) + # link_name_part1 = "{}/{}{}_{:06d}".format( + # RE.md["experiment_alias_directory"], + # subdir, + # savename, + # RE.md["scan_id"] - 1, + # ) # link_name = '{}/{}{}_{:06d}_{}.tiff'.format(RE.md['experiment_alias_directory'], subdir, savename, RE.md['scan_id'], detname) # link_name_part1 = '{}/{}{}_{:06d}'.format(RE.md['experiment_alias_directory'], subdir, savename, RE.md['scan_id']) - if os.path.isfile(link_name): - i = 1 - while os.path.isfile("{}.{:d}".format(link_name, i)): - i += 1 - os.rename(link_name, "{}.{:d}".format(link_name, i)) + # for num_frame in range(num_frames): + # filename_new = "{}_{:06d}.tiff".format(filename_part1, num_frame) + # if os.path.isfile(filename_new) == False: + # return print("File number {} does not exist.".format(num_frame)) - for num_frame in range(num_frames): - filename_new = "{}_{:06d}.tiff".format(filename_part1, num_frame) - if os.path.isfile(filename_new) == False: - return print("File number {} does not exist.".format(num_frame)) - - link_name_new = "{}_{:06d}_{}.tiff".format(link_name_part1, num_frame, detname) - os.symlink(filename_new, link_name_new) - if verbosity >= 3: - if num_frame == 0 or num_frame == np.max(num_frames): - print(" Data {} linked as: {}".format(filename_new, link_name_new)) - savename = self.get_savename(savename_extra=extra) + # link_name_new = "{}_{:06d}_{}.tiff".format(link_name_part1, num_frame, detname) + # os.symlink(filename_new, link_name_new) + # if verbosity >= 3: + # if num_frame == 0 or num_frame == np.max(num_frames): + # print(" Data {} linked as: {}".format(filename_new, link_name_new)) # savename = md['filename'] # link_name = '{}/{}{}_{:04d}_maxs.tiff'.format(RE.md['experiment_alias_directory'], subdir, savename, RE.md['scan_id']-1) - link_name = "{}/{}{}_{}.tiff".format(RE.md["experiment_alias_directory"], subdir, savename, detname) + link_name = "{}/{}{}_{}_000000_{}.tiff".format(RE.md["experiment_alias_directory"], subdir, savename, RE.md["scan_id"] - 1, detname).replace('//', '/') + print(f" Symlinks will be created at: {proposal_path()}experiments/{link_name}") # Control methods ######################################## @@ -4067,7 +4051,7 @@ def transmission_data_output(self): # beam.absorber_transmission_list = [1, 0.041, 0.0017425, 0.00007301075, 0.00000287662355, 0.000000122831826, 0.00000000513437] scan_id = h.start["scan_id"] I_bim5 = 0 # beam intensity from bim5 - I0 = dtable.pilatus2M_stats4_total + I0 = dtable['pilatus2m-1_stats4_total'] filename = h.start["sample_name"] exposure_time = h.start["sample_exposure_time"] diff --git a/startup/94-sample.py.save b/startup/94-sample.py.save index e8f62b6..cf515c2 100755 --- a/startup/94-sample.py.save +++ b/startup/94-sample.py.save @@ -1294,9 +1294,9 @@ class Sample_Generic(CoordinateSystem): #md_current['detector_sequence_ID'] = caget('XF:11BMB-ES{Det:SAXS}:cam1:FileNumber_RBV') #md_current['detector_sequence_ID'] = caget('XF:11BMB-ES{}:cam1:FileNumber_RBV'.format(pilatus_Epicsname)) - if get_beamline().detector[0].name is 'pilatus300': + if get_beamline().detector[0].name is "pilatus300k-1": md_current['detector_sequence_ID'] = caget('XF:11BMB-ES{Det:SAXS}:cam1:FileNumber_RBV') - elif get_beamline().detector[0].name is 'pilatus2M': + elif get_beamline().detector[0].name is "pilatus2m-1": md_current['detector_sequence_ID'] = caget('XF:11BMB-ES{Det:PIL2M}:cam1:FileNumber_RBV') md_current.update(get_beamline().get_md()) @@ -1327,10 +1327,10 @@ class Sample_Generic(CoordinateSystem): #caput('XF:11BMB-ES{}:cam1:AcquireTime'.format(pilatus_Epicsname), exposure_time) #caput('XF:11BMB-ES{}:cam1:AcquirePeriod'.format(pilatus_Epicsname), exposure_time+0.1) - if get_beamline().detector[0].name is 'pilatus300': + if get_beamline().detector[0].name is "pilatus300k-1": caput('XF:11BMB-ES{Det:SAXS}:cam1:AcquireTime', exposure_time) caput('XF:11BMB-ES{Det:SAXS}:cam1:AcquirePeriod', exposure_time+0.1) - elif get_beamline().detector[0].name is 'pilatus2M': + elif get_beamline().detector[0].name is "pilatus2m-1": caput('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime', exposure_time) caput('XF:11BMB-ES{Det:PIL2M}:cam1:AcquirePeriod', exposure_time+0.1) @@ -1367,7 +1367,7 @@ class Sample_Generic(CoordinateSystem): if exposure_time is not None: #for detector in gs.DETS: for detector in get_beamline().detector: - if detector.name is 'pilatus2M' and exposure_time != caget('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime'): + if detector.name is "pilatus2m-1" and exposure_time != caget('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime'): detector.setExposureTime(exposure_time, verbosity=verbosity) #extra wait time when changing the exposure time. time.sleep(2) @@ -1398,10 +1398,10 @@ class Sample_Generic(CoordinateSystem): # Wait for detectors to be ready max_exposure_time = 0 for detector in get_beamline().detector: - if detector.name is 'pilatus300': + if detector.name is "pilatus300k-1": current_exposure_time = caget('XF:11BMB-ES{Det:SAXS}:cam1:AcquireTime') max_exposure_time = max(max_exposure_time, current_exposure_time) - elif detector.name is 'pilatus2M': + elif detector.name is "pilatus2m-1": current_exposure_time = caget('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime') max_exposure_time = max(max_exposure_time, current_exposure_time) elif detector.name is 'PhotonicSciences_CMS': @@ -1420,10 +1420,10 @@ class Sample_Generic(CoordinateSystem): status = 1 for detector in get_beamline().detector: - if detector.name is 'pilatus300': + if detector.name is "pilatus300k-1": if caget('XF:11BMB-ES{Det:SAXS}:cam1:Acquire')==1: status *= 0 - elif detector.name is 'pilatus2M': + elif detector.name is "pilatus2m-1": if caget('XF:11BMB-ES{Det:PIL2M}:cam1:Acquire')==1: status *= 0 elif detector.name is 'PhotonicSciences_CMS': @@ -1454,7 +1454,7 @@ class Sample_Generic(CoordinateSystem): subdir = '' - if detector.name is 'pilatus300': + if detector.name is "pilatus300k-1": chars = caget('XF:11BMB-ES{Det:SAXS}:TIFF1:FullFileName_RBV') filename = ''.join(chr(char) for char in chars)[:-1] @@ -1489,7 +1489,7 @@ class Sample_Generic(CoordinateSystem): if verbosity>=3: print(' Data linked as: {}'.format(link_name)) - elif detector.name is 'pilatus2M': + elif detector.name is "pilatus2m-1": chars = caget('XF:11BMB-ES{Det:PIL2M}:TIFF1:FullFileName_RBV') filename = ''.join(chr(char) for char in chars)[:-1] @@ -1754,7 +1754,7 @@ class Sample_Generic(CoordinateSystem): # Wait for detectors to be ready max_exposure_time = 0 for detector in get_beamline().detector: - if detector.name is 'pilatus300' or 'pilatus2M': + if detector.name is "pilatus300k-1" or "pilatus2m-1": current_exposure_time = caget('XF:11BMB-ES{}:cam1:AcquireTime'.format(pilatus_Epicsname)) max_exposure_time = max(max_exposure_time, current_exposure_time) elif detector.name is 'PhotonicSciences_CMS': @@ -1780,7 +1780,7 @@ class Sample_Generic(CoordinateSystem): status = 1 for detector in get_beamline().detector: - if detector.name is 'pilatus300' or 'pilatus2M': + if detector.name is "pilatus300k-1" or "pilatus2m-1": print('status2.5 = ', status) if caget('XF:11BMB-ES{}:cam1:Acquire'.format(pilatus_Epicsname))==1: status = 0 diff --git a/startup/95-sample-custom.py b/startup/95-sample-custom.py index 2df3b49..2ea8f6d 100644 --- a/startup/95-sample-custom.py +++ b/startup/95-sample-custom.py @@ -973,7 +973,7 @@ def do(self, step=0, align_step=0, **md): # detselect(pilatus300) detselect(pilatus2M) for detector in get_beamline().detector: - if detector.name == "pilatus2M": + if detector.name == "pilatus2m-1": RE(detector.setExposureTime(self.md["exposure_time"])) else: detector.setExposureTime(self.md["exposure_time"]) diff --git a/startup/992-PTA-mobile.py b/startup/992-PTA-mobile.py index f6ab5cc..1c42f55 100644 --- a/startup/992-PTA-mobile.py +++ b/startup/992-PTA-mobile.py @@ -148,9 +148,9 @@ # army = EpicsMotor("XF:11BMB-ES{SM:1-Ax:Y}Mtr", name="army") # # armr = EpicsMotor('XF:11BMB-ES{SM:1-Ax:ArmR}Mtr', name='armr') -# # The SmarAct module is broken. Need to change to a SPARE_S for armr -# # changed from spareM to spareS by RL at 2011/07/23 -# # armr = EpicsMotor("XF:11BMB-ES{Spare:L-Ax:S}Mtr", name="armr") +# The SmarAct module is broken. Need to change to a SPARE_S for armr +# changed from spareM to spareS by RL at 2011/07/23 +# armr = EpicsMotor("XF:11BMB-ES{Spare:L-Ax:S}Mtr", name="armr") # ## stages for detectors diff --git a/startup/beamstop_config.cfg b/startup/beamstop_config.cfg index 39ac60c..14b199b 100755 --- a/startup/beamstop_config.cfg +++ b/startup/beamstop_config.cfg @@ -35,6 +35,30 @@ "bsy": -12.799769, "bsphi": -61.001744, "timestamp": "2025-06-26 17:04:33" + }, + { + "bsx": -18.000815999999997, + "bsy": -12.599539, + "bsphi": -61.003749, + "timestamp": "2025-07-31 10:23:39" + }, + { + "bsx": -18.000815999999997, + "bsy": -12.599539, + "bsphi": -61.003749, + "timestamp": "2025-07-31 10:23:50" + }, + { + "bsx": -18.200816, + "bsy": -12.599538999999998, + "bsphi": -61.00361100000001, + "timestamp": "2025-07-31 12:07:26" + }, + { + "bsx": -18.000816, + "bsy": -12.399296, + "bsphi": -61.005459, + "timestamp": "2025-07-31 15:33:26" } ], "round_17": [ @@ -117,6 +141,12 @@ "bsy": 17.001509, "bsphi": -181.005665, "timestamp": "2025-06-17 09:46:10" + }, + { + "bsx": -16.900647, + "bsy": 17.001970999999998, + "bsphi": -181.008503, + "timestamp": "2025-07-30 19:33:32" } ], "round_3m": [ diff --git a/startup/user_collection/user_HighVoltage.py b/startup/user_collection/user_HighVoltage.py index 4d24780..31933f5 100644 --- a/startup/user_collection/user_HighVoltage.py +++ b/startup/user_collection/user_HighVoltage.py @@ -789,7 +789,7 @@ def waxs_on_inner(): # for inner-outer stitching # cms.SAXS.setCalibration([748, 1680-590], 2.01, [-64, -73]) # 13.5 keV cms.SAXS.setCalibration([761, 1680 - 606], 5.0, [-65, -73]) -RE.md["experiment_alias_directory"] = "/nsls2/data/cms/legacy/xf11bm/data/2022_1/LZhu2/" +RE.md["experiment_alias_directory"] = proposal_path() + "experiments/LZhu2/" if True: cali = CapillaryHolder(base=stg) diff --git a/startup/user_collection/user_LinkamTensile.py b/startup/user_collection/user_LinkamTensile.py index 3a8b173..08aed26 100644 --- a/startup/user_collection/user_LinkamTensile.py +++ b/startup/user_collection/user_LinkamTensile.py @@ -39,7 +39,7 @@ # RE.install_suspender(sus) -RE.md["experiment_alias_directory"] = "/nsls2/data/cms/legacy/xf11bm/data/2023_1/beamline" +RE.md["experiment_alias_directory"] = proposal_path() + "experiments/beamline" # cms.SAXS.setCalibration([737, 1680-582], 3, [-65, -73]) #3m, 13.5kev # cms.SAXS.setCalibration([738, 1097], 3.0, [-65, -73]) #3m,13.5kev # cms.SAXS.setCalibration([738, 1680-590], 2, [-65, -73]) diff --git a/startup/user_collection/user_LinkamThermal.py b/startup/user_collection/user_LinkamThermal.py index d5c7cbc..ca24da9 100644 --- a/startup/user_collection/user_LinkamThermal.py +++ b/startup/user_collection/user_LinkamThermal.py @@ -25,7 +25,7 @@ # RE.install_suspender(sus) -RE.md["experiment_alias_directory"] = "/nsls2/data/cms/legacy/xf11bm/data/2023_1/beamline/Commissioning" +RE.md["experiment_alias_directory"] = proposal_path() + "experiments/beamline/Commissioning" # cms.SAXS.setCalibration([737, 1680-582], 3, [-65, -73]) #3m, 13.5kev # cms.SAXS.setCalibration([738, 1097], 3.0, [-65, -73]) #3m,13.5kev # cms.SAXS.setCalibration([738, 1680-590], 2, [-65, -73]) @@ -249,20 +249,20 @@ def series_measure( RE(detector.setExposurePeriod(exposure_period)) RE(detector.setExposureNumber(num_frames)) - # if detector.name is 'pilatus2M': + # if detector.name is "pilatus2m-1": # if exposure_time != caget('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime'): # caput('XF:11BMB-ES{Det:PIL2M}:cam1:AcquireTime', exposure_time) # caput('XF:11BMB-ES{Det:PIL2M}:cam1:AcquirePeriod', exposure_period) # caput('XF:11BMB-ES{Det:PIL2M}:cam1:NumImages', num_frames) - # if detector.name is 'pilatus800': + # if detector.name is "pilatus800k-1": # if exposure_time != caget('XF:11BMB-ES{Det:PIL800K}:cam1:AcquireTime'): # caput('XF:11BMB-ES{Det:PIL800K}:cam1:AcquireTime', exposure_time) # caput('XF:11BMB-ES{Det:PIL800K}:cam1:AcquirePeriod', exposure_period) # caput('XF:11BMB-ES{Det:PIL800K}:cam1:NumImages', num_frames) - # if detector.name is 'pilatus300' : + # if detector.name is "pilatus300k-1" : # if exposure_time != caget('XF:11BMB-ES{Det:SAXS}:cam1:AcquireTime'): # caput('XF:11BMB-ES{Det:SAXS}:cam1:AcquireTime', exposure_time) # caput('XF:11BMB-ES{Det:SAXS}:cam1:AcquirePeriod', exposure_period) diff --git a/startup/user_collection/user_TSAXSWAXS_stitching.py b/startup/user_collection/user_TSAXSWAXS_stitching.py index 6ef33d0..ea7cb57 100755 --- a/startup/user_collection/user_TSAXSWAXS_stitching.py +++ b/startup/user_collection/user_TSAXSWAXS_stitching.py @@ -787,7 +787,7 @@ def waxs_on_inner(): # for inner-outer stitching # cms.SAXS.setCalibration([748, 1680-590], 2.01, [-64, -73]) # 13.5 keV cms.SAXS.setCalibration([761, 1680 - 606], 5.0, [-65, -73]) -RE.md["experiment_alias_directory"] = "/nsls2/data/cms/legacy/xf11bm/data/2022_1/LZhu/" +RE.md["experiment_alias_directory"] = proposal_path() + "experiments/LZhu/" if True: cali = CapillaryHolder(base=stg) diff --git a/startup/user_collection/user_openMAXS.py.LZhu2022C1 b/startup/user_collection/user_openMAXS.py.LZhu2022C1 index eed9dea..8c9cf0c 100644 --- a/startup/user_collection/user_openMAXS.py.LZhu2022C1 +++ b/startup/user_collection/user_openMAXS.py.LZhu2022C1 @@ -766,7 +766,7 @@ def waxs_on_inner(): #for inner-outer stitching #cms.SAXS.setCalibration([748, 1680-590], 2.01, [-64, -73]) # 13.5 keV cms.SAXS.setCalibration([761, 1680-606], 5.8, [-65, -73]) -RE.md['experiment_alias_directory'] = '/nsls2/data/cms/legacy/xf11bm/data/2022_1/LZhu3/' +RE.md['experiment_alias_directory'] = proposal_path() + "experiments/LZhu3/" if True: