Ejemplo n.º 1
0
def insertRasterResult(request, visitName):

    try:
        sessionid = core.retrieve_visit_id(visitName)
    except ISPyBNoResultException as e:
        logger.error(
            "caught ISPyBNoResultException, make sure visit name is in the format mx999999-1234. bye: %s"
            % e)
        return
    sample = request[
        'sample']  # this needs to be created and linked to a DC group
    #result_obj = result['result_obj'] this doesn't appear to be used -DK
    request_obj = request['request_obj']
    directory = request_obj["directory"]
    filePrefix = request_obj['file_prefix']
    basePath = request_obj["basePath"]
    visitName = daq_utils.getVisitName()
    jpegDirectory = visitName + "/jpegs/" + directory[
        directory.find(visitName) + len(visitName):len(directory)]
    fullJpegDirectory = basePath + "/" + jpegDirectory
    jpegImagePrefix = fullJpegDirectory + "/" + filePrefix
    jpegImageFilename = jpegImagePrefix + ".jpg"
    jpegImageThumbFilename = jpegImagePrefix + "t.jpg"
    comm_s = "convert " + jpegImageFilename + " -resize 40% " + jpegImageThumbFilename + "&"
    logger.info('raster thumbnail creation: %s' % comm_s)
    os.system(comm_s)
    # Create a new data collection group entry:
    params = mxacquisition.get_data_collection_group_params()
    params['parentid'] = sessionid
    params['experimenttype'] = 'OSC'
    return createDataCollection(directory, filePrefix, jpegImageFilename,
                                params, request_obj, sessionid)
Ejemplo n.º 2
0
def logMxRequestParams(currentRequest):
  global currentIspybDCID
  reqObj = currentRequest["request_obj"]
  transmissionReadback = beamline_support.getPvValFromDescriptor("transmissionRBV")
  flux = beamline_support.getPvValFromDescriptor("flux")
  resultObj = {"requestObj":reqObj,"transmissionReadback":transmissionReadback,"flux":flux}  
  resultID = db_lib.addResultforRequest("mxExpParams",currentRequest["uid"],owner=daq_utils.owner,result_obj=resultObj,proposalID=daq_utils.getProposalID(),beamline=daq_utils.beamline)
  newResult = db_lib.getResult(resultID)
  db_lib.beamlineInfo(daq_utils.beamline, 'currentSampleID', info_dict={'sampleID':currentRequest["sample"]})
  db_lib.beamlineInfo(daq_utils.beamline, 'currentRequestID', info_dict={'requestID':currentRequest["uid"]})
  logfile = open("dataColLog.txt","a+")
  try:
    logfile.write("\n\ntimestamp: " + time.ctime(currentRequest["time"])+"\n")
  except KeyError:    
    print("caught key error in logging")
    print(currentRequest)
  logfile.write("protocol: " + reqObj["protocol"] +"\n")  
  logfile.write("data prefix: " + reqObj["file_prefix"] +"\n")
  logfile.write("flux: " + str(flux) +"\n")
  logfile.write("transimission percent: " + str(transmissionReadback) +"\n")
  logfile.write("total current (BCU): " + str(beamline_support.getPvValFromDescriptor("totalCurrentBCU")) +"\n")    
  logfile.write("omega start: " + str(reqObj["sweep_start"]) +"\n")
  logfile.write("omega end: " + str(reqObj["sweep_end"]) +"\n")
  logfile.write("image width: " + str(reqObj["img_width"]) +"\n")
  logfile.write("exposure time per image (s): " + str(reqObj["exposure_time"]) +"\n")
  logfile.write("detector distance: " + str(reqObj["detDist"]) +"\n")
  logfile.write("wavelength: " + str(reqObj["wavelength"]) +"\n")
  logfile.close()
  visitName = daq_utils.getVisitName()
  try: #I'm worried about unforseen ispyb db errors
    currentIspybDCID = ispybLib.insertResult(newResult,"mxExpParams",currentRequest,visitName)
  except:
    currentIspybDCID = 999999
    print("ispyb error")
Ejemplo n.º 3
0
def logMxRequestParams(currentRequest, wait=True):
    global currentIspybDCID
    reqObj = currentRequest["request_obj"]
    transmissionReadback = getPvDesc("transmissionRBV")
    flux = getPvDesc("flux")
    resultObj = {
        "requestObj": reqObj,
        "transmissionReadback": transmissionReadback,
        "flux": flux
    }
    resultID = db_lib.addResultforRequest("mxExpParams",
                                          currentRequest["uid"],
                                          owner=daq_utils.owner,
                                          result_obj=resultObj,
                                          proposalID=daq_utils.getProposalID(),
                                          beamline=daq_utils.beamline)
    newResult = db_lib.getResult(resultID)
    newResult['result_obj']['requestObj']['xbeam'] = reqObj['xbeam']
    newResult['result_obj']['requestObj']['ybeam'] = reqObj['ybeam']
    db_lib.beamlineInfo(daq_utils.beamline,
                        'currentSampleID',
                        info_dict={'sampleID': currentRequest["sample"]})
    db_lib.beamlineInfo(daq_utils.beamline,
                        'currentRequestID',
                        info_dict={'requestID': currentRequest["uid"]})
    logfile = open("dataColLog.txt", "a+")
    try:
        logfile.write("\n\ntimestamp: " + time.ctime(currentRequest["time"]) +
                      "\n")
    except KeyError:
        logger.error("caught key error in logging")
        logger.error(currentRequest)
    logfile.write("protocol: " + reqObj["protocol"] + "\n")
    logfile.write("data prefix: " + reqObj["file_prefix"] + "\n")
    logfile.write("flux: " + str(flux) + "\n")
    logfile.write("transimission percent: " + str(transmissionReadback) + "\n")
    logfile.write("total current (BCU): " + str(getPvDesc("totalCurrentBCU")) +
                  "\n")
    logfile.write("omega start: " + str(reqObj["sweep_start"]) + "\n")
    logfile.write("omega end: " + str(reqObj["sweep_end"]) + "\n")
    logfile.write("image width: " + str(reqObj["img_width"]) + "\n")
    logfile.write("exposure time per image (s): " +
                  str(reqObj["exposure_time"]) + "\n")
    logfile.write("detector distance: " + str(reqObj["detDist"]) + "\n")
    logfile.write("wavelength: " + str(reqObj["wavelength"]) + "\n")
    logfile.close()
    visitName = daq_utils.getVisitName()
    try:  #I'm worried about unforseen ispyb db errors
        #rasters results are entered in ispyb by the GUI, no need to wait
        if wait:
            time.sleep(getBlConfig(ISPYB_RESULT_ENTRY_DELAY))
        currentIspybDCID = ispybLib.insertResult(newResult, "mxExpParams",
                                                 currentRequest, visitName)
    except Exception as e:
        currentIspybDCID = 999999
        logger.error("logMxRequestParams - ispyb error: %s" % e)
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
def insertResult(result,
                 resultType,
                 request,
                 visitName,
                 dc_id=None,
                 xmlFileName=None):  #xmlfilename for fastDP
    #keep in mind that request type can be standard and result type be fastDP - multiple results per req.

    cbfComm = db_lib.getBeamlineConfigParam(beamline, "cbfComm")
    try:
        sessionid = core.retrieve_visit_id(visitName)
    except ISPyBNoResultException as e:
        logger.error(
            "caught ISPyBNoResultException: %s. make sure visit name is in the format mx999999-1234"
            % e)
        propNum = visitName.split('-')[0]
        sessionid = createVisit(propNum)
    request_type = request['request_type']
    if request_type in ('standard', 'vector'):
        sample = request[
            'sample']  # this needs to be created and linked to a DC group
        if (resultType == 'fastDP'):
            mx_data_reduction_dict = xml_file_to_dict(xmlFileName)
            (app_id, ap_id, scaling_id,
             integration_id) = mx_data_reduction_to_ispyb(
                 mx_data_reduction_dict, dc_id, mxprocessing)
            mxprocessing.upsert_program_ex(program_id=app_id, status=1)

        elif resultType == 'mxExpParams':
            result_obj = result['result_obj']
            request_obj = result_obj['requestObj']
            directory = request_obj["directory"]
            filePrefix = request_obj['file_prefix']
            basePath = request_obj["basePath"]
            visitName = daq_utils.getVisitName()
            jpegDirectory = visitName + "/jpegs/" + directory[
                directory.find(visitName) + len(visitName):len(directory)]
            fullJpegDirectory = basePath + "/" + jpegDirectory
            jpegImagePrefix = fullJpegDirectory + "/" + filePrefix
            daq_utils.take_crystal_picture(filename=jpegImagePrefix)
            jpegImageFilename = jpegImagePrefix + ".jpg"
            jpegImageThumbFilename = jpegImagePrefix + "t.jpg"
            node = db_lib.getBeamlineConfigParam(beamline, "adxvNode")
            comm_s = "ssh -q " + node + " \"convert " + jpegImageFilename + " -resize 40% " + jpegImageThumbFilename + "\"&"
            logger.info('resizing image: %s' % comm_s)
            os.system(comm_s)
            seqNum = int(detSeqNumPV.get())
            hdfSampleDataPattern = directory + "/" + filePrefix + "_"
            hdfRowFilepattern = hdfSampleDataPattern + str(int(
                float(seqNum))) + "_master.h5"

            # keep in mind I could do the jpeg conversion here, but maybe best to allow synchWeb on demand.
            cbfDir = directory
            CBF_conversion_pattern = cbfDir + "/" + filePrefix + "_"
            JPEG_conversion_pattern = fullJpegDirectory + "/" + filePrefix + "_"
            node = db_lib.getBeamlineConfigParam(beamline, "adxvNode")
            adxvComm = os.environ["PROJDIR"] + db_lib.getBeamlineConfigParam(
                daq_utils.beamline, "adxvComm")
            comm_s = "ssh -q " + node + " \"sleep 6;" + cbfComm + " " + hdfRowFilepattern + " 1:1 " + CBF_conversion_pattern + ";" + adxvComm + " -sa " + CBF_conversion_pattern + "000001.cbf " + JPEG_conversion_pattern + "0001.jpeg;convert " + JPEG_conversion_pattern + "0001.jpeg -resize 10% " + JPEG_conversion_pattern + "0001.thumb.jpeg\"&"
            logger.info('diffraction thumbnail image: %s' % comm_s)
            os.system(comm_s)
            # Create a new data collection group entry:
            params = mxacquisition.get_data_collection_group_params()
            params['parentid'] = sessionid
            if request_type == 'standard':
                params['experimenttype'] = 'OSC'
            elif request_type == 'vector':
                params['experimenttype'] = 'Helical'
            return createDataCollection(directory, filePrefix,
                                        jpegImageFilename, params, request_obj,
                                        sessionid)
Ejemplo n.º 7
0
def insertResult(result,
                 resultType,
                 request,
                 visitName,
                 dc_id=None,
                 xmlFileName=None):  #xmlfilename for fastDP
    #keep in mind that request type can be standard and result type be fastDP - multiple results per req.

    try:
        sessionid = core.retrieve_visit_id(visitName)
    except ISPyBNoResultException as e:
        logger.error(
            "insert result - caught ISPyBNoResultException: '%s'. make sure visit name is in the format mx999999-1234. NOT HAVING MX IN FRONT IS A SIGN OF PROBLEMS - try newVisit() in that case."
            % e)
        propNum = visitName.split('-')[0]
        sessionid = createVisit(propNum)
    request_type = request['request_type']
    if request_type in ('standard', 'vector'):
        sample = request[
            'sample']  # this needs to be created and linked to a DC group
        if (resultType == 'fastDP'):
            mx_data_reduction_dict = xml_file_to_dict(xmlFileName)
            (app_id, ap_id, scaling_id,
             integration_id) = mx_data_reduction_to_ispyb(
                 mx_data_reduction_dict, dc_id, mxprocessing)
            mxprocessing.upsert_program_ex(program_id=app_id, status=1)

        elif resultType == 'mxExpParams':
            result_obj = result['result_obj']
            request_obj = result_obj['requestObj']
            directory = request_obj["directory"]
            filePrefix = request_obj['file_prefix']
            basePath = request_obj["basePath"]
            visitName = daq_utils.getVisitName()
            jpegDirectory = visitName + "/jpegs/" + directory[
                directory.find(visitName) + len(visitName):len(directory)]
            fullJpegDirectory = basePath + "/" + jpegDirectory
            jpegImagePrefix = fullJpegDirectory + "/" + filePrefix
            daq_utils.take_crystal_picture(filename=jpegImagePrefix)
            jpegImageFilename = jpegImagePrefix + ".jpg"
            jpegImageThumbFilename = jpegImagePrefix + "t.jpg"
            node = db_lib.getBeamlineConfigParam(beamline, "adxvNode")
            comm_s = f"ssh -q {node} \"{os.environ['MXPROCESSINGSCRIPTSDIR']}resize.sh {jpegImageFilename} {jpegImageThumbFilename} 40% \"&"
            logger.info('resizing image: %s' % comm_s)
            os.system(comm_s)

            seqNum = int(detSeqNumPV.get())
            node = db_lib.getBeamlineConfigParam(beamline, "adxvNode")
            request_id = result['request']
            comm_s = f"ssh -q {node} \"{os.environ['MXPROCESSINGSCRIPTSDIR']}eiger2cbf.sh {request_id} 1 1 0 {seqNum}\""
            logger.info(f'diffraction thumbnail conversion to cbf: {comm_s}')
            os.system(comm_s)
            comm_s = f"ssh -q {node} \"{os.environ['MXPROCESSINGSCRIPTSDIR']}cbf2jpeg.sh {request_id}\""
            logger.info(f'diffraction thumbnail conversion to jpeg: {comm_s}')
            os.system(comm_s)
            # Create a new data collection group entry:
            params = mxacquisition.get_data_collection_group_params()
            params['parentid'] = sessionid
            if request_type == 'standard':
                params['experimenttype'] = 'OSC'
            elif request_type == 'vector':
                params['experimenttype'] = 'Helical'
            return createDataCollection(directory, filePrefix,
                                        jpegImageFilename, params, request_obj,
                                        sessionid)
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
def insertResult(result,resultType,request,visitName,dc_id=None,xmlFileName=None): #xmlfilename for fastDP
#keep in mind that request type can be standard and result type be fastDP - multiple results per req.

 cbfComm = db_lib.getBeamlineConfigParam(daq_utils.beamline,"cbfComm")
 try:
   sessionid = core.retrieve_visit_id(visitName)
 except ISPyBNoResultException:
   print("caught ISPyBNoResultException")
   sessionid = createVisit(visitName)
 request_type = request['request_type']
 if request_type in('standard', 'vector') :
   sample = request['sample'] # this needs to be created and linked to a DC group
   if (resultType == 'fastDP'):
     mx_data_reduction_dict = xml_file_to_dict(xmlFileName)
     (app_id, ap_id, scaling_id, integration_id) = mx_data_reduction_to_ispyb(mx_data_reduction_dict, dc_id, mxprocessing)
         
   elif resultType == 'mxExpParams':
     result_obj = result['result_obj']
     request_obj = result_obj['requestObj']
     directory = request_obj["directory"]
     filePrefix = request_obj['file_prefix']
     basePath = request_obj["basePath"]
     visitName = daq_utils.getVisitName()
     jpegDirectory = visitName + "/jpegs/" + directory[directory.find(visitName)+len(visitName):len(directory)]  
#     jpegDirectory = "jpegs" + directory[directory.find(basePath)+len(basePath):len(directory)]
     fullJpegDirectory = basePath + "/" + jpegDirectory
     jpegImagePrefix = fullJpegDirectory+"/"+filePrefix     
     daq_utils.take_crystal_picture(filename=jpegImagePrefix)
     jpegImageFilename = jpegImagePrefix+".jpg"
     jpegImageThumbFilename = jpegImagePrefix+"t.jpg"
     node = db_lib.getBeamlineConfigParam(daq_utils.beamline,"adxvNode")
#     node = db_lib.getBeamlineConfigParam(daq_utils.beamline,"spotNode1")          
     comm_s = "ssh -q " + node + " \"convert " + jpegImageFilename + " -resize 40% " + jpegImageThumbFilename + "\"&"     
     print(comm_s)
     os.system(comm_s)
#     seqNum = int(det_lib.detector_get_seqnum())
     seqNum = int(detSeqNumPV.get())          
     hdfSampleDataPattern = directory+"/"+filePrefix+"_" 
     hdfRowFilepattern = hdfSampleDataPattern + str(int(float(seqNum))) + "_master.h5"
     
#jpeg folder     cbfDir = os.getcwd()+"/jpegs/"+directory[len(os.getcwd()):len(directory)] #good luck with that working

# keep in mind I could do the jpeg conversion here, but maybe best to allow synchWeb on demand.
     cbfDir = directory
     CBF_conversion_pattern = cbfDir + "/" + filePrefix+"_"
     JPEG_conversion_pattern = fullJpegDirectory + "/" + filePrefix+"_"
     node = db_lib.getBeamlineConfigParam(daq_utils.beamline,"adxvNode")
#     node = db_lib.getBeamlineConfigParam(daq_utils.beamline,"spotNode1")     
     adxvComm = os.environ["PROJDIR"] + db_lib.getBeamlineConfigParam(daq_utils.beamline,"adxvComm")     
     comm_s = "ssh -q " + node + " \"sleep 6;" + cbfComm + " "  + hdfRowFilepattern  + " 1 " + CBF_conversion_pattern + "0001.cbf;" + adxvComm + " -sa "  + CBF_conversion_pattern + "0001.cbf " + JPEG_conversion_pattern + "0001.jpeg;convert " + JPEG_conversion_pattern + "0001.jpeg -resize 10% " + JPEG_conversion_pattern + "0001.thumb.jpeg\"&"
#     comm_s = "ssh -q " + node + " \"sleep 6;" + cbfComm + " "  + hdfRowFilepattern  + " 1 " + CBF_conversion_pattern + "0001.cbf;" + adxvComm + " -sa "  + CBF_conversion_pattern + "0001.cbf " + JPEG_conversion_pattern + "0001.jpeg;cp " + JPEG_conversion_pattern + "0001.jpeg " + JPEG_conversion_pattern + "0001.thumb.jpeg\"&"     
     print(comm_s)
     os.system(comm_s)
     # Create a new data collection group entry:
     params = mxacquisition.get_data_collection_group_params()
     params['parentid'] = sessionid
     # params['sampleid'] = ?
     if request_type == 'standard':
       params['experimenttype'] = 'OSC'
     elif request_type == 'vector':
       params['experimenttype'] = 'Helical'
     params['starttime'] = datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')
     params['endtime'] = datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')
#     params['starttime'] = datetime.fromtimestamp(request['time']).strftime('%Y-%m-%d %H:%M:%S')
#     params['endtime'] = datetime.fromtimestamp(request['time']).strftime('%Y-%m-%d %H:%M:%S')
     dcg_id = mxacquisition.insert_data_collection_group(list(params.values()))
     print("dcg_id: %i" % dcg_id)
     params = mxacquisition.get_data_collection_params()
     params['parentid'] = dcg_id
     params['visitid'] = sessionid
     params['imgdir'] = directory
     params['imgprefix'] = filePrefix
     params['imgsuffix'] = 'cbf' # assume CBF ...?
     params['wavelength'] = request_obj['wavelength']
     params['starttime'] = datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')
#     params['starttime'] = datetime.fromtimestamp(request['time']).strftime('%Y-%m-%d %H:%M:%S')     
     params['run_status'] = 'DataCollection Successful' # assume success / not aborted
     params['datacollection_number'] = request_obj['runNum']
     params['n_images'] = int(round((request_obj['sweep_end'] - request_obj['sweep_start']) / request_obj['img_width']))
     params['exp_time'] = request_obj['exposure_time']
     params['start_image_number'] = request_obj['file_number_start']
     params['axis_start'] = request_obj['sweep_start']
     params['axis_end'] = request_obj['sweep_end']
     params['axis_range'] = request_obj['img_width']
     params['resolution'] = request_obj['resolution']
     params['detector_distance'] = request_obj['detDist']
     params['slitgap_horizontal'] = request_obj['slit_width']
     params['slitgap_vertical'] = request_obj['slit_height']
     params['transmission'] = request_obj['attenuation']
     params['file_template'] = '%s_####.cbf' % (request_obj['file_prefix']) # assume cbf ...
#     params['file_template'] = '%s_%s_####.cbf' % (request_obj['file_prefix'], request_obj['runNum']) # assume cbf ...     
       # params['flux'] = ?
     params['overlap'] = 0.0
     params['rotation_axis'] = 'Omega' # assume Omega unless we know otherwise
     print("jpegimfilename = " + jpegImageFilename)
     params['xtal_snapshot1'] = jpegImageFilename
#     params['xtal_snapshot1'] = '/dls/i03/data/2016/cm14451-2/jpegs/20160413/test_xtal/xtal1_1_1_0.0.png'     
     params['xtal_snapshot2'] = '/dls/i03/data/2016/cm14451-2/jpegs/20160413/test_xtal/xtal1_1_1_90.0.png'
     params['xtal_snapshot3'] = '/dls/i03/data/2016/cm14451-2/jpegs/20160413/test_xtal/xtal1_3_1_183.0.png'
     params['xtal_snapshot4'] = '/dls/i03/data/2016/cm14451-2/jpegs/20160413/test_xtal/xtal1_3_1_93.0.png'
     dc_id = mxacquisition.insert_data_collection(list(params.values()))
     print("dc_id: %i" % dc_id)
     return dc_id