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 if b: return 'T'
36 return 'F'
37
39 """
40 This class provides an interface for preprocessing files in iceprod
41 """
42
44 IPBaseClass.__init__(self)
45 self.logger = logging.getLogger('iceprod::Corsika')
46 self.name = 'corsika'
47 self.parameters['arrang'] = -119.
48
49 self.AddParameter('version','Corsika version','v6900')
50 self.AddParameter('platform','compliler platform','')
51 self.AddParameter('cache','Should cache taball?',False)
52 self.AddParameter('cachedir','Cache directory',
53 '$system(cache)/%s_icesoft/%s'% (getpass.getuser(), self.name))
54 self.AddParameter('URL','fetch tarball from URL',None)
55 self.AddParameter('runnum','Run number','')
56 self.AddParameter('seed','Random seed','1')
57 self.AddParameter('egs_seed_offset','value to be added to EGS seed (for debugging)','0')
58 self.AddParameter('nevents','Number of Events',0)
59 self.AddParameter('outfile','Output file',"DAT%(runnum)06d")
60 self.AddParameter('logfile','Log file','%(outfile)s.log')
61 self.AddParameter('outdir','Output directory','.')
62 self.AddParameter('topdir','Top directory','')
63 self.AddParameter('tmpdir','Temporary directory','%(outdir)s/dcors%(runnum)d')
64 self.AddParameter('model','Physics Model','SIBYLL')
65 self.AddParameter('lemodel','Low Energy Physics Model','gheisha')
66 self.AddParameter('donkg','Run NKG',0)
67 self.AddParameter('doegs','Run EGS',0)
68 self.AddParameter('eslope','CR spectral index (only if ranpri=0)',-2.7)
69 self.AddParameter('crtype','CR primary type',14)
70 self.AddParameter('cthmin','Min theta of injected cosmic rays',0.0)
71 self.AddParameter('cthmax','Max theta of injected cosmic rays',89.99)
72 self.AddParameter('cphmin','Min phi of injected cosmic rays',0.0)
73 self.AddParameter('cphmax','Max phi of injected cosmic rays',360.0)
74 self.AddParameter('emin','CR min energy',600.)
75 self.AddParameter('emax','CR max energy',1.e11)
76 self.AddParameter('ecuts','hadron/em energy cut (deprecated: instead use ecuts(i),i=1..4)',0)
77 self.AddParameter('ecuts1','hadron min energy (see corsika docs)',273)
78 self.AddParameter('ecuts2','muon min energy (see corsika docs)',273)
79 self.AddParameter('ecuts3','electron min energy (see corsika docs)',0.003)
80 self.AddParameter('ecuts4','photon min energy (see corsika docs)',0.003)
81 self.AddParameter('atmod','Atmosphere model (October=13)',13)
82 self.AddParameter('debug','boolean: enable disable debug mode',False)
83
84
86 """
87 Stage files and executables
88 """
89
90 par = self.parameters
91 par['tmpdir'] = self.GetParameter('tmpdir') % par;
92
93 self.logger.info('setting up working directory: %(tmpdir)s' % par)
94 if not os.path.exists(par['tmpdir']):
95 os.makedirs(par['tmpdir']);
96 os.chdir(par['tmpdir']);
97
98 self.logger.info('caching: %s' % self.GetParameter('cache'))
99 if self.GetParameter('cache'):
100 cachedir = self.parser.parse(self.GetParameter('cachedir'))
101 if not os.path.exists(cachedir):
102 os.makedirs(cachedir)
103 else:
104 cachedir = expandvars("$PWD")
105 baseurl = par['url']
106
107 meta = I3Tarball()
108 meta.version = self.GetParameter('version')
109 meta.platform = self.GetParameter('platform')
110 meta.name = self.name
111 meta.suffix = ".tar.gz"
112 if meta.platform:
113 meta.filebase = "%s-%s.%s" % (meta.name, meta.version, meta.platform)
114 else:
115 meta.filebase = "%s-%s" % (meta.name, meta.version)
116 meta.md5sum = "%s.md5sum" % meta.filebase
117 meta.url = "%s/%s" % (baseurl,meta.filebase)
118 exe.fetch_tarball(meta,cachedir)
119 par['topdir'] = meta.path
120
121
122
123
124 os.symlink("%(topdir)s/bin/NUCNUCCS" % par, "NUCNUCCS");
125 os.symlink("%(topdir)s/bin/QGSDAT01" % par, "QGSDAT01");
126 os.symlink("%(topdir)s/bin/SECTNU" % par, "SECTNU");
127 os.symlink("%(topdir)s/bin/qgsdat-II-03" % par, "qgsdat-II-03");
128 os.symlink("%(topdir)s/bin/sectnu-II-03" % par, "sectnu-II-03");
129 os.symlink("%(topdir)s/bin/GLAUBTAR.DAT" % par, "GLAUBTAR.DAT");
130 os.symlink("%(topdir)s/bin/NUCLEAR.BIN" % par, "NUCLEAR.BIN");
131 os.environ['LD_LIBRARY_PATH'] = expandvars("%(topdir)s/lib:$LD_LIBRARY_PATH" % par);
132
133
134 egsfiles = glob.glob("%(topdir)s/bin/EGSDAT*" % par)
135
136
137 eposfiles = glob.glob("%(topdir)s/bin/epos.*" % par)
138
139 for file in egsfiles + eposfiles:
140 os.symlink(file, os.path.basename(file));
141
142
143 if os.path.exists("%(topdir)s/fluka" % par):
144 os.environ['FLUPRO'] = expandvars("%(topdir)s/fluka" % par);
145
146 return meta.path
147
148
149
151 """
152 Run CORSIKA
153 corsika output is stdout: must create a temporary directory and cd there
154 """
155
156 cwd = os.getcwd()
157 par = self.parameters
158
159
160 self.stage()
161 self.configure()
162 self.write_steering()
163
164
165
166 par['model'] = par['model'].upper()
167 par['versionnumber'] = par['version'].lstrip('v')
168 par['corsbinary'] = "%(topdir)s/bin/corsika%(versionnumber)sLinux_%(model)s_%(lemodel)s" % par;
169 if not os.path.exists(par['corsbinary']):
170 os.chdir(cwd);
171 print >> sys.stderr,"CORSIKA binary does not exist: corsika%(versionnumber)sLinux_%(model)s_%(lemodel)s\n" % par;
172 raise Exception,"CORSIKA binary does not exist: corsika%(versionnumber)sLinux_%(model)s_%(lemodel)s\n" % par;
173
174
175 system("cp %(corsbinary)s corsika.%(runnum)s.Linux" % par);
176
177
178 par['outfile'] = os.path.join(expandvars(par['outdir']%par),expandvars(par['outfile']%par))
179 par['corout'] = "DAT%(runnum)06d" % par;
180 par['logfile'] = par['logfile'] % par
181
182
183 cors_cmd = "%(tmpdir)s/corsika.%(runnum)d.Linux < %(inputfile)s > %(logfile)s " % par;
184 self.logger.info(cors_cmd);
185
186
187 status, output = getstatusoutput(cors_cmd);
188 self.logger.info(output);
189 if status:
190 os.chdir(cwd);
191 raise Exception, "dCorsika python sucks! %s\n" % output;
192
193
194 if os.path.exists("%(tmpdir)s/%(corout)s.gz" % par):
195 system("cp %(tmpdir)s/%(corout)s.gz %(outfile)s" % par);
196
197 elif os.path.exists("%(tmpdir)s/%(corout)s" % par):
198 system("cp %(tmpdir)s/%(corout)s %(outfile)s" % par);
199
200 else:
201 os.chdir(cwd);
202 print >> sys.stderr,"CORSIKA Output does not exist: exit before UCR\n";
203 raise Exception,"CORSIKA Output does not exist: exit before UCR\n";
204
205
206
207
208 nevcorsika = 0
209 try:
210 status,nevcorsika=getstatusoutput("cat %(logfile)s|grep \"GENERATED EVENTS\"|grep -v NEV|awk '{ print $6 }'" % par);
211 nevcorsika = int(nevcorsika.strip());
212 stats['nevcorsika'] = nevcorsika
213 except Exception,e:
214 self.logger.error(e);
215 if nevcorsika == self.GetParameter('nevents'):
216 system('touch %(outdir)s/corsika.%(runnum)d.isok' % par)
217 self.logger.info("OK");
218 print >> sys.stderr, "Corsika OK\n";
219 else :
220 system('touch %(outdir)s/corsika.%(runnum)d.isnotok' % par)
221 print >> sys.stderr, "Corsika not OK\n";
222 self.logger.error("NOT OK");
223
224 os.chdir(cwd);
225 return 1;
226
227 os.chdir(cwd);
228 return 0;
229
342
343
345
346 par = self.parameters
347 self.steering += "EXIT terminates input\n";
348
349 tmpdir = par['tmpdir']
350 inputfile = open(tmpdir+"/INPUTS",'w');
351 inputfile.write(self.steering % par);
352 par['inputfile'] = inputfile.name;
353 inputfile.close();
354
355
357 """
358 This class provides an interface for preprocessing files in iceprod
359 """
360
362 Corsika.__init__(self)
363 self.name = 'dcorsika'
364 self.logger = logging.getLogger('iceprod::dCorsika')
365 self.parameters['arrang'] = 0.
366
367 self.AddParameter('version','Corsika version','v6720')
368
369
370 self.AddParameter('ranpri','CR spectrum: 0=individual nuclei, 1=Wiebel-Sooth, 2=Hoerandel, 3= 5-component',2)
371 self.AddParameter('dslope','CR spectral index modification (only if ranpri=1,2)',0.)
372 self.AddParameter('length','length of generation cylinder in m (for detcfg = length/2*radius calculation)',1400.)
373 self.AddParameter('radius','radius of generation cylinder in m (for detcfg = length/2*radius calculation)',700.)
374 self.AddParameter('depth','depth of the center of IceCube detector in m (for AMANDA it is 1730.)',1950.)
375 self.AddParameter('spric','separate primary energy cutoffs','T')
376 self.AddParameter('locut','Enables skew angle cutoff','T 1.58')
377 self.AddParameter('pnormH','proton 5-component relative contribution',1.0)
378 self.AddParameter('pnormHe','Helium 5-component relative contribution',0.1)
379 self.AddParameter('pnormN','Nitrogen 5-component relative contribution',2e-3)
380 self.AddParameter('pnormAl','Aluminium 5-component relative contribution',6e-4)
381 self.AddParameter('pnormFe','Iron 5-component relative contribution',1e-3)
382 self.AddParameter('pgamH','proton 5-component spectral index',2)
383 self.AddParameter('pgamHe','Helium 5-component spectral index',2)
384 self.AddParameter('pgamN','Nitrogen 5-component spectral index',2)
385 self.AddParameter('pgamAl','Aluminium 5-component spectral index',2)
386 self.AddParameter('pgamFe','Iron 5-component spectral index',2)
387 self.AddParameter('f2k','Write in F2K format','T')
388
389
390
421
422
424 """
425 This class provides an interface for preprocessing files in iceprod
426 """
427
429 Corsika.__init__(self)
430 self.name = 'thincorsika'
431 self.logger = logging.getLogger('iceprod::ThinCorsika')
432
433
434 self.AddParameter('thinem_e','Fraction of primary energy where thinning algorithm is used for electromagnetic particles.',1.0E-6)
435 self.AddParameter('thinem_wmax','maximum weight to be given to any thinned electromagnetic particle',10.0)
436 self.AddParameter('thinh_e','Energy(Gev) where thinning algorithm is used for hadrons',1.0)
437 self.AddParameter('thinh_wmax','Maximum weight to be given to any thinned hadronic particle',1.0)
438
454
455
457 """
458 This class provides an interface for preprocessing files in iceprod
459 """
460
462 Corsika.__init__(self)
463 self.name = 'thincorsika'
464 self.logger = logging.getLogger('iceprod::AutoThinCorsika')
465
466
467 self.AddParameter('thin_method','Method for calculating thinning parameters.','2009')
468
489
490
491 -class UCR(ipmodule.IPBaseClass):
532