Belle II Software  release-05-02-19
CDCTriggerTrackCombinerModule.cc
1 #include "trg/cdc/modules/trgcdc/CDCTriggerTrackCombinerModule.h"
2 
3 #include <framework/datastore/RelationVector.h>
4 
5 using namespace std;
6 using namespace Belle2;
7 
8 //this line registers the module with the framework and actually makes it available
9 //in steering files or the the module list (basf2 -m).
10 REG_MODULE(CDCTriggerTrackCombiner);
11 
12 CDCTriggerTrackCombinerModule::CDCTriggerTrackCombinerModule() : Module::Module()
13 {
15  "The combiner module of the CDC trigger.\n"
16  "Takes tracks from the various trigger stages (finder, fitter, neuro) "
17  "and combines them to a single track list. "
18  "The 2D track parameters are taken from the fitter, if present. "
19  "For the 3D track parameters there are different options (see parameters). "
20  "Combined tracks are not produced for tracks without 3D information "
21  "from either 3D fitter or neuro.\n"
22  );
24  addParam("finder2DCollectionName", m_2DfinderCollectionName,
25  "Name of the 2D finder track list.",
26  string("TRGCDC2DFinderTracks"));
27  addParam("fitter2DCollectionName", m_2DfitterCollectionName,
28  "Name of the 2D fitter track list.",
29  string("TRGCDC2DFitterTracks"));
30  addParam("fitter3DCollectionName", m_3DfitterCollectionName,
31  "Name of the 3D fitter track list.",
32  string("TRGCDC3DFitterTracks"));
33  addParam("neuroCollectionName", m_neuroCollectionName,
34  "Name of the neuro track list.",
35  string("TRGCDCNeuroTracks"));
36  addParam("outputCollectionName", m_outputCollectionName,
37  "Name of the output track list for the combined tracks.",
38  string("TRGCDCTracks"));
39  addParam("hitCollectionName", m_hitCollectionName,
40  "Name of track segment hit list, needed for hit relations.",
41  string(""));
42  addParam("thetaDefinition", m_thetaDefinition,
43  "Select how to define cot(theta). Valid options are "
44  "3Dfitter (use 3Dfitter if present, otherwise neuro), "
45  "neuro (use neuro if present, otherwise 3Dfitter) or "
46  "avg (average 3Dfitter and neuro).",
47  string("avg"));
48  addParam("zDefinition", m_zDefinition,
49  "Select how to define z0. Valid options are "
50  "3Dfitter (use 3Dfitter if present, otherwise neuro), "
51  "neuro (use neuro if present, otherwise 3Dfitter), "
52  "avg (average 3Dfitter and neuro), "
53  "min (smaller |z0| of 3Dfitter and neuro) or "
54  "max (larger |z0| of 3Dfitter and neuro).",
55  string("min"));
56 }
57 
58 void
60 {
61  // register DataStore elements
66  tracks2Dfitter.isRequired(m_2DfitterCollectionName);
67  tracks3Dfitter.isRequired(m_3DfitterCollectionName);
68  tracksNeuro.isRequired(m_neuroCollectionName);
69  m_tracksCombined.registerInDataStore(m_outputCollectionName);
70  // register relations
71  m_tracks2Dfinder.registerRelationTo(m_tracksCombined);
72  m_tracksCombined.registerRelationTo(m_segmentHits);
73 }
74 
75 void
77 {
78  for (int itrack = 0; itrack < m_tracks2Dfinder.getEntries(); ++itrack) {
79  CDCTriggerTrack* track2Dfinder = m_tracks2Dfinder[itrack];
80  CDCTriggerTrack* track2Dfitter =
81  track2Dfinder->getRelatedTo<CDCTriggerTrack>(m_2DfitterCollectionName);
82  CDCTriggerTrack* track3Dfitter =
83  (track2Dfitter)
84  ? track2Dfitter->getRelatedTo<CDCTriggerTrack>(m_3DfitterCollectionName)
85  : nullptr;
86  CDCTriggerTrack* trackNeuro =
87  track2Dfinder->getRelatedTo<CDCTriggerTrack>(m_neuroCollectionName);
88 
89  if (!track3Dfitter && !trackNeuro) {
90  B2DEBUG(100, "skip track without 3D parameters");
91  continue;
92  }
93 
94  // 2D: take fitter if present, otherwise finder
95  CDCTriggerTrack* track2D = (track2Dfitter) ? track2Dfitter : track2Dfinder;
96 
97  // 3D: get parameters separately according to options
98  double z = 0;
99  double cotTheta = 0;
100  double chi3D = 0;
101  bool usedFit = false;
102  bool usedNN = false;
103 
104  if (!track3Dfitter) {
105  B2DEBUG(100, "no 3D fitter results, use neuro results");
106  z = trackNeuro->getZ0();
107  cotTheta = trackNeuro->getCotTheta();
108  chi3D = trackNeuro->getChi3D();
109  usedNN = true;
110  } else if (!trackNeuro) {
111  B2DEBUG(100, "no neuro results, use 3D fitter results");
112  z = track3Dfitter->getZ0();
113  cotTheta = track3Dfitter->getCotTheta();
114  chi3D = track3Dfitter->getCotTheta();
115  usedFit = true;
116  } else {
117  B2DEBUG(100, "combine 3D fitter and neuro results");
118  // z options
119  if (m_zDefinition == "3Dfitter") {
120  z = track3Dfitter->getZ0();
121  usedFit = true;
122  } else if (m_zDefinition == "neuro") {
123  z = trackNeuro->getZ0();
124  usedNN = true;
125  } else if (m_zDefinition == "avg") {
126  z = (track3Dfitter->getZ0() + trackNeuro->getZ0()) / 2.;
127  usedFit = true;
128  usedNN = true;
129  } else if (m_zDefinition == "min") {
130  z = (abs(track3Dfitter->getZ0()) < abs(trackNeuro->getZ0()))
131  ? track3Dfitter->getZ0()
132  : trackNeuro->getZ0();
133  usedFit = true;
134  usedNN = true;
135  } else if (m_zDefinition == "max") {
136  z = (abs(track3Dfitter->getZ0()) > abs(trackNeuro->getZ0()))
137  ? track3Dfitter->getZ0()
138  : trackNeuro->getZ0();
139  usedFit = true;
140  usedNN = true;
141  } else {
142  B2ERROR("invalid option for zDefinition " << m_zDefinition
143  << " (choose one of 3Dfitter, neuro, avg, min, max)");
144  }
145  // theta options
146  if (m_thetaDefinition == "3Dfitter") {
147  cotTheta = track3Dfitter->getCotTheta();
148  usedFit = true;
149  } else if (m_thetaDefinition == "neuro") {
150  cotTheta = trackNeuro->getCotTheta();
151  usedNN = true;
152  } else if (m_thetaDefinition == "avg") {
153  cotTheta = (track3Dfitter->getCotTheta() + trackNeuro->getCotTheta()) / 2.;
154  usedFit = true;
155  usedNN = true;
156  } else {
157  B2ERROR("invalid option for thetaDefinition " << m_thetaDefinition
158  << " (choose one of 3Dfitter, neuro, avg)");
159  }
160  // only fitter calculates a chi2 value
161  if (track3Dfitter)
162  chi3D = track3Dfitter->getChi3D();
163  }
164 
165  // create new track
166  CDCTriggerTrack* combinedTrack =
167  m_tracksCombined.appendNew(track2D->getPhi0(), track2D->getOmega(), track2D->getChi2D(),
168  z, cotTheta, chi3D);
169  track2Dfinder->addRelationTo(combinedTrack);
170  // get hit relations from all tracks, but without duplicates
171  vector<bool> usedHit(m_segmentHits.getEntries(), false);
172  for (const CDCTriggerSegmentHit& hit :
173  track2Dfinder->getRelationsTo<CDCTriggerSegmentHit>(m_hitCollectionName)) {
174  combinedTrack->addRelationTo(&hit);
175  usedHit[hit.getArrayIndex()] = true;
176  }
177  if (track2Dfitter) {
178  for (const CDCTriggerSegmentHit& hit :
179  track2Dfitter->getRelationsTo<CDCTriggerSegmentHit>(m_hitCollectionName)) {
180  if (!usedHit[hit.getArrayIndex()]) {
181  combinedTrack->addRelationTo(&hit);
182  usedHit[hit.getArrayIndex()] = true;
183  }
184  }
185  }
186  if (track3Dfitter && usedFit) {
187  for (const CDCTriggerSegmentHit& hit :
188  track3Dfitter->getRelationsTo<CDCTriggerSegmentHit>(m_hitCollectionName)) {
189  if (!usedHit[hit.getArrayIndex()]) {
190  combinedTrack->addRelationTo(&hit);
191  usedHit[hit.getArrayIndex()] = true;
192  }
193  }
194  }
195  if (trackNeuro && usedNN) {
196  for (const CDCTriggerSegmentHit& hit :
197  trackNeuro->getRelationsTo<CDCTriggerSegmentHit>(m_hitCollectionName)) {
198  if (!usedHit[hit.getArrayIndex()]) {
199  combinedTrack->addRelationTo(&hit);
200  usedHit[hit.getArrayIndex()] = true;
201  }
202  }
203  }
204  }
205 }
Belle2::CDCTriggerTrackCombinerModule::m_thetaDefinition
std::string m_thetaDefinition
defines how to calculate cot(theta) of the combined track
Definition: CDCTriggerTrackCombinerModule.h:51
Belle2::Module::setDescription
void setDescription(const std::string &description)
Sets the description of the module.
Definition: Module.cc:216
Belle2::CDCTriggerTrackCombinerModule::m_tracks2Dfinder
StoreArray< CDCTriggerTrack > m_tracks2Dfinder
list of 2D finder tracks (all others are obtained via relations)
Definition: CDCTriggerTrackCombinerModule.h:57
REG_MODULE
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition: Module.h:652
Belle2::Module::c_ParallelProcessingCertified
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Definition: Module.h:82
Belle2::CDCTriggerTrack
Track created by the CDC trigger.
Definition: CDCTriggerTrack.h:15
Belle2::CDCTriggerTrackCombinerModule::m_2DfinderCollectionName
std::string m_2DfinderCollectionName
name of the 2D finder track list
Definition: CDCTriggerTrackCombinerModule.h:39
Belle2::CDCTriggerTrackCombinerModule::m_outputCollectionName
std::string m_outputCollectionName
name of the output track list for the combined tracks
Definition: CDCTriggerTrackCombinerModule.h:47
Belle2::CDCTriggerTrackCombinerModule::event
virtual void event() override
Combine tracks.
Definition: CDCTriggerTrackCombinerModule.cc:76
Belle2::CDCTriggerTrackCombinerModule::m_segmentHits
StoreArray< CDCTriggerSegmentHit > m_segmentHits
list of track segment hits
Definition: CDCTriggerTrackCombinerModule.h:61
Belle2::Module
Base class for Modules.
Definition: Module.h:74
Belle2::CDCTriggerTrack::getChi3D
float getChi3D() const
get chi2 value of 3D fitter
Definition: CDCTriggerTrack.h:67
Belle2::Module::setPropertyFlags
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
Definition: Module.cc:210
Belle2::CDCTriggerTrack::getChi2D
float getChi2D() const
get chi2 value of 2D fitter
Definition: CDCTriggerTrack.h:65
Belle2::CDCTriggerTrackCombinerModule::m_neuroCollectionName
std::string m_neuroCollectionName
name of the neuro track list
Definition: CDCTriggerTrackCombinerModule.h:45
Belle2::CDCTriggerTrackCombinerModule::m_2DfitterCollectionName
std::string m_2DfitterCollectionName
name of the 2D fitter track list
Definition: CDCTriggerTrackCombinerModule.h:41
Belle2::CDCTriggerTrackCombinerModule::m_tracksCombined
StoreArray< CDCTriggerTrack > m_tracksCombined
list of combined output tracks
Definition: CDCTriggerTrackCombinerModule.h:59
Belle2::CDCTriggerTrackCombinerModule::m_hitCollectionName
std::string m_hitCollectionName
name of track segment hit list (for relations)
Definition: CDCTriggerTrackCombinerModule.h:49
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::Module::addParam
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition: Module.h:562
Belle2::CDCTriggerTrackCombinerModule::m_3DfitterCollectionName
std::string m_3DfitterCollectionName
name of the 3D fitter track list
Definition: CDCTriggerTrackCombinerModule.h:43
Belle2::StoreArray
Accessor to arrays stored in the data store.
Definition: ECLMatchingPerformanceExpertModule.h:33
Belle2::CDCTriggerTrackCombinerModule::m_zDefinition
std::string m_zDefinition
defines how to calculate z0 of the combined track
Definition: CDCTriggerTrackCombinerModule.h:53
Belle2::CDCTriggerSegmentHit
Combination of several CDCHits to a track segment hit for the trigger.
Definition: CDCTriggerSegmentHit.h:16
Belle2::CDCTriggerTrackCombinerModule::initialize
virtual void initialize() override
Initialize the module and register DataStore arrays.
Definition: CDCTriggerTrackCombinerModule.cc:59