Belle II Software  release-05-01-25
GenfitTrackCandidatesCreatorModule.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2015 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Nils Braun *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 #include <tracking/modules/fitter/GenfitTrackCandidatesCreatorModule.h>
11 #include <tracking/dataobjects/RecoTrack.h>
12 #include <framework/datastore/RelationArray.h>
13 
14 #include <mdst/dataobjects/MCParticle.h>
15 
16 using namespace std;
17 using namespace Belle2;
18 
19 REG_MODULE(GenfitTrackCandidatesCreator)
20 
22  Module()
23 {
24  setDescription("Module turning reco tracks to genfit tracks (will be unneeded once we use reco tracks everywhere).");
25  setPropertyFlags(c_ParallelProcessingCertified);
26 
27  addParam("genfitTrackCandsStoreArrayName", m_param_genfitTrackCandsStoreArrayName,
28  "StoreArray name of the related track candidates.",
29  m_param_genfitTrackCandsStoreArrayName);
30  addParam("recoTracksStoreArrayName", m_param_recoTracksStoreArrayName, "StoreArray name of the input reco tracks.",
31  m_param_recoTracksStoreArrayName);
32  addParam("mcGenfitTrackCandsStoreArrayName", m_param_mcGenfitTrackCandsStoreArrayName,
33  "StoreArray name of the related track MC candidates (or empty if there are none).",
34  m_param_mcGenfitTrackCandsStoreArrayName);
35  addParam("mcRecoTracksStoreArrayName", m_param_mcRecoTracksStoreArrayName,
36  "StoreArray name of the input reco MC tracks (or empty of there are none).",
37  m_param_mcRecoTracksStoreArrayName);
38  addParam("outputMCTrackCandidates", m_param_outputMCTrackCandidates,
39  "Flag to turn on combined conversion of PR and MCTrackCands. Can only be used if the MCMatcher was used before.",
40  m_param_outputMCTrackCandidates);
41 }
42 
43 void GenfitTrackCandidatesCreatorModule::initialize()
44 {
45  B2WARNING("This module is depricated as it uses genfit::Track(Cand)s instead of RecoTracks. It will be removed in the future. If you need information on the transition, please contact Nils Braun (nils.braun@kit.edu).");
46  StoreArray<RecoTrack> recoTracks(m_param_recoTracksStoreArrayName);
47  recoTracks.isRequired();
48 
49  StoreArray<genfit::TrackCand> genfitTrackCands(m_param_genfitTrackCandsStoreArrayName);
50  genfitTrackCands.registerInDataStore();
51 
52  genfitTrackCands.registerRelationTo(recoTracks);
53 
54  StoreArray<MCParticle> mcParticles;
55  if (mcParticles.isOptional() and recoTracks.optionalRelationTo(mcParticles)) {
56  genfitTrackCands.registerRelationTo(mcParticles);
57  }
58 
59  if (m_param_outputMCTrackCandidates) {
60  StoreArray<RecoTrack> mcRecoTracks(m_param_mcRecoTracksStoreArrayName);
61  mcRecoTracks.isRequired();
62 
63  StoreArray<genfit::TrackCand> mcGenfitTrackCands(m_param_mcGenfitTrackCandsStoreArrayName);
64  mcGenfitTrackCands.registerInDataStore();
65 
66  mcGenfitTrackCands.registerRelationTo(mcRecoTracks);
67 
68  mcGenfitTrackCands.registerRelationTo(genfitTrackCands);
69  genfitTrackCands.registerRelationTo(mcGenfitTrackCands);
70 
71  mcParticles.isRequired();
72  mcGenfitTrackCands.registerRelationTo(mcParticles);
73  }
74 }
75 
76 void GenfitTrackCandidatesCreatorModule::outputPRAndMCTrackCands(const StoreArray<RecoTrack>& prRecoTracks,
77  StoreArray<genfit::TrackCand>& prGenfitTrackCands,
78  const StoreArray<MCParticle>& mcParticles, RelationArray& relationsFromPRTrackCandsToPRRecoTracks,
79  RelationArray& relationsFromPRTrackCandsToMCParticle) const
80 {
81 
82  StoreArray<RecoTrack> mcRecoTracks(m_param_mcRecoTracksStoreArrayName);
83  StoreArray<genfit::TrackCand> mcGenfitTrackCands(m_param_mcGenfitTrackCandsStoreArrayName);
84 
85  // ugly...
86  RelationArray relationsFromMCTrackCandsToMCRecoTracks(mcGenfitTrackCands, mcRecoTracks);
87  RelationArray relationsFromMCTrackCandsToMCParticle(mcGenfitTrackCands, mcParticles);
88 
89  for (const RecoTrack& prRecoTrack : prRecoTracks) {
90  const int trackCounter = prRecoTrack.getArrayIndex();
91 
92  genfit::TrackCand* newGenfitTrackCand = prGenfitTrackCands.appendNew(prRecoTrack.createGenfitTrackCand());
93  relationsFromPRTrackCandsToPRRecoTracks.add(trackCounter, trackCounter);
94 
95  // Read the matching status and encode it into the McTrackId of the genfit::TrackCand.
96  const RecoTrack::MatchingStatus matchingStatus = prRecoTrack.getMatchingStatus();
97  if (matchingStatus == RecoTrack::MatchingStatus::c_ghost) {
98  newGenfitTrackCand->setMcTrackId(-999);
99  } else if (matchingStatus == RecoTrack::MatchingStatus::c_background) {
100  newGenfitTrackCand->setMcTrackId(-99);
101  } else if (matchingStatus == RecoTrack::MatchingStatus::c_clone) {
102  newGenfitTrackCand->setMcTrackId(-9);
103  } else if (matchingStatus == RecoTrack::MatchingStatus::c_matched) {
104  MCParticle* relatedMCParticle = prRecoTrack.getRelatedTo<MCParticle>();
105  if (relatedMCParticle) {
106  const int mcParticleArrayIndex = relatedMCParticle->getArrayIndex();
107  relationsFromPRTrackCandsToMCParticle.add(trackCounter, mcParticleArrayIndex);
108  newGenfitTrackCand->setMcTrackId(mcParticleArrayIndex);
109  } else {
110  B2WARNING("PRRecoTrack marked as 'matched', but no related MCParticle found. Something is going wrong here.");
111  }
112  }
113  }
114 
115  for (const RecoTrack& mcRecoTrack : mcRecoTracks) {
116  const int trackCounter = mcRecoTrack.getArrayIndex();
117 
118  genfit::TrackCand* newGenfitTrackCand = mcGenfitTrackCands.appendNew(mcRecoTrack.createGenfitTrackCand());
119  relationsFromMCTrackCandsToMCRecoTracks.add(trackCounter, trackCounter);
120 
121  MCParticle* relatedMCParticle = mcRecoTrack.getRelatedTo<MCParticle>();
122  if (relatedMCParticle) {
123  const int mcParticleArrayIndex = relatedMCParticle->getArrayIndex();
124  relationsFromMCTrackCandsToMCParticle.add(trackCounter, mcParticleArrayIndex);
125  newGenfitTrackCand->setMcTrackId(mcParticleArrayIndex);
126  } else {
127  B2WARNING("MCRecoTrack without related MCParticle? Something is going wrong here.");
128  }
129  }
130 
131  // Add the relations between the MCTRackCands and the PRTrackCands if needed.
132  RelationArray relationsFromMCTrackCandsToPRTrackCands(mcGenfitTrackCands, prGenfitTrackCands);
133  RelationArray relationsFromPRTrackCandsToMCTrackCands(prGenfitTrackCands, mcGenfitTrackCands);
134 
135  for (const RecoTrack& prRecoTrack : prRecoTracks) {
136  const auto& relatedMCRecoTrackWithWeight = prRecoTrack.getRelatedToWithWeight<RecoTrack>(m_param_mcRecoTracksStoreArrayName);
137  RecoTrack* relatedMCRecoTrack = relatedMCRecoTrackWithWeight.first;
138  const double weight = relatedMCRecoTrackWithWeight.second;
139  if (relatedMCRecoTrack) {
140  relationsFromPRTrackCandsToMCTrackCands.add(prRecoTrack.getArrayIndex(), relatedMCRecoTrack->getArrayIndex(), weight);
141  }
142  }
143 
144  for (const RecoTrack& mcRecoTrack : mcRecoTracks) {
145  const auto& relatedPRRecoTrackWithWeight = mcRecoTrack.getRelatedToWithWeight<RecoTrack>(m_param_recoTracksStoreArrayName);
146  RecoTrack* relatedPRRecoTrack = relatedPRRecoTrackWithWeight.first;
147  const double weight = relatedPRRecoTrackWithWeight.second;
148  if (relatedPRRecoTrack) {
149  relationsFromMCTrackCandsToPRTrackCands.add(mcRecoTrack.getArrayIndex(), relatedPRRecoTrack->getArrayIndex(), weight);
150  }
151  }
152 }
153 
154 void GenfitTrackCandidatesCreatorModule::outputPRTrackCands(const StoreArray<RecoTrack>& recoTracks,
155  StoreArray<genfit::TrackCand>& genfitTrackCands,
156  const StoreArray<MCParticle>&, RelationArray& relationsFromTrackCandsToRecoTracks,
157  RelationArray& relationsFromTrackCandsToMCParticle) const
158 {
159  for (const RecoTrack& recoTrack : recoTracks) {
160  const int trackCounter = recoTrack.getArrayIndex();
161 
162  genfit::TrackCand* newGenfitTrackCand = genfitTrackCands.appendNew(recoTrack.createGenfitTrackCand());
163  relationsFromTrackCandsToRecoTracks.add(trackCounter, trackCounter);
164 
165  MCParticle* relatedMCParticle = recoTrack.getRelatedTo<MCParticle>();
166  if (relatedMCParticle) {
167  const int mcParticleArrayIndex = relatedMCParticle->getArrayIndex();
168  relationsFromTrackCandsToMCParticle.add(trackCounter, mcParticleArrayIndex);
169  newGenfitTrackCand->setMcTrackId(mcParticleArrayIndex);
170  }
171  }
172 }
173 
174 void GenfitTrackCandidatesCreatorModule::event()
175 {
176  StoreArray<MCParticle> mcParticles;
177 
178  StoreArray<RecoTrack> recoTracks(m_param_recoTracksStoreArrayName);
179  StoreArray<genfit::TrackCand> genfitTrackCands(m_param_genfitTrackCandsStoreArrayName);
180 
181  // ugly...
182  RelationArray relationsFromTrackCandsToRecoTracks(genfitTrackCands, recoTracks);
183  RelationArray relationsFromTrackCandsToMCParticle(genfitTrackCands, mcParticles);
184 
185  if (m_param_outputMCTrackCandidates) {
186  outputPRAndMCTrackCands(recoTracks, genfitTrackCands, mcParticles, relationsFromTrackCandsToRecoTracks,
187  relationsFromTrackCandsToMCParticle);
188  } else {
189  outputPRTrackCands(recoTracks, genfitTrackCands, mcParticles, relationsFromTrackCandsToRecoTracks,
190  relationsFromTrackCandsToMCParticle);
191  }
192 }
Belle2::StoreArray::appendNew
T * appendNew()
Construct a new T object at the end of the array.
Definition: StoreArray.h:256
Belle2::RelationArray
Low-level class to create/modify relations between StoreArrays.
Definition: RelationArray.h:72
Belle2::StoreArray::optionalRelationTo
bool optionalRelationTo(const StoreArray< TO > &toArray, DataStore::EDurability durability=DataStore::c_Event, const std::string &namedRelation="") const
Tell the data store about a relation that we could make use of.
Definition: StoreArray.h:182
Belle2::StoreArray::registerRelationTo
bool registerRelationTo(const StoreArray< TO > &toArray, DataStore::EDurability durability=DataStore::c_Event, DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut, const std::string &namedRelation="") const
Register a relation to the given StoreArray.
Definition: StoreArray.h:150
genfit::TrackCand
Track candidate – seed values and indices.
Definition: TrackCand.h:69
REG_MODULE
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:652
Belle2::RelationsInterface::getRelatedTo
TO * getRelatedTo(const std::string &name="", const std::string &namedRelation="") const
Get the object to which this object has a relation.
Definition: RelationsObject.h:250
Belle2::MCParticle::getArrayIndex
int getArrayIndex() const
Get 0-based index of the particle in the corresponding MCParticle list.
Definition: MCParticle.h:255
Belle2::Module
Base class for Modules.
Definition: Module.h:74
Belle2::RecoTrack
This is the Reconstruction Event-Data Model Track.
Definition: RecoTrack.h:78
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::RelationArray::add
void add(index_type from, index_type to, weight_type weight=1.0)
Add a new element to the relation.
Definition: RelationArray.h:291
Belle2::MCParticle
A Class to store the Monte Carlo particle information.
Definition: MCParticle.h:43
Belle2::StoreArray
Accessor to arrays stored in the data store.
Definition: ECLMatchingPerformanceExpertModule.h:33
genfit::TrackCand::setMcTrackId
void setMcTrackId(int i)
Set the MCT track id, for MC simulations.
Definition: TrackCand.h:151
Belle2::RecoTrack::MatchingStatus
MatchingStatus
Enum for the matching status of this reco track (set by the matching modules in the tracking package)...
Definition: RecoTrack.h:104
Belle2::GenfitTrackCandidatesCreatorModule
Module turning reco tracks to genfit trackcands (will be unneeded once we use reco tracks everywhere)...
Definition: GenfitTrackCandidatesCreatorModule.h:34