def ShutterInit(nshots): Shutter.lSlitOpen = [] Shutter.numImage = 0 if ShutterModeReset() != 0: return 1 if ShutterEvrInit(nshots) != 0: return 2 if nshots == 1: pypsepics.put(SHUTTER_PV_M_FLIPFLOP, 1) if ShutterWaitUntilMode(2) != 0: return 3 else: pypsepics.put(SHUTTER_PV_M_BURST, 1) if ShutterWaitUntilMode(3) != 0: return 3 #print "Shutter setup finished" #raw_input("Press Enter to continue...") return 0
def load_MMS_pars(cvsfile): f=open(cvsfile) lines = f.readlines() for i in range(len(lines)): lines[i]=lines[i].rstrip("\n") fields = lines[1]; lines = lines[2:]; fields = fields.split(",")[1:] for l in lines: ll=l.split(",") pv=ll[0] if pv.startswith("#"): continue values=ll[1:] for i in range(len(fields)): if fields[i].startswith("#"): continue if (values[i] != "?"): try: vv=float(values[i]) except: vv=values[i] if (fields[i]==":RC"): vv=str(values[i]); # for some reason the run current must be a string ! if (fields[i]==":EE"): vv=str(values[i]); # for some reason the use encoder must be a string ! if (fields[i]==".DIR"): vv=int(values[i]); if (fields[i]==".SREV"): vv=int(values[i]); try: print "setting ",pv+fields[i]," to ",values[i], pypsepics.put(pv+fields[i],vv) if (fields[i]==".S"): pypsepics.put(pv+".SMAX",vv) print " done" except: print "FAILED TO set ",pv+fields[i]," to ",values[i] # time.sleep(0.1) try: print "readback ",pv+fields[i], " " ,pypsepics.get(pv+fields[i]) except: print "FAILED TO READBACK ",pv+fields[i]
def ShutterModeReset(): pypsepics.put(SHUTTER_PV_RESET_PG, 1) if ShutterWaitUntilResetDone() != 0: print "Reset failed" return 1 return 0
def clear_all_pu(self, nonuser=True): from common import pypsepics mots = self.get_motors(nonuser=nonuser) for m in mots: print m.name, ":" try: pu = pypsepics.get("%s:PU" % m.pvname) if not pu: print "Ok, pu=", pu else: print "PU=", pu, " resetting..." pypsepics.put("%s:SET_PU" % m.pvname, 0) pu = pypsepics.get("%s:PU" % m.pvname) if not pu: print "Ok, pu=", pu else: print "Failed! pu=", pu pass pass pass except Exception, ex: print ex
def capture_images(self, nImages): if nImages > 100: print "Max 100 images, aborting" return pass pypsepics.put("SXR:GIGE:CAM:703:1:JPEG:NumCapture", nImages) pypsepics.put("SXR:GIGE:CAM:703:2:JPEG:NumCapture", nImages) pypsepics.put("SXR:GIGE:CAM:703:3:JPEG:NumCapture", nImages) for i in range(1, 4): name = pypsepics.get("SXR:GIGE:CAM:703:%d:JPEG:FileName_RBV" % i) #form = pypsepics.get("SXR:GIGE:CAM:703:%d:JPEG:FileTemplate_RBV" % i) next = pypsepics.get("SXR:GIGE:CAM:703:%d:JPEG:FileNumber" % i) #print form #import sys #sys.stdout.flush() #f1 = form % ("",name,next) #print "Capturing %d images for cam%d: beginning with %s" % (nImages,f1) print "Capturing %d images for cam%d: beginning with image-# %04d" % ( nImages, i, next) pass pypsepics.put("SXR:GIGE:CAM:703:1:JPEG:Capture", 1) pypsepics.put("SXR:GIGE:CAM:703:2:JPEG:Capture", 1) pypsepics.put("SXR:GIGE:CAM:703:3:JPEG:Capture", 1) pass
def log_images(self, message="L703 camera images"): if self.elog is None: print "Elog not defined, sorry!" return cam1next = pypsepics.get("SXR:GIGE:CAM:703:1:JPEG:FileNumber") cam2next = pypsepics.get("SXR:GIGE:CAM:703:2:JPEG:FileNumber") cam3next = pypsepics.get("SXR:GIGE:CAM:703:3:JPEG:FileNumber") pypsepics.put("SXR:GIGE:CAM:703:1:JPEG:NumCapture", 1) pypsepics.put("SXR:GIGE:CAM:703:2:JPEG:NumCapture", 1) pypsepics.put("SXR:GIGE:CAM:703:3:JPEG:NumCapture", 1) print "capturing..." pypsepics.put("SXR:GIGE:CAM:703:1:JPEG:Capture", 1) pypsepics.put("SXR:GIGE:CAM:703:2:JPEG:Capture", 1) pypsepics.put("SXR:GIGE:CAM:703:3:JPEG:Capture", 1) print "waiting..." self.__dumb_wait("SXR:GIGE:CAM:703:1:JPEG:FileNumber", cam1next + 1) self.__dumb_wait("SXR:GIGE:CAM:703:2:JPEG:FileNumber", cam2next + 1) self.__dumb_wait("SXR:GIGE:CAM:703:3:JPEG:FileNumber", cam3next + 1) f1 = self.__str_from_arr( pypsepics.get("SXR:GIGE:CAM:703:1:JPEG:FullFileName_RBV")) f2 = self.__str_from_arr( pypsepics.get("SXR:GIGE:CAM:703:2:JPEG:FullFileName_RBV")) f3 = self.__str_from_arr( pypsepics.get("SXR:GIGE:CAM:703:3:JPEG:FullFileName_RBV")) print f1 print f2 print f3 print "logging..." self.elog.submit(text=message, file=f1, file_descr="cam1: %s" % ("/reg/d/psdm/sxr/sxr70313/usr/" + f1.split("/")[-1])) self.elog.submit(text=message, file=f2, file_descr="cam2: %s" % ("/reg/d/psdm/sxr/sxr70313/usr/" + f2.split("/")[-1])) self.elog.submit(text=message, file=f3, file_descr="cam3: %s" % ("/reg/d/psdm/sxr/sxr70313/usr/" + f3.split("/")[-1])) print "done!"
def theta2finemove(v): return pypsepics.put("SXR:MON:MPZ:02:POSITIONSET", v)
def aliomove(v): return pypsepics.put("SXR:MON:MPZ:01:POSITIONSET", v)
def setup(nimages,nshots,config,calibcontrols=[]): try: pypsepics.put("SXR:VARS:DAQ:PI_SHOTS",nshots) pypsepics.put("SXR:VARS:DAQ:PI_FRAMES",nimages) pass except: print "Unable to write nshots/nimages to DAQ-datastream" pass bSim = config.bSim bShutter = config.bShutter burstRate = config.burstRate #Global.nshotsPrev = nshots beamRate = sxrevent.beamrate() if burstRate==0: rate = beamRate else: rate = burstRate if bSim: alias = "PRINCETON_SIM" else: alias = "PRINCETON_BURST" if rate == beamRate: if sxrevent.is_beam_owner(): lcls_linac.set_burst_rate(0) # Set to "Full" rate else: sxrevent.set_testburst_rate(0) elif rate < beamRate: if rate == 60: print "!!! burst rate %d is not supported by MCC" % (rate) return 1 if sxrevent.is_beam_owner(): lcls_linac.set_burst_rate(rate) else: sxrevent.set_testburst_rate(rate) else: print "!!! burst rate %d is faster than beam rate %d" % (rate, beamRate) return 1 if rate == 0: print "!!! beam rate is 0. Cannot setup princeton camera." return 1 sxrevent.setSyncMarker(rate) # Exposure time = # sleep between "real" princeton open and PlayCtrl changed to "Stopped" (0.5 second) # + delay from setting BurstState and MCC begin to fire beam (0.5 second) # + exposure Time ((nshots/rate) second) # + single shot exposure tolerance (0.1 second) # = 1 + (nshots/rate) + 0.1 second #fExposureTime = 0.5 + nshots/rate fExposureTime = 0.02 + nshots/float(rate) sxrdaq.connect() config.beamRate = rate if sxrdaq.dbalias() != alias: print "!!! the current DAQ config type is %s" % (sxrdaq.dbalias()) print "!!! please switch to %s to run this script" % (alias) sxrdaq.disconnect() return 2 db = sxrdaqconfig.setPrincetonConfig(fExposureTime, nshots, config = config, alias = alias, detn=0 ) if config.bKinetics: print "Kinetics mode: %d shots" % (config.nshots) nshots = config.nshots beamInterval = 120 / rate if bSim: if bShutter: if ShutterInit(nshots) != 0: print "Shutter Init Failed" return 2 eventShutterOpen = 84 if bShutter else 0 if nshots == 1: sxrevent.setnsteps(2 + nshots) else: sxrevent.setnsteps(3 + nshots) # mode 3.3 if nshots == 1: if beamInterval < 2: sxrevent.setstep(0,83,0,0,0) else: sxrevent.setstep(0,83,beamInterval-2,0,0) sxrevent.setstep(1,eventShutterOpen,0,0,0) sxrevent.setstep(2,85,2,0,0) else: if beamInterval < 2: sxrevent.setstep(0,83,0,0,0) else: sxrevent.setstep(0,83,beamInterval-2,0,0) sxrevent.setstep(1,eventShutterOpen,0,0,0) sxrevent.setstep(2,85,2,0,0) for iEvent in range(3, nshots+3): if iEvent == nshots + 1: sxrevent.setstep(iEvent,eventShutterOpen,beamInterval-1,0,0) elif iEvent == nshots + 2: sxrevent.setstep(iEvent,85,1,0,0) else: sxrevent.setstep(iEvent,85,beamInterval,0,0) # event: # 83: start princeton exposure # 84: open/close shutter trigger # 85: DAQ readout # nshots == 1 # seq: # event code beam delay fiducial delay(360Hz) # 83 Interval 0 # 84 0 0 # 85 1 0 # nshots == 2 (old motor, which doesn't need close trigger) # seq: # event code beam delay fiducial delay(360Hz) # 83 Interval-1 0 # 84 0 0 # 85 2 0 # 84 Interval-1 0 # 85 1 0 # nshots == 3 or more # seq: # event code beam delay fiducial delay(360Hz) # 83 Interval-1 0 # 84 0 0 # 85 2 0 # 85 Interval 0 # 84 Interval-1 0 # 85 1 0 # nshots == 4 or more # seq: # event code beam delay fiducial delay(360Hz) # 83 Interval-1 0 # 84 0 0 # 85 2 0 # 85 Interval 0 # 85 Interval 0 # 84 Interval-1 0 # 85 1 0 else: sxrevent.setnsteps(2) sxrevent.setstep(0,83,beamInterval-1,0,nshots) sxrevent.setstep(1,85,(nshots-1)*beamInterval+1,0,0) sxrevent.update() sxrevent.modeOnce() # Cycle time = # Delay between setting pvPlayCtrl and princeton open (0.5 second) + # fExposureTime + # Princeton camera readout time (4.7 second for 2048x2048 @ 1M) + # Tolerance (0.3 second) + # Min ( # Network data transfer delay (Number of shots / 100) , # Max limit (20 seconds) ) # + manual delay (overhead_delay) # fNetworkDelay = nshots/100.0 if fNetworkDelay > 20: fNetworkDelay = 20 config.fCycleTime = 0.5 + fExposureTime + 5 + fNetworkDelay + overhead_delay if config.fCycleTime < 0: config.fCycleTime = 0 config.fCycleTime_seconds = int(config.fCycleTime) config.fCycleTime_nanoseconds = int((config.fCycleTime - float(config.fCycleTime_seconds))*1.e9) sxrevent.getSyncMarker() print "Beam rate = %s HZ, Sync marker = %s HZ" % (beamRate, sxrevent.getSyncMarker()) print "Starting to take %d images (each image has %d shots)" % ( nimages, nshots ) if calibcontrols==[]: calibcontrols=[('nimages',nimages),('nshots',nshots)] pass #sxrdaq._Daq__daq.configure(key=db,controls=calibcontrols) sxrdaq.configure(key=db,controls=calibcontrols,events=0) sxrdaq.begin(events=0,controls=calibcontrols) #sxrdaq.begin(events=0) #time.sleep(0.5) # Overhead for DAQ (EVR config), fixed by Matt return 0