17 #include "GaudiKernel/EventContext.h"
29 return StatusCode::FAILURE;
35 return StatusCode::FAILURE;
41 return StatusCode::FAILURE;
49 return StatusCode::SUCCESS;
72 return StatusCode::SUCCESS;
86 const auto *prodVtx = truthPart->
prodVtx();
93 const EventContext& ctx = Gaudi::Hive::currentContext();
94 float etaAtCalo, phiAtCalo;
95 if( m_emExtrapolationTool->getEtaPhiAtCalo ( ctx,
99 trkMatchTrk.push_back( cluster->
etaBE(2) - etaAtCalo );
115 for(
unsigned int i(0);
i<trkMatchTrk.size(); ++
i ){
116 trkMatchTrk[
i] = -999;
119 std::array<double,4>
eta = { -999.0, -999.0, -999.0, -999.0 };
120 std::array<double,4>
phi = { -999.0, -999.0, -999.0, -999.0 };
121 std::array<double,4>
deltaEta = { -999.0, -999.0, -999.0, -999.0 };
122 std::array<double,4>
deltaPhi = { -999.0, -999.0, -999.0, -999.0 };
124 const EventContext& ctx = Gaudi::Hive::currentContext();
125 std::pair<std::vector<CaloSampling::CaloSample>,
126 std::vector<std::unique_ptr<Trk::Surface>>>
128 m_emExtrapolationTool->getClusterLayerSurfaces(*cluster, *caloDDMgr);
130 if (m_emExtrapolationTool
131 ->getMatchAtCalo(ctx,
134 layersAndSurfaces.first,
135 layersAndSurfaces.second,
149 if (m_emExtrapolationTool
150 ->getMatchAtCalo(ctx,
153 layersAndSurfaces.first,
154 layersAndSurfaces.second,
168 if(m_emExtrapolationTool->getMatchAtCalo ( ctx,
171 layersAndSurfaces.first,
172 layersAndSurfaces.second,
191 return nPix + nPix_DS + nSCT + nSCT_DS;
197 std::vector<float> trkMatchTrkP_dEta1(
el->nTrackParticles(),-999);
198 std::vector<float> trkMatchTrkP_dEta2(
el->nTrackParticles(),-999);
199 std::vector<float> trkMatchTrkP_dPhi1(
el->nTrackParticles(),-999);
200 std::vector<float> trkMatchTrkP_dPhi2(
el->nTrackParticles(),-999);
201 std::vector<float> trkMatchTrkLM_dEta1(
el->nTrackParticles(),-999);
202 std::vector<float> trkMatchTrkLM_dEta2(
el->nTrackParticles(),-999);
203 std::vector<float> trkMatchTrkLM_dPhi1(
el->nTrackParticles(),-999);
204 std::vector<float> trkMatchTrkLM_dPhi2(
el->nTrackParticles(),-999);
205 std::vector<float> trkMatchTrkR_dPhi2(
el->nTrackParticles(),-999);
207 std::vector<float> trueMatch_dEta2(
el->nTrackParticles(),-999);
208 std::vector<float> trueMatch_dPhi2(
el->nTrackParticles(),-999);
210 const auto *caloCluster =
el->caloCluster();
211 if( caloCluster && caloCluster->pt() > m_minET ){
212 std::vector<float> trkMatch(9,-999);
213 for(
unsigned int i(0);
i <
el->nTrackParticles(); ++
i ){
214 const auto *trackParticle =
el->trackParticle(
i );
216 fillMatchDetails( trkMatch, trackParticle, caloCluster);
217 trkMatchTrkP_dEta1[
i] = trkMatch[0];
218 trkMatchTrkP_dEta2[
i] = trkMatch[1];
219 trkMatchTrkP_dPhi1[
i] = trkMatch[2];
220 trkMatchTrkP_dPhi2[
i] = trkMatch[3];
221 trkMatchTrkLM_dEta1[
i] = trkMatch[4];
222 trkMatchTrkLM_dEta2[
i] = trkMatch[5];
223 trkMatchTrkLM_dPhi1[
i] = trkMatch[6];
224 trkMatchTrkLM_dPhi2[
i] = trkMatch[7];
225 trkMatchTrkR_dPhi2[
i] = trkMatch[8];
228 fillTruthDetails( trkMatch, trackParticle, caloCluster );
229 if( trkMatch.size() == 2 ){
230 trueMatch_dEta2[
i] = trkMatch[0];
231 trueMatch_dPhi2[
i] = trkMatch[1];
249 TrackMatchingP_dEta1Dec(*
el) = trkMatchTrkP_dEta1;
250 TrackMatchingP_dEta2Dec(*
el) = trkMatchTrkP_dEta2;
251 TrackMatchingP_dPhi1Dec(*
el) = trkMatchTrkP_dPhi1;
252 TrackMatchingP_dPhi2Dec(*
el) = trkMatchTrkP_dPhi2;
253 TrackMatchingLM_dEta1Dec(*
el) = trkMatchTrkLM_dEta1;
254 TrackMatchingLM_dEta2Dec(*
el) = trkMatchTrkLM_dEta2;
255 TrackMatchingLM_dPhi1Dec(*
el) = trkMatchTrkLM_dPhi1;
256 TrackMatchingLM_dPhi2Dec(*
el) = trkMatchTrkLM_dPhi2;
257 TrackMatchingR_dPhi2Dec(*
el) = trkMatchTrkR_dPhi2;
258 TrackMatchingTrue_dEta2Dec(*
el) = trueMatch_dEta2;
259 TrackMatchingTrue_dPhi2Dec(*
el) = trueMatch_dPhi2;
264 const auto *caloCluster =
el->caloCluster();
266 std::vector<float> subCluster_E;
267 std::vector<float> subCluster_dEta;
268 std::vector<float> subCluster_dPhi;
271 if(caloCluster && clusterLinksAcc.
isAvailable(*caloCluster) ){
272 std::vector<ElementLink<xAOD::CaloClusterContainer> > clusterLinks = clusterLinksAcc(*caloCluster);
273 for(
const auto& link : clusterLinks){
274 if( link.isValid() ){
275 subCluster_E.push_back( (*link)->e() );
276 subCluster_dEta.push_back( caloCluster->eta() - (*link)->eta() );
278 subCluster_dPhi.push_back(dphi);
285 SubCluster_EDec(*
el) = subCluster_E;
286 SubCluster_dEtaDec(*
el) = subCluster_dEta;
287 SubCluster_dPhiDec(*
el) = subCluster_dPhi;
293 const EventContext& ctx = Gaudi::Hive::currentContext();
294 const auto *caloCluster =
el->caloCluster();
300 int vtxTrkParticleIndex1 = -999;
301 int vtxTrkParticleIndex2 = -999;
302 float vtxTrkParticle1_dEta2 = -999;
303 float vtxTrkParticle1_dPhi2 = -999;
304 float vtxTrkParticle2_dEta2 = -999;
305 float vtxTrkParticle2_dPhi2 = -999;
306 float vtxRerr = -999;
307 float vtxZerr = -999;
308 float vtxMerr = -999;
309 float vtxPerr = -999;
310 float vtxChi2 = -999;
312 float vtxdEta = -999;
313 float vtxdPhi = -999;
318 if( caloCluster && caloCluster->pt() > m_minET ){
321 int trkIndex1 = -999;
322 int trkIndex2 = -999;
323 for(
unsigned int i(0);
i <
el->nTrackParticles(); ++
i ){
324 const auto *trackParticle =
el->trackParticle(
i );
326 if ( trk1 ==
nullptr ){
327 trk1 = trackParticle;
329 }
else if( trk2 ==
nullptr ){
330 if( trk1->
charge() == trackParticle->charge() )
332 trk2 = trackParticle;
338 if( trk2 !=
nullptr){
345 std::vector<const xAOD::TrackParticle*> trksToFit;
346 trksToFit.push_back( trk1 );
347 trksToFit.push_back( trk2 );
348 vtxTrkParticleIndex1 = trkIndex1;
349 vtxTrkParticleIndex2 = trkIndex2;
351 std::unique_ptr<xAOD::Vertex> myVertex( m_VertexFitter->fit( trksToFit, startingPoint ) );
355 vtxR = m_V0Tools->rxy( myVertex.get() );
356 vtxRerr = m_V0Tools->rxyError( myVertex.get() );
357 vtxZ = myVertex->
z();
358 vtxZerr = myVertex->covariancePosition()(2,2) > 0 ? sqrt( myVertex->covariancePosition()(2,2) ): myVertex->covariancePosition()(2,2);
360 std::vector<double>
masses = { 0.511e-3, 0.511e-3 };
361 vtxM = m_V0Tools->invariantMass( myVertex.get(),
masses);
362 vtxMerr = m_V0Tools->invariantMassError( myVertex.get(),
masses);
364 vtxP = m_V0Tools->pT( myVertex.get() );
365 vtxPerr = m_V0Tools->pTError( myVertex.get() );
370 m_emExtrapolationTool->getEtaPhiAtCalo( ctx, myVertex.get(), &vtxdEta, &vtxdPhi);
373 vtxdEta -= caloCluster->etaBE(2);
377 vtxPhi = vertex4P.Phi();
378 vtxEta = vertex4P.Eta();
379 double momentumScaleFactor = caloCluster->e() / vtxE;
384 mom *= momentumScaleFactor;
387 float etaAtCalo, phiAtCalo;
388 if( m_emExtrapolationTool->getEtaPhiAtCalo (ctx,
392 vtxTrkParticle1_dEta2 = caloCluster->etaBE(2) - etaAtCalo;
397 pos = perigeeParameters2.position();
398 mom = perigeeParameters2.momentum();
399 mom *= momentumScaleFactor;
402 if( m_emExtrapolationTool->getEtaPhiAtCalo (ctx,
406 vtxTrkParticle2_dEta2 = caloCluster->etaBE(2) - etaAtCalo;
440 vtxRerrDec(*
el) = vtxRerr;
442 vtxZerrDec(*
el) = vtxZerr;
444 vtxMerrDec(*
el) = vtxMerr;
445 vtxPtDec(*
el) = vtxP;
446 vtxPterrDec(*
el)= vtxPerr;
448 vtxEtaDec(*
el) = vtxEta;
449 vtxPhiDec(*
el) = vtxPhi;
450 vtxTrkParticleIndex1Dec(*
el) = vtxTrkParticleIndex1;
451 vtxTrkParticleIndex2Dec(*
el) = vtxTrkParticleIndex2;
452 vtxTrkParticle1_dPhi2Dec(*
el) = vtxTrkParticle1_dPhi2;
453 vtxTrkParticle1_dEta2Dec(*
el) = vtxTrkParticle1_dEta2;
454 vtxTrkParticle2_dPhi2Dec(*
el) = vtxTrkParticle2_dPhi2;
455 vtxTrkParticle2_dEta2Dec(*
el) = vtxTrkParticle2_dEta2;
456 vtxChi2Dec(*
el) = vtxChi2;
457 vtxNdofDec(*
el) = vtxNdof;
458 vtxdEtaDec(*
el) = vtxdEta;
459 vtxdPhiDec(*
el) = vtxdPhi;