def has_pe1signal(header): """Return True if header contains a non-trivial pe1_image_lightfield. pe1_image_lightfield must exist and it must have at least 10 unique values. """ from dataportal import get_images, get_events from filestore.handlers import IntegrityError detname = 'pe1_image_lightfield' if not header.descriptors: return False e = next(get_events(header, fill=False)) if detname not in e.data: return False try: imgs = get_images(header, 'pe1_image_lightfield') except (IntegrityError, IOError): return False A = imgs.get_frame(0) uniquevalues = set(A.flatten()) rv = (len(uniquevalues) >= 10) return rv
def save_tiff(headers, dark_subtraction = True, *, max_count = None): ''' save images obtained from dataBroker as tiff format files. It returns nothing. arguments: headers - list - a list of header objects obtained from a query to dataBroker ''' F_EXTEN = '.tiff' e = '''Can not find a proper dark image applied to this header. Files will be saved but not no dark subtraction will be applied''' is_dark_subtracted = False # assume not has been done # prepare header if type(list(headers)[1]) == str: header_list = list() header_list.append(headers) else: header_list = headers for header in header_list: print('Saving your image(s) now....') # information at header level img_field = _identify_image_field(header) for ev in get_events(header): img = ev['data'][img_field] ind = ev['seq_num'] f_name = _feature_gen(header) event_timestamp = ev['timestamps']['pe1_image'] # time when triggering area detector # dark subtration logic if dark_subtraction: try: dark_uid_appended = header.start['sc_params']['dk_field_uid'] try: # bluesky only looks for uid it defines dark_search = {'group':'XPD','xp_dark_uid':dark_uid_appended} # this should be refine later dark_header = db(**dark_search) dark_img = np.array(get_images(dark_header, img_field)).squeeze() except ValueError: print(e) # protection. Should not happen dark_img = np.zeros_like(light_imgs) img -= dark_img is_dark_subtracted = True # label it only if it is successfully done except KeyError: print(e) # backward support. For scans with auto_dark turned off pass # complete file name f_name = f_name +_timestampstr(event_timestamp) if is_dark_subtracted: f_name = 'sub_' + f_name if 'temperature' in ev['data']: f_name = f_name + '_'+str(ev['data']['temperature'])+'K' # index is still needed as we don't want timestamp in file name down to seconds combind_f_name = '{}_{}{}'.format(f_name, ind, F_EXTEN) w_name = os.path.join(W_DIR, combind_f_name) print(w_name) #tif.imsave(w_name, img) #if os.path.isfile(w_name): #print('image "%s" has been saved at "%s"' % (combind_f_name, W_DIR)) #else: #print('Sorry, something went wrong with your tif saving') #return if max_count is not None and ind >= max_count: break # break the loop if max_count reach or already collect all images print('||********Saving process FINISHED********||')