10 #include <ecl/modules/eclTrackBremFinder/ECLTrackBremFinderModule.h>
13 #include <ecl/modules/eclTrackBremFinder/BestMatchContainer.h>
14 #include <ecl/modules/eclTrackBremFinder/BremFindingMatchCompute.h>
17 #include <framework/dataobjects/EventMetaData.h>
18 #include <framework/logging/Logger.h>
19 #include <framework/gearbox/Const.h>
20 #include <mdst/dataobjects/ECLCluster.h>
21 #include <mdst/dataobjects/Track.h>
22 #include <mdst/dataobjects/TrackFitResult.h>
23 #include <tracking/dataobjects/RecoTrack.h>
24 #include <tracking/dataobjects/BremHit.h>
33 setDescription(
"Use Track direction to pick up possible ECL Brem Cluster");
46 "Factor which is multiplied onto the cluster position error to check for matches",
53 "Cut on the distance between the cluster position angle and the extrapolation angle",
64 const std::string relationName =
"Bremsstrahlung";
87 double trackMomentum = trackFitResult->
getMomentum().R();
89 if (trackMomentum > 5.0) {
90 B2DEBUG(20,
"Track momentum higher than 5GeV! Track is not used for bremsstrahlung finding");
98 B2DEBUG(20,
"Checking track for related ECLCluster");
102 auto relatedClustersToTrack =
105 for (
auto& relatedCluster : relatedClustersToTrack) {
107 primaryClusterOfTrack = &relatedCluster;
117 B2DEBUG(20,
"No RecoTrack for this Track");
123 std::vector<std::pair<float, RecoHitInformation*>> extrapolationParams = {};
124 std::vector<genfit::MeasuredStateOnPlane> extrapolatedStates = {};
128 for (
auto hit : recoTrack->getRecoHitInformations(
true)) {
129 if (hit->useInFit() && recoTrack->hasTrackFitStatus()) {
131 auto measState = recoTrack->getMeasuredStateOnPlaneFromRecoHit(hit);
132 float hitRadius = measState.getPos().Perp();
133 float distance = abs(hitRadius - virtualHitRadius);
136 nearestHitContainer.
add(hit, distance);
138 }
catch (NoTrackFitResult&) {
139 B2DEBUG(29,
"No track fit result available for this hit! Event: " <<
m_evtPtr->getEvent());
142 if (nearestHitContainer.
hasMatch()) {
144 extrapolationParams.push_back({virtualHitRadius, nearestHit});
149 for (
auto param : extrapolationParams) {
150 auto fitted_state = recoTrack->getMeasuredStateOnPlaneFromRecoHit(param.second);
152 fitted_state.extrapolateToCylinder(param.first);
153 extrapolatedStates.push_back(fitted_state);
155 B2DEBUG(20,
"Extrapolation failed!");
159 B2WARNING(
"Exception" << e.what());
167 B2DEBUG(20,
"Cluster has wrong hypothesis!");
173 auto relatedTrack = cluster.getRelatedFrom<
Track>();
175 B2DEBUG(20,
"Cluster already related to track, bailing out");
181 auto relatedBremHit = cluster.getRelated<
BremHit>();
182 if (relatedBremHit) {
183 B2DEBUG(20,
"Cluster already assumed to be bremsstrahlung cluster!");
187 typedef std::tuple<ECLCluster*, genfit::MeasuredStateOnPlane, double, double > ClusterMSoPPair;
193 for (
auto hit : recoTrack->getRecoHitInformations(
true)) {
194 if (hit->getTrackingDetector() == RecoHitInformation::c_PXD || hit->getTrackingDetector() == RecoHitInformation::c_SVD) {
196 if (!recoTrack->hasTrackFitStatus()) {
199 auto measState = recoTrack->getMeasuredStateOnPlaneFromRecoHit(hit);
201 if (bremFinder.isMatch()) {
202 ClusterMSoPPair match_pair = std::make_tuple(&cluster, measState, bremFinder.getDistanceHitCluster(),
203 bremFinder.getEffAcceptanceFactor());
204 matchContainer.
add(match_pair, bremFinder.getDistanceHitCluster());
206 }
catch (NoTrackFitResult&) {
207 B2DEBUG(29,
"No track fit result available for this hit! Event: " <<
m_evtPtr->getEvent());
209 B2WARNING(
"Exception" << e.what());
215 for (
auto fitted_state : extrapolatedStates) {
217 if (bremFinder.isMatch()) {
218 ClusterMSoPPair match_pair = std::make_tuple(&cluster, fitted_state, bremFinder.getDistanceHitCluster(),
219 bremFinder.getEffAcceptanceFactor());
220 matchContainer.
add(match_pair, bremFinder.getDistanceHitCluster());
228 const auto fitted_state = std::get<1>(matchClustermSoP);
230 const auto fitted_pos = ROOT::Math::XYZVector(fitted_state.getPos());
231 const auto fitted_mom = ROOT::Math::XYZVector(fitted_state.getMom());
233 const auto hit_theta = fitted_mom.Theta();
234 const auto hit_phi = fitted_mom.Phi();
236 B2DEBUG(20,
"Best Cluster" << std::endl
237 <<
" Cluster Phi=" << std::get<0>(matchClustermSoP)->getPhi() <<
" Theta=" << std::get<0>(matchClustermSoP)->getTheta()
238 <<
" TrackHit Phi=" << hit_phi <<
" Theta=" << hit_theta);
244 double effAcceptanceFactor = std::get<3>(matchClustermSoP);
245 ECLCluster* bremCluster = std::get<0>(matchClustermSoP);
246 double clusterDistance = std::get<2>(matchClustermSoP);
251 clusterDistance, effAcceptanceFactor);
255 bremCluster->
addRelationTo(&track, effAcceptanceFactor,
"Bremsstrahlung");
257 if (primaryClusterOfTrack) {
258 primaryClusterOfTrack->
addRelationTo(bremCluster, effAcceptanceFactor);
Multiple entries can be added, but only the one will be kept, which has the best quality estimator.
TItem const & getBestMatch() const
bool add(TItem item, TEstimator est, EstimatorComparison estComparison=[](TEstimator currentBest, TEstimator newEst) {return newEst< currentBest;})
Add a new item with an estimator value.
Module to compute if an extrapolation to the ECL matches the position of an secondary ECLCLuster to f...
A bremsstrahlung hit that correlates an ECLCluster with a RecoTrack.
Provides a type-safe way to pass members of the chargedStableSet set.
@ c_WriteOut
Object/array should be saved by output modules.
@ c_Event
Different object in each event, all objects/arrays are invalidated after event() function has been ca...
double getEnergy(EHypothesisBit hypothesis) const
Return Energy (GeV).
@ c_nPhotons
CR is split into n photons (N1)
virtual void initialize() override
Use this to initialize resources or memory your module needs.
std::vector< float > m_virtualHitRadii
Radii where virtual hits for the extrapolation will be generated The default values are taken from br...
virtual void event() override
Called once for each event.
StoreArray< BremHit > m_bremHits
StoreArray BremHits.
double m_clusterAcceptanceFactor
Factor which is multiplied onto the cluster position error to check for matches.
StoreObjPtr< EventMetaData > m_evtPtr
StoreObjPtr EventMetaData.
std::string m_param_tracksStoreArrayName
StoreArray name of the Tracks for brem matching.
StoreArray< Track > m_tracks
StoreArray Track.
std::string m_param_recoTracksStoreArrayName
StoreArray name of the RecoTracks for brem matching.
StoreArray< ECLCluster > m_eclClusters
StoreArray ECLCluster.
std::string m_param_eclClustersStoreArrayName
StoreArray name of the ECLClusters for brem matching.
StoreArray< RecoTrack > m_recoTracks
StoreArray RecoTrack.
ECLTrackBremFinderModule()
Constructor, for setting module description and parameters.
float m_clusterDistanceCut
Cut on the distance between the cluster position angle and the extrapolation angle.
void setDescription(const std::string &description)
Sets the description of the module.
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
This is the Reconstruction Event-Data Model Track.
void addRelationTo(const RelationsInterface< BASE > *object, float weight=1.0, const std::string &namedRelation="") const
Add a relation from this object to another object (with caching).
bool isRequired(const std::string &name="")
Ensure this array/object has been registered previously.
Values of the result of a track fit with a given particle hypothesis.
ROOT::Math::XYZVector getMomentum() const
Getter for vector of momentum at closest approach of track in r/phi projection.
Class that bundles various TrackFitResults.
Exception class for error handling in GENFIT (provides storage for diagnostic information)
REG_MODULE(arichBtest)
Register the Module.
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Abstract base class for different kinds of events.