def center_on_click( x, y, fovx, fovy, source="screen", maglevel=0, jog=0 ): #maglevel=0 means lowmag, high fov, #1 = himag with digizoom option, #source=screen = from screen click, otherwise from macro with full pixel dimensions if (getBlConfig('robot_online') ): #so that we don't move things when robot moving? robotGovState = (getPvDesc("robotSaActive") or getPvDesc("humanSaActive")) if (not robotGovState): return if not (checkC2C_X(x, fovx)): return if (source == "screen"): waitGovNoSleep() setPvDesc("image_X_scalePix", daq_utils.screenPixX) #these are video dimensions in the gui setPvDesc("image_Y_scalePix", daq_utils.screenPixY) setPvDesc("image_X_centerPix", daq_utils.screenPixX / 2) setPvDesc("image_Y_centerPix", daq_utils.screenPixY / 2) setPvDesc("image_X_scaleMM", float(fovx)) setPvDesc("image_Y_scaleMM", float(fovy)) else: if ( int(maglevel) == 0 ): #I think hardcoded to not use maglevel anymore, replaced with more flexible fov setPvDesc("image_X_scalePix", daq_utils.lowMagPixX) setPvDesc("image_Y_scalePix", daq_utils.lowMagPixY) setPvDesc("image_X_centerPix", daq_utils.lowMagPixX / 2) setPvDesc("image_Y_centerPix", daq_utils.lowMagPixY / 2) setPvDesc("image_X_scaleMM", float(fovx)) setPvDesc("image_Y_scaleMM", float(fovy)) else: setPvDesc("image_X_scalePix", daq_utils.lowMagPixX) setPvDesc("image_Y_scalePix", daq_utils.lowMagPixY) setPvDesc("image_X_centerPix", daq_utils.highMagPixX / 2) setPvDesc("image_Y_centerPix", daq_utils.highMagPixY / 2) setPvDesc("image_X_scaleMM", float(fovx)) setPvDesc("image_Y_scaleMM", float(fovy)) omega_mod = beamline_lib.motorPosFromDescriptor("omega") % 360.0 lib_gon_center_xtal(x, y, omega_mod, 0) if (jog): beamline_lib.mvrDescriptor("omega", float(jog))
def center_on_click(x,y,fovx,fovy,source="screen",maglevel=0,jog=0): #maglevel=0 means lowmag, high fov, #1 = himag with digizoom option, #source=screen = from screen click, otherwise from macro with full pixel dimensions if (db_lib.getBeamlineConfigParam(daq_utils.beamline,'robot_online')): #so that we don't move things when robot moving? robotGovState = (beamline_support.getPvValFromDescriptor("robotSaActive") or beamline_support.getPvValFromDescriptor("humanSaActive")) if (not robotGovState): return # if (daq_utils.beamline == "amx"): if (1): if not (checkC2C_X(x,fovx)): return if (source == "screen"): waitGovNoSleep() beamline_support.setPvValFromDescriptor("image_X_scalePix",daq_utils.screenPixX) #these are video dimensions in the gui beamline_support.setPvValFromDescriptor("image_Y_scalePix",daq_utils.screenPixY) beamline_support.setPvValFromDescriptor("image_X_centerPix",daq_utils.screenPixX/2) beamline_support.setPvValFromDescriptor("image_Y_centerPix",daq_utils.screenPixY/2) beamline_support.setPvValFromDescriptor("image_X_scaleMM",float(fovx)) beamline_support.setPvValFromDescriptor("image_Y_scaleMM",float(fovy)) else: if (int(maglevel)==0): #I think hardcoded to not use maglevel anymore, replaced with more flexible fov beamline_support.setPvValFromDescriptor("image_X_scalePix",daq_utils.lowMagPixX) beamline_support.setPvValFromDescriptor("image_Y_scalePix",daq_utils.lowMagPixY) beamline_support.setPvValFromDescriptor("image_X_centerPix",daq_utils.lowMagPixX/2) beamline_support.setPvValFromDescriptor("image_Y_centerPix",daq_utils.lowMagPixY/2) beamline_support.setPvValFromDescriptor("image_X_scaleMM",float(fovx)) beamline_support.setPvValFromDescriptor("image_Y_scaleMM",float(fovy)) else: beamline_support.setPvValFromDescriptor("image_X_scalePix",daq_utils.lowMagPixX) beamline_support.setPvValFromDescriptor("image_Y_scalePix",daq_utils.lowMagPixY) beamline_support.setPvValFromDescriptor("image_X_centerPix",daq_utils.highMagPixX/2) beamline_support.setPvValFromDescriptor("image_Y_centerPix",daq_utils.highMagPixY/2) beamline_support.setPvValFromDescriptor("image_X_scaleMM",float(fovx)) beamline_support.setPvValFromDescriptor("image_Y_scaleMM",float(fovy)) omega_mod = beamline_lib.motorPosFromDescriptor("omega")%360.0 # daq_utils.broadcast_output("\ncenter on x = %s, y = %s, omega = %f, phi = %f\n" % (x,y,omega_mod,0)) # xcheck = checkC2C_X(x,fovx) # if (xcheck): lib_gon_center_xtal(x,y,omega_mod,0) if (jog): beamline_lib.mvrDescriptor("omega",float(jog))
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