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 'PHYSICS',
52 'SYSTEMATICS',
53 'BENCHMARK',
54 'TEST',
55 'TEMPLATE',
56 'SYSCHK',
57 ]
58
59
62 self.stringid= stringid
63 self.omid= omid
64
70 self.stringid= stringid
73
75 - def __init__(self,value,unit=None,format=None):
76 self.value = value
77 self.unit = unit
78 self.format = format
87
89 - def __init__(self,ptype='NaT',pname='',value=''):
90 self.ptype = ptype
91 self.pname = pname
92 self.pvalue = value
93 self.description = 'No description'
94 self.id = -1
95 self.default = None
96
101
103 self.description = description
104
106 return self.description
107
113
116
121
126
131
136
141
144 self.SetName(name)
145 self.trays = OrderedDict()
146 self.parents = []
147 self.children = []
148 self.requirements = ''
149 self.batchoptions = ''
150 self.grids = []
151 self.parallel = False
152 self.id = id
153 self.photonics = False
154
159
160 - def AddTray(self, idx, iters, externs=False):
166
171
176
178 self.requirements = reqs.strip().replace('\n', ' ')
180 return self.requirements
181
183 self.batchoptions = opts.strip().replace('\n', ' ')
185 return self.batchoptions
186
188 self.parents.append(parent)
191
193 self.children.append(child)
196
198 self.parallel = bool(parallel)
201
203 self.photonics = bool(photonics)
205 return self.photonics
206
209
211 return self.HasTray(tray) and self.GetTray(tray).HasIteration(iter)
212
218
221
224
226 - def __init__(self, idx, iters, externs=False):
227 self.iters = []
228 self.externs = False
229 self.idx = 0
230
231 self.SetIndex(idx)
232 self.SetRunExterns(externs)
233 self.SetIters(iters)
234
239
241 if not self.RunExternsEnabled():
242 real_iters = []
243 else:
244 real_iters = [TASK_EXTERN_ITER]
245 iters = str(iters).split(",")
246 for iter in iters:
247 if iter.count("-") > 0 and not iter == str(TASK_EXTERN_ITER):
248 endpoints = map(int, iter.split("-"))
249 for val in range(endpoints[0], endpoints[1]+1):
250 if val not in real_iters:
251 real_iters.append(val)
252 else:
253 iter = int(iter)
254 if iter not in real_iters:
255 real_iters.append(iter)
256 self.iters = map(int, real_iters)
259
261 return self.GetIters().has_key(iter)
262
264 self.externs = bool(externs)
267
270
273 self.dataset = dataset
274 self.job = job
275
276
301
303 if not hasattr(self, 'statistics'):
304 self.statistics = OrderedDict()
305 self.statistics[stat] = stat
306
308 if not hasattr(self, 'statistics'):
309 self.statistics = OrderedDict()
310 return self.statistics.values()
311
313 self.difplus = difplus
314
317
320
322 self.version = version
325
329 return self.parent_id
330
332 for i in range(len(self.trays)):
333 check,str = self.trays[i].CheckConfig()
334 if not check:
335 return check, "tray %d: %s" % (i,str)
336 return True,""
337
340
343
348
350 if not hasattr(self,'jobdeps'):
351 self.jobdeps = []
352 return self.jobdeps
353
355 self.description = desc
356
358 return self.description
359
361 self.datasettype = dtype
362
364 return self.datasettype
365
368
371
373 """
374 usage:
375 AddParameter(p)
376 where p is a Parameter object as of iceprod 1.2: you can also call
377
378 AddParameter("type","name","value")
379 """
380 if len(args) < 1: raise Exception, "AddParameter requires at least 1 argument, 0 given"
381 if isinstance(args[0],Parameter):
382 parameter = args[0]
383 else:
384 parameter = Parameter(*args)
385 self.parameters[parameter.GetName()] = parameter
386
388 if self.parameters.has_key(parametername):
389 del self.parameters[parametername]
390
392 return self.parameters.values()
393
395 if self.parameters.has_key(pname):
396 return self.parameters[pname]
397
399 if type(depend) in types.StringTypes:
400 self.dependencies[depend] = depend
401 else:
402 self.dependencies[depend.GetName()]= depend
403
405 return self.dependencies.values()
406
408 if self.dependencies.has_key(dname):
409 return self.dependencies[dname]
410
412 if self.dependencies.has_key(dname):
413 del self.dependencies[dname]
414
417
420
424
428
430 self.sysopts[opt.GetName()] = opt
431
433 return self.sysopts.values()
434
436 if self.sysopts.has_key(bname):
437 return self.sysopts[bname]
438
440 if self.sysopts.has_key(bname):
441 del self.sysopts[bname]
442
444 self.externs.append(extern)
445
446 - def GetExterns(self):
448
450 self.task_defs[task_def.GetName()] = task_def
451
453 return self.task_defs[name]
454
456 return self.task_defs
457
463
469
472
475
478
480 tray = self.trays[t]
481 del self.trays[t]
482 return tray
483
485 return self.extras.has_key(name)
486
488 self.extras[name] = extra
489
491 if self.HasExtra(name):
492 return self.extras[name]
493
496
499
501 return self.extras.values()
502
506
507
516
518
519 - def __init__(self,name='',value=None,type='string'):
524
527
528
529
532 self.name = ''
533 self.description = ''
534 self.parameters = OrderedDict()
535 self.mclass = ''
536 self.id = -1
537 self.projects = OrderedDict()
538 self.inboxes = []
539 self.outboxes = []
540
541
549
554
556 self.description = description
557
559 return self.description
560
563
566
568 if not self.parameters.has_key(parameter.GetName()):
569 self.parameters[parameter.GetName()] = parameter
570
572 if self.parameters.has_key(parametername):
573 del self.parameters[parametername]
574
576 return [self.parameters[k] for k in self.parameters.keys()]
577
579 if self.parameters.has_key(pname):
580 return self.parameters[pname]
581
583 if not self.projects.has_key(name):
584 self.projects[name] = project
585
587 if self.projects.has_key(projectname):
588 del self.projects[projectname]
589
592
595
597 if self.projects.has_key(projectname):
598 return self.projects[pname]
599
601 return [self.projects[k] for k in self.projects.keys()]
602
605
608
612
616
618 """
619 This class provides an interface for preprocessing files in iceprod
620 """
623
624 -class IceProdPost(IceProdPre):
625 """
626 This class provides an interface for postprocessing files in iceprod
627 """
628 - def __init__(self):
630
633 self.name = ''
634 self.version = ''
635 self.revision = 0
636 self.pid = -1
637 self.path = '.'
638 self.type = 'c++'
639 self.dependencies = {}
640
645
647 self.version = version
648
651
653 tok = self.version.split('.')[-1].replace('V','').split('-')
654 versionStr = fmt % ( tok[0], tok[1], tok[2])
655 return versionStr
656
661
666
667
672
674 self.dateTime = dateTime
677
682
684 self.compiler = compiler
685
688
691
694
697
700
702 if type(depend) in types.StringTypes:
703 self.dependencies[depend] = depend
704 else:
705 self.dependencies[depend.GetName()]= depend
706
708 return self.dependencies.values()
709
711 return self.dependencies.keys()
712
714 self.dependencies = {}
715
723
725 sname = pre.GetName()
726 self.iceprodpre[sname] = pre
727
729 return self.iceprodpre.values()
730
731 - def AddIceProdPost(self, post):
732 sname = post.GetName()
733 self.iceprodpost[sname] = post
734
735 - def GetIceProdPosts(self):
736 return self.iceprodpost.values()
737
744
747
749 return self.services.has_key(name)
751 self.services[service.GetName()] = service
753 return self.services.values()
756
792
793
796 self.outbox = None
797 self.inbox = Box('')
798
799 - def From(self, from_module, outbox):
800 self.outbox = Box(from_module,outbox)
801
802 - def To(self, to_module, inbox):
803 self.inbox = Box(to_module,inbox)
804
805 - def To(self, to_module, inbox=None):
806 if inbox:
807 self.inbox = Box(to_module,inbox)
808 else:
809 self.inbox = Box(to_module)
810
813
816
818 - def __init__(self,module,boxname='default'):
819 self.module = module
820 self.boxname = boxname
821
824
827
830
833
851
854
857
860
862 if not hasattr(self, 'python'):
863 self.python = None
864 return self.python
865
876
881
883 self.iterations = iter
885 return self.iterations
886
888 if self.parameters.has_key(pname):
889 return self.parameters[pname]
890 else:
891 return None
892
895
898
900 for m in self.modules:
901 if m.GetName() == mname:
902 return True
903 return False
904
920
932
940
943
946
948 for m in self.modules:
949 if m.GetName() == modulename:
950 return m
951 return False
952
955
958
961
965
973
976
979
982
986
987
990
991
998
1000 for metaproject in self.GetMetaProjectList():
1001 if metaproject.HasProject(pname):
1002 return metaproject.GetProject(pname)
1003
1004
1005 if self.projects.has_key(pname):
1006 return self.projects[pname]
1007
1008
1011
1013 return self.projects
1014
1016 return self.projects.values()
1017
1019 if self.projects.has_key(projectname):
1020 del self.projects[projectname]
1021
1023 if not self.ice_project_attr.has_key(name):
1024 self.ice_project_attr[name] = project
1025
1027 return self.ice_project_attr
1028
1030 return self.ice_project_attr.values()
1031
1033 if self.ice_project_attr.has_key(projectname):
1034 del self.ice_project_attr[projectname]
1035
1037 return self.services.has_key(sname)
1038
1054
1067
1069 return self.services.pop(servicename)
1070
1072 return self.services.values()
1073
1075 if self.services.has_key(s):
1076 return self.services[s]
1077
1080
1081
1083 return self.iceprodpre.has_key(sname)
1084
1086 sname = pre.GetName()
1087 self.iceprodpre[sname] = pre
1088
1090 sname = pre.GetName()
1091 if index < 0:
1092 self.iceprodpre.insert(0,sname,pre)
1093 elif index >= len(self.modules):
1094 self.iceprodpre[sname] = pre
1095 else:
1096 self.iceprodpre.insert(index,sname,pre)
1097
1099 return self.iceprodpre.pop(prename)
1100
1102 return self.iceprodpre.values()
1103
1105 if self.iceprodpre.has_key(s):
1106 return self.iceprodpre[s]
1107
1110
1111 - def HasIceProdPost(self, sname):
1112 return self.iceprodpost.has_key(sname)
1113
1114 - def AddIceProdPost(self, post):
1115 sname = post.GetName()
1116 self.iceprodpost[sname] = post
1117
1118 - def InsertIceProdPost(self, index,post):
1119 sname = post.GetName()
1120 if index < 0:
1121 self.iceprodpost.insert(0,sname,post)
1122 elif index >= len(self.modules):
1123 self.iceprodpost[sname] = post
1124 else:
1125 self.iceprodpost.insert(index,sname,post)
1126
1127 - def RemoveIceProdPost(self, postname):
1128 return self.iceprodpost.pop(postname)
1129
1130 - def GetIceProdPosts(self):
1131 return self.iceprodpost.values()
1132
1133 - def GetIceProdPost(self,s):
1134 if self.iceprodpost.has_key(s):
1135 return self.iceprodpost[s]
1136
1138 self.iceprodpost = OrderedDict()
1139
1140
1142 self.connections.append(connection)
1143
1145 self.connections.insert(pos,connection)
1146
1148 return self.connections
1149
1151 con = self.connections[index]
1152 del self.connections[index]
1153 return con
1154
1156 self.connections = []
1157
1166
1168 - def __init__(self, name, photonics=False):
1169 self.name = name
1170 self.photonics = bool(photonics)
1171 self.unpack = False
1172
1176 return self.photonics
1177
1178 -class Block(IceTrayConfig):
1179 """
1180 Container of externals and IceTrays
1181 """
1186
1188 self.trays.append(config)
1189
1192
1194 return self.trays[t]
1195
1197 tray = self.trays[t]
1198 del self.trays[t]
1199 return tray
1200
1202 self.externs.append(extern)
1203
1204 - def GetExterns(self):
1206
1207
1209 - def __init__(self,path=None,format=None):
1210 self.path = path
1211 self.format = None
1212 self.cache = False
1213
1216
1219
1222
1225
1228 self.name = None
1229 self.text = None
1230
1235
1236 - def SetText(self,text):
1238 - def GetText(self):
1240
1242 fd = open(self.name,'w')
1243 print >> fd,self.text
1244 fd.close()
1245
1246
1249 self.name = None
1250 self.version = None
1251 self.description = ''
1252 self.arguments = ''
1253 self.infile = None
1254 self.pformat = "%(name)s %(value)s %(description)s"
1255 self.outfile = None
1256 self.errfile = None
1257 self.command = None
1258 self.parameters = OrderedDict()
1259 self.steering = []
1260
1265
1267 self.version = version
1270
1272 self.description = description
1274 return self.description
1275
1280
1282 self.parameters[parameter.GetName()] = parameter
1283
1285 if self.parameters.has_key(parametername):
1286 del self.parameters[parametername]
1287
1289 return self.parameters.values()
1290
1293
1296
1308
1309
1311 if self.parameters.has_key(pname):
1312 return self.parameters[pname]
1313
1315 self.outfile = filename
1318
1320 self.errfile = filename
1323
1325 self.infile = filename
1328
1330 self.command = command
1333
1338
1340 - def __init__(self, prefix='/data/sim', search=True, filedict={}, filter=''):
1341 self.prefix = prefix
1342 self.search = search
1343 self.filedict = filedict
1344 self.paths = []
1345 self.tokens = []
1346 self.filter = filter
1347
1350
1353
1356
1359
1361 self.prefix = prefix
1362
1365
1367 self.filedict = filedict
1368
1370 return self.filedict
1371
1373 """
1374 Get list of files in rootdir and add them to database dictonary table
1375 """
1376 import re,os, os.path
1377 from os.path import join
1378 filecount = 0
1379 for path in self.paths:
1380 if path.regex: cregex = re.compile(path.regex)
1381 for p, dirs, files in os.walk(join(self.prefix,path.path)):
1382 for file in files:
1383 filepath = os.path.join(p,file)
1384 match = cregex.match(filepath)
1385 if match:
1386 year = match.group(0)
1387 day = match.group(1)
1388 run = match.group(2)
1389 truncated_path = p.replace(self.prefix,'')
1390 filename = os.path.join(truncated_path,file)
1391 subdir = os.path.basename(p)
1392 truncated_path = truncated_path[:-len(subdir)]
1393 key = filecount
1394 self.filedict[key] = [truncated_path,subdir,file]
1395 filecount += 1
1396 return len(self.filedict)
1397
1398
1400 - def __init__(self,path, regex=r'.*.i3(.gz){0,1}'):
1401 self.path = path
1402 self.regex = regex
1403
1412
1414 """
1415 This class provides an interface for preprocessing files in iceprod
1416 """
1417
1429
1439
1441 """
1442 Set parameter value for plugin
1443 """
1444 self.modules[module].SetParameter(param, value)
1445 return self
1446
1448 """
1449 Set ExpParser object for plugin
1450 """
1451 self.modules[module].SetParser(parser)
1452 return self
1453
1455 """
1456 Set ExpParser object for plugin
1457 """
1458 if len(args) == 1:
1459 for mod in self.modules.values():
1460 mod.SetParser(args[0])
1461 elif len(args) == 2:
1462 module = args[0]
1463 parser = args[1]
1464 self.modules[module].SetParser(parser)
1465 else:
1466 raise Exception, "Wrong number of arguments to SetParser"
1467
1468
1470 for pair in args:
1471 print self.last_added +': ', pair[0], '=', pair[1]
1472 self.modules[self.last_added].SetParameter(pair[0], pair[1])
1473 return self
1474
1476 for key in self.modules.keys():
1477 self.logger.info("executing PreModule %s"%key)
1478
1479 retval = self.modules[key].Execute(self.stats)
1480 if not retval == 0: raise Exception, "%s returned %d" % (key,retval)
1481
1483 for key in self.modules.keys():
1484 retval = self.modules[key].Finish(self.stats)
1485 if not retval == 0: raise Exception, "%s returned %d" % (key,retval)
1486
1487
1488 -class I3PostTray(I3PreTray):
1489 """
1490 This class provides an interface for post-processing files in iceprod
1491 """
1492 - def __init__(self):
1493 I3PreTray.__init__(self)
1494 self.logger = logging.getLogger('I3PostTray')
1495
1496 - def Execute(self):
1497 for key in self.modules.keys():
1498 self.logger.info("executing Post %s"%key)
1499 retval = self.modules.pop(key).Execute(self.stats)
1500 if not retval == 0: raise Exception, "%s returned %d" % (key,retval)
1501
1502
1504 """
1505 Holder for metaproject tarball information
1506 """
1508 self.name = None
1509 self.version = None
1510 self.path = None
1511 self.url = None
1512 self.md5sum = None
1513 self.filebase = None
1514 self.suffix = None
1515 self.platform = None
1516
1518 """
1519 Cookie for tracking datasets on client
1520 """
1522 self.plugin = None
1523 self.batchsys = 'condor.Condor'
1524 self.dataset_id = 0
1525 self.queue_id = 0
1526 self.job_ids = []
1527 self.url = "https://condor.icecube.wisc.edu:9080"
1528
1531
1534
1536 if self.dataset_id:
1537 return self.dataset_id
1538 elif self.job_ids:
1539 return self.job_ids[0]
1540 else:
1541 return 0
1542
1556
1570
1572 """
1573 Information about host
1574 """
1576 self.id = ''
1577 self.hostname = ''
1578 self.ip = ''
1579 self.grid = ''
1580 self.platform = ''
1581