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>>>
131 ->getMatchAtCalo(ctx,
134 layersAndSurfaces.first,
135 layersAndSurfaces.second,
143 trkMatchTrk[0] = deltaEta[1];
144 trkMatchTrk[1] = deltaEta[2];
150 ->getMatchAtCalo(ctx,
153 layersAndSurfaces.first,
154 layersAndSurfaces.second,
162 trkMatchTrk[4] = deltaEta[1];
163 trkMatchTrk[5] = deltaEta[2];
171 layersAndSurfaces.first,
172 layersAndSurfaces.second,
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 );
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];
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 ) );
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);
365 vtxPerr =
m_V0Tools->pTError( myVertex.get() );
367 vtxChi2 = myVertex->chiSquared();
368 vtxNdof = myVertex->numberDoF();
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;
392 vtxTrkParticle1_dEta2 = caloCluster->etaBE(2) - etaAtCalo;
397 pos = perigeeParameters2.position();
398 mom = perigeeParameters2.momentum();
399 mom *= momentumScaleFactor;
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;
const Trk::Perigee & perigeeParameters() const
Returns the Trk::MeasuredPerigee track parameters.
IParticle::FourMom_t FourMom_t
Definition of the 4-momentum type.
bool hasProdVtx() const
Check for a production vertex on this particle.
float px() const
The x component of the particle's momentum.
const TruthVertex_v1 * prodVtx() const
The production vertex of this particle.
float py() const
The y component of the particle's momentum.
float pz() const
The z component of the particle's momentum.
constexpr double electronMassInMeV
the mass of the electron (in MeV)