Changeset 13812
- Timestamp:
- 05/22/12 10:09:31 (12 years ago)
- Location:
- fact/tools/PyDimCtrl
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
fact/tools/PyDimCtrl/factdimserver.py
r13809 r13812 29 29 self.reg_msg_cb() 30 30 self.user_func = None 31 self.__delay_between_cmds = 1.0 32 seld.__delay_between_services = 1.0 33 self.__last_cmd_send = -1*float('inf') 34 self.__last_service_got = -1*float('inf') 31 35 32 36 def _cmd(self, cmdstr, *args): … … 42 46 desc = 'I' 43 47 args=(1,) 48 while not time.time() - self.__last_cmd_send > self.__delay_between_cmds: 49 time.sleep(0.5) 50 self.__last_cmd_send = time.time() 44 51 pydim.dic_sync_cmnd_service(cmdstr, args, desc, timeout=None) 52 45 53 46 54 … … 50 58 full_srv_name = self.name+'/'+service.upper() 51 59 desc = services[self.name][full_srv_name][0] 60 61 while not time.time() - self.__last_service_got > self.__delay_between_services: 62 time.sleep(0.5) 63 self.__last_service_got = time.time() 64 52 65 return pydim.dic_sync_info_service(full_srv_name, desc) 53 66 -
fact/tools/PyDimCtrl/pyfactctrl.py
r13810 r13812 1 1 #!/usr/bin/python -tti 2 2 from factdimserver import * 3 4 # List of Wobble Positions 5 source_list = { '1ES 1218+304' : [( 0.6, -5), (0.6, 175)] ,\ 6 'Crab' : [(0.6, 50), (0.6, -130)], \ 7 'Mrk 421' : [(0.6, 90),(0.6, -90)] \ 8 'Mrk 501' : [(0.6, 90),(0.6, -90)] } 9 10 def TakeFullSet( source = 'Crab', verbose = True): 11 msg = MSG( verbose ) 12 drs_calib_done = False # Drs Calib is only done in the 1st wobble pos 13 14 if not source in source_list: 15 raise ValueError('source not in source_list') 16 msg("Possible sources are:") 17 for src in source_list.keys(): 18 msg(src) 19 return False 20 21 22 # set is a list of wobble positions, stored as 2-tuple 23 for set in source_list(source): 24 # wobble is a 2-tuple: (Shift, Angle) 25 for wobble in set: 26 TrackSource( source, wobble[0] , wobble[1] , CalmDownTime=45) 27 28 if not drs_calib_done: 29 TakeDrsAmplitudeCalibration( roi=1024 ) 30 TakeDrsTimeCalibration( mode='upshifted' ) 31 AddDrsAmplitudeCalibration( roi=300 ) 32 drs_calib_done = True 33 34 VoltageOn( mode='current' ) 35 for i in range(4): 36 msg("Taking Data Run "+str(i+1)+" of 4") 37 TakeDataRun() 38 VoltageOff() 39 40 StopTracking() 41 return True 42 43 #=========== TRACKING ========================================================= 44 def TrackSource( Shift=0.6, Angle=50, SrcName='Crab', CalmDownTime = None, verbose=True): 45 drive = drive_control 46 msg = MSG( verbose ) 47 SrcName += '\0' 48 49 if not StopTracking( timeout = 5, verbose = False ): 50 msg.fail('Cannot start Tracking, because I cannot Stop the Drive') 51 return False 52 53 drive.track_source( Shift, Angle, SrcName) 54 55 if CalmDownTime != None: 56 if not WaitToCalmDown( CalmDownTime, verbose = True): 57 msg.fail("a problem in WaitToCalmDown(). drive state: "+drive.sts) 58 return False: 59 60 msg.ok('Tracking Source '+SrcName + ' Angle:'+str(Angle)+' Shift:'+str(Shift)) 61 return True 62 63 def WaitToCalmDown( CalmDownTime = 45, time_until_moving = 10, time_until_tracking = 40, verbose = True): 64 """ before calling this function, one should call TrackSource() 65 this function waits until Drive is in state 'Tracking' 66 and then sleeps *CalmDownTime* seconds in order to give 67 the Drive time to calm down. 68 69 """ 70 drive = drive_control 71 msg = MSG(verbose) 72 73 starttime = time.time() 74 while not drive.stn == 6: #Moving 75 if time.time() - starttime > time_until_moving: 76 msg.fail("DRIVE not in Moving after "+str(time_until_moving)) 77 return False 78 time.sleep(0.5) 79 msg.ok("Drive is Moving, waiting for Tracking") 80 81 starttime = time.time() 82 while not drive.stn == 7: #Tracking 83 if time.time() - starttime > time_until_tracking: 84 msg.fail("DRIVE not in Tracking after "+str(time_until_tracking)) 85 return False 86 time.sleep(0.5) 87 msg.ok("Drive is Tracking, waiting to calm down...") 88 89 time.sleep(CalmDownTime) 90 msg.ok("Drive hopefully has calmed down") 91 return True 92 93 def StopTracking( timeout = 3, verbose = True ): 94 msg = MSG(verbose) 95 drive = drive_control 96 starttime = time.time() 97 while not drive.stn == 5: 98 if time.time() - starttime > timeout: 99 msg.fail('Did not get DRIVE into Armed state within '+str(timeout)+' seconds') 100 return False 101 102 if drive.stn < 5: 103 msg.fail('DRIVE in state'+drive.sts+" I don't know how to STOP") 104 if drive.stn >= 256: 105 msg.fail('DRIVE in state'+drive.sts+" I don't know how to STOP") 106 107 if drive.stn in [6,7]: 108 drive.stop() 109 time.sleep(0.5) 110 111 msg.ok('DRIVE Stopped: current state:'+drive.sts) 112 return True 113 114 #=========== DRS CALIBRATION ================================================== 115 def TakeDrsAmplitudeCalibration( roi = None, verbose = True): 116 """ Takes DRS Amplitude Calibration 117 *roy* integer: 300, 1024 or 118 *roy* string : 'both' 119 in case of both, the roi=300 calibration is done last. 120 121 after each complete AmpliteCalibration a 4th pedestal run of the same 122 roi is taken, for crosschecking. 123 """ 124 msg = MSG( verbose ) 125 bias = bias_control 126 fad = fad_control 127 if not roi in [300,1024,'both']: 128 raise ValueError("roi must be 300,1024 or the string 'both'") 129 130 131 bias.set_zero_voltage() 132 if not bias.wait(7, 10): 133 msg.warn("bias has not switched of after 10sec") 134 return False 135 136 fad.start_drs_calibration() 137 Take( -1, 1000, 'drs-pedestal') 138 Take( -1, 1000, 'drs-gain') 139 if roi == 300: 140 Take( -1, 1000, 'pedestal') 141 fad.set_file_format(2) 142 Take( -1, 1000, 'pedestal') 143 elif roi == 1024: 144 Take( -1, 1000, 'drs-pedestal') 145 fad.set_file_format(2) 146 Take( -1, 1000, 'drs-pedestal') 147 elif roi == 'both': 148 Take( -1, 1000, 'drs-pedestal') 149 fad.set_file_format(2) 150 Take( -1, 1000, 'drs-pedestal') 151 fad.reset_secondary_drs_baseline() 152 Take( -1, 1000, 'pedestal') 153 fad.set_file_format(2) 154 Take( -1, 1000, 'pedestal') 155 156 157 def TakeDrsTimeCalibration( mode = 'upshifted', verbose = True): 158 """ Takes DRS Time Calibration 159 *mode* can be 'upshifted', 'old' or 'both' 160 """ 161 msg = MSG( verbose ) 162 bias = bias_control 163 fad = fad_control 164 if not mode in ['upshifted', 'old', 'both']: 165 raise ValueError("mode must be: 'upshifted','old' or 'both'") 166 167 bias.set_zero_voltage() 168 if not bias.wait(7, 10): 169 msg.warn("bias has not switched of after 10sec") 170 return False 171 172 fad.set_file_format(2) 173 if mode == 'old': 174 Take(-1, 1000, 'drs-time') 175 if mode == 'upshifted': 176 Take(-1, 1000, 'drs-time-upshifted') 177 if mode == 'both': 178 Take(-1, 1000, 'drs-time') 179 Take(-1, 1000, 'drs-time-upshifted') 180 181 182 183 def AddDrsAmplitudeCalibration( roi = None, verbose = True): 184 """ Adds a DRS Amplitude Calibration, 185 do not call, in case you did not *Take* one before 186 *roy* integer: 300, 1024 187 188 after each complete AmpliteCalibration a 4th pedestal run of the same 189 roi is taken, for crosschecking. 190 """ 191 msg = MSG( verbose ) 192 bias = bias_control 193 fad = fad_control 194 if not roi in [300,1024]: 195 raise ValueError("roi must be 300,1024") 196 197 if not bias.stn == 'VoltageOff': 198 msg.fail('a DRS amplitude calibration should not be taken with Voltage On') 199 return False 200 201 fad.reset_secondary_drs_baseline() 202 if roi == 300 203 Take( -1, 1000, 'pedestal') 204 fad.set_file_format(2) 205 Take( -1, 1000, 'pedestal') 206 elif roi == 1024: 207 Take( -1, 1000, 'drs-pedestal') 208 fad.set_file_format(2) 209 Take( -1, 1000, 'drs-pedestal') 210 211 return True 212 213 214 #============ BIAS VOLTAGE ==================================================== 215 def VoltageOn( mode = None, Watchdog = None, verbose = True): 216 """ High Level Method for switching on the bias Voltage 217 can be called, in whatever state the bias and the feedback might be. 218 In case the voltage is on and the feedback is already in the mode 219 requested, nothing happens. 220 In all other cases, the method will perform the needed steps to switch 221 on the bias voltage, the way the user requested 222 """ 223 msg = MSG( verbose ) 224 bias = bias_control 225 fb = feedback 226 227 if not mode in ['temperature', 'current', 'feedback']: 228 raise ValueError("mode must be 'temperature', 'current' or 'feedback'") 229 230 231 232 bias.set_global_dac(1) 233 if not bias.wait(9, 10): 234 msg.warn("bias not in Voltage ON after 10sec") 235 return False 236 if not bias.wait(5, 10): 237 msg.warn("bias not Ramping after 10sec") 238 return False 239 if not bias.wait(9, 30): 240 msg.warn("bias not fully ramped up after 30sec") 241 return False 242 243 msg("waiting 45sec...") 244 time.sleep(45) 245 return True 246 247 3 248 4 249 def IsReadyForDataTaking( verbose = True ): … … 41 286 42 287 return ok 43 44 def StopTracking( verbose = True ):45 msg = MSG()46 msg.output = verbose47 48 # defining a shortcut49 drive = drive_control50 51 drive.stop()52 if not drive.wait(5, 10):53 msg.warn("drive did not reach state 5 after 10 seconds")54 msg.warn( drive.state()[0].rstrip('\x00') )55 return False56 57 return True58 288 59 289 def TakeDataRun( verbose = True ): … … 73 303 msg.warn("FAD did not return to Connected, after 330 seconds") 74 304 return False 75 return True76 77 def TrackSource( Shift=0.6, Angle=50, SrcName='Crab', verbose=True):78 drive = drive_control79 msg = MSG( verbose )80 SrcName += '\0'81 82 timeout = 383 starttime = time.time()84 while not drive.stn == 5:85 if time.time() - starttime > timeout:86 msg.fail('Did not get DRIVE into Armed state')87 return False88 89 if drive.stn < 5:90 msg.fail('DRIVE in state'+drive.sts+" I don't what to do.")91 if drive.stn >= 256:92 msg.fail('DRIVE in state'+drive.sts+" I don't what to do.")93 94 if drive.stn in [6,7]:95 drive.stop()96 time.sleep(0.5)97 98 drive.track_source( Shift, Angle, SrcName)99 return True100 101 def WaitForTracking( CalmDownTime = 30, verbose = True):102 drive = drive_control103 msg = MSG(verbose)104 105 starttime = time.time()106 time_out = 10107 108 while not drive.stn == 7: #Tracking109 if time.time() - starttime > time_out:110 msg.fail("DRIVE not in Tracking after Timeout")111 return False112 113 msg.ok("Drive is Tracking, waiting to calm down...")114 time.sleep(CalmDownTime)115 305 return True 116 306 … … 178 368 return True 179 369 180 def Take1218( verbose = True):181 182 TrackSource( Shift=0.6, Angle=-5, SrcName='1ES 1218+304')183 WaitForTracking( CalmDownTime = 45, verbose = True)184 185 TakeDrsAmplitudeCalibration( roi=1024 )186 TakeDrsTimeCalibration( mode='upshifted' )187 TakeDrsAmplitudeCalibration( roi=300 )188 189 VoltageOn( mode='current' )190 for i in range(4):191 msg("Taking Data Run "+str(i+1)+" of 4")192 TakeDataRun()193 VoltageOff()194 195 TrackSource( Shift=0.6, Angle=175, SrcName='1ES 1218+304')196 WaitForTracking( CalmDownTime = 45, verbose = True)197 198 VoltageOn( mode='current' )199 for i in range(4):200 msg("Taking Data Run "+str(i+1)+" of 4")201 TakeDataRun()202 VoltageOff()203 204 drive_control.stop()205 370 206 371 def BlinkenLights(verbose = True): … … 473 638 474 639 #============================================================================== 475 def TakeDrsAmplitudeCalibration( roi = None, verbose = True):476 """ Takes DRS Amplitude Calibration477 *roy* integer: 300, 1024 or478 *roy* string : 'both'479 in case of both, the roi=300 calibration is done last.480 481 after each complete AmpliteCalibration a 4th pedestal run of the same482 roi is taken, for crosschecking.483 """484 msg = MSG( verbose )485 bias = bias_control486 fad = fad_control487 if not roi in [300,1024,'both']:488 raise ValueError("roi must be 300,1024 or the string 'both'")489 490 491 bias.set_zero_voltage()492 if not bias.wait(7, 10):493 msg.warn("bias has not switched of after 10sec")494 return False495 496 fad.start_drs_calibration()497 Take( -1, 1000, 'drs-pedestal')498 Take( -1, 1000, 'drs-gain')499 if roi == 300:500 Take( -1, 1000, 'pedestal')501 fad.set_file_format(2)502 Take( -1, 1000, 'pedestal')503 elif roi == 1024:504 Take( -1, 1000, 'drs-pedestal')505 fad.set_file_format(2)506 Take( -1, 1000, 'drs-pedestal')507 elif roi == 'both':508 Take( -1, 1000, 'drs-pedestal')509 fad.set_file_format(2)510 Take( -1, 1000, 'drs-pedestal')511 fad.reset_secondary_drs_baseline()512 Take( -1, 1000, 'pedestal')513 fad.set_file_format(2)514 Take( -1, 1000, 'pedestal')515 516 517 def TakeDrsTimeCalibration( mode = None, verbose = True):518 """ Takes DRS Time Calibration519 *mode* can be 'upshifted', 'old' or 'both'520 """521 msg = MSG( verbose )522 bias = bias_control523 fad = fad_control524 if not mode in ['upshifted', 'old', 'both']:525 raise ValueError("mode must be: 'upshifted','old' or 'both'")526 527 bias.set_zero_voltage()528 if not bias.wait(7, 10):529 msg.warn("bias has not switched of after 10sec")530 return False531 532 fad.set_file_format(2)533 if mode == 'old':534 Take(-1, 1000, 'drs-time')535 if mode == 'upshifted':536 Take(-1, 1000, 'drs-time-upshifted')537 if mode == 'both':538 Take(-1, 1000, 'drs-time')539 Take(-1, 1000, 'drs-time-upshifted')540 541 542 def VoltageOn( mode = None, Watchdog = None, verbose = True):543 msg = MSG( verbose )544 bias = bias_control545 fb = feedback546 547 if not mode in ['temperature', 'current', 'feedback']:548 raise ValueError("mode must be 'temperature', 'current' or 'feedback'")549 550 551 bias.set_global_dac(1)552 if not bias.wait(9, 10):553 msg.warn("bias not in Voltage ON after 10sec")554 return False555 if not bias.wait(5, 10):556 msg.warn("bias not Ramping after 10sec")557 return False558 if not bias.wait(9, 30):559 msg.warn("bias not fully ramped up after 30sec")560 return False561 562 msg("waiting 45sec...")563 time.sleep(45)564 return True565 566 640 # standard watchdog: 567 641 def std_bias_watchdog( state, verbose=True ):
Note:
See TracChangeset
for help on using the changeset viewer.