ATLAS Offline Software
Loading...
Searching...
No Matches
DerivationFramework::PixelNtupleMaker Class Reference

#include <PixelNtupleMaker.h>

Inheritance diagram for DerivationFramework::PixelNtupleMaker:
Collaboration diagram for DerivationFramework::PixelNtupleMaker:

Public Member Functions

virtual StatusCode initialize () override final
virtual StatusCode addBranches (const EventContext &ctx) const override final

Static Public Member Functions

static void GetLayerEtaPhiFromId (uint64_t id, int *barrelEC, int *layer, int *eta, int *phi)

Private Types

typedef std::vector< ElementLink< xAOD::TrackStateValidationContainer > > MeasurementsOnTrack
typedef std::vector< ElementLink< xAOD::TrackStateValidationContainer > >::const_iterator MeasurementsOnTrackIter

Private Attributes

Gaudi::Property< int > m_storeMode {this, "StoreMode", 1, "Storing mode: 1:full, 2:small, 3:Z->tautau"}
ToolHandle< InDet::IInDetTrackSelectionToolm_selector {this, "TrackSelectionTool",""}
SG::ReadHandleKey< xAOD::TrackParticleContainerm_containerKey { this, "ContainerName", "InDetTrackParticles", "" }
SG::ReadHandleKey< xAOD::TrackMeasurementValidationContainerm_measurementContainerKey { this, "MeasurementValidationKey","PixelClusters", ""}
SG::WriteHandleKey< xAOD::TrackParticleContainerm_monitoringTracks { this, "PixelMonitoringTracksKey", "PixelMonitoringTrack","" }

Detailed Description

Definition at line 29 of file PixelNtupleMaker.h.

Member Typedef Documentation

◆ MeasurementsOnTrack

◆ MeasurementsOnTrackIter

Member Function Documentation

◆ addBranches()

StatusCode DerivationFramework::PixelNtupleMaker::addBranches ( const EventContext & ctx) const
finaloverridevirtual

Definition at line 27 of file PixelNtupleMaker.cxx.

27 {
28
29 SG::ReadHandle<xAOD::TrackParticleContainer> tracks(m_containerKey,ctx);
30 if (!tracks.isValid()) { return StatusCode::SUCCESS; }
31
32 // Check the event contains tracks
33 SG::WriteHandle<xAOD::TrackParticleContainer> PixelMonitoringTrack(m_monitoringTracks,ctx);
34 if (PixelMonitoringTrack.record(std::make_unique<xAOD::TrackParticleContainer>(),
35 std::make_unique<xAOD::TrackParticleAuxContainer>()).isFailure()) {
36 return StatusCode::SUCCESS;
37 }
38
39 SG::ReadHandle<xAOD::TrackMeasurementValidationContainer> pixClusters(m_measurementContainerKey,ctx);
40 if (!pixClusters.isValid()) { return StatusCode::SUCCESS; }
41
42 // monitoring variables.
43 const int nbin_charge = 60;
44 const int nbin_tot = 120;
45 const int nbin_eta = 30;
46 const int nbin_dedx = 300;
47 const int nbin_size = 10;
48 const int nbin_reso = 80;
49 const int nbin_occ = 80;
50
51 std::vector<std::vector<int>> clusCharge(11,std::vector<int>(nbin_charge,0));
52 std::vector<std::vector<int>> clusToT(11,std::vector<int>(nbin_tot,0));
53 std::vector<std::vector<int>> clusEta(11,std::vector<int>(nbin_eta,0));
54 std::vector<std::vector<int>> clusHitEta(11,std::vector<int>(nbin_eta,0));
55 std::vector<std::vector<int>> clusdEdx(11,std::vector<int>(nbin_dedx,0));
56 std::vector<std::vector<int>> clusSizeX(11,std::vector<int>(nbin_size,0));
57 std::vector<std::vector<int>> clusSizeZ(11,std::vector<int>(nbin_size,0));
58 std::vector<std::vector<int>> clusResidualX(11,std::vector<int>(nbin_reso,0));
59 std::vector<std::vector<int>> clusResidualY(11,std::vector<int>(nbin_reso,0));
60 std::vector<std::vector<int>> clusHole(11,std::vector<int>(nbin_eta,0));
61 std::vector<std::vector<int>> clusOcc(11,std::vector<int>(nbin_occ,0));
62
63 std::vector<int> trkEta(nbin_eta,0);
64 std::vector<int> trkHole(nbin_eta,0);
65 std::vector<int> trkdEdx(nbin_dedx,0);
66
67 float maxPt = 0.0;
68 const xAOD::TrackParticle* trk_maxpt = nullptr;
69
70 std::vector<float> tmpCov(15,0.);
71
72 // StoreGateSvc+InDetTrackParticles.msosLink
73 static const SG::ConstAccessor<MeasurementsOnTrack> acc_MeasurementsOnTrack("msosLink");
74
75 for (const xAOD::TrackParticle* trk : *tracks) {
76 uint8_t nPixHits = 0; trk->summaryValue(nPixHits,xAOD::numberOfPixelHits);
77 uint8_t nSCTHits = 0; trk->summaryValue(nSCTHits,xAOD::numberOfSCTHits);
78 if (trk->pt()<1000.0 && nPixHits<4) { continue; }
79 if (trk->pt()<1000.0 && nSCTHits<1) { continue; }
80
81 std::vector<uint64_t> holeIndex;
82 std::vector<int> clusterLayer;
83 std::vector<int> clusterBEC;
84 std::vector<int> clusterModulePhi;
85 std::vector<int> clusterModuleEta;
86 std::vector<float> clusterCharge;
87 std::vector<int> clusterToT;
88 std::vector<int> clusterL1A;
89 std::vector<int> clusterIsSplit;
90 std::vector<int> clusterSize;
91 std::vector<int> clusterSizePhi;
92 std::vector<int> clusterSizeZ;
93 std::vector<bool> isEdge;
94 std::vector<bool> isOverflow;
95 std::vector<float> trackPhi;
96 std::vector<float> trackTheta;
97 std::vector<float> trackX;
98 std::vector<float> trackY;
99 std::vector<float> localX;
100 std::vector<float> localY;
101 std::vector<float> globalX;
102 std::vector<float> globalY;
103 std::vector<float> globalZ;
104 std::vector<float> unbiasedResidualX;
105 std::vector<float> unbiasedResidualY;
106 std::vector<int> clusterIsolation10x2;
107 std::vector<int> clusterIsolation20x4;
108 std::vector<int> numTotalClustersPerModule;
109 std::vector<int> numTotalPixelsPerModule;
110 std::vector<float> moduleLorentzShift;
111
112 std::vector<std::vector<int>> rdoToT;
113 std::vector<std::vector<float>> rdoCharge;
114 std::vector<std::vector<int>> rdoPhi;
115 std::vector<std::vector<int>> rdoEta;
116
117 const MeasurementsOnTrack& measurementsOnTrack = acc_MeasurementsOnTrack(*trk);
118 for (const auto & msos_iter : measurementsOnTrack) {
119 if (!msos_iter.isValid()) { continue; }
120 const xAOD::TrackStateValidation* msos = *msos_iter;
121 if (msos->detType()!=Trk::TrackState::Pixel) { continue; } // its a pixel
122 if (msos->type()==Trk::TrackStateOnSurface::Hole) { // hole
123 holeIndex.push_back(msos->detElementId());
124 continue;
125 }
126 if (!msos->trackMeasurementValidationLink().isValid()) { continue; }
127 if (!(*(msos->trackMeasurementValidationLink()))) { continue; }
128
130
131 static const SG::ConstAccessor<float> chargeAcc("charge");
132 static const SG::ConstAccessor<int> layerAcc("layer");
133 static const SG::ConstAccessor<int> becAcc("bec");
134 static const SG::ConstAccessor<int> phi_moduleAcc("phi_module");
135 static const SG::ConstAccessor<int> eta_moduleAcc("eta_module");
136 static const SG::ConstAccessor<int> ToTAcc("ToT");
137 static const SG::ConstAccessor<int> LVL1AAcc("LVL1A");
138 static const SG::ConstAccessor<char> isSplitAcc("isSplit");
139 static const SG::ConstAccessor<int> nRDOAcc("nRDO");
140 static const SG::ConstAccessor<int> sizePhiAcc("sizePhi");
141 static const SG::ConstAccessor<int> sizeZAcc("sizeZ");
142 static const SG::ConstAccessor<float> LorentzShiftAcc("LorentzShift");
143 static const SG::ConstAccessor<std::vector<int> > rdo_totAcc("rdo_tot");
144 static const SG::ConstAccessor<std::vector<float> > rdo_chargeAcc("rdo_charge");
145
146 for (const auto *clus_itr : *pixClusters) {
147 if (clus_itr->identifier()!=(msosClus)->identifier()) { continue; }
148 if (chargeAcc(*clus_itr)!=chargeAcc(*msosClus)) { continue; }
149
150 clusterLayer.push_back(layerAcc(*clus_itr));
151 clusterBEC.push_back(becAcc(*clus_itr));
152 clusterModulePhi.push_back(phi_moduleAcc(*clus_itr));
153 clusterModuleEta.push_back(eta_moduleAcc(*clus_itr));
154 clusterCharge.push_back(chargeAcc(*clus_itr));
155 clusterToT.push_back(ToTAcc(*clus_itr));
156 clusterL1A.push_back(LVL1AAcc(*clus_itr));
157 clusterIsSplit.push_back(isSplitAcc(*clus_itr));
158 clusterSize.push_back(nRDOAcc(*clus_itr));
159 clusterSizePhi.push_back(sizePhiAcc(*clus_itr));
160 clusterSizeZ.push_back(sizeZAcc(*clus_itr));
161
162 trackPhi.push_back(msos->localPhi());
163 trackTheta.push_back(msos->localTheta());
164 trackX.push_back(msos->localX());
165 trackY.push_back(msos->localY());
166 localX.push_back(clus_itr->localX());
167 localY.push_back(clus_itr->localY());
168 globalX.push_back(clus_itr->globalX());
169 globalY.push_back(clus_itr->globalY());
170 globalZ.push_back(clus_itr->globalZ());
171 unbiasedResidualX.push_back(msos->unbiasedResidualX());
172 unbiasedResidualY.push_back(msos->unbiasedResidualY());
173 moduleLorentzShift.push_back(LorentzShiftAcc(*clus_itr));
174
175 // cluster isolation IBL:50x250um, PIXEL:50x400um
176 // - isolation region 10x2 = 500x500um for IBL, 500x800um for PIXEL
177 int numNeighborCluster10x2 = 0;
178 int numNeighborCluster20x4 = 0;
179 int nTotalClustersPerModule = 0;
180 int nTotalPixelsPerModule = 0;
181 for (const auto *clus_neighbor : *pixClusters) {
182 if (layerAcc(*clus_neighbor)==layerAcc(*clus_itr)
183 && becAcc(*clus_neighbor)==becAcc(*clus_itr)
184 && phi_moduleAcc(*clus_neighbor)==phi_moduleAcc(*clus_itr)
185 && eta_moduleAcc(*clus_neighbor)==eta_moduleAcc(*clus_itr)) {
186 float deltaX = std::abs(clus_neighbor->localX()-clus_itr->localX());
187 float deltaY = std::abs(clus_neighbor->localY()-clus_itr->localY());
188 nTotalClustersPerModule++;
189 nTotalPixelsPerModule += nRDOAcc(*clus_neighbor);
190 if (deltaX>0.0 && deltaY>0.0) {
191 if (layerAcc(*clus_itr)==0 && becAcc(*clus_itr)==0) { // IBL
192 if (deltaX<0.500 && deltaY<0.500) { numNeighborCluster10x2++; }
193 if (deltaX<1.000 && deltaY<1.000) { numNeighborCluster20x4++; }
194 }
195 else {
196 if (deltaX<0.500 && deltaY<0.800) { numNeighborCluster10x2++; }
197 if (deltaX<1.000 && deltaY<1.600) { numNeighborCluster20x4++; }
198 }
199 }
200 }
201 }
202 clusterIsolation10x2.push_back(numNeighborCluster10x2);
203 clusterIsolation20x4.push_back(numNeighborCluster20x4);
204 numTotalClustersPerModule.push_back(nTotalClustersPerModule);
205 numTotalPixelsPerModule.push_back(nTotalPixelsPerModule);
206
207 // is edge pixel?
208 // contain overlflow hit?
209 bool checkEdge = false;
210 bool checkOverflow = false;
211
212 // rdo information
213 std::vector<int> tmpToT;
214 std::vector<float> tmpCharge;
215 std::vector<int> tmpPhi;
216 std::vector<int> tmpEta;
217
218 static const SG::ConstAccessor<std::vector<int> > rdo_phi_pixel_indexAcc("rdo_phi_pixel_index");
219 int nrdo = rdo_phi_pixel_indexAcc.isAvailable(*clus_itr) ? rdo_phi_pixel_indexAcc(*clus_itr).size() : -1;
220 for (int i=0; i<nrdo; i++) {
221
222 int phi = rdo_phi_pixel_indexAcc(*clus_itr)[i];
223 if (phi<5) { checkEdge=true; }
224 if (phi>320) { checkEdge=true; }
225
226 int eta = rdo_phi_pixel_indexAcc(*clus_itr)[i];
227 if (layerAcc(*clus_itr)==0 && becAcc(*clus_itr)==0) { // IBL
228 if (eta_moduleAcc(*clus_itr)>-7 && eta_moduleAcc(*clus_itr)<6) { // IBL Planar
229 if (eta<5) { checkEdge=true; }
230 if (eta>154) { checkEdge=true; }
231 }
232 else { // IBL 3D
233 if (eta<5) { checkEdge=true; }
234 if (eta>74) { checkEdge=true; }
235 }
236 }
237 else {
238 if (eta<5) { checkEdge=true; }
239 if (eta>154) { checkEdge=true; }
240 }
241
242 int tot = rdo_totAcc(*clus_itr)[i];
243 if (layerAcc(*clus_itr)==0 && becAcc(*clus_itr)==0) { // IBL
244 if (tot==16) { checkOverflow=true; }
245 }
246 else if (layerAcc(*clus_itr)==1 && becAcc(*clus_itr)==0) { // b-layer
247 if (tot==150) { checkOverflow=true; }
248 }
249 else {
250 if (tot==255) { checkOverflow=true; }
251 }
252
253 float charge = rdo_chargeAcc(*clus_itr)[i];
254 if (trk->pt()>2000.0) {
255 tmpToT.push_back(tot);
256 tmpCharge.push_back(charge);
257 tmpPhi.push_back(phi);
258 tmpEta.push_back(eta);
259 }
260 }
261 isEdge.push_back(checkEdge);
262 isOverflow.push_back(checkOverflow);
263
264 rdoToT.push_back(tmpToT);
265 rdoCharge.push_back(tmpCharge);
266 rdoPhi.push_back(tmpPhi);
267 rdoEta.push_back(tmpEta);
268 break;
269 }
270 }
271
272 if (m_storeMode==1) {
273 static const SG::Decorator<float> d0err("d0err");
274 static const SG::Decorator<float> z0err("z0err");
275 static const SG::Decorator<std::vector<uint64_t>> HoleIndex("HoleIndex");
276 static const SG::Decorator<std::vector<int>> ClusterLayer("ClusterLayer");
277 static const SG::Decorator<std::vector<int>> ClusterBEC("ClusterBEC");
278 static const SG::Decorator<std::vector<int>> ClusterModulePhi("ClusterModulePhi");
279 static const SG::Decorator<std::vector<int>> ClusterModuleEta("ClusterModuleEta");
280 static const SG::Decorator<std::vector<float>> ClusterCharge("ClusterCharge");
281 static const SG::Decorator<std::vector<int>> ClusterToT("ClusterToT");
282 static const SG::Decorator<std::vector<int>> ClusterL1A("ClusterL1A");
283 static const SG::Decorator<std::vector<int>> ClusterIsSplit("ClusterIsSplit");
284 static const SG::Decorator<std::vector<int>> ClusterSize("ClusterSize");
285 static const SG::Decorator<std::vector<int>> ClusterSizePhi("ClusterSizePhi");
286 static const SG::Decorator<std::vector<int>> ClusterSizeZ("ClusterSizeZ");
287 static const SG::Decorator<std::vector<bool>> ClusterIsEdge("ClusterIsEdge");
288 static const SG::Decorator<std::vector<bool>> ClusterIsOverflow("ClusterIsOverflow");
289 static const SG::Decorator<std::vector<float>> TrackLocalPhi("TrackLocalPhi");
290 static const SG::Decorator<std::vector<float>> TrackLocalTheta("TrackLocalTheta");
291 static const SG::Decorator<std::vector<float>> TrackLocalX("TrackLocalX");
292 static const SG::Decorator<std::vector<float>> TrackLocalY("TrackLocalY");
293 static const SG::Decorator<std::vector<float>> ClusterLocalX("ClusterLocalX");
294 static const SG::Decorator<std::vector<float>> ClusterLocalY("ClusterLocalY");
295 static const SG::Decorator<std::vector<float>> ClusterGlobalX("ClusterGlobalX");
296 static const SG::Decorator<std::vector<float>> ClusterGlobalY("ClusterGlobalY");
297 static const SG::Decorator<std::vector<float>> ClusterGlobalZ("ClusterGlobalZ");
298 static const SG::Decorator<std::vector<float>> UnbiasedResidualX("UnbiasedResidualX");
299 static const SG::Decorator<std::vector<float>> UnbiasedResidualY("UnbiasedResidualY");
300 static const SG::Decorator<std::vector<int>> ClusterIsolation10x2("ClusterIsolation10x2");
301 static const SG::Decorator<std::vector<int>> ClusterIsolation20x4("ClusterIsolation20x4");
302 static const SG::Decorator<std::vector<int>> NumTotalClustersPerModule("NumTotalClustersPerModule");
303 static const SG::Decorator<std::vector<int>> NumTotalPixelsPerModule("NumTotalPixelsPerModule");
304 static const SG::Decorator<std::vector<float>> ModuleLorentzShift("ModuleLorentzShift");
305 static const SG::Decorator<std::vector<std::vector<int>>> RdoToT("RdoToT");
306 static const SG::Decorator<std::vector<std::vector<float>>> RdoCharge("RdoCharge");
307 static const SG::Decorator<std::vector<std::vector<int>>> RdoPhi("RdoPhi");
308 static const SG::Decorator<std::vector<std::vector<int>>> RdoEta("RdoEta");
309
310 d0err(*trk) = trk->definingParametersCovMatrixVec().at(0);
311 z0err(*trk) = trk->definingParametersCovMatrixVec().at(2);
312 HoleIndex(*trk) = std::move(holeIndex);
313 ClusterLayer(*trk) = std::move(clusterLayer);
314 ClusterBEC(*trk) = std::move(clusterBEC);
315 ClusterModulePhi(*trk) = std::move(clusterModulePhi);
316 ClusterModuleEta(*trk) = std::move(clusterModuleEta);
317 ClusterCharge(*trk) = std::move(clusterCharge);
318 ClusterToT(*trk) = std::move(clusterToT);
319 ClusterL1A(*trk) = std::move(clusterL1A);
320 ClusterIsSplit(*trk) = std::move(clusterIsSplit);
321 ClusterSize(*trk) = std::move(clusterSize);
322 ClusterSizePhi(*trk) = std::move(clusterSizePhi);
323 ClusterSizeZ(*trk) = std::move(clusterSizeZ);
324 ClusterIsEdge(*trk) = std::move(isEdge);
325 ClusterIsOverflow(*trk) = std::move(isOverflow);
326 TrackLocalPhi(*trk) = std::move(trackPhi);
327 TrackLocalTheta(*trk) = std::move(trackTheta);
328 TrackLocalX(*trk) = std::move(trackX);
329 TrackLocalY(*trk) = std::move(trackY);
330 ClusterLocalX(*trk) = std::move(localX);
331 ClusterLocalY(*trk) = std::move(localY);
332 ClusterGlobalX(*trk) = std::move(globalX);
333 ClusterGlobalY(*trk) = std::move(globalY);
334 ClusterGlobalZ(*trk) = std::move(globalZ);
335 UnbiasedResidualX(*trk) = std::move(unbiasedResidualX);
336 UnbiasedResidualY(*trk) = std::move(unbiasedResidualY);
337 ClusterIsolation10x2(*trk) = std::move(clusterIsolation10x2);
338 ClusterIsolation20x4(*trk) = std::move(clusterIsolation20x4);
339 NumTotalClustersPerModule(*trk) = std::move(numTotalClustersPerModule);
340 NumTotalPixelsPerModule(*trk) = std::move(numTotalPixelsPerModule);
341 ModuleLorentzShift(*trk) = std::move(moduleLorentzShift);
342 RdoToT(*trk) = std::move(rdoToT);
343 RdoCharge(*trk) = std::move(rdoCharge);
344 RdoPhi(*trk) = std::move(rdoPhi);
345 RdoEta(*trk) = std::move(rdoEta);
346 }
347
348 // further track selection for slimmed track variables
349 uint8_t nPixelDeadSensor = 0; trk->summaryValue(nPixelDeadSensor,xAOD::numberOfPixelDeadSensors);
350 uint8_t numberOfPixelHits= 0; trk->summaryValue(numberOfPixelHits,xAOD::numberOfPixelHits);
351 uint8_t numberOfPixelHoles= 0; trk->summaryValue(numberOfPixelHoles,xAOD::numberOfPixelHoles);
352 uint8_t numberOfPixelOutliers= 0; trk->summaryValue(numberOfPixelOutliers,xAOD::numberOfPixelOutliers);
353 uint8_t nSCTHoles = 0; trk->summaryValue(nSCTHoles,xAOD::numberOfSCTHoles);
354 uint8_t nPixSharedHits = 0; trk->summaryValue(nPixSharedHits,xAOD::numberOfPixelSharedHits);
355 uint8_t nSCTSharedHits = 0; trk->summaryValue(nSCTSharedHits,xAOD::numberOfSCTSharedHits);
356
357 // loose track selection
358 bool passLooseCut = static_cast<bool>(m_selector->accept(trk));
359 if (!passLooseCut) { continue; }
360
361 //==================
362 // Efficiency check
363 //==================
364 int checkIBL(0),check3D(0),checkBLY(0),checkLY1(0),checkLY2(0),checkEA1(0),checkEA2(0),checkEA3(0),checkEC1(0),checkEC2(0),checkEC3(0);
365 for (int i=0; i<(int)clusterLayer.size(); i++) {
366 if (clusterBEC.at(i)== 0 && clusterLayer.at(i)==0) {
367 if (clusterModuleEta.at(i)>-7 && clusterModuleEta.at(i)<6) { checkIBL++; }
368 else { check3D++; }
369 }
370 else if (clusterBEC.at(i)== 0 && clusterLayer.at(i)==1) { checkBLY++; }
371 else if (clusterBEC.at(i)== 0 && clusterLayer.at(i)==2) { checkLY1++; }
372 else if (clusterBEC.at(i)== 0 && clusterLayer.at(i)==3) { checkLY2++; }
373 else if (clusterBEC.at(i)== 2 && clusterLayer.at(i)==0) { checkEA1++; }
374 else if (clusterBEC.at(i)== 2 && clusterLayer.at(i)==1) { checkEA2++; }
375 else if (clusterBEC.at(i)== 2 && clusterLayer.at(i)==2) { checkEA3++; }
376 else if (clusterBEC.at(i)==-2 && clusterLayer.at(i)==0) { checkEC1++; }
377 else if (clusterBEC.at(i)==-2 && clusterLayer.at(i)==1) { checkEC2++; }
378 else if (clusterBEC.at(i)==-2 && clusterLayer.at(i)==2) { checkEC3++; }
379 }
380
381 if (trk->pt()>2000.0 && nPixelDeadSensor==0) {
382 int ietabin = trunc((trk->eta()+3.0)/0.2);
383
384 std::for_each((trkEta.begin()+ietabin),(trkEta.begin()+ietabin+1),[](int &n){ n++; });
385 if (numberOfPixelHoles>0) { std::for_each((trkHole.begin()+ietabin),(trkHole.begin()+ietabin+1),[](int &n){ n++; }); }
386
387 if (checkBLY>0 && checkLY1>0 && checkLY2>0) { std::for_each((clusEta[0].begin()+ietabin),(clusEta[0].begin()+ietabin+1),[](int &n){ n++; }); if (checkIBL>0) { std::for_each((clusHitEta[0].begin()+ietabin),(clusHitEta[0].begin()+ietabin+1),[](int &n){ n++; }); }}
388 if (checkBLY>0 && checkEC2>0 && checkEC3>0) { std::for_each((clusEta[1].begin()+ietabin),(clusEta[1].begin()+ietabin+1),[](int &n){ n++; }); if (check3D>0) { std::for_each((clusHitEta[1].begin()+ietabin),(clusHitEta[1].begin()+ietabin+1),[](int &n){ n++; }); }}
389 if (checkIBL>0 && checkLY1>0 && checkLY2>0) { std::for_each((clusEta[2].begin()+ietabin),(clusEta[2].begin()+ietabin+1),[](int &n){ n++; }); if (checkBLY>0) { std::for_each((clusHitEta[2].begin()+ietabin),(clusHitEta[2].begin()+ietabin+1),[](int &n){ n++; }); }}
390 if (checkIBL>0 && checkBLY>0 && checkLY2>0) { std::for_each((clusEta[3].begin()+ietabin),(clusEta[3].begin()+ietabin+1),[](int &n){ n++; }); if (checkLY1>0) { std::for_each((clusHitEta[3].begin()+ietabin),(clusHitEta[3].begin()+ietabin+1),[](int &n){ n++; }); }}
391 if (checkIBL>0 && checkBLY>0 && checkLY1>0) { std::for_each((clusEta[4].begin()+ietabin),(clusEta[4].begin()+ietabin+1),[](int &n){ n++; }); if (checkLY2>0) { std::for_each((clusHitEta[4].begin()+ietabin),(clusHitEta[4].begin()+ietabin+1),[](int &n){ n++; }); }}
392 if (checkIBL>0 && checkEA2>0 && checkEA3>0) { std::for_each((clusEta[5].begin()+ietabin),(clusEta[5].begin()+ietabin+1),[](int &n){ n++; }); if (checkEA1>0) { std::for_each((clusHitEta[5].begin()+ietabin),(clusHitEta[5].begin()+ietabin+1),[](int &n){ n++; }); }}
393 if (checkIBL>0 && checkEA1>0 && checkEA3>0) { std::for_each((clusEta[6].begin()+ietabin),(clusEta[6].begin()+ietabin+1),[](int &n){ n++; }); if (checkEA2>0) { std::for_each((clusHitEta[6].begin()+ietabin),(clusHitEta[6].begin()+ietabin+1),[](int &n){ n++; }); }}
394 if (checkIBL>0 && checkEA1>0 && checkEA2>0) { std::for_each((clusEta[7].begin()+ietabin),(clusEta[7].begin()+ietabin+1),[](int &n){ n++; }); if (checkEA3>0) { std::for_each((clusHitEta[7].begin()+ietabin),(clusHitEta[7].begin()+ietabin+1),[](int &n){ n++; }); }}
395 if (checkIBL>0 && checkEC2>0 && checkEC3>0) { std::for_each((clusEta[8].begin()+ietabin),(clusEta[8].begin()+ietabin+1),[](int &n){ n++; }); if (checkEC1>0) { std::for_each((clusHitEta[8].begin()+ietabin),(clusHitEta[8].begin()+ietabin+1),[](int &n){ n++; }); }}
396 if (checkIBL>0 && checkEC1>0 && checkEC3>0) { std::for_each((clusEta[9].begin()+ietabin),(clusEta[9].begin()+ietabin+1),[](int &n){ n++; }); if (checkEC2>0) { std::for_each((clusHitEta[9].begin()+ietabin),(clusHitEta[9].begin()+ietabin+1),[](int &n){ n++; }); }}
397 if (checkIBL>0 && checkEC1>0 && checkEC2>0) { std::for_each((clusEta[10].begin()+ietabin),(clusEta[10].begin()+ietabin+1),[](int &n){ n++; }); if (checkEC3>0) { std::for_each((clusHitEta[10].begin()+ietabin),(clusHitEta[10].begin()+ietabin+1),[](int &n){ n++; }); }}
398
399 for (int i=0; i<(int)holeIndex.size(); i++) {
400 int becH, layerH, etaH, phiH;
401 GetLayerEtaPhiFromId(holeIndex.at(i),&becH,&layerH,&etaH,&phiH);
402 if (becH== 0 && layerH==0) {
403 if (etaH>-7 && etaH<6) { std::for_each((clusHole[0].begin()+ietabin),(clusHole[0].begin()+ietabin+1),[](int &n){ n++; }); }
404 else { std::for_each((clusHole[1].begin()+ietabin),(clusHole[1].begin()+ietabin+1),[](int &n){ n++; }); }
405 }
406 if (becH== 0 && layerH==1) { std::for_each((clusHole[2].begin()+ietabin),(clusHole[2].begin()+ietabin+1),[](int &n){ n++; }); }
407 if (becH== 0 && layerH==2) { std::for_each((clusHole[3].begin()+ietabin),(clusHole[3].begin()+ietabin+1),[](int &n){ n++; }); }
408 if (becH== 0 && layerH==3) { std::for_each((clusHole[4].begin()+ietabin),(clusHole[4].begin()+ietabin+1),[](int &n){ n++; }); }
409 if (becH== 2 && layerH==0) { std::for_each((clusHole[5].begin()+ietabin),(clusHole[5].begin()+ietabin+1),[](int &n){ n++; }); }
410 if (becH== 2 && layerH==1) { std::for_each((clusHole[6].begin()+ietabin),(clusHole[6].begin()+ietabin+1),[](int &n){ n++; }); }
411 if (becH== 2 && layerH==2) { std::for_each((clusHole[7].begin()+ietabin),(clusHole[7].begin()+ietabin+1),[](int &n){ n++; }); }
412 if (becH==-2 && layerH==0) { std::for_each((clusHole[8].begin()+ietabin),(clusHole[8].begin()+ietabin+1),[](int &n){ n++; }); }
413 if (becH==-2 && layerH==1) { std::for_each((clusHole[9].begin()+ietabin),(clusHole[9].begin()+ietabin+1),[](int &n){ n++; }); }
414 if (becH==-2 && layerH==2) { std::for_each((clusHole[10].begin()+ietabin),(clusHole[10].begin()+ietabin+1),[](int &n){ n++; }); }
415 }
416 }
417
418 // Cluster should not contain edge pixels
419 int clusterEdge = 0;
420 for (int i=0; i<(int)clusterLayer.size(); i++) { clusterEdge+=isEdge.at(i); }
421
422 // Cluster should not contain overflow pixels
423 int clusterOverflow = 0;
424 for (int i=0; i<(int)clusterLayer.size(); i++) { clusterOverflow+=isOverflow.at(i); }
425
426 // Cluster should not contain split state
427 int isSplit = 0;
428 for (int i=0; i<(int)clusterLayer.size(); i++) { isSplit+=clusterIsSplit.at(i); }
429
430 // Strong isolation
431 int iso20x4 = 0;
432 for (int i=0; i<(int)clusterLayer.size(); i++) { iso20x4+=clusterIsolation20x4.at(i); }
433
434 // Good tracks must be required for the dE/dx and Lorentz angle measurements
435 bool passCut = false;
436 if (numberOfPixelHits>3 && numberOfPixelHoles==0 && nPixelDeadSensor==0 && numberOfPixelOutliers==0 && clusterEdge==0 && clusterOverflow==0 && isSplit==0 && iso20x4==0) {
437 if (checkIBL>0 && checkBLY>0 && checkLY1>0 && checkLY2>0) { // Barrel
438 passCut = true;
439 }
440 else if (checkIBL>0 && checkEA1>0 && checkEA2>0 && checkEA3>0) { // Endcap
441 passCut = true;
442 }
443 else if (checkIBL>0 && checkEC1>0 && checkEC2>0 && checkEC3>0) { // Endcap
444 passCut = true;
445 }
446 else if (check3D>0 && checkEC2>0 && checkEC3>0) { // 3D
447 passCut = true;
448 }
449 }
450 if (!passCut) { continue; }
451
452 // Cut on angle alpha
453 bool isAlphaCut = false;
454 for (int i=0; i<(int)clusterLayer.size(); i++) {
455 float alpha = std::atan(std::hypot(std::tan(trackTheta[i]),std::tan(trackPhi[i])));
456 if (std::cos(alpha)<0.16) { isAlphaCut=true; break; }
457 }
458 if (isAlphaCut) { continue; }
459
460 if (trk->pt()>maxPt) {
461 maxPt = trk->pt();
462 trk_maxpt = trk;
463 }
464
465 // Cluster study
466 float energyPair = 3.62e-6; // Electron-hole pair creation energy e-h/[MeV]
467 float siDensity = 2.329; // Silicon density [g/cm^3]
468 float thicknessIBL = 0.0200; // thickness for IBL planar [cm]
469 float thickness3D = 0.0230; // thickness for IBL 3D [cm]
470 float thicknessPIX = 0.0250; // thickness for PIXEL [cm]
471 float sumE = 0.0;
472 float sumX = 0.0;
473 for (int i=0; i<(int)clusterLayer.size(); i++) {
474
475 float alpha = std::atan(std::hypot(std::tan(trackTheta[i]),std::tan(trackPhi[i])));
476 float thickness = thicknessPIX;
477 if (clusterBEC.at(i)==0 && clusterLayer.at(i)==0) {
478 thickness = (clusterModuleEta[i]<6 && clusterModuleEta[i]>-7) ? thicknessIBL : thickness3D;
479 }
480 float recodEdx = clusterCharge[i]*energyPair/thickness/siDensity*std::cos(alpha);
481 sumE += clusterCharge[i]*energyPair;
482 sumX += thickness*siDensity/std::cos(alpha);
483
484 int ibc = (clusterCharge[i]>0.0 && clusterCharge[i]<120000.0) ? trunc(clusterCharge[i]/2000.0) : nbin_charge-1;
485 int ibt = (clusterToT[i]>0 && clusterToT[i]<120) ? trunc(clusterToT[i]) : nbin_tot-1;
486 int ibe = (recodEdx>0.0 && recodEdx<3.0) ? trunc(recodEdx*100) : nbin_dedx-1;
487 int ibx = (clusterSizePhi[i]>-0.5 && clusterSizePhi[i]<9.5) ? trunc(clusterSizePhi[i]) : nbin_size-1;
488 int ibz = (clusterSizeZ[i]>-0.5 && clusterSizeZ[i]<9.5) ? trunc(clusterSizeZ[i]) : nbin_size-1;
489 int irx = (unbiasedResidualX[i]>-0.4 && unbiasedResidualX[i]<0.4) ? trunc((unbiasedResidualX[i]+0.4)/0.01) : nbin_reso-1;
490 int iry = (unbiasedResidualY[i]>-0.4 && unbiasedResidualY[i]<0.4) ? trunc((unbiasedResidualY[i]+0.4)/0.01) : nbin_reso-1;
491 int ibo = (numTotalPixelsPerModule[i]>-0.1 && numTotalPixelsPerModule[i]<160) ? trunc(numTotalPixelsPerModule[i]/2.0) : nbin_occ-1;
492
493 int idx = 0;
494 if (clusterBEC.at(i)==0 && clusterLayer.at(i)==0) {
495 if (clusterModuleEta[i]<6 && clusterModuleEta[i]>-7) { idx=0; } // IBL-planar
496 else { idx=1; } // 3D sensor
497 }
498 else if (clusterBEC.at(i)==0 && clusterLayer.at(i)==1) { idx=2; } // B-layer
499 else if (clusterBEC.at(i)==0 && clusterLayer.at(i)==2) { idx=3; } // Layer-1
500 else if (clusterBEC.at(i)==0 && clusterLayer.at(i)==3) { idx=4; } // Layer-2
501 else if (clusterBEC.at(i)==2 && clusterLayer.at(i)==0) { idx=5; } // Endcap-A1
502 else if (clusterBEC.at(i)==2 && clusterLayer.at(i)==1) { idx=6; } // Endcap-A2
503 else if (clusterBEC.at(i)==2 && clusterLayer.at(i)==2) { idx=7; } // Endcap-A3
504 else if (clusterBEC.at(i)==-2 && clusterLayer.at(i)==0) { idx=8; } // Endcap-C1
505 else if (clusterBEC.at(i)==-2 && clusterLayer.at(i)==1) { idx=9; } // Endcap-C2
506 else if (clusterBEC.at(i)==-2 && clusterLayer.at(i)==2) { idx=10; } // Endcap-C3
507
508 std::for_each((clusCharge[idx].begin()+ibc),(clusCharge[idx].begin()+ibc+1),[](int &n){ n++; });
509 std::for_each((clusToT[idx].begin()+ibt),(clusToT[idx].begin()+ibt+1),[](int &n){ n++; });
510 std::for_each((clusdEdx[idx].begin()+ibe),(clusdEdx[idx].begin()+ibe+1),[](int &n){ n++; });
511 std::for_each((clusSizeX[idx].begin()+ibx),(clusSizeX[idx].begin()+ibx+1),[](int &n){ n++; });
512 std::for_each((clusSizeZ[idx].begin()+ibz),(clusSizeZ[idx].begin()+ibz+1),[](int &n){ n++; });
513 std::for_each((clusResidualX[idx].begin()+irx),(clusResidualX[idx].begin()+irx+1),[](int &n){ n++; });
514 std::for_each((clusResidualY[idx].begin()+iry),(clusResidualY[idx].begin()+iry+1),[](int &n){ n++; });
515 std::for_each((clusOcc[idx].begin()+ibo),(clusOcc[idx].begin()+ibo+1),[](int &n){ n++; });
516 }
517
518 if (sumX>0.0) {
519 int iby = (sumE/sumX>0.0 && sumE/sumX<3.0) ? trunc(sumE/sumX*100) : 299;
520 std::for_each((trkdEdx.begin()+iby),(trkdEdx.begin()+iby+1),[](int &n){ n++; });
521 }
522 }
523
524 if (m_storeMode==2) {
525 if (maxPt>0.0) {
527 tp->makePrivateStore(*trk_maxpt);
528 tp->setDefiningParametersCovMatrixVec(tmpCov);
529
530 static const SG::Decorator<std::vector<int>> TrackEtaIBL("TrackEtaIBL");
531 static const SG::Decorator<std::vector<int>> TrackEta3D("TrackEta3D");
532 static const SG::Decorator<std::vector<int>> TrackEtaBL("TrackEtaBL");
533 static const SG::Decorator<std::vector<int>> TrackEtaL1("TrackEtaL1");
534 static const SG::Decorator<std::vector<int>> TrackEtaL2("TrackEtaL2");
535 static const SG::Decorator<std::vector<int>> TrackEtaEA1("TrackEtaEA1");
536 static const SG::Decorator<std::vector<int>> TrackEtaEA2("TrackEtaEA2");
537 static const SG::Decorator<std::vector<int>> TrackEtaEA3("TrackEtaEA3");
538 static const SG::Decorator<std::vector<int>> TrackEtaEC1("TrackEtaEC1");
539 static const SG::Decorator<std::vector<int>> TrackEtaEC2("TrackEtaEC2");
540 static const SG::Decorator<std::vector<int>> TrackEtaEC3("TrackEtaEC3");
541 static const SG::Decorator<std::vector<int>> TrackHitEtaIBL("TrackHitEtaIBL");
542 static const SG::Decorator<std::vector<int>> TrackHitEta3D("TrackHitEta3D");
543 static const SG::Decorator<std::vector<int>> TrackHitEtaBL("TrackHitEtaBL");
544 static const SG::Decorator<std::vector<int>> TrackHitEtaL1("TrackHitEtaL1");
545 static const SG::Decorator<std::vector<int>> TrackHitEtaL2("TrackHitEtaL2");
546 static const SG::Decorator<std::vector<int>> TrackHitEtaEA1("TrackHitEtaEA1");
547 static const SG::Decorator<std::vector<int>> TrackHitEtaEA2("TrackHitEtaEA2");
548 static const SG::Decorator<std::vector<int>> TrackHitEtaEA3("TrackHitEtaEA3");
549 static const SG::Decorator<std::vector<int>> TrackHitEtaEC1("TrackHitEtaEC1");
550 static const SG::Decorator<std::vector<int>> TrackHitEtaEC2("TrackHitEtaEC2");
551 static const SG::Decorator<std::vector<int>> TrackHitEtaEC3("TrackHitEtaEC3");
552 static const SG::Decorator<std::vector<int>> ClusterChargeIBL("ClusterChargeIBL");
553 static const SG::Decorator<std::vector<int>> ClusterCharge3D("ClusterCharge3D");
554 static const SG::Decorator<std::vector<int>> ClusterChargeBL("ClusterChargeBL");
555 static const SG::Decorator<std::vector<int>> ClusterChargeL1("ClusterChargeL1");
556 static const SG::Decorator<std::vector<int>> ClusterChargeL2("ClusterChargeL2");
557 static const SG::Decorator<std::vector<int>> ClusterChargeEA1("ClusterChargeEA1");
558 static const SG::Decorator<std::vector<int>> ClusterChargeEA2("ClusterChargeEA2");
559 static const SG::Decorator<std::vector<int>> ClusterChargeEA3("ClusterChargeEA3");
560 static const SG::Decorator<std::vector<int>> ClusterChargeEC1("ClusterChargeEC1");
561 static const SG::Decorator<std::vector<int>> ClusterChargeEC2("ClusterChargeEC2");
562 static const SG::Decorator<std::vector<int>> ClusterChargeEC3("ClusterChargeEC3");
563 static const SG::Decorator<std::vector<int>> ClusterToTIBL("ClusterToTIBL");
564 static const SG::Decorator<std::vector<int>> ClusterToT3D("ClusterToT3D");
565 static const SG::Decorator<std::vector<int>> ClusterToTBL("ClusterToTBL");
566 static const SG::Decorator<std::vector<int>> ClusterToTL1("ClusterToTL1");
567 static const SG::Decorator<std::vector<int>> ClusterToTL2("ClusterToTL2");
568 static const SG::Decorator<std::vector<int>> ClusterToTEA1("ClusterToTEA1");
569 static const SG::Decorator<std::vector<int>> ClusterToTEA2("ClusterToTEA2");
570 static const SG::Decorator<std::vector<int>> ClusterToTEA3("ClusterToTEA3");
571 static const SG::Decorator<std::vector<int>> ClusterToTEC1("ClusterToTEC1");
572 static const SG::Decorator<std::vector<int>> ClusterToTEC2("ClusterToTEC2");
573 static const SG::Decorator<std::vector<int>> ClusterToTEC3("ClusterToTEC3");
574 static const SG::Decorator<std::vector<int>> ClusterdEdxIBL("ClusterdEdxIBL");
575 static const SG::Decorator<std::vector<int>> ClusterdEdx3D("ClusterdEdx3D");
576 static const SG::Decorator<std::vector<int>> ClusterdEdxBL("ClusterdEdxBL");
577 static const SG::Decorator<std::vector<int>> ClusterdEdxL1("ClusterdEdxL1");
578 static const SG::Decorator<std::vector<int>> ClusterdEdxL2("ClusterdEdxL2");
579 static const SG::Decorator<std::vector<int>> ClusterdEdxEA1("ClusterdEdxEA1");
580 static const SG::Decorator<std::vector<int>> ClusterdEdxEA2("ClusterdEdxEA2");
581 static const SG::Decorator<std::vector<int>> ClusterdEdxEA3("ClusterdEdxEA3");
582 static const SG::Decorator<std::vector<int>> ClusterdEdxEC1("ClusterdEdxEC1");
583 static const SG::Decorator<std::vector<int>> ClusterdEdxEC2("ClusterdEdxEC2");
584 static const SG::Decorator<std::vector<int>> ClusterdEdxEC3("ClusterdEdxEC3");
585 static const SG::Decorator<std::vector<int>> ClusterSizeXIBL("ClusterSizeXIBL");
586 static const SG::Decorator<std::vector<int>> ClusterSizeX3D("ClusterSizeX3D");
587 static const SG::Decorator<std::vector<int>> ClusterSizeXBL("ClusterSizeXBL");
588 static const SG::Decorator<std::vector<int>> ClusterSizeXL1("ClusterSizeXL1");
589 static const SG::Decorator<std::vector<int>> ClusterSizeXL2("ClusterSizeXL2");
590 static const SG::Decorator<std::vector<int>> ClusterSizeXEA1("ClusterSizeXEA1");
591 static const SG::Decorator<std::vector<int>> ClusterSizeXEA2("ClusterSizeXEA2");
592 static const SG::Decorator<std::vector<int>> ClusterSizeXEA3("ClusterSizeXEA3");
593 static const SG::Decorator<std::vector<int>> ClusterSizeXEC1("ClusterSizeXEC1");
594 static const SG::Decorator<std::vector<int>> ClusterSizeXEC2("ClusterSizeXEC2");
595 static const SG::Decorator<std::vector<int>> ClusterSizeXEC3("ClusterSizeXEC3");
596 static const SG::Decorator<std::vector<int>> ClusterSizeZIBL("ClusterSizeZIBL");
597 static const SG::Decorator<std::vector<int>> ClusterSizeZ3D("ClusterSizeZ3D");
598 static const SG::Decorator<std::vector<int>> ClusterSizeZBL("ClusterSizeZBL");
599 static const SG::Decorator<std::vector<int>> ClusterSizeZL1("ClusterSizeZL1");
600 static const SG::Decorator<std::vector<int>> ClusterSizeZL2("ClusterSizeZL2");
601 static const SG::Decorator<std::vector<int>> ClusterSizeZEA1("ClusterSizeZEA1");
602 static const SG::Decorator<std::vector<int>> ClusterSizeZEA2("ClusterSizeZEA2");
603 static const SG::Decorator<std::vector<int>> ClusterSizeZEA3("ClusterSizeZEA3");
604 static const SG::Decorator<std::vector<int>> ClusterSizeZEC1("ClusterSizeZEC1");
605 static const SG::Decorator<std::vector<int>> ClusterSizeZEC2("ClusterSizeZEC2");
606 static const SG::Decorator<std::vector<int>> ClusterSizeZEC3("ClusterSizeZEC3");
607 static const SG::Decorator<std::vector<int>> ClusterResidualXIBL("ClusterResidualXIBL");
608 static const SG::Decorator<std::vector<int>> ClusterResidualX3D("ClusterResidualX3D");
609 static const SG::Decorator<std::vector<int>> ClusterResidualXBL("ClusterResidualXBL");
610 static const SG::Decorator<std::vector<int>> ClusterResidualXL1("ClusterResidualXL1");
611 static const SG::Decorator<std::vector<int>> ClusterResidualXL2("ClusterResidualXL2");
612 static const SG::Decorator<std::vector<int>> ClusterResidualXEA1("ClusterResidualXEA1");
613 static const SG::Decorator<std::vector<int>> ClusterResidualXEA2("ClusterResidualXEA2");
614 static const SG::Decorator<std::vector<int>> ClusterResidualXEA3("ClusterResidualXEA3");
615 static const SG::Decorator<std::vector<int>> ClusterResidualXEC1("ClusterResidualXEC1");
616 static const SG::Decorator<std::vector<int>> ClusterResidualXEC2("ClusterResidualXEC2");
617 static const SG::Decorator<std::vector<int>> ClusterResidualXEC3("ClusterResidualXEC3");
618 static const SG::Decorator<std::vector<int>> ClusterResidualYIBL("ClusterResidualYIBL");
619 static const SG::Decorator<std::vector<int>> ClusterResidualY3D("ClusterResidualY3D");
620 static const SG::Decorator<std::vector<int>> ClusterResidualYBL("ClusterResidualYBL");
621 static const SG::Decorator<std::vector<int>> ClusterResidualYL1("ClusterResidualYL1");
622 static const SG::Decorator<std::vector<int>> ClusterResidualYL2("ClusterResidualYL2");
623 static const SG::Decorator<std::vector<int>> ClusterResidualYEA1("ClusterResidualYEA1");
624 static const SG::Decorator<std::vector<int>> ClusterResidualYEA2("ClusterResidualYEA2");
625 static const SG::Decorator<std::vector<int>> ClusterResidualYEA3("ClusterResidualYEA3");
626 static const SG::Decorator<std::vector<int>> ClusterResidualYEC1("ClusterResidualYEC1");
627 static const SG::Decorator<std::vector<int>> ClusterResidualYEC2("ClusterResidualYEC2");
628 static const SG::Decorator<std::vector<int>> ClusterResidualYEC3("ClusterResidualYEC3");
629 static const SG::Decorator<std::vector<int>> ClusterHoleIBL("ClusterHoleIBL");
630 static const SG::Decorator<std::vector<int>> ClusterHole3D("ClusterHole3D");
631 static const SG::Decorator<std::vector<int>> ClusterHoleBL("ClusterHoleBL");
632 static const SG::Decorator<std::vector<int>> ClusterHoleL1("ClusterHoleL1");
633 static const SG::Decorator<std::vector<int>> ClusterHoleL2("ClusterHoleL2");
634 static const SG::Decorator<std::vector<int>> ClusterHoleEA1("ClusterHoleEA1");
635 static const SG::Decorator<std::vector<int>> ClusterHoleEA2("ClusterHoleEA2");
636 static const SG::Decorator<std::vector<int>> ClusterHoleEA3("ClusterHoleEA3");
637 static const SG::Decorator<std::vector<int>> ClusterHoleEC1("ClusterHoleEC1");
638 static const SG::Decorator<std::vector<int>> ClusterHoleEC2("ClusterHoleEC2");
639 static const SG::Decorator<std::vector<int>> ClusterHoleEC3("ClusterHoleEC3");
640 static const SG::Decorator<std::vector<int>> ClusterOccIBL("ClusterOccIBL");
641 static const SG::Decorator<std::vector<int>> ClusterOcc3D("ClusterOcc3D");
642 static const SG::Decorator<std::vector<int>> ClusterOccBL("ClusterOccBL");
643 static const SG::Decorator<std::vector<int>> ClusterOccL1("ClusterOccL1");
644 static const SG::Decorator<std::vector<int>> ClusterOccL2("ClusterOccL2");
645 static const SG::Decorator<std::vector<int>> ClusterOccEA1("ClusterOccEA1");
646 static const SG::Decorator<std::vector<int>> ClusterOccEA2("ClusterOccEA2");
647 static const SG::Decorator<std::vector<int>> ClusterOccEA3("ClusterOccEA3");
648 static const SG::Decorator<std::vector<int>> ClusterOccEC1("ClusterOccEC1");
649 static const SG::Decorator<std::vector<int>> ClusterOccEC2("ClusterOccEC2");
650 static const SG::Decorator<std::vector<int>> ClusterOccEC3("ClusterOccEC3");
651 static const SG::Decorator<std::vector<int>> TrackALL("TrackALL");
652 static const SG::Decorator<std::vector<int>> TrackHOLE("TrackHOLE");
653 static const SG::Decorator<std::vector<int>> TrackdEdx("TrackdEdx");
654
655 TrackEtaIBL(*tp) = std::move(clusEta[0]);
656 TrackEta3D(*tp) = std::move(clusEta[1]);
657 TrackEtaBL(*tp) = std::move(clusEta[2]);
658 TrackEtaL1(*tp) = std::move(clusEta[3]);
659 TrackEtaL2(*tp) = std::move(clusEta[4]);
660 TrackEtaEA1(*tp) = std::move(clusEta[5]);
661 TrackEtaEA2(*tp) = std::move(clusEta[6]);
662 TrackEtaEA3(*tp) = std::move(clusEta[7]);
663 TrackEtaEC1(*tp) = std::move(clusEta[8]);
664 TrackEtaEC2(*tp) = std::move(clusEta[9]);
665 TrackEtaEC3(*tp) = std::move(clusEta[10]);
666 TrackHitEtaIBL(*tp) = std::move(clusHitEta[0]);
667 TrackHitEta3D(*tp) = std::move(clusHitEta[1]);
668 TrackHitEtaBL(*tp) = std::move(clusHitEta[2]);
669 TrackHitEtaL1(*tp) = std::move(clusHitEta[3]);
670 TrackHitEtaL2(*tp) = std::move(clusHitEta[4]);
671 TrackHitEtaEA1(*tp) = std::move(clusHitEta[5]);
672 TrackHitEtaEA2(*tp) = std::move(clusHitEta[6]);
673 TrackHitEtaEA3(*tp) = std::move(clusHitEta[7]);
674 TrackHitEtaEC1(*tp) = std::move(clusHitEta[8]);
675 TrackHitEtaEC2(*tp) = std::move(clusHitEta[9]);
676 TrackHitEtaEC3(*tp) = std::move(clusHitEta[10]);
677 ClusterChargeIBL(*tp) = std::move(clusCharge[0]);
678 ClusterCharge3D(*tp) = std::move(clusCharge[1]);
679 ClusterChargeBL(*tp) = std::move(clusCharge[2]);
680 ClusterChargeL1(*tp) = std::move(clusCharge[3]);
681 ClusterChargeL2(*tp) = std::move(clusCharge[4]);
682 ClusterChargeEA1(*tp) = std::move(clusCharge[5]);
683 ClusterChargeEA2(*tp) = std::move(clusCharge[6]);
684 ClusterChargeEA3(*tp) = std::move(clusCharge[7]);
685 ClusterChargeEC1(*tp) = std::move(clusCharge[8]);
686 ClusterChargeEC2(*tp) = std::move(clusCharge[9]);
687 ClusterChargeEC3(*tp) = std::move(clusCharge[10]);
688 ClusterToTIBL(*tp) = std::move(clusToT[0]);
689 ClusterToT3D(*tp) = std::move(clusToT[1]);
690 ClusterToTBL(*tp) = std::move(clusToT[2]);
691 ClusterToTL1(*tp) = std::move(clusToT[3]);
692 ClusterToTL2(*tp) = std::move(clusToT[4]);
693 ClusterToTEA1(*tp) = std::move(clusToT[5]);
694 ClusterToTEA2(*tp) = std::move(clusToT[6]);
695 ClusterToTEA3(*tp) = std::move(clusToT[7]);
696 ClusterToTEC1(*tp) = std::move(clusToT[8]);
697 ClusterToTEC2(*tp) = std::move(clusToT[9]);
698 ClusterToTEC3(*tp) = std::move(clusToT[10]);
699 ClusterdEdxIBL(*tp) = std::move(clusdEdx[0]);
700 ClusterdEdx3D(*tp) = std::move(clusdEdx[1]);
701 ClusterdEdxBL(*tp) = std::move(clusdEdx[2]);
702 ClusterdEdxL1(*tp) = std::move(clusdEdx[3]);
703 ClusterdEdxL2(*tp) = std::move(clusdEdx[4]);
704 ClusterdEdxEA1(*tp) = std::move(clusdEdx[5]);
705 ClusterdEdxEA2(*tp) = std::move(clusdEdx[6]);
706 ClusterdEdxEA3(*tp) = std::move(clusdEdx[7]);
707 ClusterdEdxEC1(*tp) = std::move(clusdEdx[8]);
708 ClusterdEdxEC2(*tp) = std::move(clusdEdx[9]);
709 ClusterdEdxEC3(*tp) = std::move(clusdEdx[10]);
710 ClusterSizeXIBL(*tp) = std::move(clusSizeX[0]);
711 ClusterSizeX3D(*tp) = std::move(clusSizeX[1]);
712 ClusterSizeXBL(*tp) = std::move(clusSizeX[2]);
713 ClusterSizeXL1(*tp) = std::move(clusSizeX[3]);
714 ClusterSizeXL2(*tp) = std::move(clusSizeX[4]);
715 ClusterSizeXEA1(*tp) = std::move(clusSizeX[5]);
716 ClusterSizeXEA2(*tp) = std::move(clusSizeX[6]);
717 ClusterSizeXEA3(*tp) = std::move(clusSizeX[7]);
718 ClusterSizeXEC1(*tp) = std::move(clusSizeX[8]);
719 ClusterSizeXEC2(*tp) = std::move(clusSizeX[9]);
720 ClusterSizeXEC3(*tp) = std::move(clusSizeX[10]);
721 ClusterSizeZIBL(*tp) = std::move(clusSizeZ[0]);
722 ClusterSizeZ3D(*tp) = std::move(clusSizeZ[1]);
723 ClusterSizeZBL(*tp) = std::move(clusSizeZ[2]);
724 ClusterSizeZL1(*tp) = std::move(clusSizeZ[3]);
725 ClusterSizeZL2(*tp) = std::move(clusSizeZ[4]);
726 ClusterSizeZEA1(*tp) = std::move(clusSizeZ[5]);
727 ClusterSizeZEA2(*tp) = std::move(clusSizeZ[6]);
728 ClusterSizeZEA3(*tp) = std::move(clusSizeZ[7]);
729 ClusterSizeZEC1(*tp) = std::move(clusSizeZ[8]);
730 ClusterSizeZEC2(*tp) = std::move(clusSizeZ[9]);
731 ClusterSizeZEC3(*tp) = std::move(clusSizeZ[10]);
732 ClusterResidualXIBL(*tp) = std::move(clusResidualX[0]);
733 ClusterResidualX3D(*tp) = std::move(clusResidualX[1]);
734 ClusterResidualXBL(*tp) = std::move(clusResidualX[2]);
735 ClusterResidualXL1(*tp) = std::move(clusResidualX[3]);
736 ClusterResidualXL2(*tp) = std::move(clusResidualX[4]);
737 ClusterResidualXEA1(*tp) = std::move(clusResidualX[5]);
738 ClusterResidualXEA2(*tp) = std::move(clusResidualX[6]);
739 ClusterResidualXEA3(*tp) = std::move(clusResidualX[7]);
740 ClusterResidualXEC1(*tp) = std::move(clusResidualX[8]);
741 ClusterResidualXEC2(*tp) = std::move(clusResidualX[9]);
742 ClusterResidualXEC3(*tp) = std::move(clusResidualX[10]);
743 ClusterResidualYIBL(*tp) = std::move(clusResidualY[0]);
744 ClusterResidualY3D(*tp) = std::move(clusResidualY[1]);
745 ClusterResidualYBL(*tp) = std::move(clusResidualY[2]);
746 ClusterResidualYL1(*tp) = std::move(clusResidualY[3]);
747 ClusterResidualYL2(*tp) = std::move(clusResidualY[4]);
748 ClusterResidualYEA1(*tp) = std::move(clusResidualY[5]);
749 ClusterResidualYEA2(*tp) = std::move(clusResidualY[6]);
750 ClusterResidualYEA3(*tp) = std::move(clusResidualY[7]);
751 ClusterResidualYEC1(*tp) = std::move(clusResidualY[8]);
752 ClusterResidualYEC2(*tp) = std::move(clusResidualY[9]);
753 ClusterResidualYEC3(*tp) = std::move(clusResidualY[10]);
754 ClusterHoleIBL(*tp) = std::move(clusHole[0]);
755 ClusterHole3D(*tp) = std::move(clusHole[1]);
756 ClusterHoleBL(*tp) = std::move(clusHole[2]);
757 ClusterHoleL1(*tp) = std::move(clusHole[3]);
758 ClusterHoleL2(*tp) = std::move(clusHole[4]);
759 ClusterHoleEA1(*tp) = std::move(clusHole[5]);
760 ClusterHoleEA2(*tp) = std::move(clusHole[6]);
761 ClusterHoleEA3(*tp) = std::move(clusHole[7]);
762 ClusterHoleEC1(*tp) = std::move(clusHole[8]);
763 ClusterHoleEC2(*tp) = std::move(clusHole[9]);
764 ClusterHoleEC3(*tp) = std::move(clusHole[10]);
765 ClusterOccIBL(*tp) = std::move(clusOcc[0]);
766 ClusterOcc3D(*tp) = std::move(clusOcc[1]);
767 ClusterOccBL(*tp) = std::move(clusOcc[2]);
768 ClusterOccL1(*tp) = std::move(clusOcc[3]);
769 ClusterOccL2(*tp) = std::move(clusOcc[4]);
770 ClusterOccEA1(*tp) = std::move(clusOcc[5]);
771 ClusterOccEA2(*tp) = std::move(clusOcc[6]);
772 ClusterOccEA3(*tp) = std::move(clusOcc[7]);
773 ClusterOccEC1(*tp) = std::move(clusOcc[8]);
774 ClusterOccEC2(*tp) = std::move(clusOcc[9]);
775 ClusterOccEC3(*tp) = std::move(clusOcc[10]);
776 TrackALL(*tp) = std::move(trkEta);
777 TrackHOLE(*tp) = std::move(trkHole);
778 TrackdEdx(*tp) = std::move(trkdEdx);
779
780 PixelMonitoringTrack->push_back(tp);
781 }
782 }
783 return StatusCode::SUCCESS;
784}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
double charge(const T &p)
Definition AtlasPID.h:997
ToolHandle< InDet::IInDetTrackSelectionTool > m_selector
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_containerKey
SG::WriteHandleKey< xAOD::TrackParticleContainer > m_monitoringTracks
SG::ReadHandleKey< xAOD::TrackMeasurementValidationContainer > m_measurementContainerKey
std::vector< ElementLink< xAOD::TrackStateValidationContainer > > MeasurementsOnTrack
static void GetLayerEtaPhiFromId(uint64_t id, int *barrelEC, int *layer, int *eta, int *phi)
@ Hole
A hole on the track - this is defined in the following way.
uint64_t detElementId() const
Returns the detector element identifier.
float unbiasedResidualX() const
Returns the unbiased x residual.
float localY() const
Returns the y position.
float localTheta() const
Returns the theta position.
float unbiasedResidualY() const
Returns the unbiased x residual.
char detType() const
Returns the detector type.
float localPhi() const
Returns the phi position.
ElementLink< xAOD::TrackMeasurementValidationContainer > trackMeasurementValidationLink() const
float nSCTSharedHits(const U &p)
float nSCTHoles(const U &p)
float nSCTHits(const U &p)
@ globalZ
Definition HitInfo.h:39
bool trackPhi(const xAOD::TauJet &, const xAOD::TauTrack &track, float &out)
TrackMeasurementValidation_v1 TrackMeasurementValidation
Reference the current persistent version:
TrackStateValidation_v1 TrackStateValidation
Reference the current persistent version:
TrackParticle_v1 TrackParticle
Reference the current persistent version:
@ numberOfPixelHoles
number of pixel layers on track with absence of hits [unit8_t].
@ numberOfPixelOutliers
these are the pixel outliers, including the b-layer [unit8_t].
@ numberOfSCTHits
number of hits in SCT [unit8_t].
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
@ numberOfPixelSharedHits
number of Pixel all-layer hits shared by several tracks [unit8_t].
@ numberOfSCTSharedHits
number of SCT hits shared by several tracks [unit8_t].
@ numberOfPixelDeadSensors
number of dead pixel sensors crossed [unit8_t].
@ numberOfSCTHoles
number of SCT holes [unit8_t].

◆ GetLayerEtaPhiFromId()

void DerivationFramework::PixelNtupleMaker::GetLayerEtaPhiFromId ( uint64_t id,
int * barrelEC,
int * layer,
int * eta,
int * phi )
static

Definition at line 786 of file PixelNtupleMaker.cxx.

786 {
787 *eta =(id>>43) % 0x20 - 10;
788 *phi =(id>>43) % 0x800 / 0x20;
789 int layer_index = ((id>>43) / 0x800) & 0xF;
790
791 //A possibility is to use a bit by bit AND: layer_index & 0xF
792 switch (layer_index) {
793 case 4:
794 *barrelEC=-2;
795 *layer = 0;
796 break;
797 case 5:
798 *barrelEC=-2;
799 *layer = 1;
800 break;
801 case 6:
802 *barrelEC=-2;
803 *layer = 2;
804 break;
805 case 8:
806 *barrelEC=0;
807 *layer=0;
808 break;
809 case 9:
810 *layer=1;
811 *barrelEC=0;
812 break;
813 case 10:
814 *layer=2;
815 *barrelEC=0;
816 break;
817 case 11:
818 *barrelEC=0;
819 *layer =3;
820 break;
821 case 12:
822 *barrelEC=2;
823 *layer=0;
824 break;
825 case 13:
826 *layer =1;
827 *barrelEC=2;
828 break;
829 case 14:
830 *layer=2;
831 *barrelEC=2;
832 break;
833 }
834}
@ layer
Definition HitInfo.h:79

◆ initialize()

StatusCode DerivationFramework::PixelNtupleMaker::initialize ( )
finaloverridevirtual

Definition at line 18 of file PixelNtupleMaker.cxx.

18 {
19 ATH_CHECK(m_selector.retrieve());
20 ATH_CHECK(m_containerKey.initialize());
22 ATH_CHECK(m_monitoringTracks.initialize());
23 return StatusCode::SUCCESS;
24}
#define ATH_CHECK
Evaluate an expression and check for errors.

Member Data Documentation

◆ m_containerKey

SG::ReadHandleKey<xAOD::TrackParticleContainer> DerivationFramework::PixelNtupleMaker::m_containerKey { this, "ContainerName", "InDetTrackParticles", "" }
private

Definition at line 45 of file PixelNtupleMaker.h.

46{ this, "ContainerName", "InDetTrackParticles", "" };

◆ m_measurementContainerKey

SG::ReadHandleKey<xAOD::TrackMeasurementValidationContainer> DerivationFramework::PixelNtupleMaker::m_measurementContainerKey { this, "MeasurementValidationKey","PixelClusters", ""}
private

Definition at line 47 of file PixelNtupleMaker.h.

48{ this, "MeasurementValidationKey","PixelClusters", ""};

◆ m_monitoringTracks

SG::WriteHandleKey<xAOD::TrackParticleContainer> DerivationFramework::PixelNtupleMaker::m_monitoringTracks { this, "PixelMonitoringTracksKey", "PixelMonitoringTrack","" }
private

Definition at line 50 of file PixelNtupleMaker.h.

51{ this, "PixelMonitoringTracksKey", "PixelMonitoringTrack","" };

◆ m_selector

ToolHandle<InDet::IInDetTrackSelectionTool> DerivationFramework::PixelNtupleMaker::m_selector {this, "TrackSelectionTool",""}
private

Definition at line 42 of file PixelNtupleMaker.h.

43{this, "TrackSelectionTool",""};

◆ m_storeMode

Gaudi::Property<int> DerivationFramework::PixelNtupleMaker::m_storeMode {this, "StoreMode", 1, "Storing mode: 1:full, 2:small, 3:Z->tautau"}
private

Definition at line 39 of file PixelNtupleMaker.h.

40{this, "StoreMode", 1, "Storing mode: 1:full, 2:small, 3:Z->tautau"};

The documentation for this class was generated from the following files: