SND@LHC Software
Loading...
Searching...
No Matches
run_digiSND.py
Go to the documentation of this file.
1#!/usr/bin/env python
2import atexit
3firstEvent = 0
4
5def pyExit():
6 "nasty hack"
7 # This is needed to bypass seg violation with exiting cpp digitization
8 # Most likely related to file ownership.
9 os.system('kill '+str(os.getpid()))
10atexit.register(pyExit)
11
12import resource
14 # Getting virtual memory size
15 pid = os.getpid()
16 with open(os.path.join("/proc", str(pid), "status")) as f:
17 lines = f.readlines()
18 _vmsize = [l for l in lines if l.startswith("VmSize")][0]
19 vmsize = int(_vmsize.split()[1])
20 #Getting physical memory size
21 pmsize = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
22 print("memory: virtuell = %5.2F MB physical = %5.2F MB"%(vmsize/1.0E3,pmsize/1.0E3))
23
24import ROOT,os,sys
25import shipRoot_conf
26import shipunit as u
27
29
30from argparse import ArgumentParser
31parser = ArgumentParser()
32parser.add_argument("-f", "--inputFile", dest="inputFile", help="single input file", required=True)
33parser.add_argument("-g", "--geoFile", dest="geoFile", help="geofile", required=True)
34parser.add_argument("-n", "--nEvents", dest="nEvents", type=int, help="number of events to process", default=100000)
35parser.add_argument("-ts", "--thresholdScifi", dest="ts", type=float, help="threshold energy for Scifi [p.e.]", default=3.5)
36parser.add_argument("-ss", "--saturationScifi", dest="ss", type=float, help="saturation energy for Scifi [p.e.]", default=104.)
37parser.add_argument("-tML", "--thresholdMufiL", dest="tml", type=float, help="threshold energy for Mufi large [p.e.]", default=0.0)
38parser.add_argument("-tMS", "--thresholdMufiS", dest="tms", type=float, help="threshold energy for Mufi small [p.e.]", default=0.0)
39parser.add_argument("-no-cls", "--noClusterScifi", action='store_true', help="do not make Scifi clusters")
40parser.add_argument("-cpp", "--digiCPP", action='store_true', dest="FairTask_digi", help="perform digitization using DigiTaskSND")
41parser.add_argument("-d", "--Debug", dest="debug", help="debug", default=False)
42parser.add_argument("--copy-emulsion-points", action='store_true', help="Copy emulsion points from input file (potentially large file size!).")
43
44options = parser.parse_args()
45# rephrase the no-cluster flag
46makeClusterScifi = not options.noClusterScifi
47# -----Timer-------------
48timer = ROOT.TStopwatch()
49timer.Start()
50
51# outfile should be in local directory
52tmp = options.inputFile.split('/')
53outFile = tmp[len(tmp)-1].replace('.root','_dig.root')
54if options.inputFile.find('/eos')==0:
55 if options.FairTask_digi:
56 options.inputFile = os.environ['EOSSHIP']+options.inputFile
57 else:
58 os.system('xrdcp '+os.environ['EOSSHIP']+options.inputFile+' '+outFile)
59else:
60 if not options.FairTask_digi:
61 os.system('cp '+options.inputFile+' '+outFile)
62
63# -----Create geometry----------------------------------------------
64import shipLHC_conf as sndDet_conf
65
66if options.geoFile.find('/eos')==0:
67 options.geoFile = os.environ['EOSSHIP']+options.geoFile
68import SndlhcGeo
69snd_geo = SndlhcGeo.GeoInterface(options.geoFile)
70
71# set digitization parameters for MuFilter
72lsOfGlobals = ROOT.gROOT.GetListOfGlobals()
73scifiDet = lsOfGlobals.FindObject('Scifi')
74mufiDet = lsOfGlobals.FindObject('MuFilter')
75mufiDet.SetConfPar("MuFilter/DsAttenuationLength",350 * u.cm) # values between 300 cm and 400cm observed for H6 testbeam
76mufiDet.SetConfPar("MuFilter/DsTAttenuationLength",700 * u.cm) # top readout with mirror on bottom
77mufiDet.SetConfPar("MuFilter/VandUpAttenuationLength",999 * u.cm) # no significante attenuation observed for H6 testbeam
78mufiDet.SetConfPar("MuFilter/DsSiPMcalibrationS",25.*1000.) # in MC: 1.65 keV are about 41.2 qdc
79mufiDet.SetConfPar("MuFilter/VandUpSiPMcalibration",25.*1000.);
80mufiDet.SetConfPar("MuFilter/VandUpSiPMcalibrationS",25.*1000.);
81mufiDet.SetConfPar("MuFilter/VandUpPropSpeed",12.5*u.cm/u.nanosecond);
82mufiDet.SetConfPar("MuFilter/DsPropSpeed",14.3*u.cm/u.nanosecond);
83scifiDet.SetConfPar("Scifi/nphe_min",options.ts) # threshold
84scifiDet.SetConfPar("Scifi/nphe_max",options.ss) # saturation
85scifiDet.SetConfPar("Scifi/timeResol",150.*u.picosecond) # time resolution in ps
86scifiDet.SetConfPar("MuFilter/timeResol",150.*u.picosecond) # time resolution in ps, first guess
87
88
89# Fair digitization task
90if options.FairTask_digi:
91 run = ROOT.FairRunAna()
92 ioman = ROOT.FairRootManager.Instance()
93 ioman.RegisterInputObject('Scifi', snd_geo.modules['Scifi'])
94 ioman.RegisterInputObject('MuFilter', snd_geo.modules['MuFilter'])
95 # Don't use FairRoot's default event header settings
96 run.SetEventHeaderPersistence(False)
97
98 # Set input
99 fileSource = ROOT.FairFileSource(options.inputFile)
100 run.SetSource(fileSource)
101 # Set output
102 outfile = ROOT.FairRootFileSink(outFile.replace('.root','CPP.root'))
103 run.SetSink(outfile)
104
105 # Set number of events to process
106 inRootFile = ROOT.TFile.Open(options.inputFile)
107 inTree = inRootFile.Get('cbmsim')
108 nEventsInFile = inTree.GetEntries()
109 nEvents = min(nEventsInFile, options.nEvents)
110
111 rtdb = run.GetRuntimeDb()
112 DigiTask = ROOT.DigiTaskSND()
113 DigiTask.withScifiClusters(makeClusterScifi)
114 DigiTask.set_copy_emulsion_points(options.copy_emulsion_points)
115 run.AddTask(DigiTask)
116 run.Init()
117 run.Run(firstEvent, nEvents)
118
119# Digitization using python code SndlhcDigi
120else:
121 if options.copy_emulsion_points:
122 print("ERROR: copying of emulsion points only configurable when using DigiTask")
123
124 # import digi task
125 import SndlhcDigi
126 Sndlhc = SndlhcDigi.SndlhcDigi(outFile,makeClusterScifi)
127 nEvents = min(Sndlhc.sTree.GetEntries(),options.nEvents)
128# main loop
129 for iEvent in range(firstEvent, nEvents):
130 if iEvent % 50000 == 0 or options.debug:
131 print('event ', iEvent, nEvents - firstEvent)
132 Sndlhc.iEvent = iEvent
133 rc = Sndlhc.sTree.GetEvent(iEvent)
134 Sndlhc.digitize()
135 if makeClusterScifi:
136 Sndlhc.clusterScifi()
137 # memory monitoring
138 # mem_monitor()
139
140 # end loop over events
141 Sndlhc.finish()
142
143timer.Stop()
144rtime = timer.RealTime()
145ctime = timer.CpuTime()
146print(' ')
147print("Real time ",rtime, " s, CPU time ",ctime,"s")
configure(darkphoton=None)