Changeset 13789
- Timestamp:
- 05/18/12 23:16:43 (12 years ago)
- Location:
- fact/tools/PyDimCtrl
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
fact/tools/PyDimCtrl/fpydim.py
r13770 r13789 1 1 #!/usr/bin/python -tti 2 3 # for tab completion 2 4 import rlcompleter 3 5 import readline 4 6 readline.parse_and_bind('tab: complete') 5 7 6 import sys 7 import pydim 8 import types 9 import time # for sleep 10 from pprint import pprint 11 from keyword import iskeyword 8 import sys # for sys.exit() during bebugging mostly :-) 9 import types # for dynamic class construction 10 import time # for time.sleep 11 from pprint import pprint # for nice printing 12 13 from keyword import iskeyword # in case dynamic methods are equal to keywords 14 15 import pydim # for the C-API Dim Call Wrappers 16 17 # using this line makes 'export DIM_DNS_NODE=daq' obsolete 12 18 pydim.dic_set_dns_node('daq') 13 19 14 # making server list15 rawlist = pydim.dic_sync_info_service('DIS_DNS/SERVER_LIST','C')16 # the output needs to be treated a bit .. it is a tuple with only one long string in it17 # the string contains | and the strange character \x0018 # I use both to cut the list apart19 rawlist = rawlist[0].split('\x00')20 servers_n_hosts = rawlist[0].split('|')21 server_ids = rawlist[1].split('|')22 23 servers = {}24 for i,snh in enumerate(servers_n_hosts):25 snh = snh.split('@')26 s = snh[0]27 h = snh[1]28 sid = server_ids[i]29 servers[s] = (sid, h)30 31 # delete unneeded vars32 del servers_n_hosts33 del rawlist34 del server_ids35 36 # print servers37 38 # make service list39 services = {}40 dd = {}41 for serv in servers.keys():42 # print serv+'/SERVICE_LIST'43 sl_raw = pydim.dic_sync_info_service(serv+'/SERVICE_LIST','C')[0]44 if serv+'/SERVICE_DESC' in sl_raw:45 sd_raw = pydim.dic_sync_info_service(serv+'/SERVICE_DESC','C')[0]46 else:47 # print "Warning:", serv+'/SERVICE_DESC' , "not in SERVICE_LIST of", serv48 sd_raw = ''49 sl_raw = sl_raw.rstrip('\x00\n')50 sl_raw = sl_raw.replace('\x00','')51 sd_raw = sd_raw.rstrip('\x00\n')52 sl = sl_raw.split('\n')53 sd = sd_raw.split('\n')54 55 # create descripton dict dd from service_desc list sd56 for d_str in sd:57 service,equalsign,desc = d_str.partition('=')58 #if '=' != equalsign:59 # print "Error: server:", serv, "desc:", d_str60 dd[service] = desc61 62 63 services[serv] = {}64 for service in sl:65 service = service.split('|')66 if service[0] in dd:67 services[serv][service[0]] = (68 service[1], service[2], dd[service[0]])69 # else:70 # print service[0], 'has no DESC in SERVICE_DESC'71 72 # pprint( services )73 74 20 class FactDimServer( object ): 75 21 76 def __init__(self, name): 77 self.name = name 78 79 def cmd(self, cmdstr, *args): 80 #args = cmdstr.split(' ') 81 #for i in range(len(args)): 82 # i = len(args)-1-i 83 # if not args[i]: 84 # del args[i] 85 cmdstr=self.name+'/'+cmdstr.upper() 86 # args = tuple(args[1:]) 87 desc = services[self.name][cmdstr.upper()][0] 88 # there is a bug in the pydim library ... 89 # even if a command need no argument 90 # one has to give one ... need to tell Niko about it. 91 if len(desc) == 0: 92 desc = 'I' 93 args=(1,) 94 # print 'cmd: cmdstr:', cmdstr, 95 # print '-args:', args, 96 # print '-desc:', desc 97 pydim.dic_sync_cmnd_service(cmdstr, args, desc, timeout=None) 98 def get(self, service): 99 full_srv_name = self.name+'/'+service.upper() 100 desc = services[self.name][full_srv_name][0] 101 return pydim.dic_sync_info_service(full_srv_name, desc) 102 103 def __call__(self): 104 """ get Server State as numeric code 105 for convenience 106 """ 107 if hasattr(self, 'state'): 108 s = self.state()[0] 109 return int(s[ s.find('[')+1 : s.find(']') ]) 110 else: 111 raise TypeError(self.name+' has no CMD called STATE') 112 113 def wait(self, state_num, timeout=None): 114 """ waits for a certain state 115 BLOCKING 116 returns True if state was reached 117 returns False if timeout occured 118 raises TypeError if Server has no method state 119 """ 120 121 if not hasattr(self, 'state'): 122 raise TypeError(self.name+' has no CMD called STATE') 123 if timeout == None: 124 timeout = float('inf') 125 else: 126 timeout = float(timeout) 127 start = time.time() 128 while not self() == state_num: 129 time.sleep(0.1) 130 if time.time() >= start+timeout: 131 return False 132 return True 22 def __init__(self, name): 23 """ sets name of instance to name of server, all uppercase 24 """ 25 self.name = name.upper() 26 27 def _cmd(self, cmdstr, *args): 28 """ used by all dynamicly created methods, which call a Dim CMD 29 """ 30 cmdstr=self.name+'/'+cmdstr.upper() 31 desc = services[self.name][cmdstr.upper()][0] 32 33 # there is a work around for a bug in pydim 34 # even if a command needs no argument, and desc is also empty string 35 # one has to give one ... need to tell Niko about it. 36 if not desc: 37 desc = 'I' 38 args=(1,) 39 pydim.dic_sync_cmnd_service(cmdstr, args, desc, timeout=None) 40 41 42 def _get(self, service): 43 """ used by all dynamicly created methods, which get a service 44 """ 45 full_srv_name = self.name+'/'+service.upper() 46 desc = services[self.name][full_srv_name][0] 47 return pydim.dic_sync_info_service(full_srv_name, desc) 48 49 50 def __call__(self): 51 """ Wrapper / For Convenience 52 self.state() returns a string (if it exists) 53 *returns* numeric state code, parsed from return of self.state() 54 """ 55 if hasattr(self, 'state'): 56 s = self.state()[0] 57 return int(s[ s.find('[')+1 : s.find(']') ]) 58 else: 59 raise TypeError(self.name+' has no CMD called STATE') 60 61 def wait(self, state_num, timeout=None): 62 """ waits for a certain state 63 BLOCKING 64 returns True if state was reached 65 returns False if timeout occured 66 raises TypeError if Server has no method state 67 """ 68 69 if not hasattr(self, 'state'): 70 raise TypeError(self.name+' has no CMD called STATE') 71 if timeout == None: 72 timeout = float('inf') 73 else: 74 timeout = float(timeout) 75 start = time.time() 76 while not self() == state_num: 77 time.sleep(0.1) 78 if time.time() >= start+timeout: 79 return False 80 return True 81 82 83 84 # utility functions for dynamic addid of methods to classes 85 def add_command(cls, name): 86 meth_name = name.split('/')[1].lower() 87 if iskeyword(meth_name): 88 meth_name += '_cmd' 89 90 # this is the new command, it simple calls the _cmd() method 91 def new_command(self, *args): 92 self._cmd(meth_name, *args) 93 94 new_command.__name__ = meth_name 95 96 # from this line on, the docstring of the method is created 97 if name in dd: 98 if not dd[name]: 99 new_command.__doc__ = "DESC in SERVICE_DESC is empty ?!" 100 else: 101 new_command.__doc__ = dd[name] 102 else: 103 new_command.__doc__ = "-- no DESC found in SERVICE_DESC --" 104 new_command.__doc__ += '\n' 105 new_command.__doc__ += services[name.split('/')[0]][name][0] 106 107 # this line make the new_command() method, a method of the class cls 108 # giving it the name new_command.__name__ 109 setattr( cls, new_command.__name__, new_command) 110 111 # add_getter is very similar to add_command, 112 # the only difference is, that it calls _get() instead of _cmd() 113 # and since _get() has a return value, this return value is vorwarded to the user 114 def add_getter(cls, name): 115 meth_name = name.split('/')[1].lower() 116 if iskeyword(meth_name): 117 meth_name += '_cmd' 118 def new_command(self): 119 return self._get(meth_name) 120 new_command.__name__ = meth_name 121 if name in dd: 122 if not dd[name]: 123 new_command.__doc__ = "DESC in SERVICE_DESC is empty ?!" 124 else: 125 new_command.__doc__ = dd[name] 126 else: 127 new_command.__doc__ = "-- no DESC found in SERVICE_DESC --" 128 new_command.__doc__ += '\n' 129 new_command.__doc__ += services[name.split('/')[0]][name][0] 130 setattr( cls, new_command.__name__, new_command) 131 132 133 134 135 136 # In order to create classes according to the Dim-Servers, currently connected 137 # to the DIS_DNS I have to parse DIS_DNS/SERVER_LIST 138 # This is done in two steps, first I get the list of Server Names from DIS_DNS 139 # and the I get the list of each servers services and cmds, 140 # from each servers SERVICE_LIST and the service/command description 141 # from each servers SERVICE_DESC 142 # I get quite a lot of information, which I store in python dicts, or 143 # even nested dicts, if necessary. 144 145 def ParseDnsServerList(): 146 # making server list 147 rawlist = pydim.dic_sync_info_service('DIS_DNS/SERVER_LIST','C') 148 # the output needs to be treated a bit .. it is a tuple with only one long string in it 149 # the string contains | and the strange character \x00 150 # I use both to cut the list apart 151 rawlist = rawlist[0].split('\x00') 152 servers_n_hosts = rawlist[0].split('|') 153 server_ids = rawlist[1].split('|') 154 155 servers = {} 156 for i,snh in enumerate(servers_n_hosts): 157 snh = snh.split('@') 158 s = snh[0] 159 h = snh[1] 160 sid = server_ids[i] 161 servers[s] = (sid, h) 162 163 return servers 164 165 166 167 # servers should be a dict containing uppercase server names as keys, 168 # the values are not needed, so it might be any iteratable python listlike type 169 # to be precise 170 def ParseServersServiceList( servers ) 171 172 services = {} 173 dd = {} 174 for server in servers: 175 # sl_raw is a tuple, with an really long string, which needs to be parsed 176 sl_raw = pydim.dic_sync_info_service(server+'/SERVICE_LIST','C')[0] 177 178 # even without parsing, I can find out, if this server also gives me a 179 # service description list. In case it does not, this is fine as well 180 # the doc string of the dynamicly created methods, will then contain 181 # a note, that therer was no SERVICE_DESC ... 182 if server+'/SERVICE_DESC' in sl_raw: 183 sd_raw = pydim.dic_sync_info_service(server+'/SERVICE_DESC','C')[0] 184 else: 185 sd_raw = '' 186 187 # now before parsing, I strip off all ASCII zeroes '\x00' and all 188 # line breaks off the *end* of the long string of both 189 # the service list sl 190 # and service description sd 191 # 192 # I think in sl_raw were alse some '\x00' in the middle .. these 193 # are replaced by nothing, in case they are there. 194 sl_raw = sl_raw.rstrip('\x00\n') 195 sl_raw = sl_raw.replace('\x00','') 196 sd_raw = sd_raw.rstrip('\x00\n') 197 198 # The lists are seperated by line breaks, so I split them using this 199 sl = sl_raw.split('\n') 200 sd = sd_raw.split('\n') 201 202 # First I parse the service descriptons, so I have them available, 203 # when I create the dict full of services. 204 # All desciptions look like this 205 # 'SERVER/SERVICE=some descriptive text' or 206 # 'SERVER/SERVICE=' 207 # this I use to create the dictionary. 208 # create descripton dict dd from service_desc list sd 209 for d_str in sd: 210 service,equalsign,desc = d_str.partition('=') 211 #if '=' != equalsign: 212 # print "Error: server:", server, "desc:", d_str 213 dd[service] = desc 214 215 # Now I fill ther services dict. Each server gets a nested dict 216 # inside services. 217 # Each service is explained in a string with a '|' in between. 218 # I use this for spliting. 219 # The string look like this 220 # SERVER/SERVICE|format-desc-str(e.g. I:2;C)|-empty- or CMD or RPC| 221 services[server] = {} 222 for service in sl: 223 service = service.split('|') 224 if service[0] in dd: 225 services[server][service[0]] = ( 226 service[1], service[2], dd[service[0]]) 227 return services 228 229 230 servers = ParseDnsServerList() 231 services = ParseServersServiceList( servers ) 232 133 233 # create one class for each Fact Dim Server 134 234 FactDimServerClasses = [] 135 235 for server_name in servers: 136 137 236 FactDimServerClasses.append( 237 types.ClassType( server_name, (FactDimServer,), {}) ) 138 238 139 239 # create an instace of each of the classes … … 143 243 all_dims = [] 144 244 for i,server_name in enumerate(servers): 145 146 245 new_instance = FactDimServerClasses[i](server_name) 246 all_dims.append( new_instance ) 147 247 del new_instance 148 248 … … 150 250 #print "connecting to Dim Servers... " 151 251 for dim in all_dims: 152 # print dim.name.lower() 153 if dim.name == 'DIS_DNS': 154 continue 155 globals()[dim.name.lower()] = dim 156 dims.append(dim) 157 158 # utility class for dynamic addid of methods to classes 159 def add_command(cls, name): 160 meth_name = name.split('/')[1].lower() 161 if iskeyword(meth_name): 162 meth_name += '_cmd' 163 def new_command(self, *args): 164 self.cmd(meth_name, *args) 165 new_command.__name__ = meth_name 166 if name in dd: 167 if not dd[name]: 168 new_command.__doc__ = "DESC in SERVICE_DESC is empty ?!" 169 else: 170 new_command.__doc__ = dd[name] 171 else: 172 new_command.__doc__ = "-- no DESC found in SERVICE_DESC --" 173 new_command.__doc__ += '\n' 174 new_command.__doc__ += services[name.split('/')[0]][name][0] 175 setattr( cls, new_command.__name__, new_command) 176 177 def add_getter(cls, name): 178 meth_name = name.split('/')[1].lower() 179 if iskeyword(meth_name): 180 meth_name += '_cmd' 181 def new_command(self): 182 return self.get(meth_name) 183 new_command.__name__ = meth_name 184 if name in dd: 185 if not dd[name]: 186 new_command.__doc__ = "DESC in SERVICE_DESC is empty ?!" 187 else: 188 new_command.__doc__ = dd[name] 189 else: 190 new_command.__doc__ = "-- no DESC found in SERVICE_DESC --" 191 new_command.__doc__ += '\n' 192 new_command.__doc__ += services[name.split('/')[0]][name][0] 193 setattr( cls, new_command.__name__, new_command) 252 # print dim.name.lower() 253 if dim.name == 'DIS_DNS': 254 continue 255 globals()[dim.name.lower()] = dim 256 dims.append(dim) 194 257 195 258 for i,dim in enumerate(all_dims): 196 for cmd in services[dim.name]: 197 if 'CMD' in services[dim.name][cmd][1]: 198 cmdname = cmd.split('/')[1] 199 add_command(FactDimServerClasses[i], cmd) 200 elif not services[dim.name][cmd][1]: 201 cmdname = cmd.split('/')[1] 202 add_getter(FactDimServerClasses[i], cmd) 203 259 for cmd in services[dim.name]: 260 if 'CMD' in services[dim.name][cmd][1]: 261 cmdname = cmd.split('/')[1] 262 add_command(FactDimServerClasses[i], cmd) 263 elif not services[dim.name][cmd][1]: 264 cmdname = cmd.split('/')[1] 265 add_getter(FactDimServerClasses[i], cmd) 266 267 ############################################################################## 268 # class for colored printing 204 269 205 270 class bcolors: 206 HEADER = '\033[95m' 207 OKBLUE = '\033[94m' 208 OKGREEN = '\033[92m' 209 WARNING = '\033[93m' 210 FAIL = '\033[91m' 211 ENDC = '\033[0m' 212 213 def disable(self): 214 self.HEADER = '' 215 self.OKBLUE = '' 216 self.OKGREEN = '' 217 self.WARNING = '' 218 self.FAIL = '' 219 self.ENDC = '' 271 HEADER = '\033[95m' 272 OKBLUE = '\033[94m' 273 OKGREEN = '\033[92m' 274 WARNING = '\033[93m' 275 FAIL = '\033[91m' 276 ENDC = '\033[0m' 277 278 def disable(self): 279 self.HEADER = '' 280 self.OKBLUE = '' 281 self.OKGREEN = '' 282 self.WARNING = '' 283 self.FAIL = '' 284 self.ENDC = '' 285 286 ############################################################################## 287 # class which implements colored printing 288 # method calls can be used instead of Python print calls 289 # for conveniently printing colored output. 290 291 220 292 class MSG( bcolors): 221 def __init__(self, verbose = True): 222 self.output = verbose 223 224 def fail(self, text ): 225 text = str(text) 226 if self.output: 227 print bcolors.FAIL + "ERROR:" + bcolors.ENDC, 228 print bcolors.FAIL + text + bcolors.ENDC 229 230 def warn(self, text ): 231 text = str(text) 232 if self.output: 233 print bcolors.WARNING + text + bcolors.ENDC 234 235 def ok(self, text ): 236 text = str(text) 237 if self.output: 238 print bcolors.OKGREEN + text + bcolors.ENDC 239 240 def __call__(self, *args): 241 if self.output: 242 for arg in args: 243 print arg, 244 print 245 293 def __init__(self, verbose = True): 294 """ create MSG instance, 295 default is verbose, 296 sets self.output 297 298 if: 299 self.*output* = True, object behaves as expeted 300 if False, no call return anything 301 """ 302 self.output = verbose 303 304 def fail(self, text ): 305 """ print in RED 306 """ 307 text = str(text) 308 if self.output: 309 print bcolors.FAIL + "ERROR:" + bcolors.ENDC, 310 print bcolors.FAIL + text + bcolors.ENDC 311 312 def warn(self, text ): 313 """ print in YELLOW 314 """ 315 text = str(text) 316 if self.output: 317 print bcolors.WARNING + text + bcolors.ENDC 318 319 def ok(self, text ): 320 """ print in GREEN 321 """ 322 text = str(text) 323 if self.output: 324 print bcolors.OKGREEN + text + bcolors.ENDC 325 326 def __call__(self, *args): 327 """ print as Python print would do 328 """ 329 if self.output: 330 for arg in args: 331 print arg, 332 print 333 -
fact/tools/PyDimCtrl/service.py
r13770 r13789 1 #!/usr/bin/python -tt 2 from fpydim import * 1 #!/usr/bin/python -tti 2 #from fpydim import * 3 4 3 5 4 6 def IsReadyForDataTaking( verbose = True ): 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 7 drive = drive_control 8 bias = bias_control 9 fad = fad_control 10 11 msg = MSG() 12 msg.output = verbose 13 msg("Checking if System isready for data taking... ") 14 15 ok = True 16 if not drive() == 7: 17 msg.warn( drive.state()[0] + " NOT ok") 18 ok = False 19 if not feedback() == 12: 20 msg.warn( feedback.state()[0] + " NOT ok") 21 ok = False 22 if not bias() == 9: 23 msg.warn( bias.state()[0] + " NOT ok") 24 ok = False 25 if not fad() == 4: 26 msg.warn( fad.state()[0] + " NOT ok") 27 ok = False 28 29 if ok: 30 msg.ok( " all ok " ) 31 32 return ok 31 33 32 34 def StopTracking( verbose = True ): 33 34 35 36 37 38 39 40 41 42 43 44 45 35 msg = MSG() 36 msg.output = verbose 37 38 # defining a shortcut 39 drive = drive_control 40 41 drive.stop() 42 if not drive.wait(5, 10): 43 msg.warn("drive did not reach state 5 after 10 seconds") 44 msg.warn( drive.state()[0].rstrip('\x00') ) 45 return False 46 47 return True 46 48 47 49 def TakeDataRun( verbose = True ): 48 fad = fad_control 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 50 fad = fad_control 51 msg = MSG() 52 msg.output = verbose 53 if not IsReadyForDataTaking( verbose=False ): 54 msg.fail("System not Ready for DataTaking") 55 IsReadyForDataTaking( verbose=True ) 56 return False 57 mcp.start(300,-1,'data\0') 58 if not fad.wait(8, 10): 59 msg.warn("FAD not in Writing Data after 10seconds") 60 return False 61 msg("... taking data: 300 seconds - normal data run") 62 if not fad.wait(4, 330): 63 msg.warn("FAD did not return to Connected, after 330 seconds") 64 return False 65 return True 64 66 65 67 def TrackSource( Shift=0.6, Angle=50, SrcName='Crab', verbose=True): 66 67 68 69 70 71 72 73 74 75 76 77 78 79 68 drive = drive_control 69 70 msg = MSG() 71 msg.output = verbose 72 73 if not drive.wait(5, 10): 74 msg.warn("drive not ready after 10sec") 75 msg.warn( drive.state()[0].rstrip('\x00') ) 76 return False 77 78 SrcName += '\0' 79 drive.track_source( Shift, Angle, SrcName) 80 81 return True 80 82 81 83 def WaitForTracking( CalmDownTime = 30, verbose = True): 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 zoreturn True84 drive = drive_control 85 86 msg = MSG() 87 msg.output = verbose 88 89 if not drive.wait(6, 10): 90 msg.warn("drive not in state moving after 10sec") 91 return False 92 93 if not drive.wait(7, 10): 94 msg.warn("drive not in state Tracking after 10sec") 95 return False 96 97 msg("waiting "+str(CalmDownTime)\ 98 +"sec for drive to calm down and tracking to be stable") 99 time.sleep(CalmDownTime) 100 return True 99 101 100 102 def PrepareBias( verbose = True): 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 msg("waiting 45sec...") 121 122 103 msg = MSG() 104 msg.output = verbose 105 bias = bias_control 106 107 if feedback() != 12: 108 msg.warn("feedback is not in Current Control") 109 return False 110 111 bias.set_global_dac(1) 112 if not bias.wait(9, 10): 113 msg.warn("bias not in Voltage ON after 10sec") 114 return False 115 if not bias.wait(5, 10): 116 msg.warn("bias not Ramping after 10sec") 117 return False 118 if not bias.wait(9, 30): 119 msg.warn("bias not fully ramped up after 30sec") 120 return False 121 122 msg("waiting 45sec...") 123 time.sleep(45) 124 return True 123 125 124 126 def TakePedestalOnRun( verbose = True ): 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 127 msg = MSG() 128 msg.output = verbose 129 if not IsReadyForDataTaking( verbose=False ): 130 msg.fail("System not Ready for DataTaking") 131 IsReadyForDataTaking( verbose=True ) 132 return False 133 mcp.start(-1,1000,'pedestal\0') 134 if not fad.wait(8, 10): 135 msg.warn("FAD not in Writing Data after 10seconds") 136 return False 137 msg("... taking ped: 1000evts @25Hz") 138 if not fad.wait(4, 50): 139 msg.warn("FAD did not return to Connected, after 50 seconds") 140 return False 141 return True 142 141 143 def TakeExtLpRun( verbose = True ): 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 zoreturn True144 msg = MSG() 145 msg.output = verbose 146 if not IsReadyForDataTaking( verbose=False ): 147 msg.fail("System not Ready for DataTaking") 148 IsReadyForDataTaking( verbose=True ) 149 return False 150 mcp.start(-1,1000,'light-pulser-ext\0') 151 if not fad.wait(8, 10): 152 msg.warn("FAD not in Writing Data after 10seconds") 153 return False 154 msg("... taking light-pulser-ext: 1000evts @25Hz") 155 if not fad.wait(4, 50): 156 msg.warn("FAD did not return to Connected, after 50 seconds") 157 return False 158 return True 157 159 158 160 def TakeData( verbose = True): 159 160 161 162 163 164 165 166 161 msg = MSG() 162 msg.output = verbose 163 TakePedestalOnRun() 164 TakeExtLpRun() 165 for i in range(4): 166 i +=1 167 msg("Taking Data Run "+str(i)+" of 4") 168 TakeDataRun() 167 169 168 170 def Take( time=0, events=0, runtype='drs-pedestal', verbose=True): 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 171 msg = MSG() 172 msg.output = verbose 173 fad = fad_control 174 runtype += '\0' 175 if not fad.wait(4, 10): 176 msg.warn("fad not connected after 10sec") 177 return False 178 mcp.start( time, events, runtype) 179 if not fad.wait(8, 30): 180 msg.warn("fad not Writing Data after 30sec") 181 return False 182 timeout = float('inf') 183 if time != -1: 184 timeout = time*1.1 185 if not fad.wait(4, timeout): 186 msg.warn("Data Writing not finished after "+str(timeout)+"sec") 187 return False 188 return True 187 189 188 190 def TakeDrsCalibration( verbose = True): 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 191 msg = MSG() 192 msg.output = verbose 193 bias = bias_control 194 fad = fad_control 195 196 bias.set_zero_voltage() 197 if not bias.wait(7, 10): 198 msg.warn("bias has not switched of after 10sec") 199 return False 200 fad.start_drs_calibration() 201 Take( -1, 1000, 'drs-pedestal') 202 Take( -1, 1000, 'drs-gain') 203 Take( -1, 1000, 'drs-pedestal') 204 fad.set_file_format(2) 205 Take( -1, 1000, 'drs-pedestal') 206 Take( -1, 1000, 'drs-time') 207 Take( -1, 1000, 'drs-time-upshifted') 208 fad.reset_secondary_drs_baseline() 209 Take(-1, 1000, 'pedestal') 210 fad.set_file_format(2) 211 Take(-1, 1000, 'pedestal') 210 212 211 213 def BlinkenLights(verbose = True): 212 213 214 215 216 217 218 219 214 msg = MSG(verbose) 215 fad = fad_control 216 217 for i in range(10): 218 fad.set_file_format(2) 219 time.sleep(1) 220 fad.set_file_format(0) 221 time.sleep(1) 220 222 221 223 def TakeAmplCalib( roi=1024, verbose=True): 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 224 msg = MSG(verbose) 225 bias = bias_control 226 fad = fad_control 227 if (roi!=1024) and (roi!=300): 228 raise ValueError('roi must be 300 or 1024') 229 # I do not understand, why the out put needs to be ENABLED?? 230 feedback.enable_output(0) 231 bias.set_zero_voltage() 232 bias.wait(7) # VoltageOff 233 fad.start_drs_calibration 234 235 Take(-1, 1000, 'drs-pedestal') 236 Take(-1, 1000, 'drs-gain') 237 if roi == 300: 238 Take(-1, 1000, 'pedestal') 239 if roi == 1024: 240 Take(-1, 1000, 'drs-pedestal') 241 242 fad.set_file_format(2) 243 if roi == 300: 244 Take(-1, 1000, 'pedestal') 245 if roi == 1024: 246 Take(-1, 1000, 'drs-pedestal') 245 247 246 248 def TakeTimeCalib( verbose=True ): 247 msg = MSG( verbose ) 248 feedback.enable_output(0) 249 if bias() != 7: 250 bias.set_zero_voltage() 251 if not bias.wait(7, 10): 252 msg.warn("bias not ramped down after 10sec") 253 return False 254 fad.set_file_format(2) 255 Take(-1, 1000, 'drs-time') 256 Take(-1, 1000, 'drs-time-upshifted') 249 msg = MSG( verbose ) 250 feedback.enable_output(0) 251 if bias() != 7: 252 bias.set_zero_voltage() 253 if not bias.wait(7, 10): 254 msg.warn("bias not ramped down after 10sec") 255 return False 256 fad.set_file_format(2) 257 Take(-1, 1000, 'drs-time') 258 Take(-1, 1000, 'drs-time-upshifted') 259 260 261 # create introduction: 262 class INTRO(object): 263 def __init__(self): 264 # nothing to do 265 pass 266 267 def __repr__(self): 268 print "welcome to PyDimCtrl V0.1:" 269 print "--------------------------" 270 print "If the hardware is ON but not all the software is connected try:" 271 print " Connect()" 272 print "If all the programs are already up and running, you might want to" 273 print " TakeDrsAmplitudeCalibration(roi=1024) or " 274 print " TakeDrsAmplitudeCalibration(roi=300)" 275 print " i.e. ped, gain, trigger_offset + extra ped(for X-check)" 276 print " TakeDrsTimeCalibration( type='upshifted' ) or " 277 print " TakeDrsTimeCalibration( type='old' ) or " 278 print " " 279 print "In case you would like to ramp up the Bias voltage try:" 280 print " VoltageOn( mode='temperature' ) or" 281 print " VoltageOn( mode='current' ) or" 282 print " VoltageOn( mode='light_pulser' )" 283 print "Switch off with:" 284 print " VoltageOff()" 285 print "" 286 print "In case you would like a Watchdog to check, if the Voltage is up" 287 print "and the BiasCrate is not disconnected, then try:" 288 print " VoltageOn( mode='--see above--', Watchdog=True )" 289 print "PLEASE NOTE: The Watchdog will monitor the State of BIAS_CONTROL" 290 print "and in case of a connection loss, it will: " 291 print " * print a warning" 292 print " * issue a the RECONNECT command" 293 print " * issue SET_ZERO_VOLTAGE - since this is the only way to get referenced" 294 print " * Ramp up again, using the same settings as before" 295 print " * possible OverCurrent situation will be treated as usual" 296 print "The Watchdog will not react on any other state change, like OverCurrent or VoltageOff" 297 print "" 298 print "" 299 return "" 300 301 302 intro = INTRO() 257 303 258 304 if __name__ == '__main__': 259 IsReadyForDataTaking() 260 TrackSource( Shift=0.6, Angle=50, SrcName='Crab', verbose=True) 261 WaitForTracking( CalmDownTime = 30, verbose = True) 262 TakeDataRun() 263 StopTracking() 305 print "welcome:" 306 print " type: intro" 307 print " for a short introduction" 308 309 310 #IsReadyForDataTaking() 311 #TrackSource( Shift=0.6, Angle=50, SrcName='Crab', verbose=True) 312 #WaitForTracking( CalmDownTime = 30, verbose = True) 313 #TakeDataRun() 314 #StopTracking()
Note:
See TracChangeset
for help on using the changeset viewer.