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