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"); // 32 samples
161 m_outputTree->Branch("rpd_raw", &t_rpdRaw32, "rpd_raw[2][16][32]/s"); // 32 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"); // 40 samples
167 m_outputTree->Branch("rpd_raw", &t_rpdRaw40, "rpd_raw[2][16][40]/s"); // 40 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 if (nsamplesZdc==32) t_raw32[iside][imod][ig][id][isamp]=0;
708 if (nsamplesZdc==40) t_raw40[iside][imod][ig][id][isamp]=0;
709 }
710 }
711 }
712 if (nsamplesZdc==24||nsamplesZdc==32||nsamplesZdc==40)
713 {
714 for (int ch=0;ch<16;ch++)
715 {
716 for (unsigned int isamp=0;isamp<nsamplesZdc;isamp++)
717 {
718 t_rpdRaw[iside][ch][isamp]=0;
719 }
720 }
721 }
722 }
723 if (enableRPD)
724 {
725 for (int ch = 0; ch < 16; ch++) {
726 t_RpdChannelBaseline[iside][ch] = 0;
727 std::fill(t_RpdChannelPileupExpFitParams[iside][ch], t_RpdChannelPileupExpFitParams[iside][ch] + 2, 0);
729 std::fill(t_RpdChannelPileupExpFitParamErrs[iside][ch], t_RpdChannelPileupExpFitParamErrs[iside][ch] + 2, 0);
731 t_RpdChannelPileupExpFitMSE[iside][ch] = 0;
733 t_RpdChannelAmplitude[iside][ch] = 0;
734 t_RpdChannelAmplitudeCalib[iside][ch] = 0;
735 t_RpdChannelMaxADC[iside][ch] = 0;
736 t_RpdChannelMaxADCCalib[iside][ch] = 0;
737 t_RpdChannelMaxSample[iside][ch] = 0;
738 t_RpdChannelStatus[iside][ch] = 0;
739 t_RpdChannelPileupFrac[iside][ch] = 0;
740 }
741 t_RpdSideStatus[iside] = 0;
742 }
743 if (enableCentroid)
744 {
745 t_centroidStatus[iside] = 0;
746 std::fill(t_RPDChannelSubtrAmp[iside], t_RPDChannelSubtrAmp[iside] + 16, 0);
747 t_RPDSubtrAmpSum[iside] = 0;
750 t_xCentroidPreAvgSubtr[iside] = 0;
751 t_yCentroidPreAvgSubtr[iside] = 0;
752 t_xCentroid[iside] = 0;
753 t_yCentroid[iside] = 0;
754 std::fill(t_xRowCentroid[iside], t_xRowCentroid[iside] + 4, 0);
755 std::fill(t_yColCentroid[iside], t_yColCentroid[iside] + 4, 0);
756 t_reactionPlaneAngle[iside] = 0;
757 }
758 }
759 }
760
761 t_ZdcModuleMask = 0;
762 if (enableCentroid) {
764 t_centroidEventValid = false;
766 }
767
768 /*
769 if (t_zdcEventInfoError == xAOD::EventInfo::Error)
770 {
771 ANA_MSG_INFO("ZDC event failed EventInfo error check - aborting!");
772 return;
773 }
774 */
775
776 static const SG::ConstAccessor<char> centroidEventValidAcc("centroidEventValid" + auxSuffix);
777 static const SG::ConstAccessor<float> cosDeltaReactionPlaneAngleAcc("cosDeltaReactionPlaneAngle" + auxSuffix);
778 static const SG::ConstAccessor<float> CalibEnergyAcc("CalibEnergy"+auxSuffix);
779 static const SG::ConstAccessor<float> CalibEnergyErrAcc("CalibEnergyErr"+auxSuffix);
780 static const SG::ConstAccessor<float> NLCalibEnergyAcc("NLCalibEnergy"+auxSuffix);
781 static const SG::ConstAccessor<float> NLCalibEnergyErrAcc("NLCalibEnergyErr"+auxSuffix);
782 static const SG::ConstAccessor<float> UncalibSumAcc("UncalibSum"+auxSuffix);
783 static const SG::ConstAccessor<float> UncalibSumErrAcc("UncalibSumErr"+auxSuffix);
784 static const SG::ConstAccessor<float> AverageTimeAcc("AverageTime"+auxSuffix);
785 static const SG::ConstAccessor<unsigned int> StatusAcc("Status"+auxSuffix);
786 static const SG::ConstAccessor<unsigned int> ModuleMaskAcc("ModuleMask"+auxSuffix);
787 static const SG::ConstAccessor<float> TruthTotalEnergyAcc("TruthTotalEnergy" + auxSuffix);
788 static const SG::ConstAccessor<float> TruthInvisibleEnergyAcc("TruthInvisibleEnergy" + auxSuffix);
789 static const SG::ConstAccessor<float> TruthEMEnergyAcc("TruthEMEnergy" + auxSuffix);
790 static const SG::ConstAccessor<float> TruthNonEMEnergyAcc("TruthNonEMEnergy" + auxSuffix);
791 static const SG::ConstAccessor<float> TruthEscapedEnergyAcc("TruthEscapedEnergy" + auxSuffix);
792 static const SG::ConstAccessor<unsigned int> centroidStatusAcc("centroidStatus" + auxSuffix);
793 static const SG::ConstAccessor<std::vector<float> > RPDChannelSubtrAmpAcc("RPDChannelSubtrAmp" + auxSuffix);
794 static const SG::ConstAccessor<float> RPDSubtrAmpSumAcc("RPDSubtrAmpSum" + auxSuffix);
795 static const SG::ConstAccessor<float> xCentroidPreGeomCorPreAvgSubtrAcc("xCentroidPreGeomCorPreAvgSubtr" + auxSuffix);
796 static const SG::ConstAccessor<float> yCentroidPreGeomCorPreAvgSubtrAcc("yCentroidPreGeomCorPreAvgSubtr" + auxSuffix);
797 static const SG::ConstAccessor<float> xCentroidPreAvgSubtrAcc("xCentroidPreAvgSubtr" + auxSuffix);
798 static const SG::ConstAccessor<float> yCentroidPreAvgSubtrAcc("yCentroidPreAvgSubtr" + auxSuffix);
799 static const SG::ConstAccessor<float> xCentroidAcc("xCentroid" + auxSuffix);
800 static const SG::ConstAccessor<float> yCentroidAcc("yCentroid" + auxSuffix);
801 static const SG::ConstAccessor<std::vector<float> > xRowCentroidAcc("xRowCentroid" + auxSuffix);
802 static const SG::ConstAccessor<std::vector<float> > yColCentroidAcc("yColCentroid" + auxSuffix);
803 static const SG::ConstAccessor<float> reactionPlaneAngleAcc("reactionPlaneAngle" + auxSuffix);
804 static const SG::ConstAccessor<unsigned int> RPDStatusAcc("RPDStatus" + auxSuffix);
805 static const SG::ConstAccessor<unsigned int> nPhotonsAcc("nPhotons" + auxSuffix);
806 static const SG::ConstAccessor<float> CalibTimeAcc("CalibTime" + auxSuffix);
807 static const SG::ConstAccessor<float> AmplitudeAcc("Amplitude" + auxSuffix);
808 static const SG::ConstAccessor<float> TimeAcc("Time" + auxSuffix);
809 static const SG::ConstAccessor<float> ChisqAcc("Chisq" + auxSuffix);
810 static const SG::ConstAccessor<float> FitAmpAcc("FitAmp" + auxSuffix);
811 static const SG::ConstAccessor<float> FitAmpErrorAcc("FitAmpError" + auxSuffix);
812 static const SG::ConstAccessor<float> FitT0Acc("FitT0" + auxSuffix);
813 static const SG::ConstAccessor<float> BkgdMaxFractionAcc("BkgdMaxFraction" + auxSuffix);
814 static const SG::ConstAccessor<float> MinDeriv2ndAcc("MinDeriv2nd" + auxSuffix);
815 static const SG::ConstAccessor<float> PresampleAcc("Presample" + auxSuffix);
816 static const SG::ConstAccessor<float> PreSampleAmpAcc("PreSampleAmp" + auxSuffix);
817 static const SG::ConstAccessor<float> RPDChannelBaselineAcc("RPDChannelBaseline" + auxSuffix);
818 static const SG::ConstAccessor<std::vector<float> > RPDChannelPileupExpFitParamsAcc("RPDChannelPileupExpFitParams" + auxSuffix);
819 static const SG::ConstAccessor<std::vector<float> > RPDChannelPileupExpFitParamErrsAcc("RPDChannelPileupExpFitParamErrs" + auxSuffix);
820 static const SG::ConstAccessor<std::vector<float> > RPDChannelPileupStretchedExpFitParamsAcc("RPDChannelPileupStretchedExpFitParams" + auxSuffix);
821 static const SG::ConstAccessor<std::vector<float> > RPDChannelPileupStretchedExpFitParamErrsAcc("RPDChannelPileupStretchedExpFitParamErrs" + auxSuffix);
822 static const SG::ConstAccessor<float> RPDChannelPileupExpFitMSEAcc("RPDChannelPileupExpFitMSE" + auxSuffix);
823 static const SG::ConstAccessor<float> RPDChannelPileupStretchedExpFitMSEAcc("RPDChannelPileupStretchedExpFitMSE" + auxSuffix);
824 static const SG::ConstAccessor<float> RPDChannelAmplitudeAcc("RPDChannelAmplitude" + auxSuffix);
825 static const SG::ConstAccessor<float> RPDChannelAmplitudeCalibAcc("RPDChannelAmplitudeCalib" + auxSuffix);
826 static const SG::ConstAccessor<float> RPDChannelMaxADCAcc("RPDChannelMaxADC" + auxSuffix);
827 static const SG::ConstAccessor<float> RPDChannelMaxADCCalibAcc("RPDChannelMaxADCCalib" + auxSuffix);
828 static const SG::ConstAccessor<unsigned int> RPDChannelMaxSampleAcc("RPDChannelMaxSample" + auxSuffix);
829 static const SG::ConstAccessor<unsigned int> RPDChannelStatusAcc("RPDChannelStatus" + auxSuffix);
830 static const SG::ConstAccessor<float> RPDChannelPileupFracAcc("RPDChannelPileupFrac" + auxSuffix);
831 static const SG::ConstAccessor<float> AmpLGRefitAcc("AmpLGRefit" + auxSuffix);
832 static const SG::ConstAccessor<float> T0LGRefitAcc("T0LGRefit" + auxSuffix);
833 static const SG::ConstAccessor<float> T0SubLGRefitAcc("T0SubLGRefit" + auxSuffix);
834 static const SG::ConstAccessor<float> ChisqLGRefitAcc("ChisqLGRefit" + auxSuffix);
835
836 static const SG::ConstAccessor<uint16_t> LucrodTriggerAmpAcc("LucrodTriggerAmp");
837 static const SG::ConstAccessor<uint16_t> LucrodTriggerAmpLGAcc("LucrodTriggerAmpLG");
838 static const SG::ConstAccessor<uint16_t> LucrodTriggerSideAmpAcc("LucrodTriggerSideAmp");
839 static const SG::ConstAccessor<uint16_t> LucrodTriggerSideAmpLGAcc("LucrodTriggerSideAmpLG");
840 static const SG::ConstAccessor<float> Amplitude0Acc("Amplitude");
841 static const SG::ConstAccessor<float> MaxADCAcc("MaxADC");
842 static const SG::ConstAccessor<float> MaxADCHGAcc("MaxADCHG");
843 static const SG::ConstAccessor<float> MaxADCLGAcc("MaxADCLG");
844 static const SG::ConstAccessor<float> PeakADCHGAcc("PeakADCHG");
845 static const SG::ConstAccessor<float> PeakADCLGAcc("PeakADCLG");
846 static const SG::ConstAccessor<std::vector<uint16_t> > g0d0DataAcc("g0d0Data");
847 static const SG::ConstAccessor<std::vector<uint16_t> > g0d1DataAcc("g0d1Data");
848 static const SG::ConstAccessor<std::vector<uint16_t> > g1d0DataAcc("g1d0Data");
849 static const SG::ConstAccessor<std::vector<uint16_t> > g1d1DataAcc("g1d1Data");
850 static const SG::ConstAccessor<std::vector<uint16_t> > g0dataAcc("g0data");
851 static const SG::ConstAccessor<std::vector<uint16_t> > g1dataAcc("g1data");
852
855 t_rpdDecodingError = rpdErr;
856 t_zdcDecodingError = zdcErr;
857 if (enableCentroid) {
858 // locate global sum (only if centroid is needed)
859 xAOD::ZdcModule const * globalSum = nullptr;
860 for (auto const * zdcSum : *zdcSums) {
861 if (zdcSum->zdcSide() == 0) {
862 globalSum = zdcSum;
863 break;
864 }
865 }
866 if (!globalSum) {
867 ANA_MSG_ERROR("unable to locate global ZdcSum (side = 0)");
869 }
870 else {
871 t_centroidDecorationsAvailable = centroidStatusAcc.isAvailable(*globalSum);
872 }
873 }
874
875 if (rpdErr||zdcErr) ANA_MSG_WARNING( "Decoding errors ZDC=" << zdcErr << " RPD=" << rpdErr );
876
877 if (zdcSums.ptr())
878 {
879 ANA_MSG_DEBUG( "accessing ZdcSums" );
880 for (const auto zdcSum : *zdcSums)
881 {
882 if (zdcSum->zdcSide()==0) {
883 // trap new global sum
885 t_centroidEventValid = centroidEventValidAcc(*zdcSum);
886 t_cosDeltaReactionPlaneAngle = cosDeltaReactionPlaneAngleAcc(*zdcSum);
887 }
888 // no other branches are filled from global sum - skip to the real sides (C=-1 and A=1)
889 continue;
890 }
891 int iside = 0;
892 if (zdcSum->zdcSide() > 0) iside = 1;
893
894 //static SG::AuxElement::ConstAccessor< float > acc( "CalibEnergy" );
895 //t_ZdcEnergy[iside] = acc(*zdcSum);
896
897 if (enableZDC && !zdcErr)
898 {
899 t_ZdcEnergy[iside] = CalibEnergyAcc(*zdcSum);
900 t_ZdcEnergyErr[iside] = CalibEnergyErrAcc(*zdcSum);
901 t_ZdcNLEnergy[iside] = NLCalibEnergyAcc(*zdcSum);
902 t_ZdcNLEnergyErr[iside] = NLCalibEnergyErrAcc(*zdcSum);
903
904 t_ZdcAmp[iside] = UncalibSumAcc(*zdcSum);
905 t_ZdcAmpErr[iside] = UncalibSumErrAcc(*zdcSum);
906 if (LucrodTriggerSideAmpAcc.isAvailable(*zdcSum))
907 t_ZdcLucrodTriggerSideAmp[iside] = LucrodTriggerSideAmpAcc(*zdcSum);
908 if (LucrodTriggerSideAmpLGAcc.isAvailable(*zdcSum))
909 t_ZdcLucrodTriggerSideAmpLG[iside] = LucrodTriggerSideAmpLGAcc(*zdcSum);
910
911 ANA_MSG_VERBOSE("processZdcNtupleFromModules: ZdcSum energy = " << t_ZdcEnergy[iside]);
912
913 t_ZdcTime[iside] = AverageTimeAcc(*zdcSum);
914 t_ZdcStatus[iside] = StatusAcc(*zdcSum);
915 t_ZdcModuleMask += ( ModuleMaskAcc(*zdcSum) << 4 * iside);
916
917 if(m_isMC){
918 ANA_MSG_DEBUG("Filling sum truth");
919 t_ZdcTruthTotal [iside] = TruthTotalEnergyAcc(*zdcSum);
920 t_ZdcTruthInvis [iside] = TruthInvisibleEnergyAcc(*zdcSum);
921 t_ZdcTruthEM [iside] = TruthEMEnergyAcc(*zdcSum);
922 t_ZdcTruthNonEM [iside] = TruthNonEMEnergyAcc(*zdcSum);
923 t_ZdcTruthEscaped[iside] = TruthEscapedEnergyAcc(*zdcSum);
924 }
925
926 }
927
928 if (enableRPD)
929 {
930 if (enableRPDAmp && !rpdErr)
931 {
932 t_RpdSideStatus[iside] = RPDStatusAcc(*zdcSum);
933 }
935 {
936 t_centroidStatus[iside] = centroidStatusAcc(*zdcSum);
937 std::vector<float> const& rpdChannelSubtrAmp = RPDChannelSubtrAmpAcc(*zdcSum);
938 std::copy(rpdChannelSubtrAmp.begin(), rpdChannelSubtrAmp.end(), t_RPDChannelSubtrAmp[iside]);
939 t_RPDSubtrAmpSum[iside] = RPDSubtrAmpSumAcc(*zdcSum);
940 t_xCentroidPreGeomCorPreAvgSubtr[iside] = xCentroidPreGeomCorPreAvgSubtrAcc(*zdcSum);
941 t_yCentroidPreGeomCorPreAvgSubtr[iside] = yCentroidPreGeomCorPreAvgSubtrAcc(*zdcSum);
942 t_xCentroidPreAvgSubtr[iside] = xCentroidPreAvgSubtrAcc(*zdcSum);
943 t_yCentroidPreAvgSubtr[iside] = yCentroidPreAvgSubtrAcc(*zdcSum);
944 t_xCentroid[iside] = xCentroidAcc(*zdcSum);
945 t_yCentroid[iside] = yCentroidAcc(*zdcSum);
946 std::vector<float> const& xRowCentroid = xRowCentroidAcc(*zdcSum);
947 std::copy(xRowCentroid.begin(), xRowCentroid.end(), t_xRowCentroid[iside]);
948 std::vector<float> const& yColCentroid = yColCentroidAcc(*zdcSum);
949 std::copy(yColCentroid.begin(), yColCentroid.end(), t_yColCentroid[iside]);
950 t_reactionPlaneAngle[iside] = reactionPlaneAngleAcc(*zdcSum);
951 }
952 }
953 }
954 }
955
956 ANA_MSG_DEBUG( "accessing ZdcModules" );
957
958 if (zdcModules.ptr())
959 {
960 for (const auto zdcMod : *zdcModules)
961 {
962 int iside = 0;
963 if (zdcMod->zdcSide() > 0) iside = 1;
964 int imod = zdcMod->zdcModule();
965
966 if (m_isMC){
967 //Calib hits are only stored in channel 0 of the RPD
968 if(!(imod == 4 && zdcMod->zdcChannel() != 0)){
969 t_ZdcModuleTruthTotal [iside][imod] = TruthTotalEnergyAcc(*zdcMod);
970 t_ZdcModuleTruthInvis [iside][imod] = TruthInvisibleEnergyAcc(*zdcMod);
971 t_ZdcModuleTruthEM [iside][imod] = TruthEMEnergyAcc(*zdcMod);
972 t_ZdcModuleTruthNonEM [iside][imod] = TruthNonEMEnergyAcc(*zdcMod);
973 t_ZdcModuleTruthEscaped[iside][imod] = TruthEscapedEnergyAcc(*zdcMod);
974 t_ZdcModuleTruthNphotons[iside][imod] = nPhotonsAcc(*zdcMod);
975 }
976 //Calib hits are stored for all modules
977 //Other data is only valid for module 1-4
978 if(imod > 4) continue;
979 }
980
981 ANA_MSG_VERBOSE ("Module " << zdcMod->zdcSide() << " " << zdcMod->zdcModule() << " amp:" << AmplitudeAcc(*zdcMod));
982
983 if (zdcMod->zdcType() == 0 && !zdcErr)
984 {
985 // ZDC energy type modules
986 t_ZdcModuleCalibAmp[iside][imod] = CalibEnergyAcc(*zdcMod);
987 t_ZdcModuleCalibTime[iside][imod] = CalibTimeAcc(*zdcMod);
988 t_ZdcModuleStatus[iside][imod] = StatusAcc(*zdcMod);
989 if (t_ZdcModuleAmp[iside][imod] != 0.)
990 Warning("processZdcNtupleFromModules", "overwriting side %d module %d!", iside, imod);
991 t_ZdcModuleAmp[iside][imod] = AmplitudeAcc(*zdcMod);
992 t_ZdcModuleTime[iside][imod] = TimeAcc(*zdcMod);
993
994 t_ZdcModuleChisq[iside][imod] = ChisqAcc(*zdcMod);
995 t_ZdcModuleFitAmp[iside][imod] = FitAmpAcc(*zdcMod);
996 t_ZdcModuleAmpError[iside][imod] = FitAmpErrorAcc(*zdcMod);
997 t_ZdcModuleFitT0[iside][imod] = FitT0Acc(*zdcMod);
998 t_ZdcModuleBkgdMaxFraction[iside][imod] = BkgdMaxFractionAcc(*zdcMod);
999 t_ZdcModuleMinDeriv2nd[iside][imod] = MinDeriv2ndAcc(*zdcMod);
1000 t_ZdcModulePresample[iside][imod] = PresampleAcc(*zdcMod);
1001 t_ZdcModulePreSampleAmp[iside][imod] = PreSampleAmpAcc(*zdcMod);
1002
1003 if (AmpLGRefitAcc.isAvailable(*zdcMod)) {
1004 t_ZdcModuleAmpLGRefit[iside][imod] = AmpLGRefitAcc(*zdcMod);
1005 t_ZdcModuleT0LGRefit[iside][imod] = T0LGRefitAcc(*zdcMod);
1006 t_ZdcModuleT0SubLGRefit[iside][imod] = T0SubLGRefitAcc(*zdcMod);
1007 t_ZdcModuleChisqLGRefit[iside][imod] = ChisqLGRefitAcc(*zdcMod);
1008 }
1009
1010 if (LucrodTriggerAmpAcc.isAvailable(*zdcMod))
1011 t_ZdcLucrodTriggerAmp[iside][imod] = LucrodTriggerAmpAcc(*zdcMod);
1012 if (LucrodTriggerAmpLGAcc.isAvailable(*zdcMod))
1013 t_ZdcLucrodTriggerAmpLG[iside][imod] = LucrodTriggerAmpLGAcc(*zdcMod);
1014
1015 if (MaxADCAcc.isAvailable(*zdcMod))
1016 t_ZdcModuleMaxADC[iside][imod] = MaxADCAcc(*zdcMod);
1017 if (MaxADCHGAcc.isAvailable(*zdcMod))
1018 t_ZdcModuleMaxADCHG[iside][imod] = MaxADCHGAcc(*zdcMod);
1019 if (MaxADCLGAcc.isAvailable(*zdcMod))
1020 t_ZdcModuleMaxADCLG[iside][imod] = MaxADCLGAcc(*zdcMod);
1021 if (PeakADCHGAcc.isAvailable(*zdcMod))
1022 t_ZdcModulePeakADCHG[iside][imod] = PeakADCHGAcc(*zdcMod);
1023 if (PeakADCLGAcc.isAvailable(*zdcMod))
1024 t_ZdcModulePeakADCLG[iside][imod] = PeakADCLGAcc(*zdcMod);
1025
1026 if (enableOutputSamples && !zdcErr)
1027 {
1028 for (unsigned int isamp = 0; isamp < nsamplesZdc; isamp++) // 7 samples
1029 {
1030 if (nsamplesZdc == 7)
1031 {
1032 t_raw7[iside][imod][0][0][isamp] = g0d0DataAcc(*zdcMod).at(isamp);
1033 t_raw7[iside][imod][0][1][isamp] = g0d1DataAcc(*zdcMod).at(isamp);
1034 t_raw7[iside][imod][1][0][isamp] = g1d0DataAcc(*zdcMod).at(isamp);
1035 t_raw7[iside][imod][1][1][isamp] = g1d1DataAcc(*zdcMod).at(isamp);
1036 }
1037
1038 if (nsamplesZdc == 15)
1039 {
1040 t_raw15[iside][imod][0][0][isamp] = g0d0DataAcc(*zdcMod).at(isamp);
1041 t_raw15[iside][imod][0][1][isamp] = g0d1DataAcc(*zdcMod).at(isamp);
1042 t_raw15[iside][imod][1][0][isamp] = g1d0DataAcc(*zdcMod).at(isamp);
1043 t_raw15[iside][imod][1][1][isamp] = g1d1DataAcc(*zdcMod).at(isamp);
1044 }
1045
1046 if (nsamplesZdc == 24)
1047 {
1048 t_raw24[iside][imod][0][0][isamp] = g0dataAcc(*zdcMod).at(isamp);
1049 t_raw24[iside][imod][1][0][isamp] = g1dataAcc(*zdcMod).at(isamp);
1050 }
1051 if (nsamplesZdc == 32)
1052 {
1053 t_raw32[iside][imod][0][0][isamp] = g0dataAcc(*zdcMod).at(isamp);
1054 t_raw32[iside][imod][1][0][isamp] = g1dataAcc(*zdcMod).at(isamp);
1055 }
1056 if (nsamplesZdc == 40)
1057 {
1058 t_raw40[iside][imod][0][0][isamp] = g0dataAcc(*zdcMod).at(isamp);
1059 t_raw40[iside][imod][1][0][isamp] = g1dataAcc(*zdcMod).at(isamp);
1060 }
1061 }
1062 }
1063 }
1064 else if (zdcMod->zdcType() == 1 && nsamplesZdc == 24)
1065 {
1066 // this is the RPD
1067 if (enableRPD)
1068 {
1069 if (enableRPDAmp && !rpdErr)
1070 {
1071 t_RpdChannelBaseline[iside][zdcMod->zdcChannel()] = RPDChannelBaselineAcc(*zdcMod);
1072 std::vector<float> const &rpdChannelPileupExpFitParams = RPDChannelPileupExpFitParamsAcc(*zdcMod);
1073 std::copy(rpdChannelPileupExpFitParams.begin(), rpdChannelPileupExpFitParams.end(), t_RpdChannelPileupExpFitParams[iside][zdcMod->zdcChannel()]);
1074 std::vector<float> const &rpdChannelPileupExpFitParamErrs = RPDChannelPileupExpFitParamErrsAcc(*zdcMod);
1075 std::copy(rpdChannelPileupExpFitParamErrs.begin(), rpdChannelPileupExpFitParamErrs.end(), t_RpdChannelPileupExpFitParamErrs[iside][zdcMod->zdcChannel()]);
1076 std::vector<float> const &rpdChannelPileupStretchedExpFitParams = RPDChannelPileupStretchedExpFitParamsAcc(*zdcMod);
1077 std::copy(rpdChannelPileupStretchedExpFitParams.begin(), rpdChannelPileupStretchedExpFitParams.end(), t_RpdChannelPileupStretchedExpFitParams[iside][zdcMod->zdcChannel()]);
1078 std::vector<float> const &rpdChannelPileupStretchedExpFitParamErrs = RPDChannelPileupStretchedExpFitParamErrsAcc(*zdcMod);
1079 std::copy(rpdChannelPileupStretchedExpFitParamErrs.begin(), rpdChannelPileupStretchedExpFitParamErrs.end(), t_RpdChannelPileupStretchedExpFitParamErrs[iside][zdcMod->zdcChannel()]);
1080 t_RpdChannelPileupExpFitMSE[iside][zdcMod->zdcChannel()] = RPDChannelPileupExpFitMSEAcc(*zdcMod);
1081 t_RpdChannelPileupStretchedExpFitMSE[iside][zdcMod->zdcChannel()] = RPDChannelPileupStretchedExpFitMSEAcc(*zdcMod);
1082 t_RpdChannelAmplitude[iside][zdcMod->zdcChannel()] = RPDChannelAmplitudeAcc(*zdcMod);
1083 t_RpdChannelAmplitudeCalib[iside][zdcMod->zdcChannel()] = RPDChannelAmplitudeCalibAcc(*zdcMod);
1084 t_RpdChannelMaxADC[iside][zdcMod->zdcChannel()] = RPDChannelMaxADCAcc(*zdcMod);
1085 t_RpdChannelMaxADCCalib[iside][zdcMod->zdcChannel()] = RPDChannelMaxADCCalibAcc(*zdcMod);
1086 t_RpdChannelMaxSample[iside][zdcMod->zdcChannel()] = RPDChannelMaxSampleAcc(*zdcMod);
1087 t_RpdChannelStatus[iside][zdcMod->zdcChannel()] = RPDChannelStatusAcc(*zdcMod);
1088 t_RpdChannelPileupFrac[iside][zdcMod->zdcChannel()] = RPDChannelPileupFracAcc(*zdcMod);
1089 if(m_isMC){
1090 t_RpdModuleTruthNphotons[iside][zdcMod->zdcChannel()] = nPhotonsAcc(*zdcMod);
1091 }
1092 }
1094 {
1095 std::vector<uint16_t> const &rpdChannelRaw = g0dataAcc(*zdcMod);
1096 std::copy(rpdChannelRaw.begin(), rpdChannelRaw.end(), t_rpdRaw[iside][zdcMod->zdcChannel()]);
1097 }
1098 }
1099 }
1100 }
1101 }
1102 else
1103 {
1104 ANA_MSG_INFO("No ZdcModules" << auxSuffix << " when expected!");
1105 }
1106
1107 if (msgLvl (MSG::VERBOSE))
1108 {
1109 std::ostringstream message;
1110 message << "Dump zdc_ZdcModuleAmp: ";
1111 for (int iside = 0; iside < 2; iside++)
1112 {
1113 for (int imod = 0; imod < 4; imod++)
1114 {
1115 message << t_ZdcModuleAmp[iside][imod] << " ";
1116 }
1117 }
1118 }
1119}
1120
1122 /******************************************
1123 * Get the McEventCollection (input)
1124 ******************************************/
1125 SG::ReadHandle<McEventCollection> mcEventCollection (m_mcEventCollectionName, getContext());
1126 if (!mcEventCollection.isValid()){
1127 ANA_MSG_ERROR("Could not retrieve HepMC with key:" << m_mcEventCollectionName.key());
1128 return;
1129 }else{
1130 ANA_MSG_DEBUG("Retrieved HepMC with key: " << m_mcEventCollectionName.key());
1131 }
1132
1133 /******************************************
1134 * Clear and resize the output vectors
1135 ******************************************/
1136 t_ZdcTruthParticlePosx.clear();
1137 t_ZdcTruthParticlePosy.clear();
1138 t_ZdcTruthParticlePosz.clear();
1139 t_ZdcTruthParticleTime.clear();
1140 t_ZdcTruthParticlePx.clear();
1141 t_ZdcTruthParticlePy.clear();
1142 t_ZdcTruthParticlePz.clear();
1144 t_ZdcTruthParticlePid.clear();
1146
1147 /******************************************
1148 * Sort the particles into sides and add
1149 * them to the output vectors
1150 ******************************************/
1151 for (unsigned int cntr = 0; cntr < mcEventCollection->size(); ++cntr){
1152 const HepMC::GenEvent *genEvt = (*mcEventCollection)[cntr];
1153#ifdef HEPMC3
1154 for (const auto &vertex : genEvt->vertices()){
1155 for (const auto &particle : vertex->particles_in()){
1156#else
1157 for (const auto &vertex : genEvt->vertex_range()){
1158 for (auto ip = vertex->particles_in_const_begin();
1159 ip != vertex->particles_in_const_end();
1160 ++ip) {
1161 auto particle = *ip;
1162#endif
1163 t_ZdcTruthParticlePosx.push_back(vertex->position().x());
1164 t_ZdcTruthParticlePosy.push_back(vertex->position().y());
1165 t_ZdcTruthParticlePosz.push_back(vertex->position().z());
1166 t_ZdcTruthParticleTime.push_back(vertex->position().t());
1167 t_ZdcTruthParticlePx.push_back(particle->momentum().x());
1168 t_ZdcTruthParticlePy.push_back(particle->momentum().y());
1169 t_ZdcTruthParticlePz.push_back(particle->momentum().z());
1170 t_ZdcTruthParticleEnergy.push_back(particle->momentum().e());
1171 t_ZdcTruthParticlePid.push_back(particle->pdg_id());
1172 t_ZdcTruthParticleStatus.push_back(particle->status());
1173 } // end loop over particles
1174 }// end loop over vertices
1175 }// end loop over HepMC events
1176}
1177
1179{
1180 ANA_MSG_DEBUG ("Processing trigger");
1181
1182 bool passTrigger = false;
1183
1184 t_trigger = 0;
1185 t_trigger_TBP = 0;
1186
1187 for (int i = 0; i < 16; i++)
1188 {
1189 t_tav[i] = 0;
1190 t_tbp[i] = 0;
1191 }
1192
1193 if (m_trigDecision)
1194 {
1195 for (int i = 0; i < 16; i++)
1196 {
1197 t_tbp[i] = m_trigDecision->tbp().at(i);
1198 t_tav[i] = m_trigDecision->tav().at(i);
1199 ANA_MSG_DEBUG( "TD: " << i << " tbp: " << std::hex << t_tbp[i] << "\t" << t_tav[i] );
1200 }
1201 t_bunchGroup = m_trigDecision->bgCode();
1202 }
1203
1204 if (enableTrigger)
1205 {
1206
1207 int ic = 0;
1208 for (auto cg : m_chainGroups)
1209 {
1210
1211 if (zdcCalib)
1212 {
1213 std::string name = cg->getListOfTriggers().at(0);
1214 const unsigned int triggerbits = m_trigDecisionTool->isPassedBits(name);
1215 // deferred functionality
1216 //bool tbp = triggerbits&TrigDefs::L1_isPassedBeforePrescale;
1217 //bool tap = triggerbits&TrigDefs::L1_isPassedAfterPrescale;
1218 bool tav = triggerbits&TrigDefs::L1_isPassedAfterVeto;
1219 ANA_MSG_DEBUG("TD: checking trigger name=" << name<< " tav=" << tav);
1220 if (tav)
1221 {
1222 t_trigger += (1 << ic);
1223 t_decisions[ic] = true;
1224 t_prescales[ic] = cg->getPrescale();
1225 passTrigger = true;
1226 }
1227 else
1228 {
1229 t_decisions[ic] = 0;
1230 t_prescales[ic] = 0;
1231 }
1232 }
1233 else
1234 {
1235 if (cg->isPassed())
1236 {
1237 t_trigger += (1 << ic);
1238 t_decisions[ic] = true;
1239 t_prescales[ic] = cg->getPrescale();
1240 passTrigger = true;
1241 }
1242 else
1243 {
1244 t_decisions[ic] = 0;
1245 t_prescales[ic] = 0;
1246 }
1247 }
1248
1249 if (cg->isPassedBits()&TrigDefs::EF_passedRaw)
1250 {
1251 t_trigger_TBP += (1 << ic);
1252 }
1253
1254
1255 ic++;
1256 }
1257
1258 int irc = 0;
1259 for (auto cg : m_rerunChainGroups)
1260 {
1261 t_rerunDecisions[irc] = false;
1262 if (cg->isPassedBits()&TrigDefs::EF_passedRaw)
1263 {
1264 t_rerunDecisions[irc] = true;
1265 }
1266 irc++;
1267 }
1268
1269 }
1270
1271 return passTrigger;
1272}
1273
1275{
1276 ANA_MSG_DEBUG( "processing event info");
1277
1278 t_bcid = m_eventInfo->bcid();
1279 t_runNumber = m_eventInfo->runNumber();
1280 t_eventNumber = m_eventInfo->eventNumber();
1281 t_lumiBlock = m_eventInfo->lumiBlock();
1282 t_bunchGroup = -1;
1283 t_extendedLevel1ID = m_eventInfo->extendedLevel1ID();
1284 t_timeStamp = m_eventInfo->timeStamp();
1285 t_timeStampNSOffset = m_eventInfo->timeStampNSOffset();
1287 t_avgIntPerCrossing = m_eventInfo->averageInteractionsPerCrossing();
1288 t_actIntPerCrossing = m_eventInfo->actualInteractionsPerCrossing();
1291
1292 if ( !(m_eventCounter++ % 1000) || msgLvl(MSG::DEBUG))
1293 {
1294 ANA_MSG_INFO("Event# " << m_eventCounter << " Run " << m_eventInfo->runNumber() << " Event " << m_eventInfo->eventNumber() << " LB " << m_eventInfo->lumiBlock() );
1295 }
1296
1297}
1298
1300 // Check for new run number
1301 //
1303 //
1304 // Get access to the injector pulse steps for this run
1305 //
1307 if (!m_injMapRunToken.isValid()) {
1308 ANA_MSG_ERROR("Unable to obtain injector pulse steps for run " << t_runNumber);
1309 }
1310 else {
1311 unsigned int startLB = m_zdcInjPulserAmpMap->getFirstLumiBlock(m_injMapRunToken);
1312 unsigned int nsteps = m_zdcInjPulserAmpMap->getNumSteps(m_injMapRunToken);
1313 ANA_MSG_DEBUG("Successfully obtained injector pulse steps for run " << t_runNumber
1314 << ", first LB = " << startLB << ", number of steps = " << nsteps);
1315 }
1316
1317 // update the last run number to be the current run number
1319 }
1320
1322}
1323
1325{
1326 ANA_MSG_DEBUG("processInDet(): processing tracks & vertices!");
1327 t_ntrk = 0;
1328 t_nvx = 0;
1329 t_vxntrk = 0;
1330 t_vx_trk_index.clear();
1331 t_vxsumpt2 = 0;
1332 t_vxtype = 0;
1333 t_pvindex = -1;
1334 t_puvxntrk = 0;
1335 t_puvxsumpt = 0;
1337 t_vxnminbias = 0;
1338
1339 int i;
1340 for (i = 0; i < 3; i++) t_vx[i] = 0;
1341 for (i = 0; i < 6; i++) t_vxcov[i] = 0;
1342
1343 const xAOD::Vertex* primary_vertex = nullptr;
1344 size_t pv_index = -1;
1345 size_t vx_index = 0;
1346 float max_pileup_sumpT = 0.;
1347 int max_pileup_nTrack = 0;
1348 float max_pileup_z = 0;
1349 int nStrongPileup = 0;
1350
1351 t_nvtx = 0;
1352 t_vtx_type.clear();
1353 t_vtx_x.clear();
1354 t_vtx_y.clear();
1355 t_vtx_z.clear();
1356 t_vtx_ntrk_all.clear();
1357 t_vtx_sumpt2_all.clear();
1358 t_vtx_ntrk.clear();
1359 t_vtx_sumpt2.clear();
1360 t_vtx_trk_index.clear();
1361
1363 {
1364 ANA_MSG_DEBUG("processInDet: processing vertices");
1365
1366 t_nvx = m_primaryVertices->size();
1367
1368 static const SG::ConstAccessor<float> sumPt2Acc("sumPt2");
1369
1370 // start of new vertex representation
1371 t_nvtx = m_primaryVertices->size();
1372 for (const auto vertex : *m_primaryVertices)
1373 {
1374 float vtx_sumpt2 = 0;
1375 int vtx_ntrk = 0;
1376
1377 t_vtx_type.push_back(vertex->vertexType());
1378 t_vtx_x.push_back(0);
1379 t_vtx_y.push_back(0);
1380 t_vtx_z.push_back(vertex->z());
1381
1382 t_vtx_ntrk.push_back(vtx_ntrk);
1383 t_vtx_sumpt2.push_back(vtx_sumpt2 / 1e6);
1384 t_vtx_ntrk_all.push_back(vertex->nTrackParticles());
1385
1386 if (sumPt2Acc.isAvailable(*vertex))
1387 t_vtx_sumpt2_all.push_back(sumPt2Acc(*vertex));
1388 else
1389 t_vtx_sumpt2_all.push_back(-1);
1390
1391 std::vector<int16_t> trk_index;
1392 if ( m_trackParticles && vertex->nTrackParticles() <= trackLimit )
1393 {
1394 const std::vector< ElementLink< xAOD::TrackParticleContainer > >& vxTrackParticles = vertex->trackParticleLinks();
1395 for (size_t itrk = 0; itrk < vxTrackParticles.size(); itrk++)
1396 {
1397 ElementLink< xAOD::TrackParticleContainer > trkLink = vxTrackParticles.at(itrk);
1398 trk_index.push_back(trkLink.index());
1399 }
1400 }
1401 t_vtx_trk_index.push_back(trk_index);
1402
1403 // end of new vertex representation
1404
1405 if (vertex->vertexType() == xAOD::VxType::PriVtx)
1406 {
1407 primary_vertex = vertex;
1408 pv_index = vx_index;
1409 }
1410 if (vertex->vertexType() == xAOD::VxType::PileUp)
1411 {
1412 float pileup_sumpT = 0;
1413 int pileup_nTrack = 0;
1414 for (size_t itr = 0; itr < vertex->nTrackParticles(); itr++)
1415 {
1416 int track_quality = trackQuality(vertex->trackParticle(itr), vertex);
1417 if (track_quality != -1 && (track_quality & 128) != 0)
1418 {
1419 pileup_nTrack++;
1420 pileup_sumpT += vertex->trackParticle(itr)->pt();
1421 }
1422 }
1423 if (pileup_sumpT > max_pileup_sumpT)
1424 {
1425 max_pileup_sumpT = pileup_sumpT;
1426 max_pileup_nTrack = pileup_nTrack;
1427 max_pileup_z = vertex->z();
1428 }
1429 if (pileup_sumpT > 5e3 || pileup_nTrack > 5) nStrongPileup++;
1430 }
1431 vx_index++;
1432 }
1433 }
1434
1435 t_nstrong = nStrongPileup;
1436
1437 if (primary_vertex != nullptr)
1438 {
1439 t_vx[0] = primary_vertex->x();
1440 t_vx[1] = primary_vertex->y();
1441 t_vx[2] = primary_vertex->z();
1442 /*
1443 const std::vector<float>& cov = primary_vertex->covariance();
1444 */
1445 //for (size_t i=0;i<cov.size();i++)
1446 for (size_t i = 0; i < 6; i++)
1447 {
1448 //t_vxcov[i] = cov.at(i);
1449 t_vxcov[i] = 0;
1450 }
1451 t_vxntrk = primary_vertex->nTrackParticles();
1452 static const SG::ConstAccessor<float> sumPt2Acc("sumPt2");
1453 if (sumPt2Acc.isAvailable(*primary_vertex))
1454 t_vxsumpt2 = sumPt2Acc(*primary_vertex);
1455 else
1456 t_vxsumpt2 = 0;
1457
1458 t_vxtype = primary_vertex->vertexType();
1459 t_pvindex = pv_index;
1460 t_puvxz = max_pileup_z;
1461 t_puvxsumpt = max_pileup_sumpT;
1462 t_puvxntrk = max_pileup_nTrack;
1463
1464 const std::vector< ElementLink< xAOD::TrackParticleContainer > >& vxTrackParticles = primary_vertex->trackParticleLinks();
1465
1466 for (size_t itrk = 0; itrk < vxTrackParticles.size(); itrk++)
1467 {
1468 ElementLink< xAOD::TrackParticleContainer > trkLink = vxTrackParticles.at(itrk);
1469 if (!trkLink.isValid()) continue;
1470 if (m_trackParticles)
1471 {
1472 if (m_trackParticles->size() <= trackLimit)
1473 t_vx_trk_index.push_back(trkLink.index());
1474 }
1475 }
1476
1477 }
1478
1479
1480 if (m_trackParticles)
1481 {
1482 ANA_MSG_DEBUG("processInDet: processing trackss");
1483
1484 t_trk_pt.clear();
1485 t_trk_eta.clear();
1486 t_trk_phi.clear();
1487 t_trk_e.clear();
1488 t_trk_index.clear();
1489 t_trk_theta.clear();
1490 t_trk_charge.clear();
1491 t_trk_d0.clear();
1492 t_trk_z0.clear();
1493 t_trk_vz.clear();
1494 t_trk_vtxz.clear();
1495 t_trk_quality.clear();
1496 t_trk_nPixHits.clear();
1497 t_trk_nSctHits.clear();
1498 t_trk_nPixDead.clear();
1499 t_trk_nSctDead.clear();
1500 t_trk_nPixHoles.clear();
1501 t_trk_nSctHoles.clear();
1502 t_trk_nTrtHits.clear();
1503 t_trk_nTrtOutliers.clear();
1504 t_trk_inPixHits.clear();
1505 t_trk_exPixHits.clear();
1506 t_trk_ninPixHits.clear();
1507 t_trk_nexPixHits.clear();
1508 t_trk_pixeldEdx.clear();
1509
1510 t_ntrk = m_trackParticles->size();
1511
1512 if ( !enableTracks ) return;
1513
1514 if ( t_ntrk <= trackLimit ) // dump all tracks
1515 {
1516 int trk_index = 0;
1517 for (const auto track : *m_trackParticles)
1518 {
1519 writeTrack(track, primary_vertex, trk_index++);
1520 }
1521 }
1522 else // write small vertices
1523 {
1524 for (const auto vertex : *m_primaryVertices)
1525 {
1526 if (vertex->nTrackParticles() <= trackLimit )
1527 {
1528 const std::vector< ElementLink< xAOD::TrackParticleContainer > >& vxTrackParticles = vertex->trackParticleLinks();
1529 for (size_t itrk = 0; itrk < vxTrackParticles.size(); itrk++)
1530 {
1531 ElementLink< xAOD::TrackParticleContainer > trkLink = vxTrackParticles.at(itrk);
1532 writeTrack(*trkLink, vertex, trkLink.index());
1533 }
1534 }
1535 }
1536 }
1537 }
1538
1539 return;
1540}
1541
1542
1544{
1545
1546 if (!track) return -1;
1547
1548 bool pass_looseprimary = false;
1549 if (m_selTool->accept(*track,vertex))
1550 {
1551 pass_looseprimary = true;
1552 }
1553
1554 int quality = 0;
1555 if (pass_looseprimary) quality += 1;
1556
1557 return quality;
1558
1559}
1560
1561
1562
1563void ZdcNtuple::writeTrack(const xAOD::TrackParticle* track, const xAOD::Vertex* vertex, int trk_index)
1564{
1565 t_trk_pt.push_back(track->pt());
1566 t_trk_eta.push_back(track->eta());
1567 t_trk_phi.push_back(track->phi());
1568 t_trk_e.push_back(track->e());
1569 t_trk_index.push_back(trk_index);
1570 t_trk_theta.push_back(track->theta());
1571 t_trk_charge.push_back(track->charge());
1572 t_trk_d0.push_back(track->d0());
1573 t_trk_z0.push_back(track->z0());
1574 t_trk_vz.push_back(track->vz());
1575
1576 float vtxz = -999.;
1577 t_trk_vtxz.push_back(vtxz);
1578
1579 static const SG::ConstAccessor<uint8_t> numberOfInnermostPixelLayerHitsAcc("numberOfInnermostPixelLayerHits");
1580 static const SG::ConstAccessor<uint8_t> expectInnermostPixelLayerHitAcc("expectInnermostPixelLayerHit");
1581 static const SG::ConstAccessor<uint8_t> numberOfNextToInnermostPixelLayerHitsAcc("numberOfNextToInnermostPixelLayerHits");
1582 static const SG::ConstAccessor<uint8_t> expectNextToInnermostPixelLayerHitAcc("expectNextToInnermostPixelLayerHit");
1583 static const SG::ConstAccessor<uint8_t> numberOfSCTHitsAcc("numberOfSCTHits");
1584 static const SG::ConstAccessor<uint8_t> numberOfPixelHitsAcc("numberOfPixelHits");
1585 static const SG::ConstAccessor<uint8_t> numberOfSCTDeadSensorsAcc("numberOfSCTDeadSensors");
1586 static const SG::ConstAccessor<uint8_t> numberOfPixelDeadSensorsAcc("numberOfPixelDeadSensors");
1587 static const SG::ConstAccessor<uint8_t> numberOfSCTHolesAcc("numberOfSCTHoles");
1588 static const SG::ConstAccessor<uint8_t> numberOfPixelHolesAcc("numberOfPixelHoles");
1589 static const SG::ConstAccessor<uint8_t> numberOfTRTHitsAcc("numberOfTRTHits");
1590 static const SG::ConstAccessor<uint8_t> numberOfTRTOutliersAcc("numberOfTRTOutliers");
1591
1592 t_trk_quality.push_back(trackQuality(track, vertex));
1593 t_trk_inPixHits.push_back(numberOfInnermostPixelLayerHitsAcc(*track));
1594 t_trk_exPixHits.push_back(expectInnermostPixelLayerHitAcc(*track));
1595 t_trk_ninPixHits.push_back(numberOfNextToInnermostPixelLayerHitsAcc(*track));
1596 t_trk_nexPixHits.push_back(expectNextToInnermostPixelLayerHitAcc(*track));
1597 t_trk_nSctHits.push_back(numberOfSCTHitsAcc(*track));
1598 t_trk_nPixHits.push_back(numberOfPixelHitsAcc(*track));
1599 t_trk_nSctDead.push_back(numberOfSCTDeadSensorsAcc(*track));
1600 t_trk_nPixDead.push_back(numberOfPixelDeadSensorsAcc(*track));
1601 t_trk_nSctHoles.push_back(numberOfSCTHolesAcc(*track));
1602 t_trk_nPixHoles.push_back(numberOfPixelHolesAcc(*track));
1603 t_trk_nTrtHits.push_back(numberOfTRTHitsAcc(*track));
1604 t_trk_nTrtOutliers.push_back(numberOfTRTOutliersAcc(*track));
1605
1606 float pixeldEdx = 0;
1607 track->summaryValue(pixeldEdx, xAOD::SummaryType::pixeldEdx);
1608 t_trk_pixeldEdx.push_back(pixeldEdx);
1609}
1610
1611
1613{
1614 ANA_MSG_DEBUG("processFCal: processing FCal");
1615
1616 t_fcalEt = 0.;
1617 t_fcalEtA = 0.;
1618 t_fcalEtC = 0.;
1619 t_fcalEtA_TT = 0.;
1620 t_fcalEtC_TT = 0.;
1621
1622 if (m_caloSums)
1623 {
1624 static const SG::ConstAccessor<std::string> SummaryAcc("Summary");
1625 for (const auto calosum : *m_caloSums)
1626 {
1627 const std::string name = SummaryAcc(*calosum);
1628 if (name == "FCal")
1629 {
1630 t_fcalEt = calosum->et();
1631 ANA_MSG_DEBUG("processFCal: fcalEt = " << t_fcalEt);
1632 }
1633
1634 if (name == "All")
1635 {
1636 t_totalEt = calosum->et();
1637 ANA_MSG_DEBUG("processFCal: totalEt = " << t_totalEt);
1638 }
1639 }
1640 }
1641
1642 t_fcalEtA = 0;
1643 t_fcalEtC = 0;
1644 t_totalEt24 = 0;
1645
1646 if (m_eventShapes)
1647 {
1648 for (const auto eventShape : *m_eventShapes)
1649 {
1650 int layer = eventShape->layer();
1651 float eta = eventShape->etaMin();
1652 float et = eventShape->et();
1653 if (layer == 21 || layer == 22 || layer == 23)
1654 {
1655 if (eta > 0) t_fcalEtA += et;
1656 if (eta < 0) t_fcalEtC += et;
1657 }
1658
1659 if (TMath::Abs(eta) < 2.4)
1660 {
1661 t_totalEt24 += et;
1662 }
1663 }
1664 }
1665
1666 t_L1ET = 0;
1667 t_L1ET24 = 0;
1668
1670 {
1671 t_L1ET = m_lvl1EnergySumRoI->energyT();
1672 //t_L1ET24 = m_lvl1EnergySumRoI->energyTRestricted(); // TBD when limited eta ET available
1673 }
1674
1675 return;
1676}
1677
1679{
1680
1681 float eta_min = 5;
1682 float eta_max = -5;
1683
1684 if (!m_caloClusters) return;
1685 for (const auto cl : *m_caloClusters)
1686 {
1687
1688 if (cl->pt() < m_gapPtMin) continue;
1689
1690 int etabin = h_TCSigCut->GetXaxis()->FindBin(cl->eta());
1691 if (etabin < 1 || etabin > h_TCSigCut->GetNbinsX()) continue;
1692 float sig_cut = h_TCSigCut->GetBinContent(etabin);
1693 float sig = cl->getMomentValue(xAOD::CaloCluster::CELL_SIGNIFICANCE);
1694 int cl_cell_sig_samp = static_cast<int>(cl->getMomentValue(xAOD::CaloCluster::CELL_SIG_SAMPLING));
1695
1696 ANA_MSG_VERBOSE ("gapclus: etabin " << etabin << " sig_cut=" << sig_cut << " sig=" << sig << " samp=" << cl_cell_sig_samp);
1697
1698 if (sig < sig_cut) continue;
1699
1700 if (cl_cell_sig_samp >= CaloSampling::TileBar0 && cl_cell_sig_samp <= CaloSampling::TileExt2) continue;
1701
1702 if (cl->eta() < eta_min) eta_min = cl->eta();
1703 if (cl->eta() > eta_max) eta_max = cl->eta();
1704
1705 }
1706
1707 t_edgeGapA = 4.9 - eta_max;
1708 t_edgeGapC = eta_min + 4.9;
1709 ANA_MSG_DEBUG("processGaps(): egA " << t_edgeGapA << " , egC " << t_edgeGapC);
1710
1711}
1712
1714{
1715 ANA_MSG_DEBUG("processMBTS: trying to process!");
1716 t_mbts_countA = 0;
1717 t_mbts_countC = 0;
1720 t_mbts_timeA = 0.;
1721 t_mbts_timeC = 0.;
1722 t_mbts_timeDiff = 0.;
1723
1724 if (m_mbtsInfo->size() > 0)
1725 {
1726 t_mbts_countA = m_mbtsInfo->at(0)->countA();
1727 t_mbts_countC = m_mbtsInfo->at(0)->countC();
1728 t_mbts_timeA = m_mbtsInfo->at(0)->timeA();
1729 t_mbts_timeC = m_mbtsInfo->at(0)->timeC();
1730 t_mbts_timeDiff = m_mbtsInfo->at(0)->timeDiff();
1731 }
1732 else
1733 {
1734 ANA_MSG_INFO("processMBTS: Warning: MBTS info empty!");
1735 }
1736
1737 for (int iside = 0; iside < 2; iside++)
1738 {
1739 for (int iin = 0; iin < 8; iin++)
1740 {
1741 t_mbts_in_e[iside][iin] = 0.;
1742 t_mbts_in_t[iside][iin] = 0.;
1743 t_T2mbts_in_e[iside][iin] = 0.;
1744 t_T2mbts_in_t[iside][iin] = 0.;
1745 }
1746 for (int iout = 0; iout < 4; iout++)
1747 {
1748 t_mbts_out_e[iside][iout] = 0.;
1749 t_mbts_out_t[iside][iout] = 0.;
1750 t_T2mbts_out_e[iside][iout] = 0.;
1751 t_T2mbts_out_t[iside][iout] = 0.;
1752 }
1753 }
1754
1755 ANA_MSG_DEBUG ("filling MBTS");
1756
1757 if (m_mbtsModules == 0)
1758 {
1759 ANA_MSG_INFO("processMBTS: no MBTS container?");
1760 return;
1761 }
1762
1763 for (const auto mbtsMod : *m_mbtsModules)
1764 {
1765 int iside = 1;
1766 if (mbtsMod->type() < 0) iside = 0.;
1767 float phibin = 0.;
1768 int iphibin = -1;
1769 if (mbtsMod->eta() > 3)
1770 {
1771 phibin = mbtsMod->phi() / (2 * TMath::Pi() / 8.) - 0.4;
1772 iphibin = static_cast<int>(phibin);
1773 if (iphibin < 0 || iphibin > 7)
1774 {
1775 ANA_MSG_INFO("processMBTS: MBTS has bad phi bin");
1776 continue;
1777 }
1778 t_mbts_in_e[iside][iphibin] = mbtsMod->e();
1779 t_mbts_in_t[iside][iphibin] = mbtsMod->time();
1780 }
1781 else
1782 {
1783 phibin = mbtsMod->phi() / (2 * TMath::Pi() / 4.) - 0.24;
1784 iphibin = static_cast<int>(phibin);
1785 if (iphibin < 0 || iphibin > 3)
1786 {
1787 ANA_MSG_INFO("processMBTS: MBTS has bad phi bin");
1788 continue;
1789 }
1790 t_mbts_out_e[iside][iphibin] = mbtsMod->e();
1791 t_mbts_out_t[iside][iphibin] = mbtsMod->time();
1792 }
1793 }
1794
1795 if (!m_trigT2MbtsBits) return;
1796
1797 for (const auto mbtsBits : *m_trigT2MbtsBits)
1798 {
1799 const std::vector<float>& energies = mbtsBits->triggerEnergies();
1800 const std::vector<float>& times = mbtsBits->triggerTimes();
1801 for (int imbts = 0; imbts < 32; imbts++)
1802 {
1803 int side = imbts / 16;
1804 int ring = (imbts - 16 * side) / 8;
1805 bool isInner = (ring == 0);
1806 int index = (imbts - 16 * side - ring * 8);
1807 if (!isInner)
1808 {
1809 if ((index % 2) != 0) continue; // skip odd out ring
1810 index /= 2;
1811 }
1812 int iside = (side == 0) ? 1 : 0; // code maps side 1 into first 16 bits and side -1 into second set
1813
1814 ANA_MSG_VERBOSE ("imbts=" << imbts << " isInner=" << isInner << " iside=" << iside << " index=" << index << " e=" << energies.at(imbts) << " t=" << times.at(imbts));
1815 if (isInner)
1816 {
1817 t_T2mbts_in_e[iside][index] = energies.at(imbts);
1818 t_T2mbts_in_t[iside][index] = times.at(imbts);
1819 if (TMath::Abs(times.at(imbts)) < 12.0 && energies.at(imbts) > 40 / 222.)
1820 {
1821 if (iside == 0) t_T2mbts_countCin++;
1822 if (iside == 1) t_T2mbts_countAin++;
1823 }
1824 }
1825 else
1826 {
1827 t_T2mbts_out_e[iside][index] = energies.at(imbts);
1828 t_T2mbts_out_t[iside][index] = times.at(imbts);
1829 }
1830 }
1831 }
1832
1833 return;
1834}
1835
1837{
1838 //t_nclus = 0;
1839
1840 t_cc_pt.clear();
1841 t_cc_eta.clear();
1842 t_cc_phi.clear();
1843 t_cc_e.clear();
1844 t_cc_raw_m.clear();
1845 t_cc_raw_eta.clear();
1846 t_cc_raw_phi.clear();
1847 t_cc_raw_e.clear();
1848 t_cc_raw_samp.clear();
1849 t_cc_layer.clear();
1850 t_cc_sig.clear();
1851
1852 t_nclus = m_caloClusters->size();
1853
1854 t_clusEt = 0;
1855 t_clusEtMax = -999;
1856 t_clusetaMax = 0;
1857 t_clusphiMax = 0;
1858
1859 for (const auto cluster : *m_caloClusters)
1860 {
1861 t_cc_pt.push_back(cluster->pt());
1862 t_cc_eta.push_back(cluster->eta());
1863 t_cc_phi.push_back(cluster->phi());
1864 t_cc_e.push_back(cluster->e());
1865 t_cc_raw_m.push_back(cluster->rawM());
1866 t_cc_raw_eta.push_back(cluster->rawEta());
1867 t_cc_raw_phi.push_back(cluster->rawPhi());
1868 t_cc_raw_e.push_back(cluster->rawE());
1869
1870 std::vector<float> energies;
1871
1872 for (size_t s = CaloSampling::PreSamplerB; s < CaloSampling::Unknown; s++ )
1873 {
1874 bool hasSample = cluster->hasSampling( (xAOD::CaloCluster::CaloSample) s );
1875 float e = 0;
1876 if (hasSample)
1877 {
1878 e = cluster->eSample( (xAOD::CaloCluster::CaloSample) s);
1879 }
1880 energies.push_back(e);
1881 }
1882 t_cc_raw_samp.push_back(energies);
1883
1884 float et = cluster->e() / TMath::CosH(cluster->eta());
1885 t_clusEt += et;
1886 if (et > t_clusEtMax)
1887 {
1888 t_clusEtMax = et;
1889 t_clusetaMax = cluster->eta();
1890 t_clusphiMax = cluster->phi();
1891 }
1892
1893 double cell_sig = 0;
1894 if (!cluster->retrieveMoment(xAOD::CaloCluster::CELL_SIGNIFICANCE, cell_sig)) {ANA_MSG_DEBUG("processClusters() : No CELL_SIGNIFICANCE!");}
1895 t_cc_sig.push_back(cell_sig);
1896 double cell_layer = 0;
1897 if (!cluster->retrieveMoment(xAOD::CaloCluster::CELL_SIG_SAMPLING, cell_layer)) {ANA_MSG_DEBUG("processClusters() : No CELL_SIG_SAMPLING!");}
1898 t_cc_layer.push_back(static_cast<int>(cell_layer));
1899 //t_nclus++;
1900 }
1901
1902 if ( (!enableClusters) || (t_ntrk >= trackLimit) ) // if disabled or if too many tracks
1903 {
1904 t_cc_pt.clear();
1905 t_cc_eta.clear();
1906 t_cc_phi.clear();
1907 t_cc_e.clear();
1908 t_cc_layer.clear();
1909 t_cc_sig.clear();
1910 }
1911 else
1912 {
1913 ANA_MSG_DEBUG("processClusters(): keeping clusters");
1914 }
1915 return;
1916}
1917
1919
1920 proton_pt.clear();
1921 proton_eta.clear();
1922 proton_phi.clear();
1923 proton_e.clear();
1924 proton_side.clear();
1925 proton_eLoss.clear();
1926 proton_t.clear();
1927
1928 proton_track_stationID.clear();
1929 proton_track_nClusters.clear();
1930 proton_track_xLocal.clear();
1931 proton_track_yLocal.clear();
1932 proton_track_zLocal.clear();
1933 proton_track_xSlope.clear();
1934 proton_track_ySlope.clear();
1935
1936 proton_track_stationID.resize(m_afpProtons->size(), std::vector<int>(2));
1937 proton_track_nClusters.resize(m_afpProtons->size(), std::vector<int>(2));
1938 proton_track_xLocal.resize(m_afpProtons->size(), std::vector<float>(2));
1939 proton_track_yLocal.resize(m_afpProtons->size(), std::vector<float>(2));
1940 proton_track_zLocal.resize(m_afpProtons->size(), std::vector<float>(2));
1941 proton_track_xSlope.resize(m_afpProtons->size(), std::vector<float>(2));
1942 proton_track_ySlope.resize(m_afpProtons->size(), std::vector<float>(2));
1943
1944 nProtons = 0;
1945
1946 for(const auto * proton: *m_afpProtons){
1947
1948 proton_pt.push_back(proton->pt());
1949 proton_eta.push_back(proton->eta());
1950 proton_phi.push_back(proton->phi());
1951 proton_e.push_back(proton->e());
1952 proton_side.push_back(proton->side());
1953
1954 proton_eLoss.push_back((6800.-proton->e())/6800.);
1955 p_scat.SetPtEtaPhiE(proton->pt(), proton->eta(), proton->phi(), proton->e());
1956 (signbit(proton->eta())) ? p_beam.SetPxPyPzE(0.0, 0.0, -6800.0, 6800.0) : p_beam.SetPxPyPzE(0.0, 0.0, 6800.0,\
1957 6800.0);
1958
1959 proton_t.push_back( (p_beam - p_scat)*(p_beam - p_scat));
1960
1961 for(int i=0; i< int(proton->nTracks()); i++){
1962
1963 proton_track_stationID.at(nProtons).at(i) = proton->track(i)->stationID();
1964 proton_track_nClusters.at(nProtons).at(i) = proton->track(i)->nClusters();
1965 proton_track_xLocal.at(nProtons).at(i) = proton->track(i)->xLocal();
1966 proton_track_yLocal.at(nProtons).at(i) = proton->track(i)->yLocal();
1967 proton_track_zLocal.at(nProtons).at(i) = proton->track(i)->zLocal();
1968 proton_track_xSlope.at(nProtons).at(i) = proton->track(i)->xSlope();
1969 proton_track_ySlope.at(nProtons).at(i) = proton->track(i)->ySlope();
1970
1971 }
1972
1973 nProtons++;
1974 }
1975
1976 return;
1977}
1978
1980{
1981 uint32_t passbits = 0;
1982
1983 if (!m_isMC)
1984 {
1985 if (useGRL)
1986 {
1987 if (!m_grl->passRunLB(*m_eventInfo)) {
1988 passbits += 1; // UPC GRL
1989 }
1990 }
1991
1992 /*
1993 if(!m_grl_mb->passRunLB(*m_eventInfo)){
1994 passbits += 4; // MB GRL
1995 }
1996 */
1997
2001 || (m_eventInfo->isEventFlagBitSet(xAOD::EventInfo::Core, 18) ) )
2002 {
2003 passbits += 2;
2004 } // end if event flags check
2005 } // end if the event is data
2006
2007 return passbits;
2008}
2009
2011{
2012 if (!enableTrigger) return;
2013
2014 m_outputTree = tree( "zdcTree" );
2015 ANA_MSG_INFO("setupTriggerHistos(): Setting up trigger histos and ntuple = " << m_outputTree);
2016
2017 std::vector<std::string> triggers;
2018 std::vector<std::string> rerunTriggers;
2019 bool zdc_triggers = true;
2020
2021 // ZDC triggers
2022 if (zdc_triggers)
2023 {
2024 if (zdcCalib) // lists for calibration data
2025 {
2026 if (lhcf2022)
2027 {
2028 triggers.push_back("HLT_noalg_ZDCPEB_L1LHCF");
2029 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_OR");
2030 }
2031
2032 if (pbpb2023)
2033 {
2034 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_OR");
2035 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_OR_EMPTY");
2036 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_OR_UNPAIRED_NONISO");
2037 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_A_C");
2038 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_A_C_EMPTY");
2039 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_A_C_UNPAIRED_NONISO");
2040 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_A");
2041 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_A_EMPTY");
2042 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_A_UNPAIRED_NONISO");
2043 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_C");
2044 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_C_EMPTY");
2045 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_C_UNPAIRED_NONISO");
2046 }
2047 }
2048 else // lists for physics data
2049 {
2050 if (lhcf2022)
2051 {
2052 triggers.push_back("HLT_noalg_L1LHCF");
2053 }
2054 if (lhcf2022afp)
2055 {
2056 triggers.push_back("HLT_noalg_AFPPEB_L1AFP_A");
2057 triggers.push_back("HLT_noalg_AFPPEB_L1AFP_C");
2058 }
2059 if (lhcf2022zdc)
2060 {
2061 triggers.push_back("HLT_noalg_ZDCPEB_L1ZDC_OR");
2062 triggers.push_back("HLT_noalg_ZDCPEB_L1LHCF");
2063 triggers.push_back("HLT_noalg_L1ZDC_OR");
2064 triggers.push_back("HLT_noalg_L1ZDC_XOR_E2");
2065 triggers.push_back("HLT_noalg_L1ZDC_XOR_E1_E3");
2066 triggers.push_back("HLT_noalg_L1ZDC_A_AND_C");
2067 triggers.push_back("HLT_mb_sptrk_L1ZDC_OR");
2068 triggers.push_back("HLT_mb_sptrk_L1ZDC_XOR_E2");
2069 triggers.push_back("HLT_mb_sptrk_L1ZDC_XOR_E1_E3");
2070 triggers.push_back("HLT_mb_sptrk_L1ZDC_A_AND_C");
2071 triggers.push_back("HLT_mb_sp100_trk30_hmt_L1ZDC_XOR_E2");
2072 triggers.push_back("HLT_mb_sp100_trk30_hmt_L1ZDC_XOR_E1_E3");
2073 triggers.push_back("HLT_mb_sp100_trk30_hmt_L1ZDC_A_AND_C");
2074 }
2075 }
2076 }
2077
2078 //char name[50];
2079 ANA_MSG_INFO("Adding trigger branches!");
2080
2081 int ic = 0;
2082 for (auto &trig : triggers)
2083 {
2084 const Trig::ChainGroup* cg = m_trigDecisionTool->getChainGroup(trig);
2085 if (cg->getListOfTriggers().size())
2086 {
2087 ANA_MSG_INFO("setupTriggerHistos(): Trigger found = " << trig.c_str() << " bit " << ic);
2088 }
2089 else
2090 {
2091 ANA_MSG_INFO("setupTriggerHistos(): Trigger NOT found = " << trig.c_str() << " bit " << ic);
2092 }
2093 m_chainGroups.push_back(cg);
2094 // force all triggers to show up in tree
2095 TString bname(trig.c_str());
2096 m_outputTree->Branch(bname, &(t_decisions[ic]), bname + "/O");
2097 m_outputTree->Branch("ps_" + bname, &(t_prescales[ic]), "ps_" + bname + "/F");
2098 ic++;
2099 }
2100
2101 ANA_MSG_INFO( "triggers = " << triggers.size() << " chains = " << m_chainGroups.size() );
2102
2103 int irc = 0;
2104 ANA_MSG_INFO("Adding rerun trigger branches!");
2105 for (auto &trig : rerunTriggers)
2106 {
2107 const Trig::ChainGroup* cg = m_trigDecisionTool->getChainGroup(trig);
2108 m_rerunChainGroups.push_back(cg);
2109 if (cg->getListOfTriggers().size())
2110 {
2111 ANA_MSG_INFO("setupTriggerHistos(): Rerun trigger found = " << trig.c_str() << " bit " << irc);
2112 }
2113 else
2114 {
2115 ANA_MSG_INFO("setupTriggerHistos(): Rerun trigger NOT found = " << trig.c_str() << " bit " << irc);
2116 }
2117 // force all rerun triggers to show up in tree
2118 TString bname(trig.c_str());
2119 m_outputTree->Branch(bname, &(t_rerunDecisions[irc]), bname + "/O");
2120 irc++;
2121 }
2122
2123 // trigger matching flags for electrons and muons
2124
2125 m_setupTrigHist = true;
2126
2127 ANA_MSG_INFO("setupTriggerHistos(): Finished setting up trigger");
2128
2129}
2130
2131// from TrigMuonMatching
2132double ZdcNtuple::dR(const double eta1, const double phi1, const double eta2, const double phi2)
2133{
2134 double deta = std::abs(eta1 - eta2);
2135 double dphi = std::abs(phi1 - phi2) < TMath::Pi() ? std::abs(phi1 - phi2) : 2 * TMath::Pi() - std::abs(phi1 - phi2);
2136 return std::sqrt(deta * deta + dphi * dphi);
2137}
2138
2139
2140StatusCode ZdcNtuple :: finalize ()
2141{
2142 // This method is the mirror image of initialize(), meaning it gets
2143 // called after the last event has been processed on the worker node
2144 // and allows you to finish up any objects you created in
2145 // initialize() before they are written to disk. This is actually
2146 // fairly rare, since this happens separately for each worker node.
2147 // Most of the time you want to do your post-processing on the
2148 // submission node after all your histogram outputs have been
2149 // merged. This is different from histFinalize() in that it only
2150 // gets called on worker nodes that processed input events.
2151
2152
2153 return StatusCode::SUCCESS;
2154}
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