Exemplo n.º 1
0
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))
Exemplo n.º 2
0
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))
Exemplo n.º 3
0
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