def createDefaultRequest(sample_id): """ Doesn't really create a request, just returns a dictionary with the default parameters that can be passed to addRequesttoSample(). But note that these then get overwritten anyway, and I no longer expose them in screen params dialog """ sample = db_lib.getSampleByID(sample_id) try: propNum = sample["proposalID"] except KeyError: propNum = 999999 if (propNum == None): propNum = 999999 if (propNum != getProposalID()): setProposalID(propNum) screenPhist = float(db_lib.getBeamlineConfigParam(beamline,"screen_default_phist")) screenPhiend = float(db_lib.getBeamlineConfigParam(beamline,"screen_default_phi_end")) screenWidth = float(db_lib.getBeamlineConfigParam(beamline,"screen_default_width")) screenDist = float(db_lib.getBeamlineConfigParam(beamline,"screen_default_dist")) screenExptime = float(db_lib.getBeamlineConfigParam(beamline,"screen_default_time")) screenReso = float(db_lib.getBeamlineConfigParam(beamline,"screen_default_reso")) screenWave = float(db_lib.getBeamlineConfigParam(beamline,"screen_default_wave")) screenEnergy = float(db_lib.getBeamlineConfigParam(beamline,"screen_default_energy")) screenbeamWidth = float(db_lib.getBeamlineConfigParam(beamline,"screen_default_beamWidth")) screenbeamHeight = float(db_lib.getBeamlineConfigParam(beamline,"screen_default_beamHeight")) screenTransmissionPercent = float(db_lib.getBeamlineConfigParam(beamline,"screen_transmission_percent")) sampleName = str(db_lib.getSampleNamebyID(sample_id)) basePath = os.getcwd() runNum = db_lib.getSampleRequestCount(sample_id) (puckPosition,samplePositionInContainer,containerID) = db_lib.getCoordsfromSampleID(beamline,sample_id) request = {"sample": sample_id} request["beamline"] = beamline requestObj = { "sample": sample_id, "sweep_start": screenPhist, "sweep_end": screenPhiend, "img_width": screenWidth, "exposure_time": screenExptime, "protocol": "standard", "detDist": screenDist, "parentReqID": -1, "basePath": basePath, "file_prefix": sampleName, "directory": basePath+"/" + str(getVisitName()) + "/"+sampleName+"/" + str(runNum) + "/" +db_lib.getContainerNameByID(containerID)+"_"+str(samplePositionInContainer+1)+"/", # "directory": basePath+"/" + str(getProposalID()) + "/"+sampleName+"/" + str(runNum) + "/" +db_lib.getContainerNameByID(containerID)+"_"+str(samplePositionInContainer+1)+"/", "file_number_start": 1, "energy":screenEnergy, "wavelength": energy2wave(screenEnergy), "resolution": screenReso, "slit_height": screenbeamHeight, "slit_width": screenbeamWidth, "attenuation": screenTransmissionPercent, "pos_x": -999, "pos_y": 0, "pos_z": 0, "pos_type": 'A', "gridStep": 30} request["request_obj"] = requestObj return request
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 createDefaultRequest(sample_id, createVisit=True): """ Doesn't really create a request, just returns a dictionary with the default parameters that can be passed to addRequesttoSample(). But note that these then get overwritten anyway, and I no longer expose them in screen params dialog """ sample = db_lib.getSampleByID(sample_id) try: propNum = sample["proposalID"] except KeyError: propNum = 999999 if (propNum == None): propNum = 999999 if (propNum != getProposalID()): setProposalID(propNum, createVisit) screenDist, screenEnergy, screenExptime, screenPhiend, screenPhist, screenReso, screenTransmissionPercent, screenWidth, screenbeamHeight, screenbeamWidth = getScreenDefaultParams( ) sampleName = str(db_lib.getSampleNamebyID(sample_id)) basePath = os.getcwd() runNum = db_lib.getSampleRequestCount(sample_id) (puckPosition, samplePositionInContainer, containerID) = db_lib.getCoordsfromSampleID(beamline, sample_id) request = {"sample": sample_id} request["beamline"] = beamline requestObj = { "sample": sample_id, "sweep_start": screenPhist, "sweep_end": screenPhiend, "img_width": screenWidth, "exposure_time": screenExptime, "protocol": "standard", "detDist": screenDist, "parentReqID": -1, "basePath": basePath, "file_prefix": sampleName, "directory": basePath + "/" + str(getVisitName()) + "/" + sampleName + "/" + str(runNum) + "/" + db_lib.getContainerNameByID(containerID) + "_" + str(samplePositionInContainer + 1) + "/", "file_number_start": 1, "energy": screenEnergy, "wavelength": energy2wave(screenEnergy), "resolution": screenReso, "slit_height": screenbeamHeight, "slit_width": screenbeamWidth, "attenuation": screenTransmissionPercent, "pos_x": -999, "pos_y": 0, "pos_z": 0, "pos_type": 'A', "gridStep": 20 } request["request_obj"] = requestObj return request
owner, resultObj, beamline=os.environ["BEAMLINE_ID"]) newResult = db_lib.getResult(resultID) visitName = getBlConfig("visitName") try: ispybLib.insertResult(newResult, "fastDP", request, visitName, ispybDCID, fastDPResultFile) except Exception as e: logger.error("runfastdph5 insert result ispyb error: %s" % e) if (runFastEP): os.system("fast_ep") #looks very bad! running on ca1! if (runDimple): logger.info('run dimple selected') sampleID = request["sample"] sample = db_lib.getSampleByID(sampleID) try: modelFilename = sample["model"] if (modelFilename == 'nan'): modelPDBname = "model.pdb" else: modelPDBname = modelFilename + ".pdb" except KeyError: modelPDBname = "model.pdb" dimpleRunningDir = directory + "/dimpleOutput" comm_s = "mkdir -p " + dimpleRunningDir os.system(comm_s) os.chdir(dimpleRunningDir) comm_s = "ssh -q " + dimpleNode + " \"cd " + dimpleRunningDir + ";" + dimpleComm + " " + runningDir + "/fast_dp.mtz " + baseDirectory + "/" + modelPDBname + " " + dimpleRunningDir + "\"" logger.info(comm_s) logger.info("running dimple")
fd = open(fastDPResultFile) resultObj = xmltodict.parse(fd.read()) print("finished fast_dp") print(resultObj) resultID = db_lib.addResultforRequest("fastDP",request_id,owner,resultObj,beamline=os.environ["BEAMLINE_ID"]) newResult = db_lib.getResult(resultID) visitName = db_lib.getBeamlineConfigParam(os.environ["BEAMLINE_ID"],"visitName") try: ispybLib.insertResult(newResult,"fastDP",request,visitName,ispybDCID,fastDPResultFile) except: print("ispyb error") if (runFastEP): os.system("fast_ep") #looks very bad! running on ca1! if (runDimple): sampleID = request["sample"] sample = db_lib.getSampleByID(sampleID) try: modelFilename = sample["model"] if (modelFilename == 'nan'): modelPDBname = "model.pdb" else: modelPDBname = modelFilename + ".pdb" except KeyError: modelPDBname = "model.pdb" dimpleRunningDir = directory+"/dimpleOutput" comm_s = "mkdir -p " + dimpleRunningDir os.system(comm_s) os.chdir(dimpleRunningDir) # comm_s = "ssh -q " + node + " \"cd " + runningDir +";source /nfs/skinner/wrappers/fastDPWrap;fast_ep" # comm_s = "ssh -q " + dimpleNode + " \"cd " + dimpleRunningDir +";dimple " + runningDir + "/fast_dp.mtz /GPFS/CENTRAL/xf17id2/jjakoncic/model.pdb " + dimpleRunningDir + "\"" comm_s = "ssh -q " + dimpleNode + " \"cd " + dimpleRunningDir +";" + dimpleComm + " " + runningDir + "/fast_dp.mtz " + baseDirectory + "/" + modelPDBname + " " + dimpleRunningDir + "\""