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";
76 std::vector<ECLCluster*> eclClusters;
85 const Track* relatedTrack = cluster.getRelatedFrom<
Track>();
86 if (relatedTrack !=
nullptr)
88 eclClusters.push_back(&cluster);
100 if (trackFitResult) {
101 double trackMomentum = trackFitResult->
getMomentum().R();
103 if (trackMomentum > 5.0) {
104 B2DEBUG(20,
"Track momentum higher than 5GeV! Track is not used for bremsstrahlung finding");
112 B2DEBUG(20,
"Checking track for related ECLCluster");
116 auto relatedClustersToTrack =
119 for (
auto& relatedCluster : relatedClustersToTrack) {
121 primaryClusterOfTrack = &relatedCluster;
131 B2DEBUG(20,
"No RecoTrack for this Track");
135 std::vector<RecoHitInformation*> recoHitInformations =
136 recoTrack->getRecoHitInformations(
true);
139 std::vector<std::pair<float, RecoHitInformation*>> extrapolationParams = {};
140 std::vector<genfit::MeasuredStateOnPlane> extrapolatedStates = {};
145 if (hit->useInFit() && recoTrack->hasTrackFitStatus()) {
147 auto measState = recoTrack->getMeasuredStateOnPlaneFromRecoHit(hit);
148 float hitRadius = measState.getPos().Perp();
149 float distance = abs(hitRadius - virtualHitRadius);
152 nearestHitContainer.
add(hit, distance);
154 }
catch (NoTrackFitResult&) {
155 B2DEBUG(29,
"No track fit result available for this hit! Event: " <<
m_evtPtr->getEvent());
158 if (nearestHitContainer.
hasMatch()) {
160 extrapolationParams.push_back({virtualHitRadius, nearestHit});
165 for (
auto param : extrapolationParams) {
166 auto fitted_state = recoTrack->getMeasuredStateOnPlaneFromRecoHit(param.second);
168 fitted_state.extrapolateToCylinder(param.first);
169 extrapolatedStates.push_back(fitted_state);
170 }
catch (genfit::Exception& exception1) {
171 B2DEBUG(20,
"Extrapolation failed!");
174 }
catch (
const genfit::Exception& e) {
175 B2WARNING(
"Exception" << e.what());
184 auto relatedBremHit = cluster->getRelated<
BremHit>();
185 if (relatedBremHit) {
186 B2DEBUG(20,
"Cluster already assumed to be bremsstrahlung cluster!");
190 typedef std::tuple<ECLCluster*, genfit::MeasuredStateOnPlane, double, double > ClusterMSoPPair;
197 if (hit->getTrackingDetector() == RecoHitInformation::c_PXD || hit->getTrackingDetector() == RecoHitInformation::c_SVD) {
199 if (!recoTrack->hasTrackFitStatus()) {
202 auto measState = recoTrack->getMeasuredStateOnPlaneFromRecoHit(hit);
204 if (bremFinder.isMatch()) {
205 ClusterMSoPPair match_pair = std::make_tuple(cluster, measState, bremFinder.getDistanceHitCluster(),
206 bremFinder.getEffAcceptanceFactor());
207 matchContainer.
add(match_pair, bremFinder.getDistanceHitCluster());
209 }
catch (NoTrackFitResult&) {
210 B2DEBUG(29,
"No track fit result available for this hit! Event: " <<
m_evtPtr->getEvent());
211 }
catch (genfit::Exception& e) {
212 B2WARNING(
"Exception" << e.what());
218 for (
auto fitted_state : extrapolatedStates) {
220 if (bremFinder.isMatch()) {
221 ClusterMSoPPair match_pair = std::make_tuple(cluster, fitted_state, bremFinder.getDistanceHitCluster(),
222 bremFinder.getEffAcceptanceFactor());
223 matchContainer.
add(match_pair, bremFinder.getDistanceHitCluster());
231 const auto fitted_state = std::get<1>(matchClustermSoP);
233 const auto fitted_pos = ROOT::Math::XYZVector(fitted_state.getPos());
234 const auto fitted_mom = ROOT::Math::XYZVector(fitted_state.getMom());
236 const auto hit_theta = fitted_mom.Theta();
237 const auto hit_phi = fitted_mom.Phi();
239 B2DEBUG(20,
"Best Cluster" << std::endl
240 <<
" Cluster Phi=" << std::get<0>(matchClustermSoP)->getPhi() <<
" Theta=" << std::get<0>(matchClustermSoP)->getTheta()
241 <<
" TrackHit Phi=" << hit_phi <<
" Theta=" << hit_theta);
247 double effAcceptanceFactor = std::get<3>(matchClustermSoP);
248 ECLCluster* bremCluster = std::get<0>(matchClustermSoP);
249 double clusterDistance = std::get<2>(matchClustermSoP);
254 clusterDistance, effAcceptanceFactor);
258 bremCluster->
addRelationTo(&track, effAcceptanceFactor,
"Bremsstrahlung");
260 if (primaryClusterOfTrack) {
261 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.
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.