Belle II Software  release-06-00-14
CDCPathTruthVarSet.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 #include <tracking/ckf/cdc/filters/paths/CDCPathTruthVarSet.h>
9 
10 #include <tracking/ckf/cdc/entities/CDCCKFState.h>
11 
12 #include <ecl/dataobjects/ECLShower.h>
13 #include <mdst/dataobjects/MCParticle.h>
14 
15 #include <tracking/dataobjects/RecoTrack.h>
16 
17 using namespace std;
18 using namespace Belle2;
19 
20 bool CDCPathTruthVarSet::extract(const BaseCDCPathFilter::Object* path)
21 {
22  // check if hit belongs to same seed
23  const auto& seed = path->front();
24  auto* seedRecoTrack = seed.getSeed();
25  auto* seedMCTrack = seedRecoTrack->getRelated<RecoTrack>("MCRecoTracks");
26 
27  MCParticle* seedMCParticle;
28  if (seedMCTrack) {
29  seedMCParticle = seedMCTrack->getRelated<MCParticle>();
30  }
31  // maybe used track from Ecl seeding?
32  else {
33  seedRecoTrack = seedRecoTrack->getRelated<RecoTrack>("EclSeedRecoTracks");
34  seedMCTrack = seedRecoTrack->getRelated<RecoTrack>("MCRecoTracks");
35  const auto* seedEclShower = seedRecoTrack->getRelated<ECLShower>("ECLShowers");
36  seedMCParticle = seedEclShower->getRelated<MCParticle>();
37  }
38 
39  int daughters = 0;
40  std::vector<MCParticle*> daughterMCParticles;
41  if (seedMCParticle->getNDaughters() > 0) {
42  daughterMCParticles = seedMCParticle->getDaughters();
43 
44  while (daughterMCParticles.size() == 1) {
45  daughterMCParticles = daughterMCParticles.at(0)->getDaughters();
46  }
47  if (daughterMCParticles.size() > 1) {
48  daughters = daughterMCParticles.size();
49  }
50  }
51 
52  while (seedMCParticle->getMother()) {
53  seedMCParticle = seedMCParticle->getMother();
54  }
55 
56  int mcTrackHits = 0;
57 
58  if (seedMCTrack) {
59  mcTrackHits = seedMCTrack->getNumberOfCDCHits();
60  }
61  var<named("mcTrackHits")>() = mcTrackHits;
62 
63  var<named("daughters")>() = daughters;
64  var<named("PDG")>() = seedMCParticle->getPDG();
65 
66  auto seedMom = seedMCParticle->getMomentum();
67  var<named("seed_p_truth")>() = seedMom.Mag();
68  var<named("seed_theta_truth")>() = seedMom.Theta() * 180. / M_PI;
69  var<named("seed_pt_truth")>() = seedMom.Perp();
70  var<named("seed_pz_truth")>() = seedMom.Z();
71  var<named("seed_px_truth")>() = seedMom.X();
72  var<named("seed_py_truth")>() = seedMom.Y();
73 
74  return true;
75 }
Class to store ECL Showers.
Definition: ECLShower.h:25
A Class to store the Monte Carlo particle information.
Definition: MCParticle.h:32
std::vector< Belle2::MCParticle * > getDaughters() const
Get vector of all daughter particles, empty vector if none.
Definition: MCParticle.cc:50
This is the Reconstruction Event-Data Model Track.
Definition: RecoTrack.h:76
T * getRelated(const std::string &name="", const std::string &namedRelation="") const
Get the object to or from which this object has a relation.
AObject Object
Type of the object to be analysed.
Definition: Filter.dcl.h:33
Abstract base class for different kinds of events.