def mountSample(sampID): global mountCounter saveDetDist = beamline_lib.motorPosFromDescriptor("detectorDist") warmUpNeeded = 0 if (getBlConfig("queueCollect") == 1): mountCounter+=1 if (mountCounter > getBlConfig("robotWarmupInterval")): warmUpNeeded = 1 mountedSampleDict = db_lib.beamlineInfo(daq_utils.beamline, 'mountedSample') currentMountedSampleID = mountedSampleDict["sampleID"] if (getBlConfig(TOP_VIEW_CHECK) == 1): logger.info("setting work pos") if (daq_utils.beamline == "amx"): setPvDesc("robotXWorkPos",getPvDesc("robotXMountPos")) setPvDesc("robotYWorkPos",getPvDesc("robotYMountPos")) setPvDesc("robotZWorkPos",getPvDesc("robotZMountPos")) setPvDesc("robotOmegaWorkPos",90.0) logger.info("done setting work pos") if (currentMountedSampleID != ""): #then unmount what's there if (sampID!=currentMountedSampleID): puckPos = mountedSampleDict["puckPos"] pinPos = mountedSampleDict["pinPos"] if (robot_lib.unmountRobotSample(puckPos,pinPos,currentMountedSampleID)): db_lib.deleteCompletedRequestsforSample(currentMountedSampleID) set_field("mounted_pin","") db_lib.beamlineInfo(daq_utils.beamline, 'mountedSample', info_dict={'puckPos':0,'pinPos':0,'sampleID':""}) (puckPos,pinPos,puckID) = db_lib.getCoordsfromSampleID(daq_utils.beamline,sampID) if (warmUpNeeded): gui_message("Warming gripper. Please stand by.") mountCounter = 0 mountStat = robot_lib.mountRobotSample(puckPos,pinPos,sampID,init=0,warmup=warmUpNeeded) if (warmUpNeeded): destroy_gui_message() if (mountStat == 1): set_field("mounted_pin",sampID) detDist = beamline_lib.motorPosFromDescriptor("detectorDist") if (detDist != saveDetDist): if (getBlConfig("HePath") == 0): beamline_lib.mvaDescriptor("detectorDist",saveDetDist) elif(mountStat == 2): return 2 else: return 0 else: return 0 else: #desired sample is mounted, nothing to do return 1 else: #nothing mounted (puckPos,pinPos,puckID) = db_lib.getCoordsfromSampleID(daq_utils.beamline,sampID) mountStat = robot_lib.mountRobotSample(puckPos,pinPos,sampID,init=1) if (mountStat == 1): set_field("mounted_pin",sampID) elif(mountStat == 2): return 2 else: return 0 db_lib.beamlineInfo(daq_utils.beamline, 'mountedSample', info_dict={'puckPos':puckPos,'pinPos':pinPos,'sampleID':sampID}) return 1
def collect_detector_seq_hw(sweep_start, range_degrees, image_width, exposure_period, fileprefix, data_directory_name, file_number, currentRequest, z_target=0, changeState=True): #works for pilatus global image_started, allow_overwrite, abort_flag logger.info("data directory = " + data_directory_name) reqObj = currentRequest["request_obj"] protocol = str(reqObj["protocol"]) sweep_start = sweep_start % 360.0 if (protocol == "vector" or protocol == "stepVector"): beamline_lib.mvaDescriptor("omega", sweep_start) if (image_width == 0): number_of_images = range_degrees else: number_of_images = round(range_degrees / image_width) range_seconds = number_of_images * exposure_period if (daq_utils.detector_id == "EIGER-16"): exposure_time = exposure_period - .00001 else: exposure_time = exposure_period - .0024 angleStart = sweep_start file_prefix_minus_directory = str(fileprefix) try: file_prefix_minus_directory = file_prefix_minus_directory[ file_prefix_minus_directory.rindex("/") + 1:len(file_prefix_minus_directory)] except ValueError: pass logger.info( "collect %f degrees for %f seconds %d images exposure_period = %f exposure_time = %f" % (range_degrees, range_seconds, number_of_images, exposure_period, exposure_time)) if (protocol == "standard" or protocol == "characterize" or protocol == "ednaCol" or protocol == "screen" or protocol == "burn"): logger.info("vectorSync " + str(time.time())) daq_macros.vectorSync() logger.info("zebraDaq " + str(time.time())) daq_macros.zebraDaq(angleStart, range_degrees, image_width, exposure_period, file_prefix_minus_directory, data_directory_name, file_number, 3, changeState) # daq_macros.zebraDaq(angleStart,range_degrees,image_width,exposure_period,file_prefix_minus_directory,data_directory_name,file_number,3,protocol=protocol) #?protocol? elif (protocol == "vector"): daq_macros.vectorZebraScan(currentRequest) elif (protocol == "stepVector"): daq_macros.vectorZebraStepScan(currentRequest) else: pass return
def collect_detector_seq_hw(sweep_start,range_degrees,image_width,exposure_period,fileprefix,data_directory_name,file_number,currentRequest,z_target=0): #works for pilatus global image_started,allow_overwrite,abort_flag print("data directory = " + data_directory_name) reqObj = currentRequest["request_obj"] protocol = str(reqObj["protocol"]) if (0): # if (daq_utils.beamline == "amx"): beamline_lib.mvaDescriptor("energy",reqObj["energy"]) sweep_start = sweep_start%360.0 if (protocol == "vector" or protocol == "stepVector"): beamline_lib.mvaDescriptor("omega",sweep_start) number_of_images = round(range_degrees/image_width) range_seconds = number_of_images*exposure_period if (daq_utils.detector_id == "EIGER-16"): exposure_time = exposure_period - .00001 else: exposure_time = exposure_period - .0024 angleStart = sweep_start # angleStart = beamline_lib.motorPosFromDescriptor("omega") ### if (angleStart>360.0): ### angleStart = angleStart%360.0 #note, nsls2 angle start now used, just get current position for now file_prefix_minus_directory = str(fileprefix) try: file_prefix_minus_directory = file_prefix_minus_directory[file_prefix_minus_directory.rindex("/")+1:len(file_prefix_minus_directory)] except ValueError: pass print("collect %f degrees for %f seconds %d images exposure_period = %f exposure_time = %f" % (range_degrees,range_seconds,number_of_images,exposure_period,exposure_time)) if (protocol == "standard" or protocol == "characterize" or protocol == "ednaCol" or protocol == "screen"): daq_macros.vectorSync() daq_macros.zebraDaq(angleStart,range_degrees,image_width,exposure_period,file_prefix_minus_directory,data_directory_name,file_number,3) # daq_macros.zebraDaq(angleStart,range_degrees,image_width,exposure_period,file_prefix_minus_directory,data_directory_name,file_number,3,protocol=protocol) #?protocol? elif (protocol == "vector"): daq_macros.vectorZebraScan(currentRequest) elif (protocol == "stepVector"): daq_macros.vectorZebraStepScan(currentRequest) else: pass return
def unmountRobotSample(puckPos, pinPos, sampID): #will somehow know where it came from absPos = (pinsPerPuck * (puckPos % 3)) + pinPos + 1 robotOnline = getBlConfig('robot_online') logger.info("robot online = " + str(robotOnline)) if (robotOnline): detDist = beamline_lib.motorPosFromDescriptor("detectorDist") if (detDist < ROBOT_MIN_DISTANCE): setPvDesc("govRobotDetDistOut", ROBOT_MIN_DISTANCE) setPvDesc("govHumanDetDistOut", ROBOT_MIN_DISTANCE) daq_lib.setRobotGovState("SE") logger.info("unmounting " + str(puckPos) + " " + str(pinPos) + " " + str(sampID)) logger.info("absPos = " + str(absPos)) platePos = int(puckPos / 3) rotMotTarget = daq_utils.dewarPlateMap[platePos][0] rotCP = beamline_lib.motorPosFromDescriptor("dewarRot") logger.info("dewar target,CP") logger.info("%s %s" % (rotMotTarget, rotCP)) if (abs(rotMotTarget - rotCP) > 1): logger.info("rot dewar") try: RobotControlLib.runCmd("park") except Exception as e: e_s = str(e) message = "ROBOT park ERROR: " + e_s daq_lib.gui_message(message) logger.error(message) return 0 beamline_lib.mvaDescriptor("dewarRot", rotMotTarget) try: par_init = (beamline_support.get_any_epics_pv( "SW:RobotState", "VAL") != "Ready") par_cool = (getPvDesc("gripTemp") > -170) RobotControlLib.unmount1(init=par_init, cooldown=par_cool) except Exception as e: e_s = str(e) message = "ROBOT unmount ERROR: " + e_s daq_lib.gui_message(message) logger.error(message) return 0 if daq_utils.beamline == "fmx": det_z_pv = 'XF:17IDC-ES:FMX{Det-Ax:Z}Mtr' detDist = caget(f'{det_z_pv}.RBV') if detDist < ROBOT_MIN_DISTANCE: caput( f'{det_z_pv}.VAL', ROBOT_MIN_DISTANCE, wait=True ) # TODO shouldn't this wait for SE transition or something?? detDist = caget(f'{det_z_pv}.RBV') else: detDist = beamline_lib.motorPosFromDescriptor("detectorDist") if detDist < ROBOT_MIN_DISTANCE and abs( detDist - ROBOT_MIN_DISTANCE) > ROBOT_DISTANCE_TOLERANCE: logger.error( f"ERROR - Detector closer than {ROBOT_MIN_DISTANCE} and move than {ROBOT_DISTANCE_TOLERANCE} from {ROBOT_MIN_DISTANCE}! actual distance: {detDist}. Stopping." ) return 0 try: RobotControlLib.unmount2(absPos) except Exception as e: e_s = str(e) if (e_s.find("Fatal") != -1): daq_macros.robotOff() daq_macros.disableMount() daq_lib.gui_message( e_s + ". FATAL ROBOT ERROR - CALL STAFF! robotOff() executed.") return 0 message = "ROBOT unmount2 ERROR: " + e_s daq_lib.gui_message(message) logger.error(message) return 0 if (not daq_lib.waitGovRobotSE()): daq_lib.clearMountedSample() logger.info("could not go to SE") return 0 return 1
def mountRobotSample(puckPos, pinPos, sampID, init=0, warmup=0): global retryMountCount global sampXadjust, sampYadjust, sampZadjust absPos = (pinsPerPuck * (puckPos % 3)) + pinPos + 1 logger.info(f'init: {init} warmup: {warmup}') if (getBlConfig('robot_online')): if (not daq_lib.waitGovRobotSE()): daq_lib.setGovRobot('SE') if (getBlConfig(TOP_VIEW_CHECK) == 1): try: sample = db_lib.getSampleByID(sampID) sampName = sample['name'] reqCount = sample['request_count'] prefix1 = sampName + "_" + str(puckPos) + "_" + str( pinPos) + "_" + str(reqCount) + "_PA_0" prefix90 = sampName + "_" + str(puckPos) + "_" + str( pinPos) + "_" + str(reqCount) + "_PA_90" daq_macros.topViewSnap(prefix1, os.getcwd() + "/pinAlign", 1, acquire=0) except Exception as e: e_s = str(e) message = "TopView check ERROR, will continue: " + e_s daq_lib.gui_message(message) logger.error(message) logger.info("mounting " + str(puckPos) + " " + str(pinPos) + " " + str(sampID)) logger.info("absPos = " + str(absPos)) platePos = int(puckPos / 3) rotMotTarget = daq_utils.dewarPlateMap[platePos][0] rotCP = beamline_lib.motorPosFromDescriptor("dewarRot") logger.info("dewar target,CP") logger.info("%s %s" % (rotMotTarget, rotCP)) if (abs(rotMotTarget - rotCP) > 1): logger.info("rot dewar") try: if (init == 0): RobotControlLib.runCmd("park") except Exception as e: e_s = str(e) message = "ROBOT Park ERROR: " + e_s daq_lib.gui_message(message) logger.error(message) return 0 beamline_lib.mvaDescriptor("dewarRot", rotMotTarget) try: if (init): logger.debug('main loading part') setPvDesc("boostSelect", 0) if (getPvDesc("sampleDetected") == 0 ): #reverse logic, 0 = true setPvDesc("boostSelect", 1) else: robotStatus = beamline_support.get_any_epics_pv( "SW:RobotState", "VAL") if (robotStatus != "Ready"): if (daq_utils.beamline == "fmx"): daq_macros.homePins() time.sleep(3.0) if (not daq_lib.setGovRobot('SE')): return if (getBlConfig(TOP_VIEW_CHECK) == 1): omegaCP = beamline_lib.motorPosFromDescriptor("omega") if (omegaCP > 89.5 and omegaCP < 90.5): beamline_lib.mvrDescriptor("omega", 85.0) logger.info("calling thread") _thread.start_new_thread(wait90TopviewThread, (prefix1, prefix90)) logger.info("called thread") setPvDesc("boostSelect", 0) if (getPvDesc("gripTemp") > -170): try: logger.debug('mounting') RobotControlLib.mount(absPos) except Exception as e: e_s = str(e) message = "ROBOT mount ERROR: " + e_s daq_lib.gui_message(message) logger.error(message) return 0 else: time.sleep(0.5) if (getPvDesc("sampleDetected") == 0): logger.info("full mount") RobotControlLib.mount(absPos) else: logger.debug('quick mount') RobotControlLib.initialize() RobotControlLib._mount(absPos) setPvDesc("boostSelect", 1) else: if (getBlConfig(TOP_VIEW_CHECK) == 1): omegaCP = beamline_lib.motorPosFromDescriptor("omega") if (omegaCP > 89.5 and omegaCP < 90.5): beamline_lib.mvrDescriptor("omega", 85.0) logger.info("calling thread") _thread.start_new_thread(wait90TopviewThread, (prefix1, prefix90)) logger.info("called thread") if (warmup): RobotControlLib._mount(absPos, warmup=True) else: RobotControlLib._mount(absPos) logger.info(f'{getBlConfig(TOP_VIEW_CHECK)} {daq_utils.beamline}') if (getBlConfig(TOP_VIEW_CHECK) == 1): if (sampYadjust == 0): logger.info("Cannot align pin - Mount next sample.") daq_lib.setGovRobot('SA') return 1 except Exception as e: logger.error(e) e_s = str(e) if (e_s.find("Fatal") != -1): daq_macros.robotOff() daq_macros.disableMount() daq_lib.gui_message( e_s + ". FATAL ROBOT ERROR - CALL STAFF! robotOff() executed.") return 0 if (e_s.find("tilted") != -1 or e_s.find("Load Sample Failed") != -1): if (getBlConfig("queueCollect") == 0): daq_lib.gui_message(e_s + ". Try mounting again") return 0 else: if (retryMountCount == 0): retryMountCount += 1 mountStat = mountRobotSample(puckPos, pinPos, sampID, init) if (mountStat == 1): retryMountCount = 0 return mountStat else: retryMountCount = 0 daq_lib.gui_message("ROBOT: Could not recover from " + e_s) return 2 daq_lib.gui_message("ROBOT mount ERROR: " + e_s) return 0 return 1 else: return 1
def collectData(currentRequest): global data_directory_name, currentIspybDCID, fastDPNodeCount, fastDPNodeCounter if (daq_utils.beamline == "fmx"): if (getPvDesc("detCoverRBV") == 0): logger.info("opening det cover") setPvDesc("detCoverOpen", 1) logMe = 1 reqObj = currentRequest["request_obj"] data_directory_name = str(reqObj["directory"]) exposure_period = reqObj["exposure_time"] wavelength = reqObj["wavelength"] resolution = reqObj["resolution"] slit_height = reqObj["slit_height"] slit_width = reqObj["slit_width"] attenuation = reqObj["attenuation"] img_width = reqObj["img_width"] file_prefix = str(reqObj["file_prefix"]) logger.info(reqObj["protocol"]) prot = str(reqObj["protocol"]) sweep_start = reqObj["sweep_start"] sweep_end = reqObj["sweep_end"] range_degrees = abs(sweep_end - sweep_start) sweep_start = reqObj["sweep_start"] % 360.0 file_number_start = reqObj["file_number_start"] basePath = reqObj["basePath"] visitName = daq_utils.getVisitName() jpegDirectory = visitName + "/jpegs/" + data_directory_name[ data_directory_name.find(visitName) + len(visitName):len(data_directory_name)] colDist = reqObj["detDist"] status = 1 if not (os.path.isdir(data_directory_name)): logger.debug(f'creating {data_directory_name}') comm_s = "mkdir -p " + data_directory_name os.system(comm_s) comm_s = "chmod 777 " + data_directory_name os.system(comm_s) comm_s = "mkdir -p " + jpegDirectory os.system(comm_s) comm_s = "chmod 777 " + jpegDirectory os.system(comm_s) logger.debug( 'starting initial motions - transmission and detector distance') daq_macros.setTrans(attenuation) if prot not in ["rasterScreen", "eScan"]: beamline_lib.mvaDescriptor("detectorDist", colDist) logger.debug( 'transmission and detector distance (if not fluorescence-related) done' ) # now that the detector is in the correct position, get the beam center currentRequest['request_obj']['xbeam'] = getPvDesc('beamCenterX') currentRequest['request_obj']['ybeam'] = getPvDesc('beamCenterY') db_lib.updateRequest(currentRequest) if (prot == "raster"): logger.info('entering raster') status = daq_macros.snakeRaster(currentRequest["uid"]) logger.info('exiting raster') elif (prot == "stepRaster"): status = daq_macros.snakeStepRaster(currentRequest["uid"]) elif (prot == "specRaster"): status = daq_macros.snakeStepRasterSpec(currentRequest["uid"]) elif (prot == "vector" or prot == "stepVector"): imagesAttempted = collect_detector_seq_hw(sweep_start, range_degrees, img_width, exposure_period, file_prefix, data_directory_name, file_number_start, currentRequest) elif (prot == "multiCol"): daq_macros.snakeRaster(currentRequest["uid"]) elif (prot == "rasterScreen"): daq_macros.rasterScreen(currentRequest) elif (prot == "multiColQ"): daq_macros.multiCol(currentRequest) elif (prot == "eScan"): daq_macros.eScan(currentRequest) else: #standard, screening, or edna - these may require autoalign, checking first if (reqObj["pos_x"] != -999): beamline_lib.mvaDescriptor("sampleX", reqObj["pos_x"]) beamline_lib.mvaDescriptor("sampleY", reqObj["pos_y"]) beamline_lib.mvaDescriptor("sampleZ", reqObj["pos_z"]) elif (reqObj["centeringOption"] == "Interactive" ): #robotic, pause and let user center pause_data_collection() check_pause() else: logger.info("autoRaster") if not (daq_macros.autoRasterLoop(currentRequest)): logger.info("could not center sample") db_lib.updatePriority(currentRequest["uid"], -1) refreshGuiTree() return 0 else: if (reqObj["centeringOption"] == "AutoLoop"): reqObj[ "sweep_start"] = beamline_lib.motorPosFromDescriptor( "omega") #%360.0? sweep_start = reqObj["sweep_start"] if (reqObj["centeringOption"] == "AutoRaster"): reqObj[ "sweep_start"] = beamline_lib.motorPosFromDescriptor( "omega") - 90.0 #%360.0? sweep_start = reqObj["sweep_start"] daq_macros.setTrans(attenuation) if (reqObj["protocol"] == "screen"): screenImages = 2 screenRange = 90 range_degrees = img_width for i in range(0, screenImages): sweep_start = reqObj["sweep_start"] + (i * screenRange) sweep_end = sweep_start + screenRange file_prefix = str(reqObj["file_prefix"] + "_" + str(i * screenRange)) data_directory_name = str(reqObj["directory"]) # for now file_number_start = reqObj["file_number_start"] beamline_lib.mvaDescriptor("omega", sweep_start) if (i == 0): imagesAttempted = collect_detector_seq_hw( sweep_start, range_degrees, img_width, exposure_period, file_prefix, data_directory_name, file_number_start, currentRequest, changeState=False) else: imagesAttempted = collect_detector_seq_hw( sweep_start, range_degrees, img_width, exposure_period, file_prefix, data_directory_name, file_number_start, currentRequest) seqNum = int(detector_get_seqnum()) node = getBlConfig("spotNode1") comm_s = f'ssh -q {node} \"{os.environ["MXPROCESSINGSCRIPTSDIR"]}eiger2cbf.sh {currentRequest["uid"]} 1 1 sweep_start {seqNum}\"' logger.info(comm_s) os.system(comm_s) elif (reqObj["protocol"] == "characterize" or reqObj["protocol"] == "ednaCol"): characterizationParams = reqObj["characterizationParams"] index_success = daq_macros.dna_execute_collection3( 0.0, img_width, 2, exposure_period, data_directory_name + "/", file_prefix, 1, -89.0, 1, currentRequest) if (index_success): resultsList = db_lib.getResultsforRequest( currentRequest["uid"] ) # because for testing I keep running the same request. Probably not in usual use. results = None for i in range(0, len(resultsList)): if (resultsList[i]['result_type'] == 'characterizationStrategy'): results = resultsList[i] break if (results != None): strategyResults = results["result_obj"]["strategy"] stratStart = strategyResults["start"] stratEnd = strategyResults["end"] stratWidth = strategyResults["width"] stratExptime = strategyResults["exptime"] stratTrans = strategyResults["transmission"] stratDetDist = strategyResults["detDist"] sampleID = currentRequest["sample"] tempnewStratRequest = daq_utils.createDefaultRequest( sampleID) newReqObj = tempnewStratRequest["request_obj"] newReqObj["sweep_start"] = stratStart newReqObj["sweep_end"] = stratEnd newReqObj["img_width"] = stratWidth newReqObj["exposure_time"] = stratExptime newReqObj["attenuation"] = stratTrans newReqObj["detDist"] = stratDetDist newReqObj["directory"] = data_directory_name newReqObj["pos_x"] = beamline_lib.motorPosFromDescriptor( "sampleX") newReqObj["pos_y"] = beamline_lib.motorPosFromDescriptor( "sampleY") newReqObj["pos_z"] = beamline_lib.motorPosFromDescriptor( "sampleZ") newReqObj[ "fastDP"] = True # this is where you might want a "new from old" request to carry over stuff like this. newReqObj["fastEP"] = reqObj["fastEP"] newReqObj["dimple"] = reqObj["dimple"] newReqObj["xia2"] = reqObj["xia2"] runNum = db_lib.incrementSampleRequestCount(sampleID) newReqObj["runNum"] = runNum newStratRequest = db_lib.addRequesttoSample( sampleID, newReqObj["protocol"], daq_utils.owner, newReqObj, priority=0, proposalID=daq_utils.getProposalID()) if (reqObj["protocol"] == "ednaCol"): logger.info("new strat req = ") logger.info(newStratRequest) db_lib.updatePriority(currentRequest["uid"], -1) refreshGuiTree() collectData(db_lib.getRequestByID(newStratRequest)) return 1 else: #standard logger.info("moving omega to start " + str(time.time())) beamline_lib.mvaDescriptor("omega", sweep_start) imagesAttempted = collect_detector_seq_hw( sweep_start, range_degrees, img_width, exposure_period, file_prefix, data_directory_name, file_number_start, currentRequest) try: if (logMe) and prot == 'raster': logMxRequestParams(currentRequest, wait=False) elif (logMe): logMxRequestParams(currentRequest) except TypeError: logger.error("caught type error in logging") except IndexError: logger.error("caught index error in logging") except KeyError as e: logger.error('caught key error in logging: %s' % e) # collection finished, start processing if reqObj["protocol"] in ("standard", "vector", "raster"): send_kafka_message(topic=f'{daq_utils.beamline}.lsdc.documents', event='stop', uuid=currentRequest['uid'], protocol=reqObj["protocol"]) if (prot == "vector" or prot == "standard" or prot == "stepVector"): seqNum = int(detector_get_seqnum()) comm_s = os.environ[ "LSDCHOME"] + "/runSpotFinder4syncW.py " + data_directory_name + " " + file_prefix + " " + str( currentRequest["uid"]) + " " + str(seqNum) + " " + str( currentIspybDCID) + "&" logger.info(comm_s) os.system(comm_s) if img_width > 0: #no dataset processing in stills mode if (reqObj["fastDP"]): if (reqObj["fastEP"]): fastEPFlag = 1 else: fastEPFlag = 0 if (reqObj["dimple"]): dimpleFlag = 1 else: dimpleFlag = 0 nodeName = "fastDPNode" + str( (fastDPNodeCounter % fastDPNodeCount) + 1) fastDPNodeCounter += 1 node = getBlConfig(nodeName) dimpleNode = getBlConfig("dimpleNode") if (daq_utils.detector_id == "EIGER-16"): seqNum = int(detector_get_seqnum()) comm_s = os.environ[ "LSDCHOME"] + "/runFastDPH5.py " + data_directory_name + " " + str( seqNum) + " " + str( currentRequest["uid"] ) + " " + str(fastEPFlag) + " " + node + " " + str( dimpleFlag) + " " + dimpleNode + " " + str( currentIspybDCID) + "&" else: comm_s = os.environ[ "LSDCHOME"] + "/runFastDP.py " + data_directory_name + " " + file_prefix + " " + str( file_number_start) + " " + str( int(round(range_degrees / img_width)) ) + " " + str(currentRequest["uid"]) + " " + str( fastEPFlag) + " " + node + " " + str( dimpleFlag) + " " + dimpleNode + "&" logger.info(f'Running fastdp command: {comm_s}') visitName = daq_utils.getVisitName() if ( not os.path.exists(visitName + "/fast_dp_dir") ) or subprocess.run( ['pgrep', '-f', 'loop-fdp-dple-populate'], stdout=subprocess.PIPE ).returncode == 1: # for pgrep, return of 1 means string not found os.system("killall -KILL loop-fdp-dple-populate.sh") logger.info('starting fast dp result gathering script') os.system("cd " + visitName + ";${LSDCHOME}/bin/loop-fdp-dple-populate.sh&") os.system(comm_s) if (reqObj["xia2"]): comm_s = f"ssh -q xf17id2-srv1 \"{os.environ['MXPROCESSINGSCRIPTSDIR']}xia2.sh {currentRequest['uid']} \"&" os.system(comm_s) logger.info('processing should be triggered') db_lib.updatePriority(currentRequest["uid"], -1) refreshGuiTree() logger.info('after refresh GUI tree') return status
def collectData(currentRequest): global data_directory_name, currentIspybDCID, fastDPNodeCount, fastDPNodeCounter if (daq_utils.beamline == "fmx"): if (getPvDesc("detCoverRBV") == 0): logger.info("opening det cover") setPvDesc("detCoverOpen", 1) logMe = 1 reqObj = currentRequest["request_obj"] data_directory_name = str(reqObj["directory"]) exposure_period = reqObj["exposure_time"] wavelength = reqObj["wavelength"] resolution = reqObj["resolution"] slit_height = reqObj["slit_height"] slit_width = reqObj["slit_width"] attenuation = reqObj["attenuation"] img_width = reqObj["img_width"] file_prefix = str(reqObj["file_prefix"]) logger.info(reqObj["protocol"]) prot = str(reqObj["protocol"]) sweep_start = reqObj["sweep_start"] sweep_end = reqObj["sweep_end"] range_degrees = abs(sweep_end - sweep_start) sweep_start = reqObj["sweep_start"] % 360.0 file_number_start = reqObj["file_number_start"] basePath = reqObj["basePath"] visitName = daq_utils.getVisitName() jpegDirectory = visitName + "/jpegs/" + data_directory_name[ data_directory_name.find(visitName) + len(visitName):len(data_directory_name)] colDist = reqObj["detDist"] status = 1 if not (os.path.isdir(data_directory_name)): comm_s = "mkdir -p " + data_directory_name os.system(comm_s) comm_s = "chmod 777 " + data_directory_name os.system(comm_s) comm_s = "mkdir -p " + jpegDirectory os.system(comm_s) comm_s = "chmod 777 " + jpegDirectory os.system(comm_s) daq_macros.setTrans(attenuation) beamline_lib.mvaDescriptor("detectorDist", colDist) # now that the detector is in the correct position, get the beam center currentRequest['request_obj']['xbeam'] = getPvDesc('beamCenterX') currentRequest['request_obj']['ybeam'] = getPvDesc('beamCenterY') db_lib.updateRequest(currentRequest) if (prot == "raster"): logger.info('entering raster') status = daq_macros.snakeRaster(currentRequest["uid"]) logger.info('exiting raster') elif (prot == "stepRaster"): status = daq_macros.snakeStepRaster(currentRequest["uid"]) elif (prot == "specRaster"): status = daq_macros.snakeStepRasterSpec(currentRequest["uid"]) elif (prot == "vector" or prot == "stepVector"): imagesAttempted = collect_detector_seq_hw(sweep_start, range_degrees, img_width, exposure_period, file_prefix, data_directory_name, file_number_start, currentRequest) elif (prot == "multiCol"): daq_macros.snakeRaster(currentRequest["uid"]) elif (prot == "rasterScreen"): daq_macros.rasterScreen(currentRequest) elif (prot == "multiColQ"): daq_macros.multiCol(currentRequest) elif (prot == "eScan"): daq_macros.eScan(currentRequest) else: #standard, screening, or edna - these may require autoalign, checking first if (reqObj["pos_x"] != -999): beamline_lib.mvaDescriptor("sampleX", reqObj["pos_x"]) beamline_lib.mvaDescriptor("sampleY", reqObj["pos_y"]) beamline_lib.mvaDescriptor("sampleZ", reqObj["pos_z"]) elif (reqObj["centeringOption"] == "Interactive" ): #robotic, pause and let user center pause_data_collection() check_pause() else: logger.info("autoRaster") if not (daq_macros.autoRasterLoop(currentRequest)): logger.info("could not center sample") db_lib.updatePriority(currentRequest["uid"], -1) refreshGuiTree() return 0 else: if (reqObj["centeringOption"] == "AutoLoop"): reqObj[ "sweep_start"] = beamline_lib.motorPosFromDescriptor( "omega") #%360.0? sweep_start = reqObj["sweep_start"] if (reqObj["centeringOption"] == "AutoRaster"): reqObj[ "sweep_start"] = beamline_lib.motorPosFromDescriptor( "omega") - 90.0 #%360.0? sweep_start = reqObj["sweep_start"] daq_macros.setTrans(attenuation) if (reqObj["protocol"] == "screen"): screenImages = 2 screenRange = 90 range_degrees = img_width for i in range(0, screenImages): sweep_start = reqObj["sweep_start"] + (i * screenRange) sweep_end = sweep_start + screenRange file_prefix = str(reqObj["file_prefix"] + "_" + str(i * screenRange)) data_directory_name = str(reqObj["directory"]) # for now file_number_start = reqObj["file_number_start"] beamline_lib.mvaDescriptor("omega", sweep_start) if (i == 0): imagesAttempted = collect_detector_seq_hw( sweep_start, range_degrees, img_width, exposure_period, file_prefix, data_directory_name, file_number_start, currentRequest, changeState=False) else: imagesAttempted = collect_detector_seq_hw( sweep_start, range_degrees, img_width, exposure_period, file_prefix, data_directory_name, file_number_start, currentRequest) seqNum = int(detector_get_seqnum()) cbfComm = getBlConfig("cbfComm") cbfDir = data_directory_name + "/cbf" comm_s = "mkdir -p " + cbfDir os.system(comm_s) hdfSampleDataPattern = data_directory_name + "/" + file_prefix + "_" hdfRowFilepattern = hdfSampleDataPattern + str( int(float(seqNum))) + "_master.h5" CBF_conversion_pattern = cbfDir + "/" + file_prefix + "_" + str( int(sweep_start)) + ".cbf" comm_s = "eiger2cbf-linux " + hdfRowFilepattern startIndex = 1 endIndex = 1 node = getBlConfig("spotNode1") comm_s = "ssh -q " + node + " \"sleep 6;" + cbfComm + " " + hdfRowFilepattern + " " + str( startIndex) + ":" + str( endIndex) + " " + CBF_conversion_pattern + "\"&" logger.info(comm_s) os.system(comm_s) elif (reqObj["protocol"] == "characterize" or reqObj["protocol"] == "ednaCol"): characterizationParams = reqObj["characterizationParams"] index_success = daq_macros.dna_execute_collection3( 0.0, img_width, 2, exposure_period, data_directory_name + "/", file_prefix, 1, -89.0, 1, currentRequest) if (index_success): resultsList = db_lib.getResultsforRequest( currentRequest["uid"] ) # because for testing I keep running the same request. Probably not in usual use. results = None for i in range(0, len(resultsList)): if (resultsList[i]['result_type'] == 'characterizationStrategy'): results = resultsList[i] break if (results != None): strategyResults = results["result_obj"]["strategy"] stratStart = strategyResults["start"] stratEnd = strategyResults["end"] stratWidth = strategyResults["width"] stratExptime = strategyResults["exptime"] stratTrans = strategyResults["transmission"] stratDetDist = strategyResults["detDist"] sampleID = currentRequest["sample"] tempnewStratRequest = daq_utils.createDefaultRequest( sampleID) newReqObj = tempnewStratRequest["request_obj"] newReqObj["sweep_start"] = stratStart newReqObj["sweep_end"] = stratEnd newReqObj["img_width"] = stratWidth newReqObj["exposure_time"] = stratExptime newReqObj["attenuation"] = stratTrans newReqObj["detDist"] = stratDetDist newReqObj["directory"] = data_directory_name newReqObj["pos_x"] = beamline_lib.motorPosFromDescriptor( "sampleX") newReqObj["pos_y"] = beamline_lib.motorPosFromDescriptor( "sampleY") newReqObj["pos_z"] = beamline_lib.motorPosFromDescriptor( "sampleZ") newReqObj[ "fastDP"] = True # this is where you might want a "new from old" request to carry over stuff like this. newReqObj["fastEP"] = reqObj["fastEP"] newReqObj["dimple"] = reqObj["dimple"] newReqObj["xia2"] = reqObj["xia2"] runNum = db_lib.incrementSampleRequestCount(sampleID) newReqObj["runNum"] = runNum newStratRequest = db_lib.addRequesttoSample( sampleID, newReqObj["protocol"], daq_utils.owner, newReqObj, priority=0, proposalID=daq_utils.getProposalID()) if (reqObj["protocol"] == "ednaCol"): logger.info("new strat req = ") logger.info(newStratRequest) db_lib.updatePriority(currentRequest["uid"], -1) refreshGuiTree() collectData(db_lib.getRequestByID(newStratRequest)) return 1 else: #standard logger.info("moving omega to start " + str(time.time())) beamline_lib.mvaDescriptor("omega", sweep_start) imagesAttempted = collect_detector_seq_hw( sweep_start, range_degrees, img_width, exposure_period, file_prefix, data_directory_name, file_number_start, currentRequest) try: if (logMe): logMxRequestParams(currentRequest) except TypeError: logger.error("caught type error in logging") except IndexError: logger.error("caught index error in logging") except KeyError as e: logger.error('caught key error in logging: %s' % e) if (prot == "vector" or prot == "standard" or prot == "stepVector"): seqNum = int(detector_get_seqnum()) comm_s = os.environ[ "LSDCHOME"] + "/runSpotFinder4syncW.py " + data_directory_name + " " + file_prefix + " " + str( currentRequest["uid"]) + " " + str(seqNum) + " " + str( currentIspybDCID) + "&" logger.info(comm_s) os.system(comm_s) if img_width > 0: #no dataset processing in stills mode if (reqObj["fastDP"]): if (reqObj["fastEP"]): fastEPFlag = 1 else: fastEPFlag = 0 if (reqObj["dimple"]): dimpleFlag = 1 else: dimpleFlag = 0 nodeName = "fastDPNode" + str( (fastDPNodeCounter % fastDPNodeCount) + 1) fastDPNodeCounter += 1 node = getBlConfig(nodeName) dimpleNode = getBlConfig("dimpleNode") if (daq_utils.detector_id == "EIGER-16"): seqNum = int(detector_get_seqnum()) comm_s = os.environ[ "LSDCHOME"] + "/runFastDPH5.py " + data_directory_name + " " + file_prefix + " " + str( seqNum) + " " + str( int(round(range_degrees / img_width)) ) + " " + str(currentRequest["uid"]) + " " + str( fastEPFlag) + " " + node + " " + str( dimpleFlag) + " " + dimpleNode + " " + str( currentIspybDCID) + "&" else: comm_s = os.environ[ "LSDCHOME"] + "/runFastDP.py " + data_directory_name + " " + file_prefix + " " + str( file_number_start) + " " + str( int(round(range_degrees / img_width)) ) + " " + str(currentRequest["uid"]) + " " + str( fastEPFlag) + " " + node + " " + str( dimpleFlag) + " " + dimpleNode + "&" logger.info(comm_s) if (daq_utils.beamline == "amx"): visitName = daq_utils.getVisitName() if (not os.path.exists(visitName + "/fast_dp_dir")): os.system("killall -KILL loop-fdp-dple-populate") os.system( "cd " + visitName + ";/GPFS/CENTRAL/xf17id2/jjakoncic/Scripts/loop-fdp-dple-populate.sh&" ) os.system(comm_s) if (reqObj["xia2"]): comm_s = "ssh -q xf17id1-srv1 \"" + os.environ[ "LSDCHOME"] + "/runXia2.py " + data_directory_name + " " + file_prefix + " " + str( file_number_start) + " " + str( int(round(range_degrees / img_width))) + " " + str( currentRequest["uid"]) + "\"&" os.system(comm_s) logger.info('processing should be triggered') db_lib.updatePriority(currentRequest["uid"], -1) refreshGuiTree() logger.info('after refresh GUI tree') return status
def mountRobotSample(puckPos,pinPos,sampID,init=0,warmup=0): global retryMountCount # absPos = (pinsPerPuck*puckPos)+pinPos+1 absPos = (pinsPerPuck*(puckPos%3))+pinPos+1 if (db_lib.getBeamlineConfigParam(daq_utils.beamline,'robot_online')): if (not daq_lib.waitGovRobotSE()): daq_lib.setGovRobotSE() print("mounting " + str(puckPos) + " " + str(pinPos) + " " + str(sampID)) print("absPos = " + str(absPos)) platePos = int(puckPos/3) rotMotTarget = daq_utils.dewarPlateMap[platePos][0] rotCP = beamline_lib.motorPosFromDescriptor("dewarRot") print("dewar target,CP") print(rotMotTarget,rotCP) if (abs(rotMotTarget-rotCP)>1): print("rot dewar") try: if (init == 0): RobotControlLib.runCmd("park") except Exception as e: e_s = str(e) daq_lib.gui_message("ROBOT Park ERROR: " + e_s) print(e) return 0 beamline_lib.mvaDescriptor("dewarRot",rotMotTarget) try: if (init): beamline_support.setPvValFromDescriptor("boostSelect",0) if (beamline_support.getPvValFromDescriptor("sampleDetected") == 0): #reverse logic, 0 = true beamline_support.setPvValFromDescriptor("boostSelect",1) else: # if (beamline_support.getPvValFromDescriptor("gripTemp") > 20.0): #gripper warm robotStatus = beamline_support.get_any_epics_pv("SW:RobotState","VAL") if (robotStatus != "Ready"): if (daq_utils.beamline == "fmx"): daq_macros.homePins() time.sleep(3.0) if (not daq_lib.setGovRobotSE()): return RobotControlLib.mount(absPos) else: if (warmup): RobotControlLib._mount(absPos,warmup=True) else: RobotControlLib._mount(absPos) daq_lib.setGovRobotSA() return 1 except Exception as e: print(e) e_s = str(e) if (e_s.find("Fatal") != -1): daq_macros.robotOff() daq_macros.disableMount() daq_lib.gui_message(e_s + ". FATAL ROBOT ERROR - CALL STAFF! robotOff() executed.") return 0 if (e_s.find("tilted") != -1 or e_s.find("Load Sample Failed") != -1): if (db_lib.getBeamlineConfigParam(daq_utils.beamline,"queueCollect") == 0): daq_lib.gui_message(e_s + ". Try mounting again") return 0 else: if (retryMountCount == 0): retryMountCount+=1 mountStat = mountRobotSample(puckPos,pinPos,sampID,init) if (mountStat == 1): retryMountCount = 0 return mountStat else: retryMountCount = 0 daq_lib.gui_message("ROBOT: Could not recover from " + e_s) return 2 daq_lib.gui_message("ROBOT mount ERROR: " + e_s) return 0 return 1 else: return 1
def unmountRobotSample(puckPos,pinPos,sampID): #will somehow know where it came from # absPos = (pinsPerPuck*puckPos)+pinPos+1 absPos = (pinsPerPuck*(puckPos%3))+pinPos+1 robotOnline = db_lib.getBeamlineConfigParam(daq_utils.beamline,'robot_online') print("robot online = " + str(robotOnline)) if (robotOnline): detDist = beamline_lib.motorPosFromDescriptor("detectorDist") if (detDist<199.0): beamline_support.setPvValFromDescriptor("govRobotDetDistOut",200.0) beamline_support.setPvValFromDescriptor("govHumanDetDistOut",200.0) daq_lib.setRobotGovState("SE") print("unmounting " + str(puckPos) + " " + str(pinPos) + " " + str(sampID)) print("absPos = " + str(absPos)) platePos = int(puckPos/3) rotMotTarget = daq_utils.dewarPlateMap[platePos][0] rotCP = beamline_lib.motorPosFromDescriptor("dewarRot") print("dewar target,CP") print(rotMotTarget,rotCP) if (abs(rotMotTarget-rotCP)>1): print("rot dewar") try: RobotControlLib.runCmd("park") except Exception as e: e_s = str(e) daq_lib.gui_message("ROBOT park ERROR: " + e_s) print(e) return 0 beamline_lib.mvaDescriptor("dewarRot",rotMotTarget) try: par_init=(beamline_support.get_any_epics_pv("SW:RobotState","VAL")!="Ready") par_cool=(beamline_support.getPvValFromDescriptor("gripTemp")>-170) if par_cool == False and daq_utils.beamline == "fmx": time.sleep(3) RobotControlLib.unmount1(init=par_init,cooldown=par_cool) except Exception as e: e_s = str(e) daq_lib.gui_message("ROBOT unmount ERROR: " + e_s) print(e) return 0 detDist = beamline_lib.motorPosFromDescriptor("detectorDist") if (detDist<200.0): beamline_lib.mvaDescriptor("detectorDist",200.0) if (beamline_lib.motorPosFromDescriptor("detectorDist") < 199.0): print("ERROR - Detector < 200.0!") return 0 try: RobotControlLib.unmount2(absPos) except Exception as e: e_s = str(e) if (e_s.find("Fatal") != -1): daq_macros.robotOff() daq_macros.disableMount() daq_lib.gui_message(e_s + ". FATAL ROBOT ERROR - CALL STAFF! robotOff() executed.") return 0 daq_lib.gui_message("ROBOT unmount2 ERROR: " + e_s) print(e) return 0 if (not daq_lib.waitGovRobotSE()): daq_lib.clearMountedSample() print("could not go to SE") return 0 return 1
def lib_close_shutter(): # beamline_lib.mvaDescriptor("fastShutter",-12.5) beamline_lib.mvaDescriptor("fastShutter",beamline_support.getPvValFromDescriptor("fastShutterClosePos"))
def lib_open_shutter(): # beamline_lib.mvaDescriptor("fastShutter",12.5) beamline_lib.mvaDescriptor("fastShutter",beamline_support.getPvValFromDescriptor("fastShutterOpenPos"))
def collectData(currentRequest): global data_directory_name,currentIspybDCID,fastDPNodeCount,fastDPNodeCounter # print(currentRequest) # print("pretending to collect") # time.sleep(5) # db_lib.updatePriority(currentRequest["uid"],-1) # refreshGuiTree() # return 1 #SHORT CIRCUIT logMe = 1 reqObj = currentRequest["request_obj"] data_directory_name = str(reqObj["directory"]) exposure_period = reqObj["exposure_time"] wavelength = reqObj["wavelength"] resolution = reqObj["resolution"] slit_height = reqObj["slit_height"] slit_width = reqObj["slit_width"] attenuation = reqObj["attenuation"] img_width = reqObj["img_width"] file_prefix = str(reqObj["file_prefix"]) print(reqObj["protocol"]) prot = str(reqObj["protocol"]) sweep_start = reqObj["sweep_start"] sweep_end = reqObj["sweep_end"] range_degrees = abs(sweep_end-sweep_start) sweep_start = reqObj["sweep_start"]%360.0 file_number_start = reqObj["file_number_start"] basePath = reqObj["basePath"] # jpegDirectory = "jpegs" + data_directory_name[data_directory_name.find(basePath)+len(basePath):len(data_directory_name)] visitName = daq_utils.getVisitName() jpegDirectory = visitName + "/jpegs/" + data_directory_name[data_directory_name.find(visitName)+len(visitName):len(data_directory_name)] status = 1 if not (os.path.isdir(data_directory_name)): comm_s = "mkdir -p " + data_directory_name os.system(comm_s) comm_s = "chmod 777 " + data_directory_name os.system(comm_s) comm_s = "mkdir -p " + jpegDirectory os.system(comm_s) comm_s = "chmod 777 " + jpegDirectory os.system(comm_s) if (prot == "raster"): status = daq_macros.snakeRaster(currentRequest["uid"]) elif (prot == "stepRaster"): status = daq_macros.snakeStepRaster(currentRequest["uid"]) elif (prot == "vector" or prot == "stepVector"): if (reqObj["centeringOption"] != "Interactive"): logMe = 0 daq_macros.autoVector(currentRequest) else: imagesAttempted = collect_detector_seq_hw(sweep_start,range_degrees,img_width,exposure_period,file_prefix,data_directory_name,file_number_start,currentRequest) elif (prot == "multiCol"): # daq_macros.multiCol(currentRequest) daq_macros.snakeRaster(currentRequest["uid"]) elif (prot == "multiColQ"): daq_macros.multiCol(currentRequest) # daq_macros.snakeRaster(currentRequest["uid"]) elif (prot == "eScan"): daq_macros.eScan(currentRequest) else: #standard, screening, or edna - these may require autoalign, checking first if (reqObj["pos_x"] != -999): beamline_lib.mvaDescriptor("sampleX",reqObj["pos_x"]) beamline_lib.mvaDescriptor("sampleY",reqObj["pos_y"]) beamline_lib.mvaDescriptor("sampleZ",reqObj["pos_z"]) elif (reqObj["centeringOption"] == "Interactive"): #robotic, pause and let user center pause_data_collection() check_pause() else: print("autoRaster") if not (daq_macros.autoRasterLoop(currentRequest)): print("could not center sample") db_lib.updatePriority(currentRequest["uid"],-1) refreshGuiTree() return 0 # if (not stateModule.gotoState("DataCollection")): # print("State violation") # db_lib.updatePriority(currentRequest["uid"],-1) # refreshGuiTree() # return 0 if (reqObj["protocol"] == "screen"): screenImages = 2 screenRange = 90 range_degrees = img_width for i in range (0,screenImages): sweep_start = reqObj["sweep_start"]+(i*screenRange) sweep_end = sweep_start+screenRange # sweep_end = reqObj["sweep_end"]+(i*screenRange) file_prefix = str(reqObj["file_prefix"]+"_"+str(i*screenRange)) data_directory_name = str(reqObj["directory"]) # for now file_number_start = reqObj["file_number_start"] beamline_lib.mvaDescriptor("omega",sweep_start) if (1): # if (beamline_support.getPvValFromDescriptor("gonDaqHwTrig")): imagesAttempted = collect_detector_seq_hw(sweep_start,range_degrees,img_width,exposure_period,file_prefix,data_directory_name,file_number_start,currentRequest) else: imagesAttempted = collect_detector_seq(sweep_start,range_degrees,img_width,exposure_period,file_prefix,data_directory_name,file_number_start,currentRequest) seqNum = int(detector_get_seqnum()) cbfComm = db_lib.getBeamlineConfigParam(daq_utils.beamline,"cbfComm") cbfDir = data_directory_name+"/cbf" comm_s = "mkdir -p " + cbfDir os.system(comm_s) hdfSampleDataPattern = data_directory_name+"/"+file_prefix+"_" hdfRowFilepattern = hdfSampleDataPattern + str(int(float(seqNum))) + "_master.h5" CBF_conversion_pattern = cbfDir + "/" + file_prefix+"_" + str(int(sweep_start))+".cbf" comm_s = "eiger2cbf-linux " + hdfRowFilepattern startIndex=1 endIndex = 1 node = db_lib.getBeamlineConfigParam(daq_utils.beamline,"spotNode1") comm_s = "ssh -q " + node + " \"sleep 6;" + cbfComm + " " + hdfRowFilepattern + " " + str(startIndex) + ":" + str(endIndex) + " " + CBF_conversion_pattern + "\"&" print(comm_s) os.system(comm_s) elif (reqObj["protocol"] == "characterize" or reqObj["protocol"] == "ednaCol"): characterizationParams = reqObj["characterizationParams"] index_success = daq_macros.dna_execute_collection3(0.0,img_width,2,exposure_period,data_directory_name+"/",file_prefix,1,-89.0,1,currentRequest) # if (0): if (index_success): resultsList = db_lib.getResultsforRequest(currentRequest["uid"]) # because for testing I keep running the same request. Probably not in usual use. results = resultsList[-2] strategyResults = results["result_obj"]["strategy"] stratStart = strategyResults["start"] stratEnd = strategyResults["end"] stratWidth = strategyResults["width"] stratExptime = strategyResults["exptime"] stratDetDist = strategyResults["detDist"] sampleID = currentRequest["sample"] tempnewStratRequest = daq_utils.createDefaultRequest(sampleID) newReqObj = tempnewStratRequest["request_obj"] newReqObj["sweep_start"] = stratStart newReqObj["sweep_end"] = stratEnd newReqObj["img_width"] = stratWidth newReqObj["exposure_time"] = stratExptime newReqObj["detDist"] = stratDetDist newReqObj["directory"] = data_directory_name newReqObj["pos_x"] = beamline_lib.motorPosFromDescriptor("sampleX") newReqObj["pos_y"] = beamline_lib.motorPosFromDescriptor("sampleY") newReqObj["pos_z"] = beamline_lib.motorPosFromDescriptor("sampleZ") newReqObj["fastDP"] = reqObj["fastDP"] # this is where you might want a "new from old" request to carry over stuff like this. newReqObj["fastEP"] = reqObj["fastEP"] newReqObj["dimple"] = reqObj["dimple"] newReqObj["xia2"] = reqObj["xia2"] runNum = db_lib.incrementSampleRequestCount(sampleID) reqObj["runNum"] = runNum newStratRequest = db_lib.addRequesttoSample(sampleID,newReqObj["protocol"],daq_utils.owner,newReqObj,priority=0,proposalID=daq_utils.getProposalID()) if (reqObj["protocol"] == "ednaCol"): db_lib.updatePriority(currentRequest["uid"],-1) refreshGuiTree() collectData(newStratRequest) return 1 else: #standard beamline_lib.mvaDescriptor("omega",sweep_start) if (1): # if (beamline_support.getPvValFromDescriptor("gonDaqHwTrig")): imagesAttempted = collect_detector_seq_hw(sweep_start,range_degrees,img_width,exposure_period,file_prefix,data_directory_name,file_number_start,currentRequest) else: imagesAttempted = collect_detector_seq(sweep_start,range_degrees,img_width,exposure_period,file_prefix,data_directory_name,file_number_start,currentRequest) try: if (logMe): logMxRequestParams(currentRequest) except TypeError: print("caught type error in logging") if (prot == "vector" or prot == "standard"): seqNum = int(detector_get_seqnum()) comm_s = os.environ["LSDCHOME"] + "/runSpotFinder4syncW.py " + data_directory_name + " " + file_prefix + " " + str(currentRequest["uid"]) + " " + str(seqNum) + " " + str(currentIspybDCID)+ "&" print(comm_s) os.system(comm_s) if (reqObj["fastDP"]): if (reqObj["fastEP"]): fastEPFlag = 1 else: fastEPFlag = 0 if (reqObj["dimple"]): dimpleFlag = 1 else: dimpleFlag = 0 # node = db_lib.getBeamlineConfigParam(daq_utils.beamline,"fastDPNode") nodeName = "fastDPNode" + str((fastDPNodeCounter%fastDPNodeCount)+1) fastDPNodeCounter+=1 node = db_lib.getBeamlineConfigParam(daq_utils.beamline,nodeName) dimpleNode = db_lib.getBeamlineConfigParam(daq_utils.beamline,"dimpleNode") if (daq_utils.detector_id == "EIGER-16"): seqNum = int(detector_get_seqnum()) # seqNum = beamline_support.get_any_epics_pv("XF:17IDC-ES:FMX{Det:Eig16M}cam1:SequenceId","VAL") comm_s = os.environ["LSDCHOME"] + "/runFastDPH5.py " + data_directory_name + " " + file_prefix + " " + str(seqNum) + " " + str(int(round(range_degrees/img_width))) + " " + str(currentRequest["uid"]) + " " + str(fastEPFlag) + " " + node + " " + str(dimpleFlag) + " " + dimpleNode + " " + str(currentIspybDCID)+ "&" else: comm_s = os.environ["LSDCHOME"] + "/runFastDP.py " + data_directory_name + " " + file_prefix + " " + str(file_number_start) + " " + str(int(round(range_degrees/img_width))) + " " + str(currentRequest["uid"]) + " " + str(fastEPFlag) + " " + node + " " + str(dimpleFlag) + " " + dimpleNode + "&" print(comm_s) os.system(comm_s) if (reqObj["xia2"]): comm_s = "ssh -q xf17id1-srv1 \"" + os.environ["LSDCHOME"] + "/runXia2.py " + data_directory_name + " " + file_prefix + " " + str(file_number_start) + " " + str(int(round(range_degrees/img_width))) + " " + str(currentRequest["uid"]) + "\"&" # comm_s = os.environ["CBHOME"] + "/runXia2.py " + data_directory_name + " " + file_prefix + " " + str(file_number_start) + " " + str(int(round(range_degrees/img_width))) + " " + str(currentRequest["request_id"]) + "&" os.system(comm_s) db_lib.updatePriority(currentRequest["uid"],-1) refreshGuiTree() return status
def unmountRobotSample(puckPos, pinPos, sampID): #will somehow know where it came from absPos = (pinsPerPuck * (puckPos % 3)) + pinPos + 1 robotOnline = getBlConfig('robot_online') logger.info("robot online = " + str(robotOnline)) if (robotOnline): detDist = beamline_lib.motorPosFromDescriptor("detectorDist") if (detDist < 200.0): setPvDesc("govRobotDetDistOut", 200.0) setPvDesc("govHumanDetDistOut", 200.0) daq_lib.setRobotGovState("SE") logger.info("unmounting " + str(puckPos) + " " + str(pinPos) + " " + str(sampID)) logger.info("absPos = " + str(absPos)) platePos = int(puckPos / 3) rotMotTarget = daq_utils.dewarPlateMap[platePos][0] rotCP = beamline_lib.motorPosFromDescriptor("dewarRot") logger.info("dewar target,CP") logger.info("%s %s" % (rotMotTarget, rotCP)) if (abs(rotMotTarget - rotCP) > 1): logger.info("rot dewar") try: RobotControlLib.runCmd("park") except Exception as e: e_s = str(e) message = "ROBOT park ERROR: " + e_s daq_lib.gui_message(message) logger.error(message) return 0 beamline_lib.mvaDescriptor("dewarRot", rotMotTarget) try: par_init = (beamline_support.get_any_epics_pv( "SW:RobotState", "VAL") != "Ready") par_cool = (getPvDesc("gripTemp") > -170) RobotControlLib.unmount1(init=par_init, cooldown=par_cool) except Exception as e: e_s = str(e) message = "ROBOT unmount ERROR: " + e_s daq_lib.gui_message(message) logger.error(message) return 0 detDist = beamline_lib.motorPosFromDescriptor("detectorDist") if (detDist < 200.0): beamline_lib.mvaDescriptor("detectorDist", 200.0) if (beamline_lib.motorPosFromDescriptor("detectorDist") < 199.0): logger.error("ERROR - Detector < 200.0!") return 0 try: RobotControlLib.unmount2(absPos) except Exception as e: e_s = str(e) if (e_s.find("Fatal") != -1): daq_macros.robotOff() daq_macros.disableMount() daq_lib.gui_message( e_s + ". FATAL ROBOT ERROR - CALL STAFF! robotOff() executed.") return 0 message = "ROBOT unmount2 ERROR: " + e_s daq_lib.gui_message(message) logger.error(message) return 0 if (not daq_lib.waitGovRobotSE()): daq_lib.clearMountedSample() logger.info("could not go to SE") return 0 return 1
def dna_execute_collection3(dna_start,dna_range,dna_number_of_images,dna_exptime,dna_directory,prefix,start_image_number,overlap,dna_run_num,charRequest): global collect_and_characterize_success,dna_have_strategy_results,dna_have_index_results,picture_taken global dna_strategy_exptime,dna_strategy_start,dna_strategy_range,dna_strategy_end,dna_strat_dist global screeningoutputid characterizationParams = charRequest["request_obj"]["characterizationParams"] dna_res = float(characterizationParams["aimed_resolution"]) print("dna_res = " + str(dna_res)) dna_filename_list = [] print("number of images " + str(dna_number_of_images) + " overlap = " + str(overlap) + " dna_start " + str(dna_start) + " dna_range " + str(dna_range) + " prefix " + prefix + " start number " + str(start_image_number) + "\n") collect_and_characterize_success = 0 dna_have_strategy_results = 0 dna_have_index_results = 0 dg2rd = 3.14159265 / 180.0 if (daq_utils.detector_id == "ADSC-Q315"): det_radius = 157.5 elif (daq_utils.detector_id == "ADSC-Q210"): det_radius = 105.0 elif (daq_utils.detector_id == "PILATUS-6"): det_radius = 212.0 else: #default Pilatus det_radius = 212.0 ##### theta_radians = daq_lib.get_field("theta") * dg2rd theta_radians = 0.0 wave = 12398.5/beamline_lib.get_mono_energy() #for now dx = det_radius/(tan(2.0*(asin(wave/(2.0*dna_res)))-theta_radians)) print("distance = ",dx) #skinner - could move distance and wave and scan axis here, leave wave alone for now print("skinner about to take reference images.") for i in range(0,int(dna_number_of_images)): print("skinner prefix7 = " + prefix[0:7] + " " + str(start_image_number) + "\n") if (len(prefix)> 8): if ((prefix[0:7] == "postref") and (start_image_number == 1)): print("skinner postref bail\n") time.sleep(float(dna_number_of_images*float(dna_exptime))) break #skinner roi - maybe I can measure and use that for dna_start so that first image is face on. dna_start = daq_lib.get_field("datum_omega") colstart = float(dna_start) + (i*(abs(overlap)+float(dna_range))) dna_prefix = "ref-"+prefix #12/15 not sure why dna_run_num in prefix dna_prefix = "ref-"+prefix+"_"+str(dna_run_num) image_number = start_image_number+i dna_prefix_long = dna_directory+"/"+dna_prefix filename = daq_utils.create_filename(dna_prefix_long,image_number) beamline_lib.mvaDescriptor("omega",float(colstart)) ##### daq_lib.move_axis_absolute(daq_lib.get_field("scan_axis"),colstart) ##### daq_lib.take_image(colstart,dna_range,dna_exptime,filename,daq_lib.get_field("scan_axis"),0,1) daq_utils.take_crystal_picture(reqID=charRequest["request_id"]) ######### BECAUSE I FAKE IT imagesAttempted = collect_detector_seq(dna_range,dna_range,dna_exptime,dna_prefix,dna_directory,image_number) if (i==0): commFake = "ln -sf /nfs/skinner/testdata/johnPil6/data/B1GGTApo_9_00001.cbf " + filename else: commFake = "ln -sf /nfs/skinner/testdata/johnPil6/data/B1GGTApo_9_00181.cbf " + filename os.system(commFake) print(commFake) dna_filename_list.append(filename) ###4/16, don't bother with image server for now diffImgJpegData = daq_utils.diff2jpeg(filename,reqID=charRequest["request_id"]) #returns a dictionary # diffImgJpegData["timestamp"] = time.time() # imgRef = db_lib.addFile(diffImgJpegData["data"]) # diffImgJpegData["data"] = imgRef # imgRef = db_lib.addFile(diffImgJpegData["thumbData"]) # diffImgJpegData["thumbData"] = imgRef picture_taken = 1 # xml_from_file_list(flux,x_beamsize,y_beamsize,max_exptime_per_dc,aimed_completeness,file_list): edna_energy_ev = (12.3985/wave) * 1000.0 ##### xbeam_size = beamline_lib.get_motor_pos("slitHum") ##### ybeam_size = beamline_lib.get_motor_pos("slitVum") # if (xbeam_size == 0.0 or ybeam_size == 0.0): #don't know where to get these from yet if (1): xbeam_size = .1 ybeam_size = .16 else: xbeam_size = xbeam_size/1000 ybeam_size = ybeam_size/1000 aimed_completeness = characterizationParams['aimed_completeness'] aimed_multiplicity = characterizationParams['aimed_multiplicity'] aimed_resolution = characterizationParams['aimed_resolution'] aimed_ISig = characterizationParams['aimed_ISig'] timeout_check = 0; ##### while(not os.path.exists(dna_filename_list[len(dna_filename_list)-1])): #this waits for edna images if (0): timeout_check = timeout_check + 1 time.sleep(1.0) if (timeout_check > 10): break ##### flux = 10000000000 * beamline_lib.get_epics_pv("flux","VAL") flux = 600000000.0 #for now edna_input_filename = dna_directory + "/adsc1_in.xml" comm_s = "ssh -q xf17id1-srv1 \"" + os.environ["LSDCHOME"] + "/runEdna.py " + dna_directory + " " + dna_prefix + " " + str(aimed_ISig) + " " + str(flux) + " " + str(xbeam_size) + " " + str(ybeam_size) + " " + edna_input_filename + " " + str(charRequest["request_id"]) + "\"" print(comm_s) os.system(comm_s) return 1