Belle II Software prerelease-11-00-00a
MeasurementAdder.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/trackFitting/measurementCreator/adder/MeasurementAdder.h>
9#include <tracking/trackFitting/measurementCreator/creators/CoordinateMeasurementCreator.h>
10
11#include <cdc/dataobjects/CDCRecoHit.h>
12#include <pxd/reconstruction/PXDRecoHit.h>
13#include <svd/reconstruction/SVDRecoHit.h>
14#include <alignment/reconstruction/AlignableBKLMRecoHit.h>
15#include <alignment/reconstruction/AlignableEKLMRecoHit.h>
16
17#include <cdc/translators/LinearGlobalADCCountTranslator.h>
18#include <cdc/translators/RealisticCDCGeometryTranslator.h>
19#include <cdc/translators/RealisticTDCCountTranslator.h>
20
21#include <genfit/MeasurementFactory.h>
22#include <string>
23
24using namespace Belle2;
25
26
27namespace {
29 template <class T>
30 bool checkTwoStoreArrayNames(const std::string& firstName, const std::string& secondName)
31 {
32 return ((firstName == secondName) or
33 (firstName.empty() and secondName == DataStore::defaultArrayName<T>()) or
34 (secondName.empty() and firstName == DataStore::defaultArrayName<T>()));
35 }
36}
37
39 const std::string& storeArrayNameOfPXDHits,
40 const std::string& storeArrayNameOfSVDHits,
41 const std::string& storeArrayNameOfCDCHits,
42 const std::string& storeArrayNameOfBKLMHits,
43 const std::string& storeArrayNameOfEKLMHits,
44 const bool initializeCDCTranslators,
45 bool fromTrackCreator) :
46 m_param_storeArrayNameOfPXDHits(storeArrayNameOfPXDHits),
47 m_param_storeArrayNameOfSVDHits(storeArrayNameOfSVDHits),
48 m_param_storeArrayNameOfCDCHits(storeArrayNameOfCDCHits),
49 m_param_storeArrayNameOfBKLMHits(storeArrayNameOfBKLMHits),
50 m_param_storeArrayNameOfEKLMHits(storeArrayNameOfEKLMHits)
51{
55 if (initializeCDCTranslators) {
56 // Create new Translators and give them to the CDCRecoHits.
59 new CDC::RealisticTDCCountTranslator(true, fromTrackCreator),
60 true);
61 }
64}
65
67{
73
74 // Create the related measurement factory
75 if (pxdHits.isOptional())
76 m_genfitMeasurementFactory.addProducer(Const::PXD,
77 new genfit::MeasurementProducer<RecoHitInformation::UsedPXDHit, PXDRecoHit>(pxdHits.getPtr()));
78 if (svdHits.isOptional())
79 m_genfitMeasurementFactory.addProducer(Const::SVD,
80 new genfit::MeasurementProducer<RecoHitInformation::UsedSVDHit, SVDRecoHit>(svdHits.getPtr()));
81 if (cdcHits.isOptional())
82 m_genfitMeasurementFactory.addProducer(Const::CDC,
83 new genfit::MeasurementProducer<RecoHitInformation::UsedCDCHit, CDCRecoHit>(cdcHits.getPtr()));
84 if (bklmHits.isOptional())
85 m_genfitMeasurementFactory.addProducer(Const::BKLM,
86 new genfit::MeasurementProducer<RecoHitInformation::UsedBKLMHit, AlignableBKLMRecoHit>(bklmHits.getPtr()));
87 if (eklmHits.isOptional())
88 m_genfitMeasurementFactory.addProducer(Const::EKLM,
89 new genfit::MeasurementProducer<RecoHitInformation::UsedEKLMHit, AlignableEKLMRecoHit>(eklmHits.getPtr()));
90}
91
93{
94 m_pxdMeasurementCreators = { std::shared_ptr<PXDBaseMeasurementCreator>(new PXDCoordinateMeasurementCreator(m_genfitMeasurementFactory)) };
95 m_svdMeasurementCreators = { std::shared_ptr<SVDBaseMeasurementCreator>(new SVDCoordinateMeasurementCreator(m_genfitMeasurementFactory)) };
96 m_cdcMeasurementCreators = { std::shared_ptr<CDCBaseMeasurementCreator>(new CDCCoordinateMeasurementCreator(m_genfitMeasurementFactory)) };
97 m_bklmMeasurementCreators = { std::shared_ptr<BKLMBaseMeasurementCreator>(new BKLMCoordinateMeasurementCreator(m_genfitMeasurementFactory)) };
98 m_eklmMeasurementCreators = { std::shared_ptr<EKLMBaseMeasurementCreator>(new EKLMCoordinateMeasurementCreator(m_genfitMeasurementFactory)) };
100
101 m_skipDirtyCheck = false;
102}
103
105 const std::vector<std::shared_ptr<PXDBaseMeasurementCreator>>& pxdMeasurementCreators,
106 const std::vector<std::shared_ptr<SVDBaseMeasurementCreator>>& svdMeasurementCreators,
107 const std::vector<std::shared_ptr<CDCBaseMeasurementCreator>>& cdcMeasurementCreators,
108 const std::vector<std::shared_ptr<BKLMBaseMeasurementCreator>>& bklmMeasurementCreators,
109 const std::vector<std::shared_ptr<EKLMBaseMeasurementCreator>>& eklmMeasurementCreators,
110 const std::vector<std::shared_ptr<BaseMeasurementCreator>>& additionalMeasurementCreators)
111{
112 m_pxdMeasurementCreators = pxdMeasurementCreators;
113 m_svdMeasurementCreators = svdMeasurementCreators;
114 m_cdcMeasurementCreators = cdcMeasurementCreators;
115 m_bklmMeasurementCreators = bklmMeasurementCreators;
116 m_eklmMeasurementCreators = eklmMeasurementCreators;
117 m_additionalMeasurementCreators = additionalMeasurementCreators;
118
119 m_skipDirtyCheck = true;
120}
121
123 const std::map<std::string, std::map<std::string, std::string>>& pxdMeasurementCreators,
124 const std::map<std::string, std::map<std::string, std::string>>& svdMeasurementCreators,
125 const std::map<std::string, std::map<std::string, std::string>>& cdcMeasurementCreators,
126 const std::map<std::string, std::map<std::string, std::string>>& bklmMeasurementCreators,
127 const std::map<std::string, std::map<std::string, std::string>>& eklmMeasurementCreators,
128 const std::map<std::string, std::map<std::string, std::string>>& additionalMeasurementCreators)
129{
130 PXDMeasurementCreatorFactory pxdMeasurementCreatorFactory(m_genfitMeasurementFactory);
131 SVDMeasurementCreatorFactory svdMeasurementCreatorFactory(m_genfitMeasurementFactory);
132 CDCMeasurementCreatorFactory cdcMeasurementCreatorFactory(m_genfitMeasurementFactory);
133 BKLMMeasurementCreatorFactory bklmMeasurementCreatorFactory(m_genfitMeasurementFactory);
134 EKLMMeasurementCreatorFactory eklmMeasurementCreatorFactory(m_genfitMeasurementFactory);
135 AdditionalMeasurementCreatorFactory additionalMeasurementCreatorFactory;
136
137 pxdMeasurementCreatorFactory.setParameters(pxdMeasurementCreators);
138 svdMeasurementCreatorFactory.setParameters(svdMeasurementCreators);
139 cdcMeasurementCreatorFactory.setParameters(cdcMeasurementCreators);
140 bklmMeasurementCreatorFactory.setParameters(bklmMeasurementCreators);
141 eklmMeasurementCreatorFactory.setParameters(eklmMeasurementCreators);
142 additionalMeasurementCreatorFactory.setParameters(additionalMeasurementCreators);
143
144 pxdMeasurementCreatorFactory.initialize();
145 svdMeasurementCreatorFactory.initialize();
146 cdcMeasurementCreatorFactory.initialize();
147 bklmMeasurementCreatorFactory.initialize();
148 eklmMeasurementCreatorFactory.initialize();
149 additionalMeasurementCreatorFactory.initialize();
150
151 m_pxdMeasurementCreators = pxdMeasurementCreatorFactory.getCreators();
152 m_svdMeasurementCreators = svdMeasurementCreatorFactory.getCreators();
153 m_cdcMeasurementCreators = cdcMeasurementCreatorFactory.getCreators();
154 m_bklmMeasurementCreators = bklmMeasurementCreatorFactory.getCreators();
155 m_eklmMeasurementCreators = eklmMeasurementCreatorFactory.getCreators();
156 m_additionalMeasurementCreators = additionalMeasurementCreatorFactory.getCreators();
157
158 m_skipDirtyCheck = true;
159}
160
162{
163 B2ASSERT("Reco Track was built with another CDC store array: Reco Track "
164 << recoTrack.getStoreArrayNameOfCDCHits()
165 << ", this class " << m_param_storeArrayNameOfCDCHits,
166 checkTwoStoreArrayNames<RecoHitInformation::UsedCDCHit>(recoTrack.getStoreArrayNameOfCDCHits(), m_param_storeArrayNameOfCDCHits));
167 B2ASSERT("Reco Track was built with another SVD store array: Reco Track "
168 << recoTrack.getStoreArrayNameOfSVDHits()
169 << ", this class " << m_param_storeArrayNameOfSVDHits,
170 checkTwoStoreArrayNames<RecoHitInformation::UsedSVDHit>(recoTrack.getStoreArrayNameOfSVDHits(), m_param_storeArrayNameOfSVDHits));
171 B2ASSERT("Reco Track was built with another PXD store array: Reco Track "
172 << recoTrack.getStoreArrayNameOfPXDHits()
173 << ", this class " << m_param_storeArrayNameOfPXDHits,
174 checkTwoStoreArrayNames<RecoHitInformation::UsedPXDHit>(recoTrack.getStoreArrayNameOfPXDHits(), m_param_storeArrayNameOfPXDHits));
175 B2ASSERT("Reco Track was built with another BKLM store array: Reco Track "
176 << recoTrack.getStoreArrayNameOfBKLMHits()
177 << ", this class " << m_param_storeArrayNameOfBKLMHits,
178 checkTwoStoreArrayNames<RecoHitInformation::UsedBKLMHit>(recoTrack.getStoreArrayNameOfBKLMHits(),
180 B2ASSERT("Reco Track was built with another EKLM store array: Reco Track "
181 << recoTrack.getStoreArrayNameOfEKLMHits()
182 << ", this class " << m_param_storeArrayNameOfEKLMHits,
183 checkTwoStoreArrayNames<RecoHitInformation::UsedEKLMHit>(recoTrack.getStoreArrayNameOfEKLMHits(),
185
186 if (m_cdcMeasurementCreators.size() == 0 and m_svdMeasurementCreators.size() == 0 and m_pxdMeasurementCreators.size() == 0 and
187 m_bklmMeasurementCreators.size() == 0 and m_eklmMeasurementCreators.size() == 0 and m_additionalMeasurementCreators.size() == 0) {
188 B2WARNING("No measurement creators where added to this instance, so no measurements where created. Did you forget to call setMeasurementCreators?");
189 return false;
190 }
191
192 if (not recoTrack.getDirtyFlag() and not m_skipDirtyCheck) {
193 B2DEBUG(100, "Hit content did not change since last measurement adding and you are using default parameters." <<
194 "I will not add the measurements again. " <<
195 "If you still want to do so, set the dirty flag to true.");
196 return false;
197 }
198
199 // Delete all other measurements.
200 RecoTrackGenfitAccess::getGenfitTrack(recoTrack).deleteTrackPointsAndFitStatus();
201 recoTrack.setDirtyFlag();
202
203 std::map<genfit::TrackPoint*, RecoHitInformation*> trackPointHitMapping;
204
205 // Add the measurements created by the CDC, SVD and PXD measurement creators.
209 m_pxdMeasurementCreators, trackPointHitMapping);
210 });
214 m_svdMeasurementCreators, trackPointHitMapping);
215 });
219 m_cdcMeasurementCreators, trackPointHitMapping);
220 });
224 m_bklmMeasurementCreators, trackPointHitMapping);
225 });
229 m_eklmMeasurementCreators, trackPointHitMapping);
230 });
231
232 // Special case is with the additional measurement creator factories. They do not need any hits:
234
235 auto& genfitTrack = RecoTrackGenfitAccess::getGenfitTrack(recoTrack);
236
237 genfitTrack.sort();
238
239 // FIXME: hotfix:
240 // after we have a mapping between created track points and reco track information, we can use this mapping to
241 // write it back to the reco hit information. Please note, that we only store a single index for each
242 // reco hit information (although there could be multiple track points).
243 // We also assume that the track point vector is never changed again!
244 int counter = 0;
245 for (genfit::TrackPoint* trackPoint : genfitTrack.getPoints()) {
246 trackPointHitMapping[trackPoint]->setCreatedTrackPointID(counter);
247 counter += 1;
248 }
249
250 return true;
251}
252
254 const std::vector<std::shared_ptr<BaseMeasurementCreator>>& measurementCreators) const
255{
256 for (const auto& measurementCreator : measurementCreators) {
257 const std::vector<genfit::TrackPoint*>& trackPoints = measurementCreator->createMeasurementPoints(recoTrack);
258 for (genfit::TrackPoint* trackPoint : trackPoints) {
259 RecoTrackGenfitAccess::getGenfitTrack(recoTrack).insertPoint(trackPoint);
260 }
261 }
262}
Add measurement creators that do not rely on a specific hit type, but rather add measurements without...
Add all measurement creators related to BKLM hits.
Add all measurement creators related to CDC hits.
static void setTranslators(CDC::ADCCountTranslatorBase *const adcCountTranslator, CDC::CDCGeometryTranslatorBase *const cdcGeometryTranslator, CDC::TDCCountTranslatorBase *const tdcCountTranslator, bool useTrackTime=false, bool cosmics=false)
Setter for the Translators.
Definition CDCRecoHit.cc:33
This class simply assumes a linear translation through (0,0)
This class uses the realistic detector geometry (the one after alignment procedure) for the translati...
Translator mirroring the realistic Digitization.
static std::string defaultArrayName(const std::string &classname)
Return the default storage name for an given class name.
Definition DataStore.h:143
Add all measurement creators related to EKLM hits.
void resetMeasurementCreatorsUsingFactories(const std::map< std::string, std::map< std::string, std::string > > &pxdMeasurementCreators, const std::map< std::string, std::map< std::string, std::string > > &svdMeasurementCreators, const std::map< std::string, std::map< std::string, std::string > > &cdcMeasurementCreators, const std::map< std::string, std::map< std::string, std::string > > &bklmMeasurementCreators, const std::map< std::string, std::map< std::string, std::string > > &eklmMeasurementCreators, const std::map< std::string, std::map< std::string, std::string > > &additionalMeasurementCreators)
If you want to use non-default settings for the store arrays, you can create your own instances of th...
std::vector< std::shared_ptr< BKLMBaseMeasurementCreator > > m_bklmMeasurementCreators
Internal storage of the BKLM measurement creators.
std::vector< std::shared_ptr< CDCBaseMeasurementCreator > > m_cdcMeasurementCreators
Internal storage of the CDC measurement creators.
void createGenfitMeasurementFactory()
Helper function to create a genfit::MeasurementFactory, needed in the MeasurementCreators.
std::vector< std::shared_ptr< PXDBaseMeasurementCreator > > m_pxdMeasurementCreators
Internal storage of the PXD measurement creators.
void resetMeasurementCreators(const std::vector< std::shared_ptr< PXDBaseMeasurementCreator > > &pxdMeasurementCreators, const std::vector< std::shared_ptr< SVDBaseMeasurementCreator > > &svdMeasurementCreators, const std::vector< std::shared_ptr< CDCBaseMeasurementCreator > > &cdcMeasurementCreators, const std::vector< std::shared_ptr< BKLMBaseMeasurementCreator > > &bklmMeasurementCreators, const std::vector< std::shared_ptr< EKLMBaseMeasurementCreator > > &eklmMeasurementCreators, const std::vector< std::shared_ptr< BaseMeasurementCreator > > &additionalMeasurementCreators)
If you want to use non-default settings for the store arrays, you can create your own instances of th...
std::vector< std::shared_ptr< EKLMBaseMeasurementCreator > > m_eklmMeasurementCreators
Internal storage of the EKLM measurement creators.
std::string m_param_storeArrayNameOfPXDHits
The name of the store array for the PXD hits.
std::string m_param_storeArrayNameOfBKLMHits
The name of the store array for the BKLM hits.
genfit::MeasurementFactory< genfit::AbsMeasurement > m_genfitMeasurementFactory
Internal storage of the genfit measurement factory;.
void resetMeasurementCreatorsToDefaultSettings()
Reset the internal measurement creator storage to the default settings.
MeasurementAdder(const std::string &storeArrayNameOfPXDHits, const std::string &storeArrayNameOfSVDHits, const std::string &storeArrayNameOfCDCHits, const std::string &storeArrayNameOfBKLMHits, const std::string &storeArrayNameOfEKLMHits, const bool initializeCDCTranslators=true, bool fromTrackCreator=false)
Create a new instance of the measurement adder.
std::string m_param_storeArrayNameOfSVDHits
The name of the store array for the SVD hits.
std::vector< std::shared_ptr< BaseMeasurementCreator > > m_additionalMeasurementCreators
Internal storage of the additional measurement creators.
std::string m_param_storeArrayNameOfEKLMHits
The name of the store array for the EKLM hits.
std::string m_param_storeArrayNameOfCDCHits
The name of the store array for the CDC hits.
bool m_skipDirtyCheck
Flag to skip the dirty check. Useful when using non default measurement creators.
void addMeasurementsFromHitToRecoTrack(RecoTrack &recoTrack, RecoHitInformation &recoHitInformation, HitType *hit, const std::vector< std::shared_ptr< BaseMeasurementCreatorFromHit< HitType, detector > > > &measurementCreators, std::map< genfit::TrackPoint *, RecoHitInformation * > &trackPointHitMapping) const
Helper: Go through all measurement creators in the given list and create the measurement with a given...
std::vector< std::shared_ptr< SVDBaseMeasurementCreator > > m_svdMeasurementCreators
Internal storage of the SVD measurement creators.
bool addMeasurements(RecoTrack &recoTrack) const
After you have filled the internal storage with measurement creators (either by providing your own or...
void addMeasurementsToRecoTrack(RecoTrack &recoTrack, const std::vector< std::shared_ptr< BaseMeasurementCreator > > &measurementCreators) const
Helper: Go through all measurement creators in the given list and create the measurement without a gi...
void initialize()
Use the parameters given to the module and create the measurement creators from them.
const std::vector< std::shared_ptr< BaseMeasurementCreatorType > > & getCreators() const
Return the creators to the module.
void setParameters(const std::map< std::string, std::map< std::string, std::string > > &creatorsWithParametersDictionary)
Set the parameters.
Add all measurement creators related to PXD hits.
This class stores additional information to every CDC/SVD/PXD hit stored in a RecoTrack.
CDCHit UsedCDCHit
Define, use of CDC hits as CDC hits (for symmetry).
EKLMAlignmentHit UsedEKLMHit
Define, use of EKLMHit2d as EKLM hits.
KLMHit2d UsedBKLMHit
Define, use of KLMHit2d as BKLM hits.
PXDCluster UsedPXDHit
Define, use of clusters or true hits for PXD.
SVDCluster UsedSVDHit
Define, use of clusters or true hits for SVD.
static genfit::Track & getGenfitTrack(RecoTrack &recoTrack)
Give access to the RecoTrack's genfit::Track.
Definition RecoTrack.cc:404
This is the Reconstruction Event-Data Model Track.
Definition RecoTrack.h:79
void mapOnHits(const std::string &storeArrayNameOfHits, std::function< void(RecoHitInformation &, HitType *)> const &mapFunction, std::function< bool(const RecoHitInformation &, const HitType *)> const &pickFunction)
Call a function on all hits of the given type in the store array, that are related to this track.
Definition RecoTrack.h:766
const std::string & getStoreArrayNameOfEKLMHits() const
Name of the store array of the eklm hits.
Definition RecoTrack.h:744
const std::string & getStoreArrayNameOfSVDHits() const
Name of the store array of the svd hits.
Definition RecoTrack.h:735
const std::string & getStoreArrayNameOfPXDHits() const
Name of the store array of the pxd hits.
Definition RecoTrack.h:732
void setDirtyFlag(const bool &dirtyFlag=true)
Set to true, if you want to rebuild the measurements and do the fit independent on changes of the hit...
Definition RecoTrack.h:722
const std::string & getStoreArrayNameOfBKLMHits() const
Name of the store array of the bklm hits.
Definition RecoTrack.h:741
const std::string & getStoreArrayNameOfCDCHits() const
Name of the store array of the cdc hits.
Definition RecoTrack.h:738
bool getDirtyFlag() const
This returns true, if a hit was added after the last fit and measurement creation and a refit should ...
Definition RecoTrack.h:715
Add all measurement creators related to SVD hits.
bool isOptional(const std::string &name="")
Tell the DataStore about an optional input.
Accessor to arrays stored in the data store.
Definition StoreArray.h:113
TClonesArray * getPtr() const
Raw access to the underlying TClonesArray.
Definition StoreArray.h:311
CoordinateMeasurementCreator< RecoHitInformation::UsedSVDHit, Const::SVD > SVDCoordinateMeasurementCreator
Hit to reco hit measurement creator for the SVD.
CoordinateMeasurementCreator< RecoHitInformation::UsedPXDHit, Const::PXD > PXDCoordinateMeasurementCreator
Hit to reco hit measurement creator for the PXD.
CoordinateMeasurementCreator< RecoHitInformation::UsedBKLMHit, Const::BKLM > BKLMCoordinateMeasurementCreator
Hit to reco hit measurement creator for the BKLM.
CoordinateMeasurementCreator< RecoHitInformation::UsedCDCHit, Const::CDC > CDCCoordinateMeasurementCreator
Needed for templating.
CoordinateMeasurementCreator< RecoHitInformation::UsedEKLMHit, Const::EKLM > EKLMCoordinateMeasurementCreator
Hit to reco hit measurement creator for the EKLM.
Abstract base class for different kinds of events.