1
2
3 """
4 A set of classes that describe configuration elements in IceTray.
5
6 copyright (c) 2005 the icecube collaboration
7
8 @version: $Revision: $
9 @date: $Date: $
10 @author: T. McCauley <tpmccauley@lbl.gov>
11 @author: Juan Carlos Diaz Velez <juancarlos@icecube.wisc.edu>
12
13 @todo: Add support for more project content (the "optional" option)
14 @todo: Be a bit more clever about handling of type tags
15 @todo: Units
16 @todo: Commas and whitespace handling in projects attribute
17 @todo: What to do if libraries are included more than once?
18 @todo: Add some overall elegance
19 @todo: Fix the "inbox" problem
20 """
21 tver='$Revision: 1.4 $'
22 __version__= 2
23
24 import re,types
25 import logging
26 from odict import OrderedDict
27 from iceprod.core.constants import *
28
29 UnmetDependencyException = "Error: Un-met dependency:"
30 UndefinedTypeException = "Error: invalid type:"
31
32 SupportedTypes = [
33 'bool', 'int', 'long', 'float',
34 'double', 'string','NaT','OMKey']
35
36 VectorTypes = [
37 'boolv', 'intv', 'longv', 'floatv',
38 'doublev', 'stringv','OMKeyv']
39
40 SimulationCategories = [
41 'CORSIKA-ice-top',
42 'CORSIKA-in-ice',
43 'neutrino-generator',
44 'JULIeT', 'simple-generator',
45 'WIMP','SuperNova',
46 'TWRFilter', 'OfflineFilter',
47 'L1', 'L2', 'L3'
48 ]
49
50 DatasetTypes = [
51 'TEST',
52 'BENCHMARK',
53 'PHYSICS',
54 'TEMPLATE',
55 ]
56
57
60 self.stringid= stringid
61 self.omid= omid
62
68 self.stringid= stringid
71
73 - def __init__(self,value,unit=None,format=None):
74 self.value = value
75 self.unit = unit
76 self.format = format
85
87 - def __init__(self,ptype='NaT',pname='',value=''):
88 self.ptype = ptype
89 self.pname = pname
90 self.pvalue = value
91 self.description = 'No description'
92 self.id = -1
93 self.default = None
94
99
101 self.description = description
102
104 return self.description
105
111
114
119
124
129
134
139
142 self.SetName(name)
143 self.trays = OrderedDict()
144 self.parents = []
145 self.children = []
146 self.requirements = ''
147 self.parallel = False
148 self.id = id
149 self.photonics = False
150
155
156 - def AddTray(self, idx, iters, externs=False):
162
167
169 self.requirements = reqs.strip().replace('\n', ' ')
171 return self.requirements
172
174 self.parents.append(parent)
177
179 self.children.append(child)
182
184 self.parallel = bool(parallel)
187
189 self.photonics = bool(photonics)
191 return self.photonics
192
195
197 return self.HasTray(tray) and self.GetTray(tray).HasIteration(iter)
198
204
207
210
212 - def __init__(self, idx, iters, externs=False):
213 self.iters = []
214 self.externs = False
215 self.idx = 0
216
217 self.SetIndex(idx)
218 self.SetRunExterns(externs)
219 self.SetIters(iters)
220
225
227 if not self.RunExternsEnabled():
228 real_iters = []
229 else:
230 real_iters = [TASK_EXTERN_ITER]
231 iters = str(iters).split(",")
232 for iter in iters:
233 if iter.count("-") > 0 and not iter == str(TASK_EXTERN_ITER):
234 endpoints = map(int, iter.split("-"))
235 for val in range(endpoints[0], endpoints[1]+1):
236 if val not in real_iters:
237 real_iters.append(val)
238 else:
239 iter = int(iter)
240 if iter not in real_iters:
241 real_iters.append(iter)
242 self.iters = map(int, real_iters)
245
247 return self.GetIters().has_key(iter)
248
250 self.externs = bool(externs)
253
256
259 self.version = __version__
260 self.parent_id = 0
261 self.trays = []
262 self.difplus = None
263 self.parameters = OrderedDict()
264 self.batchopts = OrderedDict()
265 self.sysopts = OrderedDict()
266 self.dependencies = OrderedDict()
267 self.description = "Run was not given a description"
268 self.category = None
269 self.externs = []
270 self.extras = OrderedDict()
271 self.filter = None
272 self.datasettype = "PHYSICS"
273 self.task_defs = OrderedDict()
274
275 maxjobs = Parameter()
276 maxjobs.SetName("MAXJOBS")
277 maxjobs.SetType("int")
278 maxjobs.SetValue("1")
279 self.AddParameter(maxjobs)
280
282 self.difplus = difplus
283
286
289
291 self.version = version
294
298 return self.parent_id
299
301 for i in range(len(self.trays)):
302 check,str = self.trays[i].CheckConfig()
303 if not check:
304 return check, "tray %d: %s" % (i,str)
305 return True,""
306
309
312
314 self.description = desc
315
317 return self.description
318
320 self.datasettype = dtype
321
323 return self.datasettype
324
327
330
332 """
333 usage:
334 AddParameter(p)
335 where p is a Parameter object as of iceprod 1.2: you can also call
336
337 AddParameter("type","name","value")
338 """
339 if len(args) < 1: raise Exception, "AddParameter requires at least 1 argument, 0 given"
340 if isinstance(args[0],Parameter):
341 parameter = args[0]
342 else:
343 parameter = Parameter(*args)
344 self.parameters[parameter.GetName()] = parameter
345
347 if self.parameters.has_key(parametername):
348 del self.parameters[parametername]
349
351 return self.parameters.values()
352
354 if self.parameters.has_key(pname):
355 return self.parameters[pname]
356
358 self.dependencies[depend] = depend
359
361 return self.dependencies.values()
362
364 if self.dependencies.has_key(dname):
365 return self.dependencies[dname]
366
368 if self.dependencies.has_key(dname):
369 del self.dependencies[dname]
370
373
375 return self.batchopts.values()
376
378 if self.batchopts.has_key(bname):
379 return self.batchopts[bname]
380
382 if self.batchopts.has_key(bname):
383 del self.batchopts[bname]
384
386 self.sysopts[opt.GetName()] = opt
387
389 return self.sysopts.values()
390
392 if self.sysopts.has_key(bname):
393 return self.sysopts[bname]
394
396 if self.sysopts.has_key(bname):
397 del self.sysopts[bname]
398
400 self.externs.append(extern)
401
402 - def GetExterns(self):
404
406 self.task_defs[task_def.GetName()] = task_def
407
409 return self.task_defs[name]
410
412 return self.task_defs
413
419
425
428
431
434
436 tray = self.trays[t]
437 del self.trays[t]
438 return tray
439
441 return self.extras.has_key(name)
442
444 self.extras[name] = extra
445
447 if self.HasExtra(name):
448 return self.extras[name]
449
452
455
457 return self.extras.values()
458
462
471
473
474 - def __init__(self,name='',value=None,type='string'):
479
482
483
484
487 self.name = ''
488 self.description = ''
489 self.parameters = OrderedDict()
490 self.mclass = ''
491 self.id = -1
492 self.projects = OrderedDict()
493 self.inboxes = []
494 self.outboxes = []
495
496
504
509
511 self.description = description
512
514 return self.description
515
518
521
523 if not self.parameters.has_key(parameter.GetName()):
524 self.parameters[parameter.GetName()] = parameter
525
527 if self.parameters.has_key(parametername):
528 del self.parameters[parametername]
529
531 return [self.parameters[k] for k in self.parameters.keys()]
532
534 if self.parameters.has_key(pname):
535 return self.parameters[pname]
536
538 if not self.projects.has_key(name):
539 self.projects[name] = project
540
542 if self.projects.has_key(projectname):
543 del self.projects[projectname]
544
547
550
552 if self.projects.has_key(projectname):
553 return self.projects[pname]
554
556 return [self.projects[k] for k in self.projects.keys()]
557
560
563
567
569 """
570 This class provides an interface for preprocessing files in iceprod
571 """
574
575 -class IceProdPost(IceProdPre):
576 """
577 This class provides an interface for postprocessing files in iceprod
578 """
579 - def __init__(self):
581
584 self.name = ''
585 self.version = ''
586 self.revision = 0
587 self.pid = -1
588 self.path = '.'
589 self.type = 'c++'
590 self.dependencies = {}
591
596
598 self.version = version
599
602
604 tok = self.version.split('.')[-1].replace('V','').split('-')
605 versionStr = fmt % ( tok[0], tok[1], tok[2])
606 return versionStr
607
612
617
618
623
625 self.dateTime = dateTime
628
633
635 self.compiler = compiler
636
639
642
645
648
651
653 if type(depend) in types.StringTypes:
654 self.dependencies[depend] = depend
655 else:
656 self.dependencies[depend.GetName()]= depend
657
659 return self.dependencies.values()
660
662 return self.dependencies.keys()
663
665 self.dependencies = {}
666
674
676 sname = pre.GetName()
677 self.iceprodpre[sname] = pre
678
680 return self.iceprodpre.values()
681
682 - def AddIceProdPost(self, post):
683 sname = post.GetName()
684 self.iceprodpost[sname] = post
685
686 - def GetIceProdPosts(self):
687 return self.iceprodpost.values()
688
695
698
700 return self.services.has_key(name)
702 self.services[service.GetName()] = service
704 return self.services.values()
707
743
744
747 self.outbox = None
748 self.inbox = Box('')
749
750 - def From(self, from_module, outbox):
751 self.outbox = Box(from_module,outbox)
752
753 - def To(self, to_module, inbox):
754 self.inbox = Box(to_module,inbox)
755
756 - def To(self, to_module, inbox=None):
757 if inbox:
758 self.inbox = Box(to_module,inbox)
759 else:
760 self.inbox = Box(to_module)
761
764
767
769 - def __init__(self,module,boxname='default'):
770 self.module = module
771 self.boxname = boxname
772
775
778
781
784
801
804
807
808
819
824
826 self.iterations = iter
828 return self.iterations
829
831 if self.parameters.has_key(pname):
832 return self.parameters[pname]
833 else:
834 return None
835
837 self.steering=steering
838
841
843 for m in self.modules:
844 if m.GetName() == mname:
845 return True
846 return False
847
863
875
883
886
889
891 for m in self.modules:
892 if m.GetName() == modulename:
893 return m
894 return False
895
898
901
904
908
916
919
922
925
929
930
933
934
941
943 for metaproject in self.GetMetaProjectList():
944 if metaproject.HasProject(pname):
945 return metaproject.GetProject(pname)
946
947
948 if self.projects.has_key(pname):
949 return self.projects[pname]
950
951
954
957
959 return self.projects.values()
960
962 if self.projects.has_key(projectname):
963 del self.projects[projectname]
964
966 if not self.ice_project_attr.has_key(name):
967 self.ice_project_attr[name] = project
968
970 return self.ice_project_attr
971
973 return self.ice_project_attr.values()
974
976 if self.ice_project_attr.has_key(projectname):
977 del self.ice_project_attr[projectname]
978
980 return self.services.has_key(sname)
981
997
1010
1012 return self.services.pop(servicename)
1013
1015 return self.services.values()
1016
1018 if self.services.has_key(s):
1019 return self.services[s]
1020
1023
1024
1026 return self.iceprodpre.has_key(sname)
1027
1029 sname = pre.GetName()
1030 self.iceprodpre[sname] = pre
1031
1033 sname = pre.GetName()
1034 if index < 0:
1035 self.iceprodpre.insert(0,sname,pre)
1036 elif index >= len(self.modules):
1037 self.iceprodpre[sname] = pre
1038 else:
1039 self.iceprodpre.insert(index,sname,pre)
1040
1042 return self.iceprodpre.pop(prename)
1043
1045 return self.iceprodpre.values()
1046
1048 if self.iceprodpre.has_key(s):
1049 return self.iceprodpre[s]
1050
1053
1054 - def HasIceProdPost(self, sname):
1055 return self.iceprodpost.has_key(sname)
1056
1057 - def AddIceProdPost(self, post):
1058 sname = post.GetName()
1059 self.iceprodpost[sname] = post
1060
1061 - def InsertIceProdPost(self, index,post):
1062 sname = post.GetName()
1063 if index < 0:
1064 self.iceprodpost.insert(0,sname,post)
1065 elif index >= len(self.modules):
1066 self.iceprodpost[sname] = post
1067 else:
1068 self.iceprodpost.insert(index,sname,post)
1069
1070 - def RemoveIceProdPost(self, postname):
1071 return self.iceprodpost.pop(postname)
1072
1073 - def GetIceProdPosts(self):
1074 return self.iceprodpost.values()
1075
1076 - def GetIceProdPost(self,s):
1077 if self.iceprodpost.has_key(s):
1078 return self.iceprodpost[s]
1079
1081 self.iceprodpost = OrderedDict()
1082
1083
1085 self.connections.append(connection)
1086
1088 self.connections.insert(pos,connection)
1089
1091 return self.connections
1092
1094 con = self.connections[index]
1095 del self.connections[index]
1096 return con
1097
1099 self.connections = []
1100
1106 self.output_files.append(file)
1108 return self.output_files
1109
1111 - def __init__(self, name, photonics=False):
1112 self.name = name
1113 self.photonics = bool(photonics)
1117 return self.photonics
1118
1119 -class Block(IceTrayConfig):
1120 """
1121 Container of externals and IceTrays
1122 """
1127
1129 self.trays.append(config)
1130
1133
1135 return self.trays[t]
1136
1138 tray = self.trays[t]
1139 del self.trays[t]
1140 return tray
1141
1143 self.externs.append(extern)
1144
1145 - def GetExterns(self):
1147
1148
1150 - def __init__(self,path=None,format=None):
1151 self.path = path
1152 self.format = None
1153
1156
1159
1162
1165
1168 self.name = None
1169 self.text = None
1170
1175
1176 - def SetText(self,text):
1178 - def GetText(self):
1180
1182 fd = open(self.name,'w')
1183 print >> fd,self.text
1184 fd.close()
1185
1186
1189 self.name = None
1190 self.version = None
1191 self.description = ''
1192 self.arguments = ''
1193 self.infile = None
1194 self.pformat = "%(name)s %(value)s %(description)s"
1195 self.outfile = None
1196 self.errfile = None
1197 self.command = None
1198 self.parameters = OrderedDict()
1199 self.steering = []
1200
1205
1207 self.version = version
1210
1212 self.description = description
1214 return self.description
1215
1217 self.arguments= args
1219 return self.arguments
1220
1222 self.parameters[parameter.GetName()] = parameter
1223
1225 if self.parameters.has_key(parametername):
1226 del self.parameters[parametername]
1227
1229 return self.parameters.values()
1230
1233
1236
1248
1249
1251 if self.parameters.has_key(pname):
1252 return self.parameters[pname]
1253
1255 self.outfile = filename
1258
1260 self.errfile = filename
1263
1265 self.infile = filename
1268
1270 self.command = command
1273
1275 self.steering.append(steering)
1277 return self.steering
1278
1280 - def __init__(self, prefix='/data/sim', search=True, filedict={}, filter=''):
1281 self.prefix = prefix
1282 self.search = search
1283 self.filedict = filedict
1284 self.paths = []
1285 self.tokens = []
1286 self.filter = filter
1287
1290
1293
1296
1299
1301 self.prefix = prefix
1302
1305
1307 self.filedict = filedict
1308
1310 return self.filedict
1311
1313 """
1314 Get list of files in rootdir and add them to database dictonary table
1315 """
1316 import re,os, os.path
1317 from os.path import join
1318 filecount = 0
1319 for path in self.paths:
1320 if path.regex: cregex = re.compile(path.regex)
1321 for p, dirs, files in os.walk(join(self.prefix,path.path)):
1322 for file in files:
1323 filepath = os.path.join(p,file)
1324 match = cregex.match(filepath)
1325 if match:
1326 year = match.group(0)
1327 day = match.group(1)
1328 run = match.group(2)
1329 truncated_path = p.replace(self.prefix,'')
1330 filename = os.path.join(truncated_path,file)
1331 subdir = os.path.basename(p)
1332 truncated_path = truncated_path[:-len(subdir)]
1333 key = filecount
1334 self.filedict[key] = [truncated_path,subdir,file]
1335 filecount += 1
1336 return len(self.filedict)
1337
1338
1340 - def __init__(self,path, regex=r'.*.i3(.gz){0,1}'):
1341 self.path = path
1342 self.regex = regex
1343
1352
1354 """
1355 This class provides an interface for preprocessing files in iceprod
1356 """
1357
1359 self.modules = OrderedDict()
1360 self.status = 0
1361 self.stats = {}
1362 self.last_added = None
1363
1364
1365 self.realtime = 0.0
1366 self.usertime = 0.0
1367 self.systime = 0.0
1368 self.logger = logging.getLogger('I3PreTray')
1369
1379
1381 """
1382 Set parameter value for plugin
1383 """
1384 self.modules[module].SetParameter(param, value)
1385 return self
1386
1388 """
1389 Set ExpParser object for plugin
1390 """
1391 self.modules[module].SetParser(parser)
1392 return self
1393
1395 for pair in args:
1396 print self.last_added +': ', pair[0], '=', pair[1]
1397 self.modules[self.last_added].SetParameter(pair[0], pair[1])
1398 return self
1399
1401 for key in self.modules.keys():
1402 self.logger.info("executing PreModule %s"%key)
1403
1404 retval = self.modules[key].Execute(self.stats)
1405 if not retval == 0: raise Exception, "%s returned %d" % (key,retval)
1406
1408 for key in self.modules.keys():
1409 retval = self.modules[key].Finish(self.stats)
1410 if not retval == 0: raise Exception, "%s returned %d" % (key,retval)
1411
1412
1413 -class I3PostTray(I3PreTray):
1414 """
1415 This class provides an interface for post-processing files in iceprod
1416 """
1417 - def __init__(self):
1418 I3PreTray.__init__(self)
1419 self.logger = logging.getLogger('I3PostTray')
1420
1421 - def Execute(self):
1422 for key in self.modules.keys():
1423 self.logger.info("executing Post %s"%key)
1424 retval = self.modules.pop(key).Execute(self.stats)
1425 if not retval == 0: raise Exception, "%s returned %d" % (key,retval)
1426
1427
1429 """
1430 Holder for metaproject tarball information
1431 """
1433 self.name = None
1434 self.version = None
1435 self.path = None
1436 self.url = None
1437 self.md5sum = None
1438 self.filebase = None
1439 self.suffix = None
1440 self.platform = None
1441
1443 """
1444 Cookie for tracking datasets on client
1445 """
1447 self.plugin = None
1448 self.batchsys = 'condor.Condor'
1449 self.dataset_id = 0
1450 self.queue_id = 0
1451 self.job_ids = []
1452 self.url = "https://condor.icecube.wisc.edu:9080"
1453
1456
1459
1461 if self.dataset_id:
1462 return self.dataset_id
1463 elif self.job_ids:
1464 return self.job_ids[0]
1465 else:
1466 return 0
1467
1481
1495