ATLAS Offline Software
Loading...
Searching...
No Matches
HECNoiseD3PDMaker.py
Go to the documentation of this file.
1# Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
2
3#
4# D3PDMaker
5#
6# Author: Sven Menke
7#
8# this python alg creates a D3PD and fills it
9#
10import AthenaPython.PyAthena as PyAthena
11import ROOT
12from array import array
13
15 def __init__ ( self, name, **kw ) :
16 PyAthena.Alg.__init__(self,name)
17 self.name = name
18 self.det = None
19 self.cond = None
20
21
22 self.MinDigitADC = kw.get('MinDigitADC', 20)
23 self.MaxDeltaT = kw.get('MaxDeltaT', 5)
24 self.NtupleFileName = kw.get('NtupleFileName', 'HECNoiseD3PD.root')
25 self.RequireTrigger = kw.get('RequireTrigger', False)
26 self.TriggerLines = kw.get('TriggerLines', ['HLT_noalg_L1EM20A',
27 'HLT_noalg_L1EM20C',
28 'L1_J12',
29 'L1_J30',
30 'L1_TAU5',
31 'L1_TAU8',
32 'L1_J5_EMPTY',
33 'L1_J10_EMPTY',
34 'L1_J12_EMPTY',
35 'L1_J30_EMPTY',
36 'L1_TAU5_EMPTY',
37 'L1_TAU8_EMPTY',
38 'L1_J5_FIRSTEMPTY',
39 'L1_J10_FIRSTEMPTY',
40 'L1_J12_FIRSTEMPTY',
41 'L1_J30_FIRSTEMPTY',
42 'L1_TAU5_FIRSTEMPTY',
43 'L1_TAU8_FIRSTEMPTY'])
44
45 def initialize(self):
46 print ("==> initializing ", self.name)
47 print ("MinDigitADC: ", self.MinDigitADC)
48 print ("MaxDeltaT: ", self.MaxDeltaT)
49 print ("NtupleFileName: ", self.NtupleFileName)
50 print ("RequireTrigger: ", self.RequireTrigger)
51 print ("TriggerLines: ", self.TriggerLines)
52 #
53 self.sg = PyAthena.py_svc("StoreGateSvc")
54 self.cond = PyAthena.py_svc('StoreGateSvc/ConditionStore')
55 self.det = PyAthena.py_svc("StoreGateSve/DetectorStore")
56 self.LArOID = self.det.retrieve("LArOnlineID","LArOnlineID")
57 self.cid = self.det.retrieve("CaloCell_ID","CaloCell_ID")
58 self.tdt = PyAthena.py_tool('Trig::TrigDecisionTool/TrigDecisionTool')
59 self.ntfile = ROOT.TFile(self.NtupleFileName,"RECREATE")
60 self.hectree = ROOT.TTree("HECNoise","HECNoise")
61 self.iRun = array('i',[0])
62 self.iEvent = array('L',[0])
63 self.iEventCount = array('i',[0])
64 self.fPrescale = {}
65 self.iTrigger = {}
66 for tl in self.TriggerLines:
67 self.fPrescale[tl] = array('f',[0.0])
68 self.iTrigger[tl] = array('i',[0])
69 pass
70 self.iTime = array('i',[0])
71 self.iLB = array('i',[0])
72 self.iBCID = array('i',[0])
73 self.avgMu = array('f',[0.0])
74 self.actMu = array('f',[0.0])
75 self.iGain = array('i',[0])
76 self.iOID = array('L',[0])
77 self.iSide = array('i',[0])
78 self.iSamp = array('i',[0])
79 self.iReg = array('i',[0])
80 self.iEta = array('i',[0])
81 self.iPhi = array('i',[0])
82 self.iQuality = array('i',[0])
83 self.e = array('f',[0.0])
84 self.t = array('f',[0.0])
85 self.eta = array('f',[0.0])
86 self.phi = array('f',[0.0])
87 self.z = array('f',[0.0])
88 self.r = array('f',[0.0])
89 self.Ped = array('f',[0.0])
90 self.PedRMS = array('f',[0.0])
91 self.iDigi = array('i',32*[0])
92 self.iMax = array('i',[0])
93 self.iMin = array('i',[0])
94 #
95 self.hectree.Branch("iRun",self.iRun,"iRun/I")
96 self.hectree.Branch("iEvent",self.iEvent,"iEvent/I")
97 self.hectree.Branch("iEventCount",self.iEventCount,"iEventCount/I")
98
99 for tl in self.TriggerLines:
100 self.hectree.Branch(tl+"_Prescale",self.fPrescale[tl],tl+"_Prescale/F")
101 self.hectree.Branch(tl+"_Trigger",self.iTrigger[tl],tl+"_Trigger/I")
102 pass
103 self.hectree.Branch("iTime",self.iTime,"iTime/I")
104 self.hectree.Branch("iLB",self.iLB,"iLB/I")
105 self.hectree.Branch("iBCID",self.iBCID,"iBCID/I")
106 self.hectree.Branch("avgMu",self.avgMu,"avgMu/F")
107 self.hectree.Branch("actMu",self.actMu,"actMu/F")
108 self.hectree.Branch("iGain",self.iGain,"iGain/I")
109 self.hectree.Branch("iOID",self.iOID,"iOID/l")
110 self.hectree.Branch("iSide",self.iSide,"iSide/I")
111 self.hectree.Branch("iSamp",self.iSamp,"iSamp/I")
112 self.hectree.Branch("iReg",self.iReg,"iReg/I")
113 self.hectree.Branch("iEta",self.iEta,"iEta/I")
114 self.hectree.Branch("iPhi",self.iPhi,"iPhi/I")
115 self.hectree.Branch("iQuality",self.iQuality,"iQuality/I")
116 self.hectree.Branch("e",self.e,"e/F")
117 self.hectree.Branch("t",self.t,"t/F")
118 self.hectree.Branch("eta",self.eta,"eta/F")
119 self.hectree.Branch("phi",self.phi,"phi/F")
120 self.hectree.Branch("z",self.z,"z/F")
121 self.hectree.Branch("r",self.r,"r/F")
122 self.hectree.Branch("Ped",self.Ped,"Ped/F")
123 self.hectree.Branch("PedRMS",self.PedRMS,"PedRMS/F")
124 self.hectree.Branch("iDigi",self.iDigi,"iDigi[32]/I")
125 self.hectree.Branch("iMax",self.iMax,"iMax/I")
126 self.hectree.Branch("iMin",self.iMin,"iMin/I")
127 #
128 return True
129
130 def execute(self):
131 eid=ROOT.Gaudi.Hive.currentContext().eventID()
132 lcsCont = self.cond.retrieve("CondCont<LArOnOffIdMapping>","LArOnOffIdMap")
133 lcs=lcsCont.find(eid)
134 pedCont = self.cond.retrieve("CondCont<ILArPedestal>","LArPedestal")
135 ped=pedCont.find(eid)
136 cddCont = self.cond.retrieve("CondCont<CaloDetDescrManager>","CaloDetDescrManager")
137 cdd=cddCont.find(eid)
138 # filter low gain cells
139 passedTrigger = False
140 foundLowCell = False
141 for tl in self.TriggerLines:
142 self.fPrescale[tl][0] = self.tdt.getPrescale(tl)
143 if self.tdt.isPassed(tl):
144 passedTrigger = True
145 self.iTrigger[tl][0] = 1
146 pass
147 else:
148 self.iTrigger[tl][0] = 0
149 pass
150 pass
151 if passedTrigger or not self.RequireTrigger: # take only triggered events or all if RequireTrigger is False (default)
152 self.iEventCount[0] = 0
153 ldc = self.sg.retrieve("LArDigitContainer","LArDigitContainer_Thinned")
154 for ld in ldc:
155 hid = ld.hardwareID()
156 if self.LArOID.isHECchannel(hid):# and ld.gain() == 2:
157 sigmax=0
158 sigmin=0
159 imax=0
160 imin=0
161 isamp=0
162 samp0= ld.samples()[0]
163 for samp in ld.samples():
164 if isamp < 32:
165 self.iDigi[isamp] = samp
166 pass
167 if samp-samp0 > sigmax:
168 sigmax = samp-samp0
169 imax=isamp
170 pass
171 if samp-samp0 < sigmin:
172 sigmin = samp-samp0
173 imin=isamp
174 pass
175 isamp = isamp+1
176 pass
177 if sigmax > self.MinDigitADC and sigmin < -self.MinDigitADC and ( (imin-imax) < self.MaxDeltaT or imin < imax):
178 foundLowCell = True
179 ei = self.sg.retrieve("xAOD::EventInfo","EventInfo")
180 cc = self.sg.retrieve("CaloCellContainer","AllCalo")
181 self.iRun[0] = ei.runNumber()
182 self.iEvent[0] = ei.eventNumber()
183 self.iEventCount[0] = self.iEventCount[0]+1
184 self.iTime[0] = ei.timeStamp()
185 self.iLB[0] = ei.lumiBlock()
186 self.iBCID[0] = ei.bcid()
187 self.avgMu[0] = ei.averageInteractionsPerCrossing()
188 self.actMu[0] = ei.actualInteractionsPerCrossing()
189 self.iGain[0] = ld.gain()
190 oid = lcs.cnvToIdentifier(hid)
191 self.iOID[0] = ld.channelID().get_compact()
192 self.Ped[0] = ped.pedestal(ld.channelID(),ld.gain())
193 self.PedRMS[0] = ped.pedestalRMS(ld.channelID(),ld.gain())
194 self.iSide[0] = self.cid.pos_neg(oid)
195 self.iSamp[0] = self.cid.sampling(oid)
196 self.iReg[0] = self.cid.region(oid)
197 self.iEta[0] = self.cid.eta(oid)
198 self.iPhi[0] = self.cid.phi(oid)
199 self.iMax[0] = imax
200 self.iMin[0] = imin
201 ihash = self.cid.calo_cell_hash(oid)
202 rcell = cc.findCell(ihash)
203 self.e[0] = 0.0
204 self.t[0] = 0.0
205 self.iQuality[0] = 0
206 if rcell.ID() != oid:
207 print ("Cell iHash does not match ...")
208 pass
209 else:
210 self.e[0] = rcell.e()
211 self.t[0] = rcell.time()
212 self.iQuality[0] = rcell.quality()
213 pass
214 cdde = cdd.get_element(oid)
215 self.eta[0] = cdde.eta()
216 self.phi[0] = cdde.phi()
217 self.z[0] = cdde.z()
218 self.r[0] = cdde.r()
219 self.hectree.Fill()
220 self.setFilterPassed(True)
221 pass
222 pass
223 pass
224 if foundLowCell:
225 print ('Event passed HECNoise Filter')
226 return True
227 pass
228 print ('Event failed HECNoise Filter')
229 self.setFilterPassed(False)
230 return True
231
232 def finalize(self):
233 self.ntfile.Write()
234 self.ntfile.Close()
235 return True
236
# take only triggered events or all if RequireTrigger is False(default) RequireTrigger
virtual StatusCode execute() override
virtual StatusCode finalize() override
virtual StatusCode initialize() override
STL class.