20 #include "GaudiKernel/EventContext.h"
28 m_emExtrapolationTool(
"EMExtrapolationTools"),
29 m_VertexFitter(
"Trk::TrkVkalVrtFitter"),
30 m_V0Tools(
"Trk::V0Tools"),
36 declareProperty(
"MinET",
m_minET);
48 return StatusCode::FAILURE;
54 return StatusCode::FAILURE;
60 return StatusCode::FAILURE;
68 return StatusCode::SUCCESS;
72 return StatusCode::SUCCESS;
77 const EventContext& ctx = Gaudi::Hive::currentContext();
95 return StatusCode::SUCCESS;
109 const auto *prodVtx = truthPart->
prodVtx();
116 const EventContext& ctx = Gaudi::Hive::currentContext();
117 float etaAtCalo, phiAtCalo;
118 if( m_emExtrapolationTool->getEtaPhiAtCalo ( ctx,
122 trkMatchTrk.push_back( cluster->
etaBE(2) - etaAtCalo );
138 for(
unsigned int i(0);
i<trkMatchTrk.size(); ++
i ){
139 trkMatchTrk[
i] = -999;
142 std::array<double,4> eta = { -999.0, -999.0, -999.0, -999.0 };
143 std::array<double,4> phi = { -999.0, -999.0, -999.0, -999.0 };
144 std::array<double,4>
deltaEta = { -999.0, -999.0, -999.0, -999.0 };
145 std::array<double,4>
deltaPhi = { -999.0, -999.0, -999.0, -999.0 };
147 const EventContext& ctx = Gaudi::Hive::currentContext();
148 std::pair<std::vector<CaloSampling::CaloSample>,
149 std::vector<std::unique_ptr<Trk::Surface>>>
151 m_emExtrapolationTool->getClusterLayerSurfaces(*cluster, *caloDDMgr);
153 if (m_emExtrapolationTool
154 ->getMatchAtCalo(ctx,
157 layersAndSurfaces.first,
158 layersAndSurfaces.second,
172 if (m_emExtrapolationTool
173 ->getMatchAtCalo(ctx,
176 layersAndSurfaces.first,
177 layersAndSurfaces.second,
191 if(m_emExtrapolationTool->getMatchAtCalo ( ctx,
194 layersAndSurfaces.first,
195 layersAndSurfaces.second,
214 return nPix + nPix_DS + nSCT + nSCT_DS;
220 std::vector<float> trkMatchTrkP_dEta1(
el->nTrackParticles(),-999);
221 std::vector<float> trkMatchTrkP_dEta2(
el->nTrackParticles(),-999);
222 std::vector<float> trkMatchTrkP_dPhi1(
el->nTrackParticles(),-999);
223 std::vector<float> trkMatchTrkP_dPhi2(
el->nTrackParticles(),-999);
224 std::vector<float> trkMatchTrkLM_dEta1(
el->nTrackParticles(),-999);
225 std::vector<float> trkMatchTrkLM_dEta2(
el->nTrackParticles(),-999);
226 std::vector<float> trkMatchTrkLM_dPhi1(
el->nTrackParticles(),-999);
227 std::vector<float> trkMatchTrkLM_dPhi2(
el->nTrackParticles(),-999);
228 std::vector<float> trkMatchTrkR_dPhi2(
el->nTrackParticles(),-999);
230 std::vector<float> trueMatch_dEta2(
el->nTrackParticles(),-999);
231 std::vector<float> trueMatch_dPhi2(
el->nTrackParticles(),-999);
233 const auto *caloCluster =
el->caloCluster();
234 if( caloCluster && caloCluster->pt() > m_minET ){
235 std::vector<float> trkMatch(9,-999);
236 for(
unsigned int i(0);
i <
el->nTrackParticles(); ++
i ){
237 const auto *trackParticle =
el->trackParticle(
i );
239 fillMatchDetails( trkMatch, trackParticle, caloCluster);
240 trkMatchTrkP_dEta1[
i] = trkMatch[0];
241 trkMatchTrkP_dEta2[
i] = trkMatch[1];
242 trkMatchTrkP_dPhi1[
i] = trkMatch[2];
243 trkMatchTrkP_dPhi2[
i] = trkMatch[3];
244 trkMatchTrkLM_dEta1[
i] = trkMatch[4];
245 trkMatchTrkLM_dEta2[
i] = trkMatch[5];
246 trkMatchTrkLM_dPhi1[
i] = trkMatch[6];
247 trkMatchTrkLM_dPhi2[
i] = trkMatch[7];
248 trkMatchTrkR_dPhi2[
i] = trkMatch[8];
251 fillTruthDetails( trkMatch, trackParticle, caloCluster );
252 if( trkMatch.size() == 2 ){
253 trueMatch_dEta2[
i] = trkMatch[0];
254 trueMatch_dPhi2[
i] = trkMatch[1];
272 TrackMatchingP_dEta1Dec(*
el) = trkMatchTrkP_dEta1;
273 TrackMatchingP_dEta2Dec(*
el) = trkMatchTrkP_dEta2;
274 TrackMatchingP_dPhi1Dec(*
el) = trkMatchTrkP_dPhi1;
275 TrackMatchingP_dPhi2Dec(*
el) = trkMatchTrkP_dPhi2;
276 TrackMatchingLM_dEta1Dec(*
el) = trkMatchTrkLM_dEta1;
277 TrackMatchingLM_dEta2Dec(*
el) = trkMatchTrkLM_dEta2;
278 TrackMatchingLM_dPhi1Dec(*
el) = trkMatchTrkLM_dPhi1;
279 TrackMatchingLM_dPhi2Dec(*
el) = trkMatchTrkLM_dPhi2;
280 TrackMatchingR_dPhi2Dec(*
el) = trkMatchTrkR_dPhi2;
281 TrackMatchingTrue_dEta2Dec(*
el) = trueMatch_dEta2;
282 TrackMatchingTrue_dPhi2Dec(*
el) = trueMatch_dPhi2;
287 const auto *caloCluster =
el->caloCluster();
289 std::vector<float> subCluster_E;
290 std::vector<float> subCluster_dEta;
291 std::vector<float> subCluster_dPhi;
294 if(caloCluster && clusterLinksAcc.
isAvailable(*caloCluster) ){
295 std::vector<ElementLink<xAOD::CaloClusterContainer> > clusterLinks = clusterLinksAcc(*caloCluster);
296 for(
const auto& link : clusterLinks){
297 if( link.isValid() ){
298 subCluster_E.push_back( (*link)->e() );
299 subCluster_dEta.push_back( caloCluster->eta() - (*link)->eta() );
301 subCluster_dPhi.push_back(dphi);
308 SubCluster_EDec(*
el) = subCluster_E;
309 SubCluster_dEtaDec(*
el) = subCluster_dEta;
310 SubCluster_dPhiDec(*
el) = subCluster_dPhi;
316 const EventContext& ctx = Gaudi::Hive::currentContext();
317 const auto *caloCluster =
el->caloCluster();
323 int vtxTrkParticleIndex1 = -999;
324 int vtxTrkParticleIndex2 = -999;
325 float vtxTrkParticle1_dEta2 = -999;
326 float vtxTrkParticle1_dPhi2 = -999;
327 float vtxTrkParticle2_dEta2 = -999;
328 float vtxTrkParticle2_dPhi2 = -999;
329 float vtxRerr = -999;
330 float vtxZerr = -999;
331 float vtxMerr = -999;
332 float vtxPerr = -999;
333 float vtxChi2 = -999;
335 float vtxdEta = -999;
336 float vtxdPhi = -999;
341 if( caloCluster && caloCluster->pt() > m_minET ){
344 int trkIndex1 = -999;
345 int trkIndex2 = -999;
346 for(
unsigned int i(0);
i <
el->nTrackParticles(); ++
i ){
347 const auto *trackParticle =
el->trackParticle(
i );
349 if ( trk1 ==
nullptr ){
350 trk1 = trackParticle;
352 }
else if( trk2 ==
nullptr ){
353 if( trk1->
charge() == trackParticle->charge() )
355 trk2 = trackParticle;
361 if( trk2 !=
nullptr){
368 std::vector<const xAOD::TrackParticle*> trksToFit;
369 trksToFit.push_back( trk1 );
370 trksToFit.push_back( trk2 );
371 vtxTrkParticleIndex1 = trkIndex1;
372 vtxTrkParticleIndex2 = trkIndex2;
374 std::unique_ptr<xAOD::Vertex> myVertex( m_VertexFitter->fit( trksToFit, startingPoint ) );
378 vtxR = m_V0Tools->rxy( myVertex.get() );
379 vtxRerr = m_V0Tools->rxyError( myVertex.get() );
380 vtxZ = myVertex->
z();
381 vtxZerr = myVertex->covariancePosition()(2,2) > 0 ? sqrt( myVertex->covariancePosition()(2,2) ): myVertex->covariancePosition()(2,2);
383 std::vector<double>
masses = { 0.511e-3, 0.511e-3 };
384 vtxM = m_V0Tools->invariantMass( myVertex.get(),
masses);
385 vtxMerr = m_V0Tools->invariantMassError( myVertex.get(),
masses);
387 vtxP = m_V0Tools->pT( myVertex.get() );
388 vtxPerr = m_V0Tools->pTError( myVertex.get() );
393 m_emExtrapolationTool->getEtaPhiAtCalo( ctx, myVertex.get(), &vtxdEta, &vtxdPhi);
396 vtxdEta -= caloCluster->etaBE(2);
400 vtxPhi = vertex4P.Phi();
401 vtxEta = vertex4P.Eta();
402 double momentumScaleFactor = caloCluster->e() / vtxE;
407 mom *= momentumScaleFactor;
410 float etaAtCalo, phiAtCalo;
411 if( m_emExtrapolationTool->getEtaPhiAtCalo (ctx,
415 vtxTrkParticle1_dEta2 = caloCluster->etaBE(2) - etaAtCalo;
420 pos = perigeeParameters2.position();
421 mom = perigeeParameters2.momentum();
422 mom *= momentumScaleFactor;
425 if( m_emExtrapolationTool->getEtaPhiAtCalo (ctx,
429 vtxTrkParticle2_dEta2 = caloCluster->etaBE(2) - etaAtCalo;
463 vtxRerrDec(*
el) = vtxRerr;
465 vtxZerrDec(*
el) = vtxZerr;
467 vtxMerrDec(*
el) = vtxMerr;
468 vtxPtDec(*
el) = vtxP;
469 vtxPterrDec(*
el)= vtxPerr;
471 vtxEtaDec(*
el) = vtxEta;
472 vtxPhiDec(*
el) = vtxPhi;
473 vtxTrkParticleIndex1Dec(*
el) = vtxTrkParticleIndex1;
474 vtxTrkParticleIndex2Dec(*
el) = vtxTrkParticleIndex2;
475 vtxTrkParticle1_dPhi2Dec(*
el) = vtxTrkParticle1_dPhi2;
476 vtxTrkParticle1_dEta2Dec(*
el) = vtxTrkParticle1_dEta2;
477 vtxTrkParticle2_dPhi2Dec(*
el) = vtxTrkParticle2_dPhi2;
478 vtxTrkParticle2_dEta2Dec(*
el) = vtxTrkParticle2_dEta2;
479 vtxChi2Dec(*
el) = vtxChi2;
480 vtxNdofDec(*
el) = vtxNdof;
481 vtxdEtaDec(*
el) = vtxdEta;
482 vtxdPhiDec(*
el) = vtxdPhi;