ATLAS Offline Software
Loading...
Searching...
No Matches
ZdcNtuple.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include <TSystem.h>
6#include <TFile.h>
12
13#include <ZdcNtuple/ZdcNtuple.h>
16
17// this is needed to distribute the algorithm to the workers
18//ClassImp(ZdcNtuple)
19
20ZdcNtuple :: ZdcNtuple (const std::string& name, ISvcLocator *pSvcLocator)
21 : EL::AnaAlgorithm(name, pSvcLocator),
22 m_grl ("GoodRunsListSelectionTool/grl", this),
23 //m_zdcAnalysisTool("ZDC::ZdcAnalysisTool/ZdcAnalysisTool", this),
24 m_selTool( "InDet::InDetTrackSelectionTool/TrackSelectionTool", this )
25{
26 // Here you put any code for the base initialization of variables,
27 // e.g. initialize all pointers to 0. Note that you should only put
28 // the most basic initialization here, since this method will be
29 // called on both the submission and the worker node. Most of your
30 // initialization code will go into histInitialize() and
31 // initialize().
32 m_setupTrigHist = false;
34
35 declareProperty("isMC", m_isMC = false, "MC mode");
36 declareProperty("enableOutputTree", enableOutputTree = false, "Enable output tree");
37 declareProperty("enableOutputSamples", enableOutputSamples = false, "Output ZDC and RPD raw data");
38 declareProperty("enableTrigger", enableTrigger = true, "comment");
39 declareProperty("enableTracks", enableTracks = false, "comment");
40 declareProperty("trackLimit", trackLimit = 500, "comment");
41 declareProperty("enableID", enableID = false, "turn on to enable ID tracks & vertices for physics streams");
42 declareProperty("enableCalo", enableCalo = false, "turn on to enable calorimeter energy info for physics streams");
43 declareProperty("enableClusters", enableClusters = false, "turn on to enable calo topo cluster info for physics streams");
44 declareProperty("writeOnlyTriggers", writeOnlyTriggers = false, "comment");
45 declareProperty("useGRL", useGRL = true, "comment");
46 declareProperty("grlFilename", grlFilename = "$ROOTCOREBIN/data/ZdcNtuple/data16_hip8TeV.periodAllYear_DetStatus-v86-pro20-19_DQDefects-00-02-04_PHYS_HeavyIonP_All_Good.xml", "comment");
47 declareProperty("slimmed", slimmed = false, "comment");
48 declareProperty("zdcCalib", zdcCalib = false, "zdc/ZDCCalib file");
49 declareProperty("zdcInj", zdcInj = false, "ZDC injected pulse");
50 declareProperty("zdcLaser", zdcLaser = false, "Run 2 ZDC Laser");
51 declareProperty("zdcOnly", zdcOnly = false, "comment");
52 declareProperty("zdcLowGainMode", zdcLowGainMode = 0, "comment");
53
54 declareProperty("flipDelay", flipDelay = 0, "comment");
55 declareProperty("reprocZdc", reprocZdc = 0, "comment");
56 declareProperty("auxSuffix", auxSuffix = "", "comment");
57 declareProperty("nsamplesZdc", nsamplesZdc = 24, "number of samples, 7 = most of Run 2, 24,32,40 = Run 3");
58 declareProperty("lhcf2022", lhcf2022 = false,"LHCf2022 general config");
59 declareProperty("lhcf2022afp", lhcf2022afp = false,"LHCf2022 AFP-specific config");
60 declareProperty("lhcf2022zdc", lhcf2022zdc = false,"LHCf2022 ZDC-specific config");
61 declareProperty("pbpb2023", pbpb2023 = true, "PbPb2023 config");
62 declareProperty("zdcConfig", zdcConfig = "PbPb2018", "argument to configure ZdcAnalysisTool");
63 declareProperty("doZdcCalib", doZdcCalib = false, "perform ZDC energy calibration");
64 declareProperty("enableZDC", enableZDC = true);
65 declareProperty("enableRPD",enableRPD = false,"enable reading any RPD decorations");
66 declareProperty("enableRPDAmp",enableRPDAmp = false,"enable reading RPD amplitudes (also requires enableRPD)");
67 declareProperty("enableCentroid",enableCentroid = false,"enable reading centroid decorations (also requires enableRPD)");
68
69 declareProperty( "TrackSelectionTool", m_selTool );
70
71 m_zdcAnalysisTool.declarePropertyFor (this, "zdcAnalysisTool");
72
73}
74
75/*
76StatusCode ZdcNtuple :: setupJob (EL::Job& job)
77{
78 // Here you put code that sets up the job on the submission object
79 // so that it is ready to work with your algorithm, e.g. you can
80 // request the D3PDReader service or add output files. Any code you
81 // put here could instead also go into the submission script. The
82 // sole advantage of putting it here is that it gets automatically
83 // activated/deactivated when you add/remove the algorithm from your
84 // job, which may or may not be of value to you.
85
86 job.useXAOD ();
87 ANA_CHECK( "setupJob()", xAOD::Init() ); // call before opening first file
88
89 return StatusCode::SUCCESS;
90}
91*/
92
93
94StatusCode ZdcNtuple :: initialize ()
95{
96 // Here you do everything that needs to be done at the very
97 // beginning on each worker node, e.g. create histograms and output
98 // trees. This method gets called before any input files are
99 // connected.
100
101 ANA_MSG_DEBUG("Howdy from Initialize!");
102
104 ANA_CHECK(m_zdcSumContainerName.initialize());
106
108 {
109
110 ANA_CHECK( book(TTree("zdcTree", "ZDC Tree")));
111 m_outputTree = tree( "zdcTree" );
112
113 m_outputTree->Branch("runNumber", &t_runNumber, "runNumber/i");
114 m_outputTree->Branch("eventNumber", &t_eventNumber, "eventNumber/i");
115 m_outputTree->Branch("lumiBlock", &t_lumiBlock, "lumiBlock/i");
116 m_outputTree->Branch("bunchGroup", &t_bunchGroup, "bunchGroup/b");
117 m_outputTree->Branch("bcid", &t_bcid, "bcid/i");
118 if (zdcInj) m_outputTree->Branch("vInj",&t_vInj,"vInj/F");
119 m_outputTree->Branch("avgIntPerCrossing", &t_avgIntPerCrossing, "avgIntPerCrossing/F");
120 m_outputTree->Branch("actIntPerCrossing", &t_actIntPerCrossing, "actIntPerCrossing/F");
121 m_outputTree->Branch("trigger", &t_trigger, "trigger/l");
122 m_outputTree->Branch("trigger_TBP", &t_trigger_TBP, "trigger_TBP/i");
123 m_outputTree->Branch("tbp", &t_tbp, "tbp[16]/i");
124 m_outputTree->Branch("tav", &t_tav, "tav[16]/i");
125 m_outputTree->Branch("passBits", &t_passBits, "passBits/i");
126 m_outputTree->Branch("extendedLevel1ID",&t_extendedLevel1ID,"extendedLevel1ID/i");
127 m_outputTree->Branch("timeStamp",&t_timeStamp,"timeStamp/i");
128 m_outputTree->Branch("timeStampNSOffset",&t_timeStampNSOffset,"timeStampNSOffset/i");
129 m_outputTree->Branch("zdcEventInfoError",&t_zdcEventInfoError,"zdcEventInfoError/b");
130 m_outputTree->Branch("zdcEventInfoErrorWord",&t_zdcEventInfoErrorWord,"zdcEventInfoErrorWord/i");
131 // ZDC and RPD decoding errors
132 m_outputTree->Branch("zdcDecodingError",&t_zdcDecodingError,"zdcDecodingError/b");
133 m_outputTree->Branch("rpdDecodingError",&t_rpdDecodingError,"rpdDecodingError/b");
134
135 if (enableZDC)
136 {
138 {
139 if (nsamplesZdc == 7)
140 {
141 ANA_MSG_INFO("Setting up for 7 samples");
142 m_outputTree->Branch("zdc_raw", &t_raw7, "zdc_raw[2][4][2][2][7]/s"); // 7 samples
143 }
144
145 if (nsamplesZdc == 15)
146 {
147 ANA_MSG_INFO("Setting up for 15 samples");
148 m_outputTree->Branch("zdc_raw", &t_raw15, "zdc_raw[2][4][2][2][15]/s"); // 15 samples
149 }
150
151 if (nsamplesZdc == 24)
152 {
153 ANA_MSG_INFO("Setting up for 24 samples");
154 m_outputTree->Branch("zdc_raw", &t_raw24, "zdc_raw[2][4][2][2][24]/s"); // 24 samples
155 m_outputTree->Branch("rpd_raw", &t_rpdRaw, "rpd_raw[2][16][24]/s"); // 24 samples
156 }
157 if (nsamplesZdc == 32)
158 {
159 ANA_MSG_INFO("Setting up for 32 samples");
160 m_outputTree->Branch("zdc_raw", &t_raw32, "zdc_raw[2][4][2][2][32]/s"); // 24 samples
161 m_outputTree->Branch("rpd_raw", &t_rpdRaw32, "rpd_raw[2][16][32]/s"); // 24 samples
162 }
163 if (nsamplesZdc == 40)
164 {
165 ANA_MSG_INFO("Setting up for 40 samples");
166 m_outputTree->Branch("zdc_raw", &t_raw40, "zdc_raw[2][4][2][2][40]/s"); // 24 samples
167 m_outputTree->Branch("rpd_raw", &t_rpdRaw40, "rpd_raw[2][16][40]/s"); // 24 samples
168 }
169 }
170
171 m_outputTree->Branch("zdc_ZdcAmp", &t_ZdcAmp, "zdc_ZdcAmp[2]/F");
172 m_outputTree->Branch("zdc_ZdcAmpErr", &t_ZdcAmpErr, "zdc_ZdcAmpErr[2]/F");
173 m_outputTree->Branch("zdc_ZdcEnergy", &t_ZdcEnergy, "zdc_ZdcEnergy[2]/F");
174 m_outputTree->Branch("zdc_ZdcEnergyErr", &t_ZdcEnergyErr, "zdc_ZdcEnergyErr[2]/F");
175 m_outputTree->Branch("zdc_ZdcNLEnergy", &t_ZdcNLEnergy, "zdc_ZdcNLEnergy[2]/F");
176 m_outputTree->Branch("zdc_ZdcNLEnergyErr", &t_ZdcNLEnergyErr, "zdc_ZdcNLEnergyErr[2]/F");
177 m_outputTree->Branch("zdc_ZdcTime", &t_ZdcTime, "zdc_ZdcTime[2]/F");
178 m_outputTree->Branch("zdc_ZdcStatus", &t_ZdcStatus, "zdc_ZdcStatus[2]/S");
179 m_outputTree->Branch("zdc_ZdcTrigEff", &t_ZdcTrigEff, "zdc_ZdcTrigEff[2]/F");
180 m_outputTree->Branch("zdc_ZdcModuleMask", &t_ZdcModuleMask, "zdc_ZdcModuleMask/i");
181 m_outputTree->Branch("zdc_ZdcLucrodTriggerSideAmp",&t_ZdcLucrodTriggerSideAmp,"zdc_ZdcLucrodTriggerSideAmp[2]/S");
182 m_outputTree->Branch("zdc_ZdcLucrodTriggerSideAmpLG",&t_ZdcLucrodTriggerSideAmpLG,"zdc_ZdcLucrodTriggerSideAmpLG[2]/S");
183
184 m_outputTree->Branch("zdc_ZdcModuleAmp", &t_ZdcModuleAmp, "zdc_ZdcModuleAmp[2][4]/F");
185 m_outputTree->Branch("zdc_ZdcModuleTime", &t_ZdcModuleTime, "zdc_ZdcModuleTime[2][4]/F");
186 m_outputTree->Branch("zdc_ZdcModuleFitAmp", &t_ZdcModuleFitAmp, "zdc_ZdcModuleFitAmp[2][4]/F");
187 m_outputTree->Branch("zdc_ZdcModuleFitT0", &t_ZdcModuleFitT0, "zdc_ZdcModuleFitT0[2][4]/F");
188 m_outputTree->Branch("zdc_ZdcModuleStatus", &t_ZdcModuleStatus, "zdc_ZdcModuleStatus[2][4]/i");
189 m_outputTree->Branch("zdc_ZdcModuleChisq", &t_ZdcModuleChisq, "zdc_ZdcModuleChisq[2][4]/F");
190 m_outputTree->Branch("zdc_ZdcModuleCalibAmp", &t_ZdcModuleCalibAmp, "zdc_ZdcModuleCalibAmp[2][4]/F");
191 m_outputTree->Branch("zdc_ZdcModuleCalibTime", &t_ZdcModuleCalibTime, "zdc_ZdcModuleCalibTime[2][4]/F");
192 m_outputTree->Branch("zdc_ZdcModuleBkgdMaxFraction", &t_ZdcModuleBkgdMaxFraction, "zdc_ZdcModuleBkgdMaxFraction[2][4]/F");
193 m_outputTree->Branch("zdc_ZdcModuleAmpError", &t_ZdcModuleAmpError, "zdc_ZdcModuleAmpError[2][4]/F");
194 m_outputTree->Branch("zdc_ZdcModuleMinDeriv2nd", &t_ZdcModuleMinDeriv2nd, "zdc_ZdcModuleMinDeriv2nd[2][4]/F");
195 m_outputTree->Branch("zdc_ZdcModulePresample", &t_ZdcModulePresample, "zdc_ZdcModulePresample[2][4]/F");
196 m_outputTree->Branch("zdc_ZdcModulePreSampleAmp", &t_ZdcModulePreSampleAmp, "zdc_ZdcModulePreSampleAmp[2][4]/F");
197 m_outputTree->Branch("zdc_ZdcLucrodTriggerAmp",&t_ZdcLucrodTriggerAmp,"zdc_ZdcLucrodTriggerAmp[2][4]/S");
198 m_outputTree->Branch("zdc_ZdcLucrodTriggerAmpLG",&t_ZdcLucrodTriggerAmpLG,"zdc_ZdcLucrodTriggerAmpLG[2][4]/S");
199 m_outputTree->Branch("zdc_ZdcModuleMaxADC",&t_ZdcModuleMaxADC,"zdc_ZdcModuleMaxADC[2][4]/F");
200 m_outputTree->Branch("zdc_ZdcModuleMaxADCHG",&t_ZdcModuleMaxADCHG,"zdc_ZdcModuleMaxADCHG[2][4]/F");
201 m_outputTree->Branch("zdc_ZdcModuleMaxADCLG",&t_ZdcModuleMaxADCLG,"zdc_ZdcModuleMaxADCLG[2][4]/F");
202 m_outputTree->Branch("zdc_ZdcModulePeakADCHG",&t_ZdcModulePeakADCHG,"zdc_ZdcModulePeakADCHG[2][4]/F");
203 m_outputTree->Branch("zdc_ZdcModulePeakADCLG",&t_ZdcModulePeakADCLG,"zdc_ZdcModulePeakADCLG[2][4]/F");
204 m_outputTree->Branch("zdc_ZdcModuleAmpLGRefit", &t_ZdcModuleAmpLGRefit, "zdc_ZdcModuleAmpLGRefit[2][4]/F");
205 m_outputTree->Branch("zdc_ZdcModuleAmpCorrLGRefit", &t_ZdcModuleAmpCorrLGRefit, "zdc_ZdcModuleAmpCorrLGRefit[2][4]/F");
206 m_outputTree->Branch("zdc_ZdcModuleT0LGRefit", &t_ZdcModuleT0LGRefit, "zdc_ZdcModuleT0LGRefit[2][4]/F");
207 m_outputTree->Branch("zdc_ZdcModuleT0SubLGRefit", &t_ZdcModuleT0SubLGRefit, "zdc_ZdcModuleT0SubLGRefit[2][4]/F");
208 m_outputTree->Branch("zdc_ZdcModuleChisqLGRefit", &t_ZdcModuleChisqLGRefit, "zdc_ZdcModuleChisqLGRefit[2][4]/F");
209
210 if(m_isMC){
211 //Modules
212 m_outputTree->Branch("zdc_ZdcModuleTruthTotal",&t_ZdcModuleTruthTotal,"zdc_ZdcModuleTruthTotal[2][7]/F");
213 m_outputTree->Branch("zdc_ZdcModuleTruthInvisible",&t_ZdcModuleTruthInvis,"zdc_ZdcModuleTruthInvisible[2][7]/F");
214 m_outputTree->Branch("zdc_ZdcModuleTruthEM",&t_ZdcModuleTruthEM,"zdc_ZdcModuleTruthEM[2][7]/F");
215 m_outputTree->Branch("zdc_ZdcModuleTruthNonEM",&t_ZdcModuleTruthNonEM,"zdc_ZdcModuleTruthNonEM[2][7]/F");
216 m_outputTree->Branch("zdc_ZdcModuleTruthEscaped",&t_ZdcModuleTruthEscaped,"zdc_ZdcModuleTruthEscaped[2][7]/F");
217 m_outputTree->Branch("zdc_ZdcModuleTruthNphotons",&t_ZdcModuleTruthNphotons,"zdc_ZdcModuleTruthNphotons[2][7]/i");
218 m_outputTree->Branch("zdc_RpdModuleTruthNphotons",&t_RpdModuleTruthNphotons,"zdc_RpdModuleTruthNphotons[2][16]/i");
219
220 //Sums
221 m_outputTree->Branch("zdc_ZdcTruthTotal",&t_ZdcTruthTotal,"zdc_ZdcTruthTotal[2]/F");
222 m_outputTree->Branch("zdc_ZdcTruthInvisible",&t_ZdcTruthInvis, "zdc_ZdcTruthInvisible[2]/F");
223 m_outputTree->Branch("zdc_ZdcTruthEM",&t_ZdcTruthEM,"zdc_ZdcTruthEM[2]/F");
224 m_outputTree->Branch("zdc_ZdcTruthNonEM",&t_ZdcTruthNonEM,"zdc_ZdcTruthNonEM[2]/F");
225 m_outputTree->Branch("zdc_ZdcTruthEscaped",&t_ZdcTruthEscaped,"zdc_ZdcTruthEscaped[2]/F");
226
227 //Event gen particles
228 m_outputTree->Branch("zdc_ZdcTruthParticlePosx",&t_ZdcTruthParticlePosx);
229 m_outputTree->Branch("zdc_ZdcTruthParticlePosy",&t_ZdcTruthParticlePosy);
230 m_outputTree->Branch("zdc_ZdcTruthParticlePosz",&t_ZdcTruthParticlePosz);
231 m_outputTree->Branch("zdc_ZdcTruthParticleTime",&t_ZdcTruthParticleTime);
232 m_outputTree->Branch("zdc_ZdcTruthParticlePx",&t_ZdcTruthParticlePx);
233 m_outputTree->Branch("zdc_ZdcTruthParticlePy",&t_ZdcTruthParticlePy);
234 m_outputTree->Branch("zdc_ZdcTruthParticlePz",&t_ZdcTruthParticlePz);
235 m_outputTree->Branch("zdc_ZdcTruthParticleEnergy",&t_ZdcTruthParticleEnergy);
236 m_outputTree->Branch("zdc_ZdcTruthParticlePid",&t_ZdcTruthParticlePid);
237 m_outputTree->Branch("zdc_ZdcTruthParticleStatus",&t_ZdcTruthParticleStatus);
238 }
239 }
240 if (enableRPD)
241 {
242 if (enableRPDAmp) {
243 m_outputTree->Branch("zdc_RpdChannelBaseline",&t_RpdChannelBaseline,"zdc_RpdChannelBaseline[2][16]/F");
244 m_outputTree->Branch("zdc_RpdChannelPileupExpFitParams",&t_RpdChannelPileupExpFitParams,"zdc_RpdChannelPileupExpFitParams[2][16][2]/F");
245 m_outputTree->Branch("zdc_RpdChannelPileupStretchedExpFitParams",&t_RpdChannelPileupStretchedExpFitParams,"zdc_RpdChannelPileupStretchedExpFitParams[2][16][3]/F");
246 m_outputTree->Branch("zdc_RpdChannelPileupExpFitParamErrs",&t_RpdChannelPileupExpFitParamErrs,"zdc_RpdChannelPileupExpFitParamErrs[2][16][2]/F");
247 m_outputTree->Branch("zdc_RpdChannelPileupStretchedExpFitParamErrs",&t_RpdChannelPileupStretchedExpFitParamErrs,"zdc_RpdChannelPileupStretchedExpFitParamErrs[2][16][3]/F");
248 m_outputTree->Branch("zdc_RpdChannelPileupExpFitMSE",&t_RpdChannelPileupExpFitMSE,"zdc_RpdChannelPileupExpFitMSE[2][16]/F");
249 m_outputTree->Branch("zdc_RpdChannelPileupStretchedExpFitMSE",&t_RpdChannelPileupStretchedExpFitMSE,"zdc_RpdChannelPileupStretchedExpFitMSE[2][16]/F");
250 m_outputTree->Branch("zdc_RpdChannelAmplitude",&t_RpdChannelAmplitude,"zdc_RpdChannelAmplitude[2][16]/F");
251 m_outputTree->Branch("zdc_RpdChannelAmplitudeCalib",&t_RpdChannelAmplitudeCalib,"zdc_RpdChannelAmplitudeCalib[2][16]/F");
252 m_outputTree->Branch("zdc_RpdChannelMaxADC",&t_RpdChannelMaxADC,"zdc_RpdChannelMaxADC[2][16]/F");
253 m_outputTree->Branch("zdc_RpdChannelMaxADCCalib",&t_RpdChannelMaxADCCalib,"zdc_RpdChannelMaxADCCalib[2][16]/F");
254 m_outputTree->Branch("zdc_RpdChannelMaxSample",&t_RpdChannelMaxSample,"zdc_RpdChannelMaxSample[2][16]/i");
255 m_outputTree->Branch("zdc_RpdChannelStatus",&t_RpdChannelStatus,"zdc_RpdChannelStatus[2][16]/i");
256 m_outputTree->Branch("zdc_RpdChannelPileupFrac",&t_RpdChannelPileupFrac,"zdc_RpdChannelPileupFrac[2][16]/F");
257 m_outputTree->Branch("zdc_RpdSideStatus",&t_RpdSideStatus,"zdc_RpdSideStatus[2]/i");
258 }
259 if (enableCentroid)
260 {
261 m_outputTree->Branch("zdc_centroidAvailable", &t_centroidDecorationsAvailable);
262 m_outputTree->Branch("zdc_centroidEventValid", &t_centroidEventValid, "zdc_centroidEventValid/B");
263 m_outputTree->Branch("zdc_centroidStatus", &t_centroidStatus, "zdc_centroidStatus[2]/i");
264 m_outputTree->Branch("zdc_RPDChannelSubtrAmp", &t_RPDChannelSubtrAmp, "zdc_RPDChannelSubtrAmp[2][16]/F");
265 m_outputTree->Branch("zdc_RPDSubtrAmpSum", &t_RPDSubtrAmpSum, "zdc_RPDSubtrAmpSum[2]/F");
266 m_outputTree->Branch("zdc_xCentroidPreGeomCorPreAvgSubtr", &t_xCentroidPreGeomCorPreAvgSubtr, "zdc_xCentroidPreGeomCorPreAvgSubtr[2]/F");
267 m_outputTree->Branch("zdc_yCentroidPreGeomCorPreAvgSubtr", &t_yCentroidPreGeomCorPreAvgSubtr, "zdc_yCentroidPreGeomCorPreAvgSubtr[2]/F");
268 m_outputTree->Branch("zdc_xCentroidPreAvgSubtr", &t_xCentroidPreAvgSubtr, "zdc_xCentroidPreAvgSubtr[2]/F");
269 m_outputTree->Branch("zdc_yCentroidPreAvgSubtr", &t_yCentroidPreAvgSubtr, "zdc_yCentroidPreAvgSubtr[2]/F");
270 m_outputTree->Branch("zdc_xCentroid", &t_xCentroid, "zdc_xCentroid[2]/F");
271 m_outputTree->Branch("zdc_yCentroid", &t_yCentroid, "zdc_yCentroid[2]/F");
272 m_outputTree->Branch("zdc_xRowCentroid", &t_xRowCentroid, "zdc_xRowCentroid[2][4]/F");
273 m_outputTree->Branch("zdc_yColCentroid", &t_yColCentroid, "zdc_yColCentroid[2][4]/F");
274 m_outputTree->Branch("zdc_reactionPlaneAngle", &t_reactionPlaneAngle, "zdc_reactionPlaneAngle[2]/F");
275 m_outputTree->Branch("zdc_cosDeltaReactionPlaneAngle", &t_cosDeltaReactionPlaneAngle, "zdc_cosDeltaReactionPlaneAngle/F");
276 }
277 }
278
279 if (!(zdcCalib || zdcLaser || zdcOnly || zdcInj))
280 {
281 m_outputTree->Branch("mbts_in_e", &t_mbts_in_e, "mbts_in_e[2][8]/F");
282 m_outputTree->Branch("mbts_in_t", &t_mbts_in_t, "mbts_in_t[2][8]/F");
283 m_outputTree->Branch("mbts_out_e", &t_mbts_out_e, "mbts_out_e[2][4]/F");
284 m_outputTree->Branch("mbts_out_t", &t_mbts_out_t, "mbts_out_t[2][4]/F");
285
286 m_outputTree->Branch("T2mbts_in_e", &t_T2mbts_in_e, "T2mbts_in_e[2][8]/F");
287 m_outputTree->Branch("T2mbts_in_t", &t_T2mbts_in_t, "T2mbts_in_t[2][8]/F");
288 m_outputTree->Branch("T2mbts_out_e", &t_T2mbts_out_e, "T2mbts_out_e[2][4]/F");
289 m_outputTree->Branch("T2mbts_out_t", &t_T2mbts_out_t, "T2mbts_out_t[2][4]/F");
290
291 m_outputTree->Branch("L1ET", &t_L1ET, "L1ET/F");
292 m_outputTree->Branch("L1ET24", &t_L1ET24, "L1ET24/F");
293
294 m_outputTree->Branch("totalEt", &t_totalEt, "totalEt/F");
295 m_outputTree->Branch("totalEt_TTsum", &t_totalEt_TTsum, "totalEt_TTsum/F");
296
297 m_outputTree->Branch("totalEt24", &t_totalEt24, "totalEt24/F");
298 m_outputTree->Branch("totalEt24_TTsum", &t_totalEt24_TTsum, "totalEt24_TTsum/F");
299
300 m_outputTree->Branch("fcalEt", &t_fcalEt, "fcalEt/F");
301 m_outputTree->Branch("fcalEtA", &t_fcalEtA, "fcalEtA/F");
302 m_outputTree->Branch("fcalEtC", &t_fcalEtC, "fcalEtC/F");
303 m_outputTree->Branch("fcalEtA_TT", &t_fcalEtA_TT, "fcalEtA_TT/F");
304 m_outputTree->Branch("fcalEtC_TT", &t_fcalEtC_TT, "fcalEtC_TT/F");
305
306 m_outputTree->Branch("nvx", &t_nvx, "nvx/I");
307 m_outputTree->Branch("vx", &t_vx, "vx[3]/F");
308 m_outputTree->Branch("pvindex", &t_pvindex, "pvindex/I");
309 m_outputTree->Branch("vxntrk", &t_vxntrk, "vxntrk/I");
310 m_outputTree->Branch("vx_trk_index", "vector<int>", &t_vx_trk_index);
311 m_outputTree->Branch("vxtype", &t_vxtype, "vxtype/I");
312 m_outputTree->Branch("vxcov", &t_vxcov, "vxcov[6]/F");
313 m_outputTree->Branch("vxsumpt2", &t_vxsumpt2, "vxsumpt2/F");
314 m_outputTree->Branch("nstrong", &t_nstrong, "nstrong/I");
315 m_outputTree->Branch("puvxntrk", &t_puvxntrk, "puvxntrk/I");
316 m_outputTree->Branch("puvxsumpt", &t_puvxsumpt, "puvxsumpt/F");
317 m_outputTree->Branch("puvxz", &t_puvxz, "puvxz/F");
318 m_outputTree->Branch("vxnlooseprimary", &t_vxnlooseprimary, "vxnlooseprimary/I");
319 m_outputTree->Branch("vxnminbias", &t_vxnminbias, "vxnminbias/I");
320 m_outputTree->Branch("vxngoodmuon", &t_vxngoodmuon, "vxngoodmuon/I");
321
322 m_outputTree->Branch("t_nvtx", &t_nvtx, "nvtx/I");
323 m_outputTree->Branch("vtx_type", "vector<int8_t>", &t_vtx_type);
324 m_outputTree->Branch("vtx_x", "vector<float>", &t_vtx_x);
325 m_outputTree->Branch("vtx_y", "vector<float>", &t_vtx_y);
326 m_outputTree->Branch("vtx_z", "vector<float>", &t_vtx_z);
327 m_outputTree->Branch("vtx_ntrk_all", "vector<int16_t>", &t_vtx_ntrk_all);
328 m_outputTree->Branch("vtx_sumpt2_all", "vector<float>", &t_vtx_sumpt2_all);
329 m_outputTree->Branch("vtx_ntrk", "vector<int16_t>", &t_vtx_ntrk);
330 m_outputTree->Branch("vtx_sumpt2", "vector<float>", &t_vtx_sumpt2);
331 m_outputTree->Branch("vtx_trk_index", "vector< vector<int16_t> >", &t_vtx_trk_index);
332
333 m_outputTree->Branch("mbts_countA", &t_mbts_countA, "mbts_countA/s");
334 m_outputTree->Branch("mbts_countC", &t_mbts_countC, "mbts_countC/s");
335 m_outputTree->Branch("T2mbts_countAin", &t_T2mbts_countAin, "T2mbts_countAin/s");
336 m_outputTree->Branch("T2mbts_countCin", &t_T2mbts_countCin, "T2mbts_countCin/s");
337 m_outputTree->Branch("mbts_timeA", &t_mbts_timeA, "mbts_timeA/F");
338 m_outputTree->Branch("mbts_timeC", &t_mbts_timeC, "mbts_timeC/F");
339 m_outputTree->Branch("mbts_timeDiff", &t_mbts_timeDiff, "mbts_timeDiff/F");
340
341 t_nclus = 0;
342 m_outputTree->Branch("nclus", &t_nclus, "nclus/i");
343 m_outputTree->Branch("clusEt", &t_clusEt, "clusEt/F");
344 m_outputTree->Branch("clusEtMax", &t_clusEtMax, "clusEtMax/F");
345 m_outputTree->Branch("clusetaMax", &t_clusetaMax, "clusetaMax/F");
346 m_outputTree->Branch("clusphiMax", &t_clusphiMax, "clusphiMax/F");
347
348 m_outputTree->Branch("cc_pt", "vector<float>", &t_cc_pt);
349 m_outputTree->Branch("cc_eta", "vector<float>", &t_cc_eta);
350 m_outputTree->Branch("cc_phi", "vector<float>", &t_cc_phi);
351 m_outputTree->Branch("cc_e", "vector<float>", &t_cc_e);
352 m_outputTree->Branch("cc_raw_m", "vector<float>", &t_cc_raw_m);
353 m_outputTree->Branch("cc_raw_eta", "vector<float>", &t_cc_raw_eta);
354 m_outputTree->Branch("cc_raw_phi", "vector<float>", &t_cc_raw_phi);
355 m_outputTree->Branch("cc_raw_e", "vector<float>", &t_cc_raw_e);
356 m_outputTree->Branch("cc_raw_samp", "vector<vector<float>>", &t_cc_raw_samp);
357 m_outputTree->Branch("cc_sig", "vector<float>", &t_cc_sig);
358 m_outputTree->Branch("cc_layer", "vector<int>", &t_cc_layer);
359
360 m_outputTree->Branch("edgeGapA", &t_edgeGapA, "edgeGapA/F");
361 m_outputTree->Branch("edgeGapC", &t_edgeGapC, "edgeGapC/F");
362
363 m_outputTree->Branch("ntrk", &t_ntrk, "ntrk/i");
364 if (enableTracks)
365 {
366 m_outputTree->Branch("trk_pt", "vector<float>", &t_trk_pt);
367 m_outputTree->Branch("trk_eta", "vector<float>", &t_trk_eta);
368 m_outputTree->Branch("trk_theta", "vector<float>", &t_trk_theta);
369 m_outputTree->Branch("trk_phi", "vector<float>", &t_trk_phi);
370 m_outputTree->Branch("trk_e", "vector<float>", &t_trk_e);
371 m_outputTree->Branch("trk_index", "vector<int>", &t_trk_index);
372 m_outputTree->Branch("trk_d0", "vector<float>", &t_trk_d0);
373 m_outputTree->Branch("trk_z0", "vector<float>", &t_trk_z0);
374 m_outputTree->Branch("trk_vz", "vector<float>", &t_trk_vz);
375 m_outputTree->Branch("trk_vtxz", "vector<float>", &t_trk_vtxz);
376 m_outputTree->Branch("trk_pixeldEdx", "vector<float>", &t_trk_pixeldEdx);
377 m_outputTree->Branch("trk_charge", "vector<int8_t>", &t_trk_charge);
378 m_outputTree->Branch("trk_quality", "vector<int16_t>", &t_trk_quality);
379 m_outputTree->Branch("trk_nPixHits", "vector<uint8_t>", &t_trk_nPixHits);
380 m_outputTree->Branch("trk_nSctHits", "vector<uint8_t>", &t_trk_nSctHits);
381 m_outputTree->Branch("trk_nPixDead", "vector<uint8_t>", &t_trk_nPixDead);
382 m_outputTree->Branch("trk_nSctDead", "vector<uint8_t>", &t_trk_nSctDead);
383 m_outputTree->Branch("trk_nPixHoles", "vector<uint8_t>", &t_trk_nPixHoles);
384 m_outputTree->Branch("trk_nSctHoles", "vector<uint8_t>", &t_trk_nSctHoles);
385 m_outputTree->Branch("trk_nTrtHits", "vector<uint8_t>", &t_trk_nTrtHits);
386 m_outputTree->Branch("trk_nTrtOutliers", "vector<uint8_t>", &t_trk_nTrtOutliers);
387 m_outputTree->Branch("trk_inPixHits", "vector<uint8_t>", &t_trk_inPixHits);
388 m_outputTree->Branch("trk_exPixHits", "vector<uint8_t>", &t_trk_exPixHits);
389 m_outputTree->Branch("trk_ninPixHits", "vector<uint8_t>", &t_trk_ninPixHits);
390 m_outputTree->Branch("trk_nexPixHits", "vector<uint8_t>", &t_trk_nexPixHits);
391 }
392
394 m_outputTree->Branch("nProtons", &nProtons, "nProtons/i");
395 m_outputTree->Branch("proton_pt", "vector<double>", &proton_pt);
396 m_outputTree->Branch("proton_eta", "vector<double>", &proton_eta);
397 m_outputTree->Branch("proton_phi", "vector<double>", &proton_phi);
398 m_outputTree->Branch("proton_e", "vector<double>", &proton_e);
399 m_outputTree->Branch("proton_side", "vector<int>", &proton_side);
400 m_outputTree->Branch("proton_eLoss", "vector<double>", &proton_eLoss);
401 m_outputTree->Branch("proton_t", "vector<double>", &proton_t);
402 m_outputTree->Branch("proton_track_stationID", "vector<vector<int>>", &proton_track_stationID);
403 m_outputTree->Branch("proton_track_nClusters", "vector<vector<int>>", &proton_track_nClusters);
404 m_outputTree->Branch("proton_track_xLocal", "vector<vector<float>>", &proton_track_xLocal);
405 m_outputTree->Branch("proton_track_yLocal", "vector<vector<float>>", &proton_track_yLocal);
406 m_outputTree->Branch("proton_track_zLocal", "vector<vector<float>>", &proton_track_zLocal);
407 m_outputTree->Branch("proton_track_xSlope", "vector<vector<float>>", &proton_track_xSlope);
408 m_outputTree->Branch("proton_track_ySlope", "vector<vector<float>>", &proton_track_ySlope);
409 }
410
411 }
412 }
413
414 ANA_MSG_DEBUG("Anti-howdy from Initialize!");
415
416
417 // Here you do everything that you need to do after the first input
418 // file has been connected and before the first event is processed,
419 // e.g. create additional histograms based on which variables are
420 // available in the input files. You can also create all of your
421 // histograms and trees in here, but be aware that this method
422 // doesn't get called if no events are processed. So any objects
423 // you create here won't be available in the output if you have no
424 // input events.
425
426 ANA_MSG_INFO("enableOutputTree = " << enableOutputTree);
427 ANA_MSG_INFO("writeOnlyTriggers = " << writeOnlyTriggers);
428 ANA_MSG_INFO("enableOutputSamples = " << enableOutputSamples);
429 ANA_MSG_INFO("enableTrigger = " << enableTrigger);
430 ANA_MSG_INFO("enableRPD = " << enableRPD);
431 ANA_MSG_INFO("enableCentroid = " << enableCentroid);
432 ANA_MSG_INFO("zdcCalib = " << zdcCalib);
433 ANA_MSG_INFO("zdcInj = " << zdcInj);
434 ANA_MSG_INFO("zdcLaser = " << zdcLaser);
435 ANA_MSG_INFO("zdcConfig = " << zdcConfig);
436 ANA_MSG_INFO("reprocZdc = " << reprocZdc);
437 ANA_MSG_INFO("auxSuffix = " << auxSuffix );
438 ANA_MSG_INFO("zdcLowGainMode = " << zdcLowGainMode);
439 ANA_MSG_INFO("enableID = " << enableID);
440 ANA_MSG_INFO("enableCalo = " << enableCalo);
441 ANA_MSG_INFO("enableClusters = " << enableClusters);
442 ANA_MSG_INFO("trackLimit = " << trackLimit);
443 ANA_MSG_INFO("trackLimitReject = " << trackLimitReject);
444 ANA_MSG_INFO("isMC = " << m_isMC);
445 ANA_MSG_INFO("useGRL = " << useGRL);
446 ANA_MSG_INFO("grlFilename = " << grlFilename);
447 ANA_MSG_INFO("slimmed = " << slimmed);
448 ANA_MSG_INFO("zdcOnly = " << zdcOnly);
449 ANA_MSG_INFO("flipDelay = " << flipDelay);
450 ANA_MSG_INFO("nsamplesZdc = " << nsamplesZdc);
451 ANA_MSG_INFO("lhcf2022 = " << lhcf2022);
452 ANA_MSG_INFO("lhcf2022afp = " << lhcf2022afp);
453 ANA_MSG_INFO("lhcf2022zdc = " << lhcf2022zdc);
454 ANA_MSG_INFO("doZdcCalib = " << doZdcCalib);
455
456 ANA_MSG_DEBUG("initialize: Initialize!");
457
458
459 // GRL
460
461 if (useGRL)
462 {
463 const char* fullGRLFilePath = gSystem->ExpandPathName (grlFilename.c_str());
464 ANA_MSG_INFO("GRL: " << fullGRLFilePath);
465 std::vector<std::string> vecStringGRL;
466 vecStringGRL.push_back(fullGRLFilePath);
467 ANA_CHECK(m_grl.setProperty( "GoodRunsListVec", vecStringGRL));
468 ANA_CHECK(m_grl.setProperty("PassThrough", false)); // if true (default) will ignore result of GRL and will just pass all events
469 ANA_CHECK(m_grl.initialize());
470
471 }
472
473 if (enableTracks)
474 {
475 ANA_CHECK(m_selTool.retrieve());
476 }
477
478 if (enableTrigger) // HLT related
479 {
480 ANA_MSG_INFO("Trying to initialize TDT");
481 ANA_CHECK(m_trigDecisionTool.retrieve());
482 }
483
484 // ZDC re-reco tool
485 if (reprocZdc)
486 {
487 m_zdcAnalysisTool.setTypeAndName("ZDC::ZdcAnalysisTool/ZdcAnalysisTool");
488
489 ANA_MSG_INFO("Trying to configure ZDC Analysis Tool!");
490
491 ANA_CHECK(m_zdcAnalysisTool.setProperty("FlipEMDelay", flipDelay));
492 ANA_CHECK(m_zdcAnalysisTool.setProperty("LowGainMode", zdcLowGainMode));
493 ANA_CHECK(m_zdcAnalysisTool.setProperty("DoCalib", doZdcCalib));
494 ANA_CHECK(m_zdcAnalysisTool.setProperty("Configuration", zdcConfig));
495 ANA_CHECK(m_zdcAnalysisTool.setProperty("AuxSuffix", auxSuffix));
496 ANA_CHECK(m_zdcAnalysisTool.setProperty("ForceCalibRun", -1));
497
498 ANA_MSG_INFO("Setting up zdcConfig=" << zdcConfig);
499 if (zdcConfig=="LHCf2022")
500 {
501 ANA_CHECK(m_zdcAnalysisTool.setProperty("DoTrigEff", false)); // for now
502 ANA_CHECK(m_zdcAnalysisTool.setProperty("DoTimeCalib", false)); // for now
503 ANA_CHECK(m_zdcAnalysisTool.setProperty("Configuration", "LHCf2022"));
504 }
505 else if (zdcConfig == "PbPb2018")
506 {
507 ANA_CHECK(m_zdcAnalysisTool.setProperty("Configuration", "PbPb2018"));
508 }
509 else if (zdcConfig == "pPb2016")
510 {
511 ANA_CHECK(m_zdcAnalysisTool.setProperty("Configuration", "pPb2016"));
512 }
513 else if (zdcConfig == "PbPb2015")
514 {
515 ANA_CHECK(m_zdcAnalysisTool.setProperty("Configuration", "PbPb2015"));
516 }
517
518 if (flipDelay)
519 ANA_MSG_INFO("FLIP ZDC DELAY IN EM MODULES");
520 else
521 ANA_MSG_INFO("NO FLIP ZDC DELAY IN EM MODULES");
522
523
524 ANA_MSG_INFO("Trying to initialize ZDC Analysis Tool!");
525 ANA_CHECK(m_zdcAnalysisTool.initialize());
526 }
527
528 if (zdcInj)
529 {
530 m_zdcInjPulserAmpMap = std::make_shared<ZdcInjPulserAmpMap>();
531 ATH_MSG_INFO( "Using JSON file for injector-pulse voltage at path " << m_zdcInjPulserAmpMap->getFilePath() );
532 }
533
534 return StatusCode::SUCCESS;
535}
536
537
538
539StatusCode ZdcNtuple :: execute ()
540{
541 // Here you do everything that needs to be done on every single
542 // events, e.g. read input variables, apply cuts, and fill
543 // histograms and trees. This is where most of your actual analysis
544 // code will go.
545
546
547 // prefilter with a track limit
548
549 if (!evtStore())
550 {
551 ANA_MSG_INFO("*** No event found! ***");
552 return StatusCode::SUCCESS;
553 }
554
555 ANA_CHECK(evtStore()->retrieve( m_eventInfo, "EventInfo"));
557 if (zdcInj){
559 }
560
561 //tracks used to go here
562
564
565 if ((!(zdcCalib || zdcLaser || zdcOnly || zdcInj)) && enableID)
566 {
567 ANA_MSG_DEBUG("Trying to extract InDetTrackParticles from evtStore()=" << evtStore());
568 ANA_CHECK(evtStore()->retrieve( m_trackParticles, "InDetTrackParticles") );
569 size_t n = m_trackParticles->size();
570 ANA_MSG_DEBUG("Done w/ extracting InDetTrackParticles with size = " << n);
571
572 if (n > trackLimit && trackLimitReject) return StatusCode::SUCCESS;
573 }
574
575 bool passTrigger = true;
576 m_trigDecision = 0;
577 if (enableTrigger)
578 {
579 ANA_CHECK(evtStore()->retrieve( m_trigDecision, "xTrigDecision"));
581 passTrigger = processTriggerDecision();
582 }
583
584 if (reprocZdc){
585 ANA_MSG_INFO ("Reprocessing ZDC in ZdcNtuple");
586 ANA_CHECK(m_zdcAnalysisTool->reprocessZdc());
587 }else{
588 ANA_MSG_DEBUG ("No ZDC reprocessing");
589 }
590
591 processZdcNtupleFromModules(); // same model in both cases -- processZdcNtuple() goes straight to the anlaysis tool, which is good for debugging
592
593 if(m_isMC){
595 }
596
597 if (!(zdcCalib || zdcLaser || zdcOnly || zdcInj))
598 {
599
600 // PLEASE NOTE: the commented sections here will be restored once we have a better sense of the Run 3 HI data
601
602 // Global E_T quantities for centrality
603 if (enableCalo){
604 ANA_CHECK(evtStore()->retrieve( m_caloSums, "CaloSums") );
605 ANA_CHECK(evtStore()->retrieve( m_eventShapes, "HIEventShape") );
606
608 ANA_CHECK(evtStore()->retrieve( m_lvl1EnergySumRoI, "LVL1EnergySumRoI") );
609
610 processFCal();
611 }
612
613 // MBTS quantities, but may require a derivation to be accessible (required STDM6 in pp)
614 //ANA_CHECK(evtStore()->retrieve( m_mbtsInfo, "MBTSForwardEventInfo") );
615 //ANA_CHECK(evtStore()->retrieve( m_mbtsModules, "MBTSModules") );
616 //m_trigT2MbtsBits = 0;
617 //ANA_CHECK(evtStore()->retrieve( m_trigT2MbtsBits, "HLT_xAOD__TrigT2MbtsBitsContainer_T2Mbts") );
618 //processMBTS();
619
620 if (enableID){
621 ANA_CHECK(evtStore()->retrieve( m_primaryVertices, "PrimaryVertices") );
622 processInDet();
623 }
624
625
626 if (enableClusters){
627 ANA_CHECK(evtStore()->retrieve( m_caloClusters, "CaloCalTopoClusters"));
629 }
630
631 // Gaps will require some evaluation of Run 3 performance of the clusters
632 //processGaps();
633
635 ANA_CHECK(evtStore()->retrieve( m_afpProtons, "AFPProtonContainer"));
637 }
638 }
639
640 // if trigger enabled, only write out events which pass one of them, unless using MC
641
642 if (enableTrigger && !passTrigger && !m_isMC && writeOnlyTriggers) return StatusCode::SUCCESS;
643
644
646 {
647 tree( "zdcTree" )->Fill();
648 }
649
650 return StatusCode::SUCCESS;
651}
652
654{
655
658
659 ANA_MSG_DEBUG ("copying already processed info!");
660
661 //Reset the truth separately since it has a different range
662 for(int iside : {0,1}){
663 for(int imod = 0; imod < 7; ++imod){
664 t_ZdcModuleTruthTotal[iside][imod] = 0;
665 t_ZdcModuleTruthInvis[iside][imod] = 0;
666 t_ZdcModuleTruthEM[iside][imod] = 0;
667 t_ZdcModuleTruthNonEM[iside][imod] = 0;
668 t_ZdcModuleTruthEscaped[iside][imod] = 0;
669 t_ZdcModuleTruthNphotons[iside][imod] = 0;
670 }
671 for(int ch = 0; ch < 16; ++ch){
672 t_RpdModuleTruthNphotons[iside][ch] = 0;
673 }
674 }
675
676 for (size_t iside = 0; iside < 2; iside++)
677 {
678 t_ZdcAmp[iside] = 0; t_ZdcEnergy[iside] = 0; t_ZdcEnergyErr[iside] = 0;t_ZdcTime[iside] = 0; t_ZdcStatus[iside] = 0;
679 t_ZdcNLEnergy[iside] = 0;t_ZdcNLEnergyErr[iside] = 0;
680 t_ZdcTrigEff[iside] = 0;t_ZdcLucrodTriggerSideAmp[iside] = 0; t_ZdcLucrodTriggerSideAmpLG[iside] = 0; t_ZdcTruthTotal[iside] = 0;
681 t_ZdcTruthInvis[iside] = 0; t_ZdcTruthEM[iside] = 0; t_ZdcTruthNonEM[iside] = 0;
682 t_ZdcTruthEscaped[iside] = 0;
683 for (int imod = 0; imod < 4; imod++)
684 {
685 t_ZdcModuleAmp[iside][imod] = 0; t_ZdcModuleTime[iside][imod] = 0; t_ZdcModuleStatus[iside][imod] = 0;
686
687 t_ZdcModuleCalibAmp[iside][imod] = 0; t_ZdcModuleCalibTime[iside][imod] = 0; t_ZdcModuleChisq[iside][imod] = 0; t_ZdcModuleFitAmp[iside][imod] = 0;
688 t_ZdcModuleFitT0[iside][imod] = 0; t_ZdcModuleBkgdMaxFraction[iside][imod] = 0; t_ZdcModuleAmpError[iside][imod] = 0;
689 t_ZdcModuleMinDeriv2nd[iside][imod] = 0; t_ZdcModulePresample[iside][imod] = 0; t_ZdcModulePreSampleAmp[iside][imod] = 0;
690 t_ZdcLucrodTriggerAmp[iside][imod] = 0;t_ZdcLucrodTriggerAmpLG[iside][imod] = 0;
691 t_ZdcModuleMaxADC[iside][imod] = 0; t_ZdcModuleMaxADCHG[iside][imod] = 0; t_ZdcModuleMaxADCLG[iside][imod] = 0;
692 t_ZdcModulePeakADCHG[iside][imod] = 0; t_ZdcModulePeakADCLG[iside][imod] = 0;
693 t_ZdcModuleAmpLGRefit[iside][imod] = 0; t_ZdcModuleAmpCorrLGRefit[iside][imod] = 0;
694 t_ZdcModuleT0LGRefit[iside][imod] = 0; t_ZdcModuleT0SubLGRefit[iside][imod] = 0; t_ZdcModuleChisqLGRefit[iside][imod] = 0;
695
697 {
698 for (int ig=0;ig<2;ig++)
699 {
700 for (int id=0;id<2;id++)
701 {
702 for (unsigned int isamp=0;isamp<nsamplesZdc;isamp++)
703 {
704 if (nsamplesZdc==7) t_raw7[iside][imod][ig][id][isamp]=0;
705 if (nsamplesZdc==15) t_raw15[iside][imod][ig][id][isamp]=0;
706 if (nsamplesZdc==24) t_raw24[iside][imod][ig][id][isamp]=0;
707 }
708 }
709 }
710 if (nsamplesZdc==24)
711 {
712 for (int ch=0;ch<16;ch++)
713 {
714 for (unsigned int isamp=0;isamp<nsamplesZdc;isamp++)
715 {
716 t_rpdRaw[iside][ch][isamp]=0;
717 }
718 }
719 }
720 }
721 if (enableRPD)
722 {
723 for (int ch = 0; ch < 16; ch++) {
724 t_RpdChannelBaseline[iside][ch] = 0;
725 std::fill(t_RpdChannelPileupExpFitParams[iside][ch], t_RpdChannelPileupExpFitParams[iside][ch] + 2, 0);
727 std::fill(t_RpdChannelPileupExpFitParamErrs[iside][ch], t_RpdChannelPileupExpFitParamErrs[iside][ch] + 2, 0);
729 t_RpdChannelPileupExpFitMSE[iside][ch] = 0;
731 t_RpdChannelAmplitude[iside][ch] = 0;
732 t_RpdChannelAmplitudeCalib[iside][ch] = 0;
733 t_RpdChannelMaxADC[iside][ch] = 0;
734 t_RpdChannelMaxADCCalib[iside][ch] = 0;
735 t_RpdChannelMaxSample[iside][ch] = 0;
736 t_RpdChannelStatus[iside][ch] = 0;
737 t_RpdChannelPileupFrac[iside][ch] = 0;
738 }
739 t_RpdSideStatus[iside] = 0;
740 }
741 if (enableCentroid)
742 {
743 t_centroidStatus[iside] = 0;
744 std::fill(t_RPDChannelSubtrAmp[iside], t_RPDChannelSubtrAmp[iside] + 16, 0);
745 t_RPDSubtrAmpSum[iside] = 0;
748 t_xCentroidPreAvgSubtr[iside] = 0;
749 t_yCentroidPreAvgSubtr[iside] = 0;
750 t_xCentroid[iside] = 0;
751 t_yCentroid[iside] = 0;
752 std::fill(t_xRowCentroid[iside], t_xRowCentroid[iside] + 4, 0);
753 std::fill(t_yColCentroid[iside], t_yColCentroid[iside] + 4, 0);
754 t_reactionPlaneAngle[iside] = 0;
755 }
756 }
757 }
758
759 t_ZdcModuleMask = 0;
760 if (enableCentroid) {
762 t_centroidEventValid = false;
764 }
765
766 /*
767 if (t_zdcEventInfoError == xAOD::EventInfo::Error)
768 {
769 ANA_MSG_INFO("ZDC event failed EventInfo error check - aborting!");
770 return;
771 }
772 */
773
774 static const SG::ConstAccessor<char> centroidEventValidAcc("centroidEventValid" + auxSuffix);
775 static const SG::ConstAccessor<float> cosDeltaReactionPlaneAngleAcc("cosDeltaReactionPlaneAngle" + auxSuffix);
776 static const SG::ConstAccessor<float> CalibEnergyAcc("CalibEnergy"+auxSuffix);
777 static const SG::ConstAccessor<float> CalibEnergyErrAcc("CalibEnergyErr"+auxSuffix);
778 static const SG::ConstAccessor<float> NLCalibEnergyAcc("NLCalibEnergy"+auxSuffix);
779 static const SG::ConstAccessor<float> NLCalibEnergyErrAcc("NLCalibEnergyErr"+auxSuffix);
780 static const SG::ConstAccessor<float> UncalibSumAcc("UncalibSum"+auxSuffix);
781 static const SG::ConstAccessor<float> UncalibSumErrAcc("UncalibSumErr"+auxSuffix);
782 static const SG::ConstAccessor<float> AverageTimeAcc("AverageTime"+auxSuffix);
783 static const SG::ConstAccessor<unsigned int> StatusAcc("Status"+auxSuffix);
784 static const SG::ConstAccessor<unsigned int> ModuleMaskAcc("ModuleMask"+auxSuffix);
785 static const SG::ConstAccessor<float> TruthTotalEnergyAcc("TruthTotalEnergy" + auxSuffix);
786 static const SG::ConstAccessor<float> TruthInvisibleEnergyAcc("TruthInvisibleEnergy" + auxSuffix);
787 static const SG::ConstAccessor<float> TruthEMEnergyAcc("TruthEMEnergy" + auxSuffix);
788 static const SG::ConstAccessor<float> TruthNonEMEnergyAcc("TruthNonEMEnergy" + auxSuffix);
789 static const SG::ConstAccessor<float> TruthEscapedEnergyAcc("TruthEscapedEnergy" + auxSuffix);
790 static const SG::ConstAccessor<unsigned int> centroidStatusAcc("centroidStatus" + auxSuffix);
791 static const SG::ConstAccessor<std::vector<float> > RPDChannelSubtrAmpAcc("RPDChannelSubtrAmp" + auxSuffix);
792 static const SG::ConstAccessor<float> RPDSubtrAmpSumAcc("RPDSubtrAmpSum" + auxSuffix);
793 static const SG::ConstAccessor<float> xCentroidPreGeomCorPreAvgSubtrAcc("xCentroidPreGeomCorPreAvgSubtr" + auxSuffix);
794 static const SG::ConstAccessor<float> yCentroidPreGeomCorPreAvgSubtrAcc("yCentroidPreGeomCorPreAvgSubtr" + auxSuffix);
795 static const SG::ConstAccessor<float> xCentroidPreAvgSubtrAcc("xCentroidPreAvgSubtr" + auxSuffix);
796 static const SG::ConstAccessor<float> yCentroidPreAvgSubtrAcc("yCentroidPreAvgSubtr" + auxSuffix);
797 static const SG::ConstAccessor<float> xCentroidAcc("xCentroid" + auxSuffix);
798 static const SG::ConstAccessor<float> yCentroidAcc("yCentroid" + auxSuffix);
799 static const SG::ConstAccessor<std::vector<float> > xRowCentroidAcc("xRowCentroid" + auxSuffix);
800 static const SG::ConstAccessor<std::vector<float> > yColCentroidAcc("yColCentroid" + auxSuffix);
801 static const SG::ConstAccessor<float> reactionPlaneAngleAcc("reactionPlaneAngle" + auxSuffix);
802 static const SG::ConstAccessor<unsigned int> RPDStatusAcc("RPDStatus" + auxSuffix);
803 static const SG::ConstAccessor<unsigned int> nPhotonsAcc("nPhotons" + auxSuffix);
804 static const SG::ConstAccessor<float> CalibTimeAcc("CalibTime" + auxSuffix);
805 static const SG::ConstAccessor<float> AmplitudeAcc("Amplitude" + auxSuffix);
806 static const SG::ConstAccessor<float> TimeAcc("Time" + auxSuffix);
807 static const SG::ConstAccessor<float> ChisqAcc("Chisq" + auxSuffix);
808 static const SG::ConstAccessor<float> FitAmpAcc("FitAmp" + auxSuffix);
809 static const SG::ConstAccessor<float> FitAmpErrorAcc("FitAmpError" + auxSuffix);
810 static const SG::ConstAccessor<float> FitT0Acc("FitT0" + auxSuffix);
811 static const SG::ConstAccessor<float> BkgdMaxFractionAcc("BkgdMaxFraction" + auxSuffix);
812 static const SG::ConstAccessor<float> MinDeriv2ndAcc("MinDeriv2nd" + auxSuffix);
813 static const SG::ConstAccessor<float> PresampleAcc("Presample" + auxSuffix);
814 static const SG::ConstAccessor<float> PreSampleAmpAcc("PreSampleAmp" + auxSuffix);
815 static const SG::ConstAccessor<float> RPDChannelBaselineAcc("RPDChannelBaseline" + auxSuffix);
816 static const SG::ConstAccessor<std::vector<float> > RPDChannelPileupExpFitParamsAcc("RPDChannelPileupExpFitParams" + auxSuffix);
817 static const SG::ConstAccessor<std::vector<float> > RPDChannelPileupExpFitParamErrsAcc("RPDChannelPileupExpFitParamErrs" + auxSuffix);
818 static const SG::ConstAccessor<std::vector<float> > RPDChannelPileupStretchedExpFitParamsAcc("RPDChannelPileupStretchedExpFitParams" + auxSuffix);
819 static const SG::ConstAccessor<std::vector<float> > RPDChannelPileupStretchedExpFitParamErrsAcc("RPDChannelPileupStretchedExpFitParamErrs" + auxSuffix);
820 static const SG::ConstAccessor<float> RPDChannelPileupExpFitMSEAcc("RPDChannelPileupExpFitMSE" + auxSuffix);
821 static const SG::ConstAccessor<float> RPDChannelPileupStretchedExpFitMSEAcc("RPDChannelPileupStretchedExpFitMSE" + auxSuffix);
822 static const SG::ConstAccessor<float> RPDChannelAmplitudeAcc("RPDChannelAmplitude" + auxSuffix);
823 static const SG::ConstAccessor<float> RPDChannelAmplitudeCalibAcc("RPDChannelAmplitudeCalib" + auxSuffix);
824 static const SG::ConstAccessor<float> RPDChannelMaxADCAcc("RPDChannelMaxADC" + auxSuffix);
825 static const SG::ConstAccessor<float> RPDChannelMaxADCCalibAcc("RPDChannelMaxADCCalib" + auxSuffix);
826 static const SG::ConstAccessor<unsigned int> RPDChannelMaxSampleAcc("RPDChannelMaxSample" + auxSuffix);
827 static const SG::ConstAccessor<unsigned int> RPDChannelStatusAcc("RPDChannelStatus" + auxSuffix);
828 static const SG::ConstAccessor<float> RPDChannelPileupFracAcc("RPDChannelPileupFrac" + auxSuffix);
829 static const SG::ConstAccessor<float> AmpLGRefitAcc("AmpLGRefit" + auxSuffix);
830 static const SG::ConstAccessor<float> T0LGRefitAcc("T0LGRefit" + auxSuffix);
831 static const SG::ConstAccessor<float> T0SubLGRefitAcc("T0SubLGRefit" + auxSuffix);
832 static const SG::ConstAccessor<float> ChisqLGRefitAcc("ChisqLGRefit" + auxSuffix);
833
834 static const SG::ConstAccessor<uint16_t> LucrodTriggerAmpAcc("LucrodTriggerAmp");
835 static const SG::ConstAccessor<uint16_t> LucrodTriggerAmpLGAcc("LucrodTriggerAmpLG");
836 static const SG::ConstAccessor<uint16_t> LucrodTriggerSideAmpAcc("LucrodTriggerSideAmp");
837 static const SG::ConstAccessor<uint16_t> LucrodTriggerSideAmpLGAcc("LucrodTriggerSideAmpLG");
838 static const SG::ConstAccessor<float> Amplitude0Acc("Amplitude");
839 static const SG::ConstAccessor<float> MaxADCAcc("MaxADC");
840 static const SG::ConstAccessor<float> MaxADCHGAcc("MaxADCHG");
841 static const SG::ConstAccessor<float> MaxADCLGAcc("MaxADCLG");
842 static const SG::ConstAccessor<float> PeakADCHGAcc("PeakADCHG");
843 static const SG::ConstAccessor<float> PeakADCLGAcc("PeakADCLG");
844 static const SG::ConstAccessor<std::vector<uint16_t> > g0d0DataAcc("g0d0Data");
845 static const SG::ConstAccessor<std::vector<uint16_t> > g0d1DataAcc("g0d1Data");
846 static const SG::ConstAccessor<std::vector<uint16_t> > g1d0DataAcc("g1d0Data");
847 static const SG::ConstAccessor<std::vector<uint16_t> > g1d1DataAcc("g1d1Data");
848 static const SG::ConstAccessor<std::vector<uint16_t> > g0dataAcc("g0data");
849 static const SG::ConstAccessor<std::vector<uint16_t> > g1dataAcc("g1data");
850
853 t_rpdDecodingError = rpdErr;
854 t_zdcDecodingError = zdcErr;
855 if (enableCentroid) {
856 // locate global sum (only if centroid is needed)
857 xAOD::ZdcModule const * globalSum = nullptr;
858 for (auto const * zdcSum : *zdcSums) {
859 if (zdcSum->zdcSide() == 0) {
860 globalSum = zdcSum;
861 break;
862 }
863 }
864 if (!globalSum) {
865 ANA_MSG_ERROR("unable to locate global ZdcSum (side = 0)");
867 }
868 else {
869 t_centroidDecorationsAvailable = centroidStatusAcc.isAvailable(*globalSum);
870 }
871 }
872
873 if (rpdErr||zdcErr) ANA_MSG_WARNING( "Decoding errors ZDC=" << zdcErr << " RPD=" << rpdErr );
874
875 if (zdcSums.ptr())
876 {
877 ANA_MSG_DEBUG( "accessing ZdcSums" );
878 for (const auto zdcSum : *zdcSums)
879 {
880 if (zdcSum->zdcSide()==0) {
881 // trap new global sum
883 t_centroidEventValid = centroidEventValidAcc(*zdcSum);
884 t_cosDeltaReactionPlaneAngle = cosDeltaReactionPlaneAngleAcc(*zdcSum);
885 }
886 // no other branches are filled from global sum - skip to the real sides (C=-1 and A=1)
887 continue;
888 }
889 int iside = 0;
890 if (zdcSum->zdcSide() > 0) iside = 1;
891
892 //static SG::AuxElement::ConstAccessor< float > acc( "CalibEnergy" );
893 //t_ZdcEnergy[iside] = acc(*zdcSum);
894
895 if (enableZDC && !zdcErr)
896 {
897 t_ZdcEnergy[iside] = CalibEnergyAcc(*zdcSum);
898 t_ZdcEnergyErr[iside] = CalibEnergyErrAcc(*zdcSum);
899 t_ZdcNLEnergy[iside] = NLCalibEnergyAcc(*zdcSum);
900 t_ZdcNLEnergyErr[iside] = NLCalibEnergyErrAcc(*zdcSum);
901
902 t_ZdcAmp[iside] = UncalibSumAcc(*zdcSum);
903 t_ZdcAmpErr[iside] = UncalibSumErrAcc(*zdcSum);
904 if (LucrodTriggerSideAmpAcc.isAvailable(*zdcSum))
905 t_ZdcLucrodTriggerSideAmp[iside] = LucrodTriggerSideAmpAcc(*zdcSum);
906 if (LucrodTriggerSideAmpLGAcc.isAvailable(*zdcSum))
907 t_ZdcLucrodTriggerSideAmpLG[iside] = LucrodTriggerSideAmpLGAcc(*zdcSum);
908
909 ANA_MSG_VERBOSE("processZdcNtupleFromModules: ZdcSum energy = " << t_ZdcEnergy[iside]);
910
911 t_ZdcTime[iside] = AverageTimeAcc(*zdcSum);
912 t_ZdcStatus[iside] = StatusAcc(*zdcSum);
913 t_ZdcModuleMask += ( ModuleMaskAcc(*zdcSum) << 4 * iside);
914
915 if(m_isMC){
916 ANA_MSG_DEBUG("Filling sum truth");
917 t_ZdcTruthTotal [iside] = TruthTotalEnergyAcc(*zdcSum);
918 t_ZdcTruthInvis [iside] = TruthInvisibleEnergyAcc(*zdcSum);
919 t_ZdcTruthEM [iside] = TruthEMEnergyAcc(*zdcSum);
920 t_ZdcTruthNonEM [iside] = TruthNonEMEnergyAcc(*zdcSum);
921 t_ZdcTruthEscaped[iside] = TruthEscapedEnergyAcc(*zdcSum);
922 }
923
924 }
925
926 if (enableRPD)
927 {
928 if (enableRPDAmp && !rpdErr)
929 {
930 t_RpdSideStatus[iside] = RPDStatusAcc(*zdcSum);
931 }
933 {
934 t_centroidStatus[iside] = centroidStatusAcc(*zdcSum);
935 std::vector<float> const& rpdChannelSubtrAmp = RPDChannelSubtrAmpAcc(*zdcSum);
936 std::copy(rpdChannelSubtrAmp.begin(), rpdChannelSubtrAmp.end(), t_RPDChannelSubtrAmp[iside]);
937 t_RPDSubtrAmpSum[iside] = RPDSubtrAmpSumAcc(*zdcSum);
938 t_xCentroidPreGeomCorPreAvgSubtr[iside] = xCentroidPreGeomCorPreAvgSubtrAcc(*zdcSum);
939 t_yCentroidPreGeomCorPreAvgSubtr[iside] = yCentroidPreGeomCorPreAvgSubtrAcc(*zdcSum);
940 t_xCentroidPreAvgSubtr[iside] = xCentroidPreAvgSubtrAcc(*zdcSum);
941 t_yCentroidPreAvgSubtr[iside] = yCentroidPreAvgSubtrAcc(*zdcSum);
942 t_xCentroid[iside] = xCentroidAcc(*zdcSum);
943 t_yCentroid[iside] = yCentroidAcc(*zdcSum);
944 std::vector<float> const& xRowCentroid = xRowCentroidAcc(*zdcSum);
945 std::copy(xRowCentroid.begin(), xRowCentroid.end(), t_xRowCentroid[iside]);
946 std::vector<float> const& yColCentroid = yColCentroidAcc(*zdcSum);
947 std::copy(yColCentroid.begin(), yColCentroid.end(), t_yColCentroid[iside]);
948 t_reactionPlaneAngle[iside] = reactionPlaneAngleAcc(*zdcSum);
949 }
950 }
951 }
952 }
953
954 ANA_MSG_DEBUG( "accessing ZdcModules" );
955
956 if (zdcModules.ptr())
957 {
958 for (const auto zdcMod : *zdcModules)
959 {
960 int iside = 0;
961 if (zdcMod->zdcSide() > 0) iside = 1;
962 int imod = zdcMod->zdcModule();
963
964 if (m_isMC){
965 //Calib hits are only stored in channel 0 of the RPD
966 if(!(imod == 4 && zdcMod->zdcChannel() != 0)){
967 t_ZdcModuleTruthTotal [iside][imod] = TruthTotalEnergyAcc(*zdcMod);
968 t_ZdcModuleTruthInvis [iside][imod] = TruthInvisibleEnergyAcc(*zdcMod);
969 t_ZdcModuleTruthEM [iside][imod] = TruthEMEnergyAcc(*zdcMod);
970 t_ZdcModuleTruthNonEM [iside][imod] = TruthNonEMEnergyAcc(*zdcMod);
971 t_ZdcModuleTruthEscaped[iside][imod] = TruthEscapedEnergyAcc(*zdcMod);
972 t_ZdcModuleTruthNphotons[iside][imod] = nPhotonsAcc(*zdcMod);
973 }
974 //Calib hits are stored for all modules
975 //Other data is only valid for module 1-4
976 if(imod > 4) continue;
977 }
978
979 ANA_MSG_VERBOSE ("Module " << zdcMod->zdcSide() << " " << zdcMod->zdcModule() << " amp:" << AmplitudeAcc(*zdcMod));
980
981 if (zdcMod->zdcType() == 0 && !zdcErr)
982 {
983 // ZDC energy type modules
984 t_ZdcModuleCalibAmp[iside][imod] = CalibEnergyAcc(*zdcMod);
985 t_ZdcModuleCalibTime[iside][imod] = CalibTimeAcc(*zdcMod);
986 t_ZdcModuleStatus[iside][imod] = StatusAcc(*zdcMod);
987 if (t_ZdcModuleAmp[iside][imod] != 0.)
988 Warning("processZdcNtupleFromModules", "overwriting side %d module %d!", iside, imod);
989 t_ZdcModuleAmp[iside][imod] = AmplitudeAcc(*zdcMod);
990 t_ZdcModuleTime[iside][imod] = TimeAcc(*zdcMod);
991
992 t_ZdcModuleChisq[iside][imod] = ChisqAcc(*zdcMod);
993 t_ZdcModuleFitAmp[iside][imod] = FitAmpAcc(*zdcMod);
994 t_ZdcModuleAmpError[iside][imod] = FitAmpErrorAcc(*zdcMod);
995 t_ZdcModuleFitT0[iside][imod] = FitT0Acc(*zdcMod);
996 t_ZdcModuleBkgdMaxFraction[iside][imod] = BkgdMaxFractionAcc(*zdcMod);
997 t_ZdcModuleMinDeriv2nd[iside][imod] = MinDeriv2ndAcc(*zdcMod);
998 t_ZdcModulePresample[iside][imod] = PresampleAcc(*zdcMod);
999 t_ZdcModulePreSampleAmp[iside][imod] = PreSampleAmpAcc(*zdcMod);
1000
1001 if (AmpLGRefitAcc.isAvailable(*zdcMod)) {
1002 t_ZdcModuleAmpLGRefit[iside][imod] = AmpLGRefitAcc(*zdcMod);
1003 t_ZdcModuleT0LGRefit[iside][imod] = T0LGRefitAcc(*zdcMod);
1004 t_ZdcModuleT0SubLGRefit[iside][imod] = T0SubLGRefitAcc(*zdcMod);
1005 t_ZdcModuleChisqLGRefit[iside][imod] = ChisqLGRefitAcc(*zdcMod);
1006 }
1007
1008 if (LucrodTriggerAmpAcc.isAvailable(*zdcMod))
1009 t_ZdcLucrodTriggerAmp[iside][imod] = LucrodTriggerAmpAcc(*zdcMod);
1010 if (LucrodTriggerAmpLGAcc.isAvailable(*zdcMod))
1011 t_ZdcLucrodTriggerAmpLG[iside][imod] = LucrodTriggerAmpLGAcc(*zdcMod);
1012
1013 if (MaxADCAcc.isAvailable(*zdcMod))
1014 t_ZdcModuleMaxADC[iside][imod] = MaxADCAcc(*zdcMod);
1015 if (MaxADCHGAcc.isAvailable(*zdcMod))
1016 t_ZdcModuleMaxADCHG[iside][imod] = MaxADCHGAcc(*zdcMod);
1017 if (MaxADCLGAcc.isAvailable(*zdcMod))
1018 t_ZdcModuleMaxADCLG[iside][imod] = MaxADCLGAcc(*zdcMod);
1019 if (PeakADCHGAcc.isAvailable(*zdcMod))
1020 t_ZdcModulePeakADCHG[iside][imod] = PeakADCHGAcc(*zdcMod);
1021 if (PeakADCLGAcc.isAvailable(*zdcMod))
1022 t_ZdcModulePeakADCLG[iside][imod] = PeakADCLGAcc(*zdcMod);
1023
1024 if (enableOutputSamples && !zdcErr)
1025 {
1026 for (unsigned int isamp = 0; isamp < nsamplesZdc; isamp++) // 7 samples
1027 {
1028 if (nsamplesZdc == 7)
1029 {
1030 t_raw7[iside][imod][0][0][isamp] = g0d0DataAcc(*zdcMod).at(isamp);
1031 t_raw7[iside][imod][0][1][isamp] = g0d1DataAcc(*zdcMod).at(isamp);
1032 t_raw7[iside][imod][1][0][isamp] = g1d0DataAcc(*zdcMod).at(isamp);
1033 t_raw7[iside][imod][1][1][isamp] = g1d1DataAcc(*zdcMod).at(isamp);
1034 }
1035
1036 if (nsamplesZdc == 15)
1037 {
1038 t_raw15[iside][imod][0][0][isamp] = g0d0DataAcc(*zdcMod).at(isamp);
1039 t_raw15[iside][imod][0][1][isamp] = g0d1DataAcc(*zdcMod).at(isamp);
1040 t_raw15[iside][imod][1][0][isamp] = g1d0DataAcc(*zdcMod).at(isamp);
1041 t_raw15[iside][imod][1][1][isamp] = g1d1DataAcc(*zdcMod).at(isamp);
1042 }
1043
1044 if (nsamplesZdc == 24)
1045 {
1046 t_raw24[iside][imod][0][0][isamp] = g0dataAcc(*zdcMod).at(isamp);
1047 t_raw24[iside][imod][1][0][isamp] = g1dataAcc(*zdcMod).at(isamp);
1048 }
1049 }
1050 }
1051 }
1052 else if (zdcMod->zdcType() == 1 && nsamplesZdc == 24)
1053 {
1054 // this is the RPD
1055 if (enableRPD)
1056 {
1057 if (enableRPDAmp && !rpdErr)
1058 {
1059 t_RpdChannelBaseline[iside][zdcMod->zdcChannel()] = RPDChannelBaselineAcc(*zdcMod);
1060 std::vector<float> const &rpdChannelPileupExpFitParams = RPDChannelPileupExpFitParamsAcc(*zdcMod);
1061 std::copy(rpdChannelPileupExpFitParams.begin(), rpdChannelPileupExpFitParams.end(), t_RpdChannelPileupExpFitParams[iside][zdcMod->zdcChannel()]);
1062 std::vector<float> const &rpdChannelPileupExpFitParamErrs = RPDChannelPileupExpFitParamErrsAcc(*zdcMod);
1063 std::copy(rpdChannelPileupExpFitParamErrs.begin(), rpdChannelPileupExpFitParamErrs.end(), t_RpdChannelPileupExpFitParamErrs[iside][zdcMod->zdcChannel()]);
1064 std::vector<float> const &rpdChannelPileupStretchedExpFitParams = RPDChannelPileupStretchedExpFitParamsAcc(*zdcMod);
1065 std::copy(rpdChannelPileupStretchedExpFitParams.begin(), rpdChannelPileupStretchedExpFitParams.end(), t_RpdChannelPileupStretchedExpFitParams[iside][zdcMod->zdcChannel()]);
1066 std::vector<float> const &rpdChannelPileupStretchedExpFitParamErrs = RPDChannelPileupStretchedExpFitParamErrsAcc(*zdcMod);
1067 std::copy(rpdChannelPileupStretchedExpFitParamErrs.begin(), rpdChannelPileupStretchedExpFitParamErrs.end(), t_RpdChannelPileupStretchedExpFitParamErrs[iside][zdcMod->zdcChannel()]);
1068 t_RpdChannelPileupExpFitMSE[iside][zdcMod->zdcChannel()] = RPDChannelPileupExpFitMSEAcc(*zdcMod);
1069 t_RpdChannelPileupStretchedExpFitMSE[iside][zdcMod->zdcChannel()] = RPDChannelPileupStretchedExpFitMSEAcc(*zdcMod);
1070 t_RpdChannelAmplitude[iside][zdcMod->zdcChannel()] = RPDChannelAmplitudeAcc(*zdcMod);
1071 t_RpdChannelAmplitudeCalib[iside][zdcMod->zdcChannel()] = RPDChannelAmplitudeCalibAcc(*zdcMod);
1072 t_RpdChannelMaxADC[iside][zdcMod->zdcChannel()] = RPDChannelMaxADCAcc(*zdcMod);
1073 t_RpdChannelMaxADCCalib[iside][zdcMod->zdcChannel()] = RPDChannelMaxADCCalibAcc(*zdcMod);
1074 t_RpdChannelMaxSample[iside][zdcMod->zdcChannel()] = RPDChannelMaxSampleAcc(*zdcMod);
1075 t_RpdChannelStatus[iside][zdcMod->zdcChannel()] = RPDChannelStatusAcc(*zdcMod);
1076 t_RpdChannelPileupFrac[iside][zdcMod->zdcChannel()] = RPDChannelPileupFracAcc(*zdcMod);
1077 if(m_isMC){
1078 t_RpdModuleTruthNphotons[iside][zdcMod->zdcChannel()] = nPhotonsAcc(*zdcMod);
1079 }
1080 }
1082 {
1083 std::vector<uint16_t> const &rpdChannelRaw = g0dataAcc(*zdcMod);
1084 std::copy(rpdChannelRaw.begin(), rpdChannelRaw.end(), t_rpdRaw[iside][zdcMod->zdcChannel()]);
1085 }
1086 }
1087 }
1088 }
1089 }
1090 else
1091 {
1092 ANA_MSG_INFO("No ZdcModules" << auxSuffix << " when expected!");
1093 }
1094
1095 if (msgLvl (MSG::VERBOSE))
1096 {
1097 std::ostringstream message;
1098 message << "Dump zdc_ZdcModuleAmp: ";
1099 for (int iside = 0; iside < 2; iside++)
1100 {
1101 for (int imod = 0; imod < 4; imod++)
1102 {
1103 message << t_ZdcModuleAmp[iside][imod] << " ";
1104 }
1105 }
1106 }
1107}
1108
1110 /******************************************
1111 * Get the McEventCollection (input)
1112 ******************************************/
1113 SG::ReadHandle<McEventCollection> mcEventCollection (m_mcEventCollectionName, getContext());
1114 if (!mcEventCollection.isValid()){
1115 ANA_MSG_ERROR("Could not retrieve HepMC with key:" << m_mcEventCollectionName.key());
1116 return;
1117 }else{
1118 ANA_MSG_DEBUG("Retrieved HepMC with key: " << m_mcEventCollectionName.key());
1119 }
1120
1121 /******************************************
1122 * Clear and resize the output vectors
1123 ******************************************/
1124 t_ZdcTruthParticlePosx.clear();
1125 t_ZdcTruthParticlePosy.clear();
1126 t_ZdcTruthParticlePosz.clear();
1127 t_ZdcTruthParticleTime.clear();
1128 t_ZdcTruthParticlePx.clear();
1129 t_ZdcTruthParticlePy.clear();
1130 t_ZdcTruthParticlePz.clear();
1132 t_ZdcTruthParticlePid.clear();
1134
1135 /******************************************
1136 * Sort the particles into sides and add
1137 * them to the output vectors
1138 ******************************************/
1139 for (unsigned int cntr = 0; cntr < mcEventCollection->size(); ++cntr){
1140 const HepMC::GenEvent *genEvt = (*mcEventCollection)[cntr];
1141#ifdef HEPMC3
1142 for (const auto &vertex : genEvt->vertices()){
1143 for (const auto &particle : vertex->particles_in()){
1144#else
1145 for (const auto &vertex : genEvt->vertex_range()){
1146 for (auto ip = vertex->particles_in_const_begin();
1147 ip != vertex->particles_in_const_end();
1148 ++ip) {
1149 auto particle = *ip;
1150#endif
1151 t_ZdcTruthParticlePosx.push_back(vertex->position().x());
1152 t_ZdcTruthParticlePosy.push_back(vertex->position().y());
1153 t_ZdcTruthParticlePosz.push_back(vertex->position().z());
1154 t_ZdcTruthParticleTime.push_back(vertex->position().t());
1155 t_ZdcTruthParticlePx.push_back(particle->momentum().x());
1156 t_ZdcTruthParticlePy.push_back(particle->momentum().y());
1157 t_ZdcTruthParticlePz.push_back(particle->momentum().z());
1158 t_ZdcTruthParticleEnergy.push_back(particle->momentum().e());
1159 t_ZdcTruthParticlePid.push_back(particle->pdg_id());
1160 t_ZdcTruthParticleStatus.push_back(particle->status());
1161 } // end loop over particles
1162 }// end loop over vertices
1163 }// end loop over HepMC events
1164}
1165
1167{
1168 ANA_MSG_DEBUG ("Processing trigger");
1169
1170 bool passTrigger = false;
1171
1172 t_trigger = 0;
1173 t_trigger_TBP = 0;
1174
1175 for (int i = 0; i < 16; i++)
1176 {
1177 t_tav[i] = 0;
1178 t_tbp[i] = 0;
1179 }
1180
1181 if (m_trigDecision)
1182 {
1183 for (int i = 0; i < 16; i++)
1184 {
1185 t_tbp[i] = m_trigDecision->tbp().at(i);
1186 t_tav[i] = m_trigDecision->tav().at(i);
1187 ANA_MSG_DEBUG( "TD: " << i << " tbp: " << std::hex << t_tbp[i] << "\t" << t_tav[i] );
1188 }
1189 t_bunchGroup = m_trigDecision->bgCode();
1190 }
1191
1192 if (enableTrigger)
1193 {
1194
1195 int ic = 0;
1196 for (auto cg : m_chainGroups)
1197 {
1198
1199 if (zdcCalib)
1200 {
1201 std::string name = cg->getListOfTriggers().at(0);
1202 const unsigned int triggerbits = m_trigDecisionTool->isPassedBits(name);
1203 // deferred functionality
1204 //bool tbp = triggerbits&TrigDefs::L1_isPassedBeforePrescale;
1205 //bool tap = triggerbits&TrigDefs::L1_isPassedAfterPrescale;
1206 bool tav = triggerbits&TrigDefs::L1_isPassedAfterVeto;
1207 ANA_MSG_DEBUG("TD: checking trigger name=" << name<< " tav=" << tav);
1208 if (tav)
1209 {
1210 t_trigger += (1 << ic);
1211 t_decisions[ic] = true;
1212 t_prescales[ic] = cg->getPrescale();
1213 passTrigger = true;
1214 }
1215 else
1216 {
1217 t_decisions[ic] = 0;
1218 t_prescales[ic] = 0;
1219 }
1220 }
1221 else
1222 {
1223 if (cg->isPassed())
1224 {
1225 t_trigger += (1 << ic);
1226 t_decisions[ic] = true;
1227 t_prescales[ic] = cg->getPrescale();
1228 passTrigger = true;
1229 }
1230 else
1231 {
1232 t_decisions[ic] = 0;
1233 t_prescales[ic] = 0;
1234 }
1235 }
1236
1237 if (cg->isPassedBits()&TrigDefs::EF_passedRaw)
1238 {
1239 t_trigger_TBP += (1 << ic);
1240 }
1241
1242
1243 ic++;
1244 }
1245
1246 int irc = 0;
1247 for (auto cg : m_rerunChainGroups)
1248 {
1249 t_rerunDecisions[irc] = false;
1250 if (cg->isPassedBits()&TrigDefs::EF_passedRaw)
1251 {
1252 t_rerunDecisions[irc] = true;
1253 }
1254 irc++;
1255 }
1256
1257 }
1258
1259 return passTrigger;
1260}
1261
1263{
1264 ANA_MSG_DEBUG( "processing event info");
1265
1266 t_bcid = m_eventInfo->bcid();
1267 t_runNumber = m_eventInfo->runNumber();
1268 t_eventNumber = m_eventInfo->eventNumber();
1269 t_lumiBlock = m_eventInfo->lumiBlock();
1270 t_bunchGroup = -1;
1271 t_extendedLevel1ID = m_eventInfo->extendedLevel1ID();
1272 t_timeStamp = m_eventInfo->timeStamp();
1273 t_timeStampNSOffset = m_eventInfo->timeStampNSOffset();
1275 t_avgIntPerCrossing = m_eventInfo->averageInteractionsPerCrossing();
1276 t_actIntPerCrossing = m_eventInfo->actualInteractionsPerCrossing();
1279
1280 if ( !(m_eventCounter++ % 1000) || msgLvl(MSG::DEBUG))
1281 {
1282 ANA_MSG_INFO("Event# " << m_eventCounter << " Run " << m_eventInfo->runNumber() << " Event " << m_eventInfo->eventNumber() << " LB " << m_eventInfo->lumiBlock() );
1283 }
1284
1285}
1286
1288 // Check for new run number
1289 //
1291 //
1292 // Get access to the injector pulse steps for this run
1293 //
1295 if (!m_injMapRunToken.isValid()) {
1296 ANA_MSG_ERROR("Unable to obtain injector pulse steps for run " << t_runNumber);
1297 }
1298 else {
1299 unsigned int startLB = m_zdcInjPulserAmpMap->getFirstLumiBlock(m_injMapRunToken);
1300 unsigned int nsteps = m_zdcInjPulserAmpMap->getNumSteps(m_injMapRunToken);
1301 ANA_MSG_DEBUG("Successfully obtained injector pulse steps for run " << t_runNumber
1302 << ", first LB = " << startLB << ", number of steps = " << nsteps);
1303 }
1304
1305 // update the last run number to be the current run number
1307 }
1308
1310}
1311
1313{
1314 ANA_MSG_DEBUG("processInDet(): processing tracks & vertices!");
1315 t_ntrk = 0;
1316 t_nvx = 0;
1317 t_vxntrk = 0;
1318 t_vx_trk_index.clear();
1319 t_vxsumpt2 = 0;
1320 t_vxtype = 0;
1321 t_pvindex = -1;
1322 t_puvxntrk = 0;
1323 t_puvxsumpt = 0;
1325 t_vxnminbias = 0;
1326
1327 int i;
1328 for (i = 0; i < 3; i++) t_vx[i] = 0;
1329 for (i = 0; i < 6; i++) t_vxcov[i] = 0;
1330
1331 const xAOD::Vertex* primary_vertex = nullptr;
1332 size_t pv_index = -1;
1333 size_t vx_index = 0;
1334 float max_pileup_sumpT = 0.;
1335 int max_pileup_nTrack = 0;
1336 float max_pileup_z = 0;
1337 int nStrongPileup = 0;
1338
1339 t_nvtx = 0;
1340 t_vtx_type.clear();
1341 t_vtx_x.clear();
1342 t_vtx_y.clear();
1343 t_vtx_z.clear();
1344 t_vtx_ntrk_all.clear();
1345 t_vtx_sumpt2_all.clear();
1346 t_vtx_ntrk.clear();
1347 t_vtx_sumpt2.clear();
1348 t_vtx_trk_index.clear();
1349
1351 {
1352 ANA_MSG_DEBUG("processInDet: processing vertices");
1353
1354 t_nvx = m_primaryVertices->size();
1355
1356 static const SG::ConstAccessor<float> sumPt2Acc("sumPt2");
1357
1358 // start of new vertex representation
1359 t_nvtx = m_primaryVertices->size();
1360 for (const auto vertex : *m_primaryVertices)
1361 {
1362 float vtx_sumpt2 = 0;
1363 int vtx_ntrk = 0;
1364
1365 t_vtx_type.push_back(vertex->vertexType());
1366 t_vtx_x.push_back(0);
1367 t_vtx_y.push_back(0);
1368 t_vtx_z.push_back(vertex->z());
1369
1370 t_vtx_ntrk.push_back(vtx_ntrk);
1371 t_vtx_sumpt2.push_back(vtx_sumpt2 / 1e6);
1372 t_vtx_ntrk_all.push_back(vertex->nTrackParticles());
1373
1374 if (sumPt2Acc.isAvailable(*vertex))
1375 t_vtx_sumpt2_all.push_back(sumPt2Acc(*vertex));
1376 else
1377 t_vtx_sumpt2_all.push_back(-1);
1378
1379 std::vector<int16_t> trk_index;
1380 if ( m_trackParticles && vertex->nTrackParticles() <= trackLimit )
1381 {
1382 const std::vector< ElementLink< xAOD::TrackParticleContainer > >& vxTrackParticles = vertex->trackParticleLinks();
1383 for (size_t itrk = 0; itrk < vxTrackParticles.size(); itrk++)
1384 {
1385 ElementLink< xAOD::TrackParticleContainer > trkLink = vxTrackParticles.at(itrk);
1386 trk_index.push_back(trkLink.index());
1387 }
1388 }
1389 t_vtx_trk_index.push_back(trk_index);
1390
1391 // end of new vertex representation
1392
1393 if (vertex->vertexType() == xAOD::VxType::PriVtx)
1394 {
1395 primary_vertex = vertex;
1396 pv_index = vx_index;
1397 }
1398 if (vertex->vertexType() == xAOD::VxType::PileUp)
1399 {
1400 float pileup_sumpT = 0;
1401 int pileup_nTrack = 0;
1402 for (size_t itr = 0; itr < vertex->nTrackParticles(); itr++)
1403 {
1404 int track_quality = trackQuality(vertex->trackParticle(itr), vertex);
1405 if (track_quality != -1 && (track_quality & 128) != 0)
1406 {
1407 pileup_nTrack++;
1408 pileup_sumpT += vertex->trackParticle(itr)->pt();
1409 }
1410 }
1411 if (pileup_sumpT > max_pileup_sumpT)
1412 {
1413 max_pileup_sumpT = pileup_sumpT;
1414 max_pileup_nTrack = pileup_nTrack;
1415 max_pileup_z = vertex->z();
1416 }
1417 if (pileup_sumpT > 5e3 || pileup_nTrack > 5) nStrongPileup++;
1418 }
1419 vx_index++;
1420 }
1421 }
1422
1423 t_nstrong = nStrongPileup;
1424
1425 if (primary_vertex != nullptr)
1426 {
1427 t_vx[0] = primary_vertex->x();
1428 t_vx[1] = primary_vertex->y();
1429 t_vx[2] = primary_vertex->z();
1430 /*
1431 const std::vector<float>& cov = primary_vertex->covariance();
1432 */
1433 //for (size_t i=0;i<cov.size();i++)
1434 for (size_t i = 0; i < 6; i++)
1435 {
1436 //t_vxcov[i] = cov.at(i);
1437 t_vxcov[i] = 0;
1438 }
1439 t_vxntrk = primary_vertex->nTrackParticles();
1440 static const SG::ConstAccessor<float> sumPt2Acc("sumPt2");
1441 if (sumPt2Acc.isAvailable(*primary_vertex))
1442 t_vxsumpt2 = sumPt2Acc(*primary_vertex);
1443 else
1444 t_vxsumpt2 = 0;
1445
1446 t_vxtype = primary_vertex->vertexType();
1447 t_pvindex = pv_index;
1448 t_puvxz = max_pileup_z;
1449 t_puvxsumpt = max_pileup_sumpT;
1450 t_puvxntrk = max_pileup_nTrack;
1451
1452 const std::vector< ElementLink< xAOD::TrackParticleContainer > >& vxTrackParticles = primary_vertex->trackParticleLinks();
1453
1454 for (size_t itrk = 0; itrk < vxTrackParticles.size(); itrk++)
1455 {
1456 ElementLink< xAOD::TrackParticleContainer > trkLink = vxTrackParticles.at(itrk);
1457 if (!trkLink.isValid()) continue;
1458 if (m_trackParticles)
1459 {
1460 if (m_trackParticles->size() <= trackLimit)
1461 t_vx_trk_index.push_back(trkLink.index());
1462 }
1463 }
1464
1465 }
1466
1467
1468 if (m_trackParticles)
1469 {
1470 ANA_MSG_DEBUG("processInDet: processing trackss");
1471
1472 t_trk_pt.clear();
1473 t_trk_eta.clear();
1474 t_trk_phi.clear();
1475 t_trk_e.clear();
1476 t_trk_index.clear();
1477 t_trk_theta.clear();
1478 t_trk_charge.clear();
1479 t_trk_d0.clear();
1480 t_trk_z0.clear();
1481 t_trk_vz.clear();
1482 t_trk_vtxz.clear();
1483 t_trk_quality.clear();
1484 t_trk_nPixHits.clear();
1485 t_trk_nSctHits.clear();
1486 t_trk_nPixDead.clear();
1487 t_trk_nSctDead.clear();
1488 t_trk_nPixHoles.clear();
1489 t_trk_nSctHoles.clear();
1490 t_trk_nTrtHits.clear();
1491 t_trk_nTrtOutliers.clear();
1492 t_trk_inPixHits.clear();
1493 t_trk_exPixHits.clear();
1494 t_trk_ninPixHits.clear();
1495 t_trk_nexPixHits.clear();
1496 t_trk_pixeldEdx.clear();
1497
1498 t_ntrk = m_trackParticles->size();
1499
1500 if ( !enableTracks ) return;
1501
1502 if ( t_ntrk <= trackLimit ) // dump all tracks
1503 {
1504 int trk_index = 0;
1505 for (const auto track : *m_trackParticles)
1506 {
1507 writeTrack(track, primary_vertex, trk_index++);
1508 }
1509 }
1510 else // write small vertices
1511 {
1512 for (const auto vertex : *m_primaryVertices)
1513 {
1514 if (vertex->nTrackParticles() <= trackLimit )
1515 {
1516 const std::vector< ElementLink< xAOD::TrackParticleContainer > >& vxTrackParticles = vertex->trackParticleLinks();
1517 for (size_t itrk = 0; itrk < vxTrackParticles.size(); itrk++)
1518 {
1519 ElementLink< xAOD::TrackParticleContainer > trkLink = vxTrackParticles.at(itrk);
1520 writeTrack(*trkLink, vertex, trkLink.index());
1521 }
1522 }
1523 }
1524 }
1525 }
1526
1527 return;
1528}
1529
1530
1532{
1533
1534 if (!track) return -1;
1535
1536 bool pass_looseprimary = false;
1537 if (m_selTool->accept(*track,vertex))
1538 {
1539 pass_looseprimary = true;
1540 }
1541
1542 int quality = 0;
1543 if (pass_looseprimary) quality += 1;
1544
1545 return quality;
1546
1547}
1548
1549
1550
1551void ZdcNtuple::writeTrack(const xAOD::TrackParticle* track, const xAOD::Vertex* vertex, int trk_index)
1552{
1553 t_trk_pt.push_back(track->pt());
1554 t_trk_eta.push_back(track->eta());
1555 t_trk_phi.push_back(track->phi());
1556 t_trk_e.push_back(track->e());
1557 t_trk_index.push_back(trk_index);
1558 t_trk_theta.push_back(track->theta());
1559 t_trk_charge.push_back(track->charge());
1560 t_trk_d0.push_back(track->d0());
1561 t_trk_z0.push_back(track->z0());
1562 t_trk_vz.push_back(track->vz());
1563
1564 float vtxz = -999.;
1565 t_trk_vtxz.push_back(vtxz);
1566
1567 static const SG::ConstAccessor<uint8_t> numberOfInnermostPixelLayerHitsAcc("numberOfInnermostPixelLayerHits");
1568 static const SG::ConstAccessor<uint8_t> expectInnermostPixelLayerHitAcc("expectInnermostPixelLayerHit");
1569 static const SG::ConstAccessor<uint8_t> numberOfNextToInnermostPixelLayerHitsAcc("numberOfNextToInnermostPixelLayerHits");
1570 static const SG::ConstAccessor<uint8_t> expectNextToInnermostPixelLayerHitAcc("expectNextToInnermostPixelLayerHit");
1571 static const SG::ConstAccessor<uint8_t> numberOfSCTHitsAcc("numberOfSCTHits");
1572 static const SG::ConstAccessor<uint8_t> numberOfPixelHitsAcc("numberOfPixelHits");
1573 static const SG::ConstAccessor<uint8_t> numberOfSCTDeadSensorsAcc("numberOfSCTDeadSensors");
1574 static const SG::ConstAccessor<uint8_t> numberOfPixelDeadSensorsAcc("numberOfPixelDeadSensors");
1575 static const SG::ConstAccessor<uint8_t> numberOfSCTHolesAcc("numberOfSCTHoles");
1576 static const SG::ConstAccessor<uint8_t> numberOfPixelHolesAcc("numberOfPixelHoles");
1577 static const SG::ConstAccessor<uint8_t> numberOfTRTHitsAcc("numberOfTRTHits");
1578 static const SG::ConstAccessor<uint8_t> numberOfTRTOutliersAcc("numberOfTRTOutliers");
1579
1580 t_trk_quality.push_back(trackQuality(track, vertex));
1581 t_trk_inPixHits.push_back(numberOfInnermostPixelLayerHitsAcc(*track));
1582 t_trk_exPixHits.push_back(expectInnermostPixelLayerHitAcc(*track));
1583 t_trk_ninPixHits.push_back(numberOfNextToInnermostPixelLayerHitsAcc(*track));
1584 t_trk_nexPixHits.push_back(expectNextToInnermostPixelLayerHitAcc(*track));
1585 t_trk_nSctHits.push_back(numberOfSCTHitsAcc(*track));
1586 t_trk_nPixHits.push_back(numberOfPixelHitsAcc(*track));
1587 t_trk_nSctDead.push_back(numberOfSCTDeadSensorsAcc(*track));
1588 t_trk_nPixDead.push_back(numberOfPixelDeadSensorsAcc(*track));
1589 t_trk_nSctHoles.push_back(numberOfSCTHolesAcc(*track));
1590 t_trk_nPixHoles.push_back(numberOfPixelHolesAcc(*track));
1591 t_trk_nTrtHits.push_back(numberOfTRTHitsAcc(*track));
1592 t_trk_nTrtOutliers.push_back(numberOfTRTOutliersAcc(*track));
1593
1594 float pixeldEdx = 0;
1595 track->summaryValue(pixeldEdx, xAOD::SummaryType::pixeldEdx);
1596 t_trk_pixeldEdx.push_back(pixeldEdx);
1597}
1598
1599
1601{
1602 ANA_MSG_DEBUG("processFCal: processing FCal");
1603
1604 t_fcalEt = 0.;
1605 t_fcalEtA = 0.;
1606 t_fcalEtC = 0.;
1607 t_fcalEtA_TT = 0.;
1608 t_fcalEtC_TT = 0.;
1609
1610 if (m_caloSums)
1611 {
1612 static const SG::ConstAccessor<std::string> SummaryAcc("Summary");
1613 for (const auto calosum : *m_caloSums)
1614 {
1615 const std::string name = SummaryAcc(*calosum);
1616 if (name == "FCal")
1617 {
1618 t_fcalEt = calosum->et();
1619 ANA_MSG_DEBUG("processFCal: fcalEt = " << t_fcalEt);
1620 }
1621
1622 if (name == "All")
1623 {
1624 t_totalEt = calosum->et();
1625 ANA_MSG_DEBUG("processFCal: totalEt = " << t_totalEt);
1626 }
1627 }
1628 }
1629
1630 t_fcalEtA = 0;
1631 t_fcalEtC = 0;
1632 t_totalEt24 = 0;
1633
1634 if (m_eventShapes)
1635 {
1636 for (const auto eventShape : *m_eventShapes)
1637 {
1638 int layer = eventShape->layer();
1639 float eta = eventShape->etaMin();
1640 float et = eventShape->et();
1641 if (layer == 21 || layer == 22 || layer == 23)
1642 {
1643 if (eta > 0) t_fcalEtA += et;
1644 if (eta < 0) t_fcalEtC += et;
1645 }
1646
1647 if (TMath::Abs(eta) < 2.4)
1648 {
1649 t_totalEt24 += et;
1650 }
1651 }
1652 }
1653
1654 t_L1ET = 0;
1655 t_L1ET24 = 0;
1656
1658 {
1659 t_L1ET = m_lvl1EnergySumRoI->energyT();
1660 //t_L1ET24 = m_lvl1EnergySumRoI->energyTRestricted(); // TBD when limited eta ET available
1661 }
1662
1663 return;
1664}
1665
1667{
1668
1669 float eta_min = 5;
1670 float eta_max = -5;
1671
1672 if (!m_caloClusters) return;
1673 for (const auto cl : *m_caloClusters)
1674 {
1675
1676 if (cl->pt() < m_gapPtMin) continue;
1677
1678 int etabin = h_TCSigCut->GetXaxis()->FindBin(cl->eta());
1679 if (etabin < 1 || etabin > h_TCSigCut->GetNbinsX()) continue;
1680 float sig_cut = h_TCSigCut->GetBinContent(etabin);
1681 float sig = cl->getMomentValue(xAOD::CaloCluster::CELL_SIGNIFICANCE);
1682 int cl_cell_sig_samp = static_cast<int>(cl->getMomentValue(xAOD::CaloCluster::CELL_SIG_SAMPLING));
1683
1684 ANA_MSG_VERBOSE ("gapclus: etabin " << etabin << " sig_cut=" << sig_cut << " sig=" << sig << " samp=" << cl_cell_sig_samp);
1685
1686 if (sig < sig_cut) continue;
1687
1688 if (cl_cell_sig_samp >= CaloSampling::TileBar0 && cl_cell_sig_samp <= CaloSampling::TileExt2) continue;
1689
1690 if (cl->eta() < eta_min) eta_min = cl->eta();
1691 if (cl->eta() > eta_max) eta_max = cl->eta();
1692
1693 }
1694
1695 t_edgeGapA = 4.9 - eta_max;
1696 t_edgeGapC = eta_min + 4.9;
1697 ANA_MSG_DEBUG("processGaps(): egA " << t_edgeGapA << " , egC " << t_edgeGapC);
1698
1699}
1700
1702{
1703 ANA_MSG_DEBUG("processMBTS: trying to process!");
1704 t_mbts_countA = 0;
1705 t_mbts_countC = 0;
1708 t_mbts_timeA = 0.;
1709 t_mbts_timeC = 0.;
1710 t_mbts_timeDiff = 0.;
1711
1712 if (m_mbtsInfo->size() > 0)
1713 {
1714 t_mbts_countA = m_mbtsInfo->at(0)->countA();
1715 t_mbts_countC = m_mbtsInfo->at(0)->countC();
1716 t_mbts_timeA = m_mbtsInfo->at(0)->timeA();
1717 t_mbts_timeC = m_mbtsInfo->at(0)->timeC();
1718 t_mbts_timeDiff = m_mbtsInfo->at(0)->timeDiff();
1719 }
1720 else
1721 {
1722 ANA_MSG_INFO("processMBTS: Warning: MBTS info empty!");
1723 }
1724
1725 for (int iside = 0; iside < 2; iside++)
1726 {
1727 for (int iin = 0; iin < 8; iin++)
1728 {
1729 t_mbts_in_e[iside][iin] = 0.;
1730 t_mbts_in_t[iside][iin] = 0.;
1731 t_T2mbts_in_e[iside][iin] = 0.;
1732 t_T2mbts_in_t[iside][iin] = 0.;
1733 }
1734 for (int iout = 0; iout < 4; iout++)
1735 {
1736 t_mbts_out_e[iside][iout] = 0.;
1737 t_mbts_out_t[iside][iout] = 0.;
1738 t_T2mbts_out_e[iside][iout] = 0.;
1739 t_T2mbts_out_t[iside][iout] = 0.;
1740 }
1741 }
1742
1743 ANA_MSG_DEBUG ("filling MBTS");
1744
1745 if (m_mbtsModules == 0)
1746 {
1747 ANA_MSG_INFO("processMBTS: no MBTS container?");
1748 return;
1749 }
1750
1751 for (const auto mbtsMod : *m_mbtsModules)
1752 {
1753 int iside = 1;
1754 if (mbtsMod->type() < 0) iside = 0.;
1755 float phibin = 0.;
1756 int iphibin = -1;
1757 if (mbtsMod->eta() > 3)
1758 {
1759 phibin = mbtsMod->phi() / (2 * TMath::Pi() / 8.) - 0.4;
1760 iphibin = static_cast<int>(phibin);
1761 if (iphibin < 0 || iphibin > 7)
1762 {
1763 ANA_MSG_INFO("processMBTS: MBTS has bad phi bin");
1764 continue;
1765 }
1766 t_mbts_in_e[iside][iphibin] = mbtsMod->e();
1767 t_mbts_in_t[iside][iphibin] = mbtsMod->time();
1768 }
1769 else
1770 {
1771 phibin = mbtsMod->phi() / (2 * TMath::Pi() / 4.) - 0.24;
1772 iphibin = static_cast<int>(phibin);
1773 if (iphibin < 0 || iphibin > 3)
1774 {
1775 ANA_MSG_INFO("processMBTS: MBTS has bad phi bin");
1776 continue;
1777 }
1778 t_mbts_out_e[iside][iphibin] = mbtsMod->e();
1779 t_mbts_out_t[iside][iphibin] = mbtsMod->time();
1780 }
1781 }
1782
1783 if (!m_trigT2MbtsBits) return;
1784
1785 for (const auto mbtsBits : *m_trigT2MbtsBits)
1786 {
1787 const std::vector<float>& energies = mbtsBits->triggerEnergies();
1788 const std::vector<float>& times = mbtsBits->triggerTimes();
1789 for (int imbts = 0; imbts < 32; imbts++)
1790 {
1791 int side = imbts / 16;
1792 int ring = (imbts - 16 * side) / 8;
1793 bool isInner = (ring == 0);
1794 int index = (imbts - 16 * side - ring * 8);
1795 if (!isInner)
1796 {
1797 if ((index % 2) != 0) continue; // skip odd out ring
1798 index /= 2;
1799 }
1800 int iside = (side == 0) ? 1 : 0; // code maps side 1 into first 16 bits and side -1 into second set
1801
1802 ANA_MSG_VERBOSE ("imbts=" << imbts << " isInner=" << isInner << " iside=" << iside << " index=" << index << " e=" << energies.at(imbts) << " t=" << times.at(imbts));
1803 if (isInner)
1804 {
1805 t_T2mbts_in_e[iside][index] = energies.at(imbts);
1806 t_T2mbts_in_t[iside][index] = times.at(imbts);
1807 if (TMath::Abs(times.at(imbts)) < 12.0 && energies.at(imbts) > 40 / 222.)
1808 {
1809 if (iside == 0) t_T2mbts_countCin++;
1810 if (iside == 1) t_T2mbts_countAin++;
1811 }
1812 }
1813 else
1814 {
1815 t_T2mbts_out_e[iside][index] = energies.at(imbts);
1816 t_T2mbts_out_t[iside][index] = times.at(imbts);
1817 }
1818 }
1819 }
1820
1821 return;
1822}
1823
1825{
1826 //t_nclus = 0;
1827
1828 t_cc_pt.clear();
1829 t_cc_eta.clear();
1830 t_cc_phi.clear();
1831 t_cc_e.clear();
1832 t_cc_raw_m.clear();
1833 t_cc_raw_eta.clear();
1834 t_cc_raw_phi.clear();
1835 t_cc_raw_e.clear();
1836 t_cc_raw_samp.clear();
1837 t_cc_layer.clear();
1838 t_cc_sig.clear();
1839
1840 t_nclus = m_caloClusters->size();
1841
1842 t_clusEt = 0;
1843 t_clusEtMax = -999;
1844 t_clusetaMax = 0;
1845 t_clusphiMax = 0;
1846
1847 for (const auto cluster : *m_caloClusters)
1848 {
1849 t_cc_pt.push_back(cluster->pt());
1850 t_cc_eta.push_back(cluster->eta());
1851 t_cc_phi.push_back(cluster->phi());
1852 t_cc_e.push_back(cluster->e());
1853 t_cc_raw_m.push_back(cluster->rawM());
1854 t_cc_raw_eta.push_back(cluster->rawEta());
1855 t_cc_raw_phi.push_back(cluster->rawPhi());
1856 t_cc_raw_e.push_back(cluster->rawE());
1857
1858 std::vector<float> energies;
1859
1860 for (size_t s = CaloSampling::PreSamplerB; s < CaloSampling::Unknown; s++ )
1861 {
1862 bool hasSample = cluster->hasSampling( (xAOD::CaloCluster::CaloSample) s );
1863 float e = 0;
1864 if (hasSample)
1865 {
1866 e = cluster->eSample( (xAOD::CaloCluster::CaloSample) s);
1867 }
1868 energies.push_back(e);
1869 }
1870 t_cc_raw_samp.push_back(energies);
1871
1872 float et = cluster->e() / TMath::CosH(cluster->eta());
1873 t_clusEt += et;
1874 if (et > t_clusEtMax)
1875 {
1876 t_clusEtMax = et;
1877 t_clusetaMax = cluster->eta();
1878 t_clusphiMax = cluster->phi();
1879 }
1880
1881 double cell_sig = 0;
1882 if (!cluster->retrieveMoment(xAOD::CaloCluster::CELL_SIGNIFICANCE, cell_sig)) {ANA_MSG_DEBUG("processClusters() : No CELL_SIGNIFICANCE!");}
1883 t_cc_sig.push_back(cell_sig);
1884 double cell_layer = 0;
1885 if (!cluster->retrieveMoment(xAOD::CaloCluster::CELL_SIG_SAMPLING, cell_layer)) {ANA_MSG_DEBUG("processClusters() : No CELL_SIG_SAMPLING!");}
1886 t_cc_layer.push_back(static_cast<int>(cell_layer));
1887 //t_nclus++;
1888 }
1889
1890 if ( (!enableClusters) || (t_ntrk >= trackLimit) ) // if disabled or if too many tracks
1891 {
1892 t_cc_pt.clear();
1893 t_cc_eta.clear();
1894 t_cc_phi.clear();
1895 t_cc_e.clear();
1896 t_cc_layer.clear();
1897 t_cc_sig.clear();
1898 }
1899 else
1900 {
1901 ANA_MSG_DEBUG("processClusters(): keeping clusters");
1902 }
1903 return;
1904}
1905
1907
1908 proton_pt.clear();
1909 proton_eta.clear();
1910 proton_phi.clear();
1911 proton_e.clear();
1912 proton_side.clear();
1913 proton_eLoss.clear();
1914 proton_t.clear();
1915
1916 proton_track_stationID.clear();
1917 proton_track_nClusters.clear();
1918 proton_track_xLocal.clear();
1919 proton_track_yLocal.clear();
1920 proton_track_zLocal.clear();
1921 proton_track_xSlope.clear();
1922 proton_track_ySlope.clear();
1923
1924 proton_track_stationID.resize(m_afpProtons->size(), std::vector<int>(2));
1925 proton_track_nClusters.resize(m_afpProtons->size(), std::vector<int>(2));
1926 proton_track_xLocal.resize(m_afpProtons->size(), std::vector<float>(2));
1927 proton_track_yLocal.resize(m_afpProtons->size(), std::vector<float>(2));
1928 proton_track_zLocal.resize(m_afpProtons->size(), std::vector<float>(2));
1929 proton_track_xSlope.resize(m_afpProtons->size(), std::vector<float>(2));
1930 proton_track_ySlope.resize(m_afpProtons->size(), std::vector<float>(2));
1931
1932 nProtons = 0;
1933
1934 for(const auto * proton: *m_afpProtons){
1935
1936 proton_pt.push_back(proton->pt());
1937 proton_eta.push_back(proton->eta());
1938 proton_phi.push_back(proton->phi());
1939 proton_e.push_back(proton->e());
1940 proton_side.push_back(proton->side());
1941
1942 proton_eLoss.push_back((6800.-proton->e())/6800.);
1943 p_scat.SetPtEtaPhiE(proton->pt(), proton->eta(), proton->phi(), proton->e());
1944 (signbit(proton->eta())) ? p_beam.SetPxPyPzE(0.0, 0.0, -6800.0, 6800.0) : p_beam.SetPxPyPzE(0.0, 0.0, 6800.0,\
1945 6800.0);
1946
1947 proton_t.push_back( (p_beam - p_scat)*(p_beam - p_scat));
1948
1949 for(int i=0; i< int(proton->nTracks()); i++){
1950
1951 proton_track_stationID.at(nProtons).at(i) = proton->track(i)->stationID();
1952 proton_track_nClusters.at(nProtons).at(i) = proton->track(i)->nClusters();
1953 proton_track_xLocal.at(nProtons).at(i) = proton->track(i)->xLocal();
1954 proton_track_yLocal.at(nProtons).at(i) = proton->track(i)->yLocal();
1955 proton_track_zLocal.at(nProtons).at(i) = proton->track(i)->zLocal();
1956 proton_track_xSlope.at(nProtons).at(i) = proton->track(i)->xSlope();
1957 proton_track_ySlope.at(nProtons).at(i) = proton->track(i)->ySlope();
1958
1959 }
1960
1961 nProtons++;
1962 }
1963
1964 return;
1965}
1966
1968{
1969 uint32_t passbits = 0;
1970
1971 if (!m_isMC)
1972 {
1973 if (useGRL)
1974 {
1975 if (!m_grl->passRunLB(*m_eventInfo)) {
1976 passbits += 1; // UPC GRL
1977 }
1978 }
1979
1980 /*
1981 if(!m_grl_mb->passRunLB(*m_eventInfo)){
1982 passbits += 4; // MB GRL
1983 }
1984 */
1985
1989 || (m_eventInfo->isEventFlagBitSet(xAOD::EventInfo::Core, 18) ) )
1990 {
1991 passbits += 2;
1992 } // end if event flags check
1993 } // end if the event is data
1994
1995 return passbits;
1996}
1997
1999{
2000 if (!enableTrigger) return;
2001
2002 m_outputTree = tree( "zdcTree" );
2003 ANA_MSG_INFO("setupTriggerHistos(): Setting up trigger histos and ntuple = " << m_outputTree);
2004
2005 std::vector<std::string> triggers;
2006 std::vector<std::string> rerunTriggers;
2007 bool zdc_triggers = true;
2008
2009 // ZDC triggers
2010 if (zdc_triggers)
2011 {
2012 if (zdcCalib) // lists for calibration data
2013 {
2014 if (lhcf2022)
2015 {
2016 triggers.push_back("HLT_noalg_ZDCPEB_L1LHCF");
2017 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_OR");
2018 }
2019
2020 if (pbpb2023)
2021 {
2022 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_OR");
2023 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_OR_EMPTY");
2024 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_OR_UNPAIRED_NONISO");
2025 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_A_C");
2026 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_A_C_EMPTY");
2027 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_A_C_UNPAIRED_NONISO");
2028 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_A");
2029 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_A_EMPTY");
2030 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_A_UNPAIRED_NONISO");
2031 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_C");
2032 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_C_EMPTY");
2033 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_C_UNPAIRED_NONISO");
2034 }
2035 }
2036 else // lists for physics data
2037 {
2038 if (lhcf2022)
2039 {
2040 triggers.push_back("HLT_noalg_L1LHCF");
2041 }
2042 if (lhcf2022afp)
2043 {
2044 triggers.push_back("HLT_noalg_AFPPEB_L1AFP_A");
2045 triggers.push_back("HLT_noalg_AFPPEB_L1AFP_C");
2046 }
2047 if (lhcf2022zdc)
2048 {
2049 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_OR");
2050 triggers.push_back("HLT_noalg_ZDCPEB_L1LHCF");
2051 triggers.push_back("HLT_noalg_L1ZDC_OR");
2052 triggers.push_back("HLT_noalg_L1ZDC_XOR_E2");
2053 triggers.push_back("HLT_noalg_L1ZDC_XOR_E1_E3");
2054 triggers.push_back("HLT_noalg_L1ZDC_A_AND_C");
2055 triggers.push_back("HLT_mb_sptrk_L1ZDC_OR");
2056 triggers.push_back("HLT_mb_sptrk_L1ZDC_XOR_E2");
2057 triggers.push_back("HLT_mb_sptrk_L1ZDC_XOR_E1_E3");
2058 triggers.push_back("HLT_mb_sptrk_L1ZDC_A_AND_C");
2059 triggers.push_back("HLT_mb_sp100_trk30_hmt_L1ZDC_XOR_E2");
2060 triggers.push_back("HLT_mb_sp100_trk30_hmt_L1ZDC_XOR_E1_E3");
2061 triggers.push_back("HLT_mb_sp100_trk30_hmt_L1ZDC_A_AND_C");
2062 }
2063 }
2064 }
2065
2066 //char name[50];
2067 ANA_MSG_INFO("Adding trigger branches!");
2068
2069 int ic = 0;
2070 for (auto &trig : triggers)
2071 {
2072 const Trig::ChainGroup* cg = m_trigDecisionTool->getChainGroup(trig);
2073 if (cg->getListOfTriggers().size())
2074 {
2075 ANA_MSG_INFO("setupTriggerHistos(): Trigger found = " << trig.c_str() << " bit " << ic);
2076 }
2077 else
2078 {
2079 ANA_MSG_INFO("setupTriggerHistos(): Trigger NOT found = " << trig.c_str() << " bit " << ic);
2080 }
2081 m_chainGroups.push_back(cg);
2082 // force all triggers to show up in tree
2083 TString bname(trig.c_str());
2084 m_outputTree->Branch(bname, &(t_decisions[ic]), bname + "/O");
2085 m_outputTree->Branch("ps_" + bname, &(t_prescales[ic]), "ps_" + bname + "/F");
2086 ic++;
2087 }
2088
2089 ANA_MSG_INFO( "triggers = " << triggers.size() << " chains = " << m_chainGroups.size() );
2090
2091 int irc = 0;
2092 ANA_MSG_INFO("Adding rerun trigger branches!");
2093 for (auto &trig : rerunTriggers)
2094 {
2095 const Trig::ChainGroup* cg = m_trigDecisionTool->getChainGroup(trig);
2096 m_rerunChainGroups.push_back(cg);
2097 if (cg->getListOfTriggers().size())
2098 {
2099 ANA_MSG_INFO("setupTriggerHistos(): Rerun trigger found = " << trig.c_str() << " bit " << irc);
2100 }
2101 else
2102 {
2103 ANA_MSG_INFO("setupTriggerHistos(): Rerun trigger NOT found = " << trig.c_str() << " bit " << irc);
2104 }
2105 // force all rerun triggers to show up in tree
2106 TString bname(trig.c_str());
2107 m_outputTree->Branch(bname, &(t_rerunDecisions[irc]), bname + "/O");
2108 irc++;
2109 }
2110
2111 // trigger matching flags for electrons and muons
2112
2113 m_setupTrigHist = true;
2114
2115 ANA_MSG_INFO("setupTriggerHistos(): Finished setting up trigger");
2116
2117}
2118
2119// from TrigMuonMatching
2120double ZdcNtuple::dR(const double eta1, const double phi1, const double eta2, const double phi2)
2121{
2122 double deta = std::abs(eta1 - eta2);
2123 double dphi = std::abs(phi1 - phi2) < TMath::Pi() ? std::abs(phi1 - phi2) : 2 * TMath::Pi() - std::abs(phi1 - phi2);
2124 return std::sqrt(deta * deta + dphi * dphi);
2125}
2126
2127
2128StatusCode ZdcNtuple :: finalize ()
2129{
2130 // This method is the mirror image of initialize(), meaning it gets
2131 // called after the last event has been processed on the worker node
2132 // and allows you to finish up any objects you created in
2133 // initialize() before they are written to disk. This is actually
2134 // fairly rare, since this happens separately for each worker node.
2135 // Most of the time you want to do your post-processing on the
2136 // submission node after all your histogram outputs have been
2137 // merged. This is different from histFinalize() in that it only
2138 // gets called on worker nodes that processed input events.
2139
2140
2141 return StatusCode::SUCCESS;
2142}
Scalar eta() const
pseudorapidity method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
Helper class to provide constant type-safe access to aux data.
#define ANA_MSG_INFO(xmsg)
Macro printing info messages.
#define ANA_MSG_ERROR(xmsg)
Macro printing error messages.
#define ANA_MSG_WARNING(xmsg)
Macro printing warning messages.
#define ANA_MSG_VERBOSE(xmsg)
Macro printing verbose messages.
#define ANA_MSG_DEBUG(xmsg)
Macro printing debug messages.
#define ANA_CHECK(EXP)
check whether the given expression was successful
Define enumerations for event-level ZDC data.
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
bool msgLvl(const MSG::Level lvl) const
StatusCode book(const TH1 &hist, const std::string &tDir="", const std::string &stream="")
Simplify the booking and registering (into THistSvc) of histograms.
AnaAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
constructor with parameters
Helper class to provide constant type-safe access to aux data.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
const_pointer_type ptr()
Dereference the pointer.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
std::vector< std::string > getListOfTriggers() const
std::vector< float > t_cc_raw_phi
Definition ZdcNtuple.h:399
const xAOD::VertexContainer * m_primaryVertices
Definition ZdcNtuple.h:124
float t_yCentroidPreGeomCorPreAvgSubtr[2]
Definition ZdcNtuple.h:274
float t_cosDeltaReactionPlaneAngle
Definition ZdcNtuple.h:282
bool reprocZdc
Definition ZdcNtuple.h:82
float t_mbts_timeDiff
Definition ZdcNtuple.h:346
std::vector< double > proton_t
Definition ZdcNtuple.h:417
float t_ZdcModuleFitT0[2][4]
Definition ZdcNtuple.h:221
std::vector< const Trig::ChainGroup * > m_rerunChainGroups
Definition ZdcNtuple.h:140
float t_yCentroid[2]
Definition ZdcNtuple.h:278
std::vector< float > t_cc_pt
Definition ZdcNtuple.h:391
TLorentzVector p_scat
Definition ZdcNtuple.h:427
const xAOD::MBTSModuleContainer * m_mbtsModules
Definition ZdcNtuple.h:122
float t_RpdChannelPileupStretchedExpFitParamErrs[2][16][3]
Definition ZdcNtuple.h:255
SG::ReadHandleKey< McEventCollection > m_mcEventCollectionName
Definition ZdcNtuple.h:113
short t_ZdcStatus[2]
Definition ZdcNtuple.h:197
std::vector< float > t_ZdcTruthParticlePy
Definition ZdcNtuple.h:212
float t_RpdChannelAmplitudeCalib[2][16]
Definition ZdcNtuple.h:259
uint32_t t_ntrk
Definition ZdcNtuple.h:362
float t_ZdcTruthEM[2]
Definition ZdcNtuple.h:204
float t_totalEt
Definition ZdcNtuple.h:320
unsigned int m_lastRunNumber
Definition ZdcNtuple.h:52
ZdcInjPulserAmpMap::Token m_injMapRunToken
Definition ZdcNtuple.h:53
float t_RPDSubtrAmpSum[2]
Definition ZdcNtuple.h:272
unsigned int t_RpdSideStatus[2]
Definition ZdcNtuple.h:265
float t_ZdcModuleChisqLGRefit[2][4]
Definition ZdcNtuple.h:242
bool enableOutputTree
Definition ZdcNtuple.h:59
float t_clusphiMax
Definition ZdcNtuple.h:406
float t_ZdcModuleT0SubLGRefit[2][4]
Definition ZdcNtuple.h:241
bool pbpb2023
Definition ZdcNtuple.h:88
bool flipDelay
Definition ZdcNtuple.h:81
unsigned short t_ZdcLucrodTriggerAmpLG[2][4]
Definition ZdcNtuple.h:232
bool zdcLaser
Definition ZdcNtuple.h:75
float t_RpdChannelAmplitude[2][16]
Definition ZdcNtuple.h:258
std::vector< uint8_t > t_trk_nPixHoles
Definition ZdcNtuple.h:379
float t_puvxz
Definition ZdcNtuple.h:292
std::vector< uint8_t > t_trk_nSctHoles
Definition ZdcNtuple.h:380
bool trackLimitReject
Definition ZdcNtuple.h:80
uint16_t t_mbts_countA
Definition ZdcNtuple.h:342
float t_fcalEtC
Definition ZdcNtuple.h:314
void processMCEventCollection()
bool lhcf2022afp
Definition ZdcNtuple.h:87
unsigned short t_ZdcLucrodTriggerSideAmp[2]
Definition ZdcNtuple.h:200
unsigned int t_RpdModuleTruthNphotons[2][16]
Definition ZdcNtuple.h:266
const xAOD::ForwardEventInfoContainer * m_mbtsInfo
Definition ZdcNtuple.h:121
bool enableCalo
Definition ZdcNtuple.h:64
bool doZdcCalib
Definition ZdcNtuple.h:94
std::vector< int > t_vx_trk_index
Definition ZdcNtuple.h:287
double dR(const double eta1, const double phi1, const double eta2, const double phi2)
float t_reactionPlaneAngle[2]
Definition ZdcNtuple.h:281
std::vector< std::vector< float > > proton_track_ySlope
Definition ZdcNtuple.h:423
void processZdcNtupleFromModules()
unsigned int t_ZdcModuleMask
Definition ZdcNtuple.h:198
std::vector< float > t_trk_vz
Definition ZdcNtuple.h:370
void processInDet()
std::vector< float > t_trk_pt
Definition ZdcNtuple.h:363
uint32_t t_eventNumber
Definition ZdcNtuple.h:152
float t_RpdChannelPileupExpFitParams[2][16][2]
Definition ZdcNtuple.h:252
bool lhcf2022zdc
Definition ZdcNtuple.h:86
float t_totalEt24
Definition ZdcNtuple.h:322
uint16_t t_raw32[2][4][2][2][32]
Definition ZdcNtuple.h:354
const xAOD::EventInfo * m_eventInfo
Definition ZdcNtuple.h:115
float t_RpdChannelMaxADCCalib[2][16]
Definition ZdcNtuple.h:261
std::vector< int > t_trk_index
Definition ZdcNtuple.h:374
bool enableID
Definition ZdcNtuple.h:63
float t_clusEtMax
Definition ZdcNtuple.h:404
std::vector< std::vector< float > > proton_track_xLocal
Definition ZdcNtuple.h:419
float t_T2mbts_in_e[2][8]
Definition ZdcNtuple.h:182
uint16_t t_raw7[2][4][2][2][7]
Definition ZdcNtuple.h:351
float t_vInj
Definition ZdcNtuple.h:155
void processClusters()
bool slimmed
Definition ZdcNtuple.h:56
std::vector< const Trig::ChainGroup * > m_chainGroups
Definition ZdcNtuple.h:139
std::vector< float > t_cc_raw_e
Definition ZdcNtuple.h:400
float t_mbts_in_t[2][8]
Definition ZdcNtuple.h:179
std::vector< int16_t > t_vtx_ntrk
Definition ZdcNtuple.h:307
float t_ZdcAmpErr[2]
Definition ZdcNtuple.h:191
float t_vxcov[6]
Definition ZdcNtuple.h:290
float t_RpdChannelMaxADC[2][16]
Definition ZdcNtuple.h:260
float t_ZdcModuleCalibTime[2][4]
Definition ZdcNtuple.h:225
int m_eventCounter
Definition ZdcNtuple.h:135
uint32_t acceptEvent()
float t_ZdcModulePresample[2][4]
Definition ZdcNtuple.h:229
float t_ZdcNLEnergy[2]
Definition ZdcNtuple.h:194
std::vector< float > t_vtx_sumpt2_all
Definition ZdcNtuple.h:306
const xAOD::HIEventShapeContainer * m_caloSums
Definition ZdcNtuple.h:119
std::vector< int16_t > t_vtx_ntrk_all
Definition ZdcNtuple.h:305
float t_xRowCentroid[2][4]
Definition ZdcNtuple.h:279
unsigned int t_RpdChannelMaxSample[2][16]
Definition ZdcNtuple.h:262
std::vector< float > t_cc_raw_eta
Definition ZdcNtuple.h:398
float t_actIntPerCrossing
Definition ZdcNtuple.h:162
uint64_t t_trigger
Definition ZdcNtuple.h:169
bool t_centroidDecorationsAvailable
Definition ZdcNtuple.h:268
std::vector< std::vector< int16_t > > t_vtx_trk_index
Definition ZdcNtuple.h:309
std::string grlFilename
Definition ZdcNtuple.h:58
std::vector< float > t_trk_eta
Definition ZdcNtuple.h:364
int t_puvxntrk
Definition ZdcNtuple.h:293
TLorentzVector p_beam
Definition ZdcNtuple.h:426
uint16_t t_raw15[2][4][2][2][15]
Definition ZdcNtuple.h:352
bool lhcf2022
Definition ZdcNtuple.h:85
std::vector< float > t_cc_eta
Definition ZdcNtuple.h:392
TH1 * h_TCSigCut
Definition ZdcNtuple.h:339
uint16_t t_T2mbts_countCin
Definition ZdcNtuple.h:349
float t_xCentroidPreAvgSubtr[2]
Definition ZdcNtuple.h:275
float t_ZdcTrigEff[2]
Definition ZdcNtuple.h:199
float t_ZdcModuleMinDeriv2nd[2][4]
Definition ZdcNtuple.h:228
std::vector< float > t_trk_vtxz
Definition ZdcNtuple.h:371
float t_RPDChannelSubtrAmp[2][16]
Definition ZdcNtuple.h:271
float t_ZdcNLEnergyErr[2]
Definition ZdcNtuple.h:195
uint32_t t_passBits
Definition ZdcNtuple.h:157
float t_ZdcModuleChisq[2][4]
Definition ZdcNtuple.h:222
std::vector< int8_t > t_vtx_type
Definition ZdcNtuple.h:301
float t_T2mbts_out_e[2][4]
Definition ZdcNtuple.h:183
const xAOD::CaloClusterContainer * m_caloClusters
Definition ZdcNtuple.h:125
std::vector< int > t_cc_layer
Definition ZdcNtuple.h:396
uint8_t t_rpdDecodingError
Definition ZdcNtuple.h:167
float t_ZdcModuleAmpError[2][4]
Definition ZdcNtuple.h:226
float t_ZdcModuleTime[2][4]
Definition ZdcNtuple.h:219
ToolHandle< InDet::IInDetTrackSelectionTool > m_selTool
Definition ZdcNtuple.h:106
PublicToolHandle< Trig::TrigDecisionTool > m_trigDecisionTool
Definition ZdcNtuple.h:103
int t_nstrong
Definition ZdcNtuple.h:295
std::vector< float > t_trk_theta
Definition ZdcNtuple.h:367
std::vector< uint8_t > t_trk_ninPixHits
Definition ZdcNtuple.h:385
uint16_t t_T2mbts_countAin
Definition ZdcNtuple.h:348
bool m_setupTrigHist
Definition ZdcNtuple.h:137
uint32_t t_tav[16]
Definition ZdcNtuple.h:187
std::string zdcConfig
Definition ZdcNtuple.h:95
std::vector< float > t_cc_e
Definition ZdcNtuple.h:394
bool zdcOnly
Definition ZdcNtuple.h:77
float t_mbts_timeC
Definition ZdcNtuple.h:345
float t_ZdcModuleAmpCorrLGRefit[2][4]
Definition ZdcNtuple.h:239
std::vector< float > t_cc_phi
Definition ZdcNtuple.h:393
uint32_t t_nclus
Definition ZdcNtuple.h:390
uint32_t t_tbp[16]
Definition ZdcNtuple.h:188
void processMBTS()
uint16_t t_rpdRaw[2][16][24]
Definition ZdcNtuple.h:357
std::vector< std::vector< int > > proton_track_nClusters
Definition ZdcNtuple.h:424
std::vector< int > proton_side
Definition ZdcNtuple.h:415
uint32_t t_timeStamp
Definition ZdcNtuple.h:159
float t_ZdcModuleTruthTotal[2][7]
Definition ZdcNtuple.h:244
float t_xCentroidPreGeomCorPreAvgSubtr[2]
Definition ZdcNtuple.h:273
float t_ZdcTruthInvis[2]
Definition ZdcNtuple.h:203
float t_ZdcModuleCalibAmp[2][4]
Definition ZdcNtuple.h:224
float t_ZdcModuleFitAmp[2][4]
Definition ZdcNtuple.h:220
float t_fcalEtA
Definition ZdcNtuple.h:313
float t_ZdcModuleAmpLGRefit[2][4]
Definition ZdcNtuple.h:238
float t_vx[3]
Definition ZdcNtuple.h:285
float t_ZdcModulePeakADCLG[2][4]
Definition ZdcNtuple.h:237
unsigned int t_ZdcModuleStatus[2][4]
Definition ZdcNtuple.h:223
float t_mbts_out_t[2][4]
Definition ZdcNtuple.h:180
float t_L1ET24
Definition ZdcNtuple.h:143
float t_ZdcModuleT0LGRefit[2][4]
Definition ZdcNtuple.h:240
void processGaps()
bool enableZDC
Definition ZdcNtuple.h:89
std::vector< uint8_t > t_trk_nPixDead
Definition ZdcNtuple.h:377
std::vector< int8_t > t_trk_charge
Definition ZdcNtuple.h:372
float t_ZdcModuleTruthNonEM[2][7]
Definition ZdcNtuple.h:247
int t_vxnminbias
Definition ZdcNtuple.h:297
float t_ZdcModuleAmp[2][4]
Definition ZdcNtuple.h:218
float t_fcalEtC_TT
Definition ZdcNtuple.h:316
uint32_t t_zdcEventInfoErrorWord
Definition ZdcNtuple.h:164
bool enableTrigger
Definition ZdcNtuple.h:61
float t_ZdcEnergy[2]
Definition ZdcNtuple.h:192
std::vector< std::vector< float > > t_cc_raw_samp
Definition ZdcNtuple.h:401
float t_RpdChannelPileupFrac[2][16]
Definition ZdcNtuple.h:264
bool enableRPDAmp
Definition ZdcNtuple.h:91
std::vector< float > t_ZdcTruthParticlePosy
Definition ZdcNtuple.h:208
std::vector< int16_t > t_trk_quality
Definition ZdcNtuple.h:373
bool enableTracks
Definition ZdcNtuple.h:66
std::vector< uint8_t > t_trk_nSctHits
Definition ZdcNtuple.h:376
uint16_t t_rpdRaw32[2][16][32]
Definition ZdcNtuple.h:358
float t_clusEt
Definition ZdcNtuple.h:403
std::vector< float > t_cc_raw_m
Definition ZdcNtuple.h:397
const xAOD::TrigT2MbtsBitsContainer * m_trigT2MbtsBits
Definition ZdcNtuple.h:123
std::vector< float > t_trk_d0
Definition ZdcNtuple.h:368
size_t nsamplesZdc
Definition ZdcNtuple.h:84
const xAOD::AFPProtonContainer * m_afpProtons
Definition ZdcNtuple.h:130
void writeTrack(const xAOD::TrackParticle *, const xAOD::Vertex *vertex, int)
std::vector< std::vector< float > > proton_track_zLocal
Definition ZdcNtuple.h:421
void processEventInfo()
float t_RpdChannelPileupExpFitParamErrs[2][16][2]
Definition ZdcNtuple.h:254
void processFCal()
std::vector< float > t_trk_z0
Definition ZdcNtuple.h:369
bool t_rerunDecisions[200]
Definition ZdcNtuple.h:175
float t_avgIntPerCrossing
Definition ZdcNtuple.h:161
std::vector< float > t_vtx_x
Definition ZdcNtuple.h:302
float t_ZdcTruthTotal[2]
Definition ZdcNtuple.h:202
const xAOD::TrackParticleContainer * m_trackParticles
Definition ZdcNtuple.h:126
float t_prescales[200]
Definition ZdcNtuple.h:173
bool processTriggerDecision()
float t_ZdcTime[2]
Definition ZdcNtuple.h:196
float t_T2mbts_in_t[2][8]
Definition ZdcNtuple.h:184
std::vector< float > t_vtx_y
Definition ZdcNtuple.h:303
uint32_t t_timeStampNSOffset
Definition ZdcNtuple.h:160
std::vector< float > t_vtx_z
Definition ZdcNtuple.h:304
std::vector< uint8_t > t_trk_nTrtHits
Definition ZdcNtuple.h:381
std::vector< double > proton_pt
Definition ZdcNtuple.h:411
int t_vxtype
Definition ZdcNtuple.h:288
std::vector< int > t_ZdcTruthParticlePid
Definition ZdcNtuple.h:215
SG::ReadHandleKey< xAOD::ZdcModuleContainer > m_zdcSumContainerName
Definition ZdcNtuple.h:111
unsigned short t_ZdcLucrodTriggerAmp[2][4]
Definition ZdcNtuple.h:231
void processVInjInfo()
float t_ZdcModuleBkgdMaxFraction[2][4]
Definition ZdcNtuple.h:227
asg::AnaToolHandle< IGoodRunsListSelectionTool > m_grl
Definition ZdcNtuple.h:104
unsigned int t_ZdcModuleTruthNphotons[2][7]
Definition ZdcNtuple.h:249
int nProtons
Definition ZdcNtuple.h:410
std::vector< std::vector< float > > proton_track_yLocal
Definition ZdcNtuple.h:420
std::vector< float > t_vtx_sumpt2
Definition ZdcNtuple.h:308
const xAOD::TrigDecision * m_trigDecision
Definition ZdcNtuple.h:118
std::vector< uint8_t > t_trk_nSctDead
Definition ZdcNtuple.h:378
float t_RpdChannelPileupStretchedExpFitMSE[2][16]
Definition ZdcNtuple.h:257
void processProtons()
std::vector< float > t_trk_pixeldEdx
Definition ZdcNtuple.h:387
float t_yCentroidPreAvgSubtr[2]
Definition ZdcNtuple.h:276
float t_xCentroid[2]
Definition ZdcNtuple.h:277
int t_pvindex
Definition ZdcNtuple.h:289
float t_puvxsumpt
Definition ZdcNtuple.h:294
std::vector< double > proton_eta
Definition ZdcNtuple.h:412
float t_RpdChannelBaseline[2][16]
Definition ZdcNtuple.h:251
std::vector< float > t_ZdcTruthParticlePx
Definition ZdcNtuple.h:211
std::vector< float > t_trk_phi
Definition ZdcNtuple.h:365
bool enableOutputSamples
Definition ZdcNtuple.h:60
float t_mbts_in_e[2][8]
Definition ZdcNtuple.h:177
std::vector< double > proton_eLoss
Definition ZdcNtuple.h:416
uint16_t t_raw24[2][4][2][2][24]
Definition ZdcNtuple.h:353
bool enableCentroid
Definition ZdcNtuple.h:92
float t_ZdcModulePreSampleAmp[2][4]
Definition ZdcNtuple.h:230
float t_mbts_timeA
Definition ZdcNtuple.h:344
uint16_t t_mbts_countC
Definition ZdcNtuple.h:343
unsigned int t_centroidStatus[2]
Definition ZdcNtuple.h:270
float t_clusetaMax
Definition ZdcNtuple.h:405
float t_ZdcTruthNonEM[2]
Definition ZdcNtuple.h:205
uint8_t t_bunchGroup
Definition ZdcNtuple.h:156
uint32_t t_runNumber
Definition ZdcNtuple.h:151
unsigned int zdcLowGainMode
Definition ZdcNtuple.h:78
float t_edgeGapC
Definition ZdcNtuple.h:327
int t_vxnlooseprimary
Definition ZdcNtuple.h:296
bool enableRPD
Definition ZdcNtuple.h:90
float t_ZdcAmp[2]
Definition ZdcNtuple.h:190
int t_vxngoodmuon
Definition ZdcNtuple.h:298
TTree * m_outputTree
Definition ZdcNtuple.h:150
bool zdcInj
Definition ZdcNtuple.h:76
size_t trackLimit
Definition ZdcNtuple.h:79
const xAOD::EnergySumRoI * m_lvl1EnergySumRoI
Definition ZdcNtuple.h:127
float t_RpdChannelPileupExpFitMSE[2][16]
Definition ZdcNtuple.h:256
std::vector< std::vector< int > > proton_track_stationID
Definition ZdcNtuple.h:418
SG::ReadHandleKey< xAOD::ZdcModuleContainer > m_zdcModuleContainerName
Definition ZdcNtuple.h:109
float t_totalEt24_TTsum
Definition ZdcNtuple.h:323
float t_ZdcTruthEscaped[2]
Definition ZdcNtuple.h:206
float t_ZdcModulePeakADCHG[2][4]
Definition ZdcNtuple.h:236
std::shared_ptr< ZdcInjPulserAmpMap > m_zdcInjPulserAmpMap
Definition ZdcNtuple.h:132
std::vector< float > t_ZdcTruthParticleEnergy
Definition ZdcNtuple.h:214
std::vector< double > proton_e
Definition ZdcNtuple.h:414
bool useGRL
Definition ZdcNtuple.h:57
float t_fcalEtA_TT
Definition ZdcNtuple.h:315
float t_vxsumpt2
Definition ZdcNtuple.h:291
uint32_t t_bcid
Definition ZdcNtuple.h:154
float t_ZdcEnergyErr[2]
Definition ZdcNtuple.h:193
float t_ZdcModuleTruthEM[2][7]
Definition ZdcNtuple.h:246
std::vector< float > t_ZdcTruthParticleTime
Definition ZdcNtuple.h:210
std::vector< uint8_t > t_trk_nPixHits
Definition ZdcNtuple.h:375
uint32_t t_extendedLevel1ID
Definition ZdcNtuple.h:158
unsigned short t_ZdcLucrodTriggerSideAmpLG[2]
Definition ZdcNtuple.h:201
unsigned int t_RpdChannelStatus[2][16]
Definition ZdcNtuple.h:263
float t_L1ET
Definition ZdcNtuple.h:142
uint16_t t_raw40[2][4][2][2][40]
Definition ZdcNtuple.h:355
std::string auxSuffix
Definition ZdcNtuple.h:83
bool writeOnlyTriggers
Definition ZdcNtuple.h:62
std::vector< float > t_ZdcTruthParticlePosz
Definition ZdcNtuple.h:209
char t_centroidEventValid
Definition ZdcNtuple.h:269
bool t_decisions[200]
Definition ZdcNtuple.h:174
bool enableClusters
Definition ZdcNtuple.h:65
asg::AnaToolHandle< ZDC::IZdcAnalysisTool > m_zdcAnalysisTool
Definition ZdcNtuple.h:105
float t_totalEt_TTsum
Definition ZdcNtuple.h:321
std::vector< float > t_ZdcTruthParticlePz
Definition ZdcNtuple.h:213
uint16_t t_rpdRaw40[2][16][40]
Definition ZdcNtuple.h:359
uint32_t t_trigger_TBP
Definition ZdcNtuple.h:170
std::vector< std::vector< float > > proton_track_xSlope
Definition ZdcNtuple.h:422
int t_vxntrk
Definition ZdcNtuple.h:286
bool m_isMC
Definition ZdcNtuple.h:136
void setupTriggerHistos()
std::vector< float > t_ZdcTruthParticlePosx
Definition ZdcNtuple.h:207
int trackQuality(const xAOD::TrackParticle *tp, const xAOD::Vertex *vertex)
float t_yColCentroid[2][4]
Definition ZdcNtuple.h:280
float t_ZdcModuleTruthInvis[2][7]
Definition ZdcNtuple.h:245
std::vector< uint8_t > t_trk_nexPixHits
Definition ZdcNtuple.h:386
float m_gapPtMin
Definition ZdcNtuple.h:328
float t_ZdcModuleMaxADCHG[2][4]
Definition ZdcNtuple.h:234
std::vector< float > t_cc_sig
Definition ZdcNtuple.h:395
std::vector< double > proton_phi
Definition ZdcNtuple.h:413
std::vector< uint8_t > t_trk_inPixHits
Definition ZdcNtuple.h:383
float t_T2mbts_out_t[2][4]
Definition ZdcNtuple.h:185
float t_fcalEt
Definition ZdcNtuple.h:312
uint8_t t_zdcEventInfoError
Definition ZdcNtuple.h:163
std::vector< int > t_ZdcTruthParticleStatus
Definition ZdcNtuple.h:216
float t_RpdChannelPileupStretchedExpFitParams[2][16][3]
Definition ZdcNtuple.h:253
float t_ZdcModuleMaxADCLG[2][4]
Definition ZdcNtuple.h:235
std::vector< uint8_t > t_trk_nTrtOutliers
Definition ZdcNtuple.h:382
uint32_t t_lumiBlock
Definition ZdcNtuple.h:153
float t_edgeGapA
Definition ZdcNtuple.h:326
bool zdcCalib
Definition ZdcNtuple.h:74
std::vector< float > t_trk_e
Definition ZdcNtuple.h:366
const xAOD::HIEventShapeContainer * m_eventShapes
Definition ZdcNtuple.h:120
std::vector< uint8_t > t_trk_exPixHits
Definition ZdcNtuple.h:384
float t_ZdcModuleMaxADC[2][4]
Definition ZdcNtuple.h:233
float t_ZdcModuleTruthEscaped[2][7]
Definition ZdcNtuple.h:248
uint8_t t_zdcDecodingError
Definition ZdcNtuple.h:166
float t_mbts_out_e[2][4]
Definition ZdcNtuple.h:178
@ CELL_SIGNIFICANCE
Cell significance = E/sig of the cell with the largest |E|/sig.
@ CELL_SIG_SAMPLING
CaloSample of the cell with the largest |E|/sig.
CaloSampling::CaloSample CaloSample
@ Tile
The Tile calorimeter.
@ Core
Core flags describing the event.
@ ForwardDet
The forward detectors.
@ LAr
The LAr calorimeter.
@ Error
The sub-detector issued an error.
float z() const
Returns the z position.
size_t nTrackParticles() const
Get the number of tracks associated with this vertex.
const TrackParticleLinks_t & trackParticleLinks() const
Get all the particles associated with the vertex.
float y() const
Returns the y position.
VxType::VertexType vertexType() const
The type of the vertex.
float x() const
Returns the x position.
This module defines the arguments passed from the BATCH driver to the BATCH worker.
Definition index.py:1
@ PileUp
Pile-up vertex.
@ PriVtx
Primary vertex.
ZdcModule_v1 ZdcModule
Definition ZdcModule.h:15
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.
@ pixeldEdx
the dE/dx estimate, calculated using the pixel clusters [?
Extra patterns decribing particle interation process.
TChain * tree