def inquotes(strng) '{return(sprintf("\"%s\"",strng));}' def set_series_pars '{ global series_pars local field beam_params empty_array series_pars series_pars["parent"] = CCD_PARENT_DIR series_pars["child"] = CCD_CHILD_DIR series_pars["name"] = CCD_FILENAME "_" series_pars["suffix"] = inquotes(CCD_SUFFIX) series_pars["ndata0"] = epics_get(sprintf("%s.SeqNumber",CCDID)) series_pars["preset"] = CCD_PRESET series_pars["samx"] = A[samx] series_pars["samz"] = A[samz] series_pars["samth"] = A[samth] series_pars["bstop"] = A[bstop] # if (epics_get("8idi:UnidigBo9.VAL") == "Low") { # series_pars["ccdshutter_status"] = inquotes("ON")} # else { series_pars["ccdshutter_status"] = inquotes("OFF") # } series_pars["ccdx"] = A[ccdx] series_pars["ccdz"] = A[ccdz] read_beam_params for (field in beam_params) series_pars[field] = beam_params[field] series_pars["topup"] = inquotes(epics_get("Mt:TopUpAutoEnableC")) series_pars["energy"] = epics_get("ID08:Energy") series_pars["ccd_speed"] = epics_get(sprintf("%s.ADC",CCDID)) if(epics_get(sprintf("%s.CameraMode",CCDID),"short")==3) series_pars["kinetics"] = 1 else series_pars["kinetics"]=0 if (series_pars["kinetics"] > 0) { series_pars["kinwinsize"] = epics_get(sprintf("%s.KinStripSize",CCDID)) series_pars["slicetop"] = CCD_SLICETOP } series_pars["rows"] = epics_get(sprintf("%s.VLength",SAVED_ROI)) series_pars["cols"] = epics_get(sprintf("%s.HLength",SAVED_ROI)) series_pars["row_beg"] = epics_get(sprintf("%s.VStart",SAVED_ROI)) series_pars["row_end"] = series_pars["row_beg"]+series_pars["rows"]-1 series_pars["col_beg"] = epics_get(sprintf("%s.HStart",SAVED_ROI)) series_pars["col_end"] = series_pars["col_beg"]+series_pars["cols"]-1 series_pars["ring_i_beg"] = epics_get("S:SRcurrentAI") series_pars["start_time"] = inquotes(date()) }' def set_more_series_pars '{ local RING_Iend series_pars["end_time"] = inquotes(date()) # # if ring current is read both before and after series, take the average # of the two; otherwise, use whatever is available series_pars["ring_i_end"] = epics_get("S:SRcurrentAI") if (series_pars["ring_i_end"]) { if (series_pars["ring_i_beg"]) series_pars["ring_i"] = (series_pars["ring_i_end"] +\ series_pars["ring_i_beg"])/2 else { series_pars["ring_i_beg"] = 0 series_pars["ring_i"] = series_pars["ring_i_end"] } } else { series_pars["ring_i_end"] = 0 if (series_pars["ring_i_beg"]) series_pars["ring_i"] = series_pars["ring_i_beg"] else { series_pars["ring_i_beg"] = 0 print "WARNING: could not get ring current value." } } if (!series_pars["energy"]) { print "WARNING: could not get beam energy value." delete series_pars["energy"] } foo_old=epics_get(sprintf("%s.SeqNumber",CCDID)) sleep(0.5) foo_new = epics_get(sprintf("%s.SeqNumber",CCDID)) while( foo_old != foo_new) { foo_old = foo_new sleep(0.5) foo_new = epics_get(sprintf("%s.SeqNumber",CCDID)) } series_pars["ndataend"] = epics_get(sprintf("%s.SeqNumber",CCDID))-1 if (series_pars["none_found"]) { print "WARNING: No parameters found in " BEAM_PARAMS_FILE ";" print " beam zero, sample-detector distance, etc. unknown." print " Run \'beamparams\' to set for future scans" delete series_pars["none_found"] } }' def writeinfo '{ local field format info_name INFOFILE sp sp = $1 info_name = sprintf("%s%05d-%05d%s", sp["name"], sp["ndata0"],\ sp["ndataend"],".info") INFOFILE = CCD_PARENT_DIR CCD_CHILD_DIR info_name sp["parent"] = inquotes(sp["parent"]) sp["child"] = inquotes(sp["child"]) sp["name"] = inquotes(sp["name"]) sp["info_name"] = inquotes(info_name) print "Writing series parameters to " INFOFILE open(INFOFILE) format = "%15s = %s\n" for (field in sp) fprintf(INFOFILE,"%15s = %s\n",field,sp[field]) # make sure this goes at the end of the file if (exists("$1","ndataend")) fprintf(INFOFILE,format,"ndata","ndataend - ndata0 + 1") close(INFOFILE) }' def exists(varname,field) '{ # checks if varname[field] exists # note: both arguments must be in quotes (or string variables) return( whatis(sprintf("%s[%s]",varname,field)) ? 1:0 ) }' def empty_array '{ local field # make series_pars an associative array if it # is not yet defined $1["nothing"] # empty out old entries in series_pars for (field in $1) delete $1[field] }'