コード例 #1
0
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
コード例 #2
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]
コード例 #3
0
def ShutterModeReset():
    pypsepics.put(SHUTTER_PV_RESET_PG, 1)

    if ShutterWaitUntilResetDone() != 0:
        print "Reset failed"
        return 1

    return 0
コード例 #4
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
コード例 #5
0
ファイル: user.py プロジェクト: sioan/softXRayDataAndControls
    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
コード例 #6
0
ファイル: user.py プロジェクト: sioan/softXRayDataAndControls
    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!"
コード例 #7
0
def theta2finemove(v):
    return pypsepics.put("SXR:MON:MPZ:02:POSITIONSET", v)
コード例 #8
0
def aliomove(v):
    return pypsepics.put("SXR:MON:MPZ:01:POSITIONSET", v)
コード例 #9
0
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