1
2
3 """
4 Interface for configuring pre/post icetray scripts
5
6 copyright (c) 2005 the icecube collaboration
7
8 @version: $Revision: $
9 @date: $Date: $
10 @author: Juan Carlos Diaz Velez <juancarlos@icecube.wisc.edu>
11 """
12
13 import os
14 import re
15 import sys
16 import math
17 import glob
18 import dircache
19 import time
20 import string
21 import shutil
22 import cPickle
23 import ipmodule
24 from ipmodule import IPBaseClass
25 from os import system
26 from os.path import expandvars
27 import logging
28 import popen2
29 import getpass
30 from commands import getstatusoutput
31 from iceprod.core import exe
32 from iceprod.core.dataclasses import I3Tarball
33
35 """
36 This class provides an interface for preprocessing files in iceprod
37 """
38
40 IPBaseClass.__init__(self)
41 self.logger = logging.getLogger('iceprod::Corsika')
42 self.name = 'corsika'
43 self.parameters['arrang'] = -119.
44
45 self.AddParameter('version','Corsika version','v6720')
46 self.AddParameter('platform','compliler platform','')
47 self.AddParameter('cache','Should cache taball?',False)
48 self.AddParameter('cachedir','Cache directory',
49 '$system(cache)/%s_icesoft/%s'% (getpass.getuser(), self.name))
50 self.AddParameter('URL','fetch tarball from URL',None)
51 self.AddParameter('runnum','Run number','')
52 self.AddParameter('seed','Random seed','1')
53 self.AddParameter('nevents','Number of Events',0)
54 self.AddParameter('outfile','Output file',"DAT%(runnum)06d")
55 self.AddParameter('logfile','Log file','%(outfile)s.log')
56 self.AddParameter('outdir','Output directory','.')
57 self.AddParameter('topdir','Top directory','')
58 self.AddParameter('tmpdir','Temporary directory','%(outdir)s/dcors%(runnum)d')
59 self.AddParameter('model','Physics Model','SIBYLL')
60 self.AddParameter('lemodel','Low Energy Physics Model','gheisha')
61 self.AddParameter('donkg','Run NKG',0)
62 self.AddParameter('doegs','Run EGS',0)
63 self.AddParameter('eslope','CR spectral index (only if ranpri=0)',-2.7)
64 self.AddParameter('crtype','CR primary type',14)
65 self.AddParameter('cthmin','Min theta of injected cosmic rays',0.0)
66 self.AddParameter('cthmax','Max theta of injected cosmic rays',89.99)
67 self.AddParameter('cphmin','Min phi of injected cosmic rays',0.0)
68 self.AddParameter('cphmax','Max phi of injected cosmic rays',360.0)
69 self.AddParameter('emin','CR min energy',600.)
70 self.AddParameter('emax','CR max energy',1.e11)
71 self.AddParameter('ecuts','hadron/em energy cut (deprecated: instead use ecuts(i),i=1..4)',0)
72 self.AddParameter('ecuts1','hadron min energy (see corsika docs)',273)
73 self.AddParameter('ecuts2','muon min energy (see corsika docs)',273)
74 self.AddParameter('ecuts3','electron min energy (see corsika docs)',0.003)
75 self.AddParameter('ecuts4','photon min energy (see corsika docs)',0.003)
76 self.AddParameter('atmod','Atmosphere model (October=13)',13)
77 self.AddParameter('debug','boolean: enable disable debug mode',False)
78
79
81 """
82 Stage files and executables
83 """
84
85 par = self.parameters
86 par['tmpdir'] = self.GetParameter('tmpdir') % par;
87
88 self.logger.info('setting up working directory: %(tmpdir)s' % par)
89 if not os.path.exists(par['tmpdir']):
90 os.makedirs(par['tmpdir']);
91 os.chdir(par['tmpdir']);
92
93 self.logger.info('caching: %s' % self.GetParameter('cache'))
94 if self.GetParameter('cache'):
95 cachedir = self.parser.parse(self.GetParameter('cachedir'))
96 if not os.path.exists(cachedir):
97 os.makedirs(cachedir)
98 else:
99 cachedir = expandvars("$PWD")
100 baseurl = par['url']
101
102 meta = I3Tarball()
103 meta.version = self.GetParameter('version')
104 meta.platform = self.GetParameter('platform')
105 meta.name = self.name
106 meta.suffix = ".tar.gz"
107 if meta.platform:
108 meta.filebase = "%s-%s.%s" % (meta.name, meta.version, meta.platform)
109 else:
110 meta.filebase = "%s-%s" % (meta.name, meta.version)
111 meta.md5sum = "%s.md5sum" % meta.filebase
112 meta.url = "%s/%s" % (baseurl,meta.filebase)
113 exe.fetch_tarball(meta,cachedir)
114 par['topdir'] = meta.path
115
116
117
118
119 os.symlink("%(topdir)s/bin/NUCNUCCS" % par, "NUCNUCCS");
120 os.symlink("%(topdir)s/bin/QGSDAT01" % par, "QGSDAT01");
121 os.symlink("%(topdir)s/bin/SECTNU" % par, "SECTNU");
122 os.symlink("%(topdir)s/bin/qgsdat-II-03" % par, "qgsdat-II-03");
123 os.symlink("%(topdir)s/bin/sectnu-II-03" % par, "sectnu-II-03");
124 os.symlink("%(topdir)s/bin/GLAUBTAR.DAT" % par, "GLAUBTAR.DAT");
125 os.symlink("%(topdir)s/bin/NUCLEAR.BIN" % par, "NUCLEAR.BIN");
126 os.environ['LD_LIBRARY_PATH'] = expandvars("%(topdir)s/lib:$LD_LIBRARY_PATH" % par);
127
128
129 egsfiles = glob.glob("%(topdir)s/bin/EGSDAT*" % par)
130
131
132 eposfiles = glob.glob("%(topdir)s/bin/epos.*" % par)
133
134 for file in egsfiles + eposfiles:
135 os.symlink(file, os.path.basename(file));
136
137
138 if os.path.exists("%(topdir)s/fluka" % par):
139 os.environ['FLUPRO'] = expandvars("%(topdir)s/fluka" % par);
140
141 return meta.path
142
143
144
146 """
147 Run CORSIKA
148 corsika output is stdout: must create a temporary directory and cd there
149 """
150
151 cwd = os.getcwd()
152 par = self.parameters
153
154
155 self.stage()
156 self.configure()
157 self.write_steering()
158
159
160
161 par['model'] = par['model'].upper()
162 par['versionnumber'] = par['version'].lstrip('v')
163 par['corsbinary'] = "%(topdir)s/bin/corsika%(versionnumber)sLinux_%(model)s_%(lemodel)s" % par;
164 if not os.path.exists(par['corsbinary']):
165 os.chdir(cwd);
166 print >> sys.stderr,"CORSIKA binary does not exist: corsika%(versionnumber)sLinux_%(model)s_%(lemodel)s\n" % par;
167 raise Exception,"CORSIKA binary does not exist: corsika%(versionnumber)sLinux_%(model)s_%(lemodel)s\n" % par;
168
169
170 system("cp %(corsbinary)s corsika.%(runnum)s.Linux" % par);
171
172
173 par['outfile'] = os.path.join(expandvars(par['outdir']%par),expandvars(par['outfile']%par))
174 par['corout'] = "DAT%(runnum)06d" % par;
175 par['logfile'] = par['logfile'] % par
176
177
178 cors_cmd = "%(tmpdir)s/corsika.%(runnum)d.Linux < %(inputfile)s > %(logfile)s " % par;
179 self.logger.info(cors_cmd);
180
181
182 status, output = getstatusoutput(cors_cmd);
183 self.logger.info(output);
184 if status:
185 os.chdir(cwd);
186 raise Exception, "dCorsika python sucks! %s\n" % output;
187
188
189 if os.path.exists("%(tmpdir)s/%(corout)s.gz" % par):
190 system("cp %(tmpdir)s/%(corout)s.gz %(outfile)s" % par);
191
192 elif os.path.exists("%(tmpdir)s/%(corout)s" % par):
193 system("cp %(tmpdir)s/%(corout)s %(outfile)s" % par);
194
195 else:
196 os.chdir(cwd);
197 print >> sys.stderr,"CORSIKA Output does not exist: exit before UCR\n";
198 raise Exception,"CORSIKA Output does not exist: exit before UCR\n";
199
200
201
202
203 nevcorsika = 0
204 try:
205 status,nevcorsika=getstatusoutput("cat %(logfile)s|grep \"GENERATED EVENTS\"|grep -v NEV|awk '{ print $6 }'" % par);
206 nevcorsika = int(nevcorsika.strip());
207 stats['nevcorsika'] = nevcorsika
208 except Exception,e:
209 self.logger.error(e);
210 if nevcorsika == self.GetParameter('nevents'):
211 system('touch %(outdir)s/corsika.%(runnum)d.isok' % par)
212 self.logger.info("OK");
213 print >> sys.stderr, "Corsika OK\n";
214 else :
215 system('touch %(outdir)s/corsika.%(runnum)d.isnotok' % par)
216 print >> sys.stderr, "Corsika not OK\n";
217 self.logger.error("NOT OK");
218 self.logger.error(exe.tail(self.GetParameter('logfile')));
219 os.chdir(cwd);
220 return 1;
221
222 os.chdir(cwd);
223 return 0;
224
334
335
337
338 par = self.parameters
339 self.steering += "EXIT terminates input\n";
340
341 tmpdir = par['tmpdir']
342 inputfile = open(tmpdir+"/INPUTS",'w');
343 inputfile.write(self.steering % par);
344 par['inputfile'] = inputfile.name;
345 inputfile.close();
346
347
349 """
350 This class provides an interface for preprocessing files in iceprod
351 """
352
354 Corsika.__init__(self)
355 self.name = 'dcorsika'
356 self.logger = logging.getLogger('iceprod::dCorsika')
357 self.parameters['arrang'] = 0.
358
359 self.AddParameter('version','Corsika version','v6720')
360
361
362 self.AddParameter('ranpri','CR spectrum: 0=individual nuclei, 1=Wiebel-Sooth, 2=Hoerandel',2)
363 self.AddParameter('dslope','CR spectral index modification (only if ranpri=1,2)',0.)
364 self.AddParameter('length','length of generation cylinder in m (for detcfg = length/2*radius calculation)',1400.)
365 self.AddParameter('radius','radius of generation cylinder in m (for detcfg = length/2*radius calculation)',700.)
366 self.AddParameter('depth','depth of the center of IceCube detector in m (for AMANDA it is 1730.)',1950.)
367
368
369
396
397
399 """
400 This class provides an interface for preprocessing files in iceprod
401 """
402
404 Corsika.__init__(self)
405 self.name = 'thincorsika'
406 self.logger = logging.getLogger('iceprod::ThinCorsika')
407
408
409 self.AddParameter('thinem_e','Fraction of primary energy where thinning algorithm is used for electromagnetic particles.',1.0E-6)
410 self.AddParameter('thinem_wmax','maximum weight to be given to any thinned electromagnetic particle',10.0)
411 self.AddParameter('thinh_e','Energy(Gev) where thinning algorithm is used for hadrons',1.0)
412 self.AddParameter('thinh_wmax','Maximum weight to be given to any thinned hadronic particle',1.0)
413
429
430
432 """
433 This class provides an interface for preprocessing files in iceprod
434 """
435
437 Corsika.__init__(self)
438 self.name = 'thincorsika'
439 self.logger = logging.getLogger('iceprod::AutoThinCorsika')
440
441
442 self.AddParameter('thin_method','Method for calculating thinning parameters.','2009')
443
464
465
466 -class UCR(ipmodule.IPBaseClass):
467
476
477
479 if not ipmodule.IPBaseClass.Execute(self,stats): return 0
480
481 from commands import getstatusoutput
482
483 ucr_bin = self.GetParameter('ucr-binary')
484 ucr_bin = self.parser.parse(ucr_bin)
485
486 ucr_opts = self.GetParameter('ucr-opts')
487 ucr_opts = self.parser.parse(ucr_opts)
488
489 ucr_in = self.GetParameter('input')
490 ucr_in = self.parser.parse(ucr_in)
491
492 ucr_out = self.GetParameter('output')
493 ucr_out = self.parser.parse(ucr_out)
494
495 ucr_cmd = " ".join([ucr_bin,'-out='+ucr_out, ucr_in, ucr_opts])
496
497 os.system("touch %s" % ucr_out)
498
499 self.logger.info(ucr_cmd)
500 status, output = getstatusoutput(ucr_cmd);
501
502 self.logger.info(output)
503 if status:
504 self.logger.error(output)
505
506 return status
507