LDMX Software
tracking::reco::VertexProcessor Class Reference

Public Member Functions

 VertexProcessor (const std::string &name, framework::Process &process)
 Constructor.
 
virtual ~VertexProcessor ()=default
 Destructor.
 
void onProcessStart () override
 Callback for the EventProcessor to take any necessary action when the processing of events starts, such as creating histograms.
 
void onProcessEnd () override
 Callback for the EventProcessor to take any necessary action when the processing of events finishes, such as calculating job-summary quantities.
 
void configure (framework::config::Parameters &parameters) override
 Configure the processor using the given user specified parameters.
 
void produce (framework::Event &event) override
 Run the processor.
 
- Public Member Functions inherited from framework::Producer
 Producer (const std::string &name, Process &process)
 Class constructor.
 
virtual void process (Event &event) final
 Processing an event for a Producer is calling produce.
 
- Public Member Functions inherited from framework::EventProcessor
 DECLARE_FACTORY (EventProcessor, EventProcessor *, const std::string &, Process &)
 declare that we have a factory for this class
 
 EventProcessor (const std::string &name, Process &process)
 Class constructor.
 
virtual ~EventProcessor ()=default
 Class destructor.
 
virtual void beforeNewRun (ldmx::RunHeader &run_header)
 Callback for Producers to add parameters to the run header before conditions are initialized.
 
virtual void onNewRun (const ldmx::RunHeader &run_header)
 Callback for the EventProcessor to take any necessary action when the run being processed changes.
 
virtual void onFileOpen (EventFile &event_file)
 Callback for the EventProcessor to take any necessary action when a new event input ROOT file is opened.
 
virtual void onFileClose (EventFile &event_file)
 Callback for the EventProcessor to take any necessary action when a event input ROOT file is closed.
 
template<class T >
const T & getCondition (const std::string &condition_name)
 Access a conditions object for the current event.
 
TDirectory * getHistoDirectory ()
 Access/create a directory in the histogram file for this event processor to create histograms and analysis tuples.
 
void setStorageHint (framework::StorageControl::Hint hint)
 Mark the current event as having the given storage control hint from this module_.
 
void setStorageHint (framework::StorageControl::Hint hint, const std::string &purposeString)
 Mark the current event as having the given storage control hint from this module and the given purpose string.
 
int getLogFrequency () const
 Get the current logging frequency from the process.
 
int getRunNumber () const
 Get the run number from the process.
 
std::string getName () const
 Get the processor name.
 
void createHistograms (const std::vector< framework::config::Parameters > &histos)
 Internal function which is used to create histograms passed from the python configuration @parma histos vector of Parameters that configure histograms to create.
 

Private Attributes

Acts::MagneticFieldContext bctx_
 The contexts - TODO: they should move to some global location, I guess.
 
int nevents_ {0}
 
std::shared_ptr< InterpolatedMagneticField3 > sp_interpolated_b_field_
 
std::string field_map_ {""}
 Path to the magnetic field map.
 
std::string trk_coll_name_ {"Tracks"}
 
std::string seeds_coll_name_ {"RecoilTruthSeeds"}
 
std::string input_pass_name_ {""}
 
std::shared_ptr< VoidPropagator > propagator_
 
double processing_time_ {0.}
 
TH1F * h_m_
 
TH1F * h_m_truth_filter_
 
TH1F * h_m_truth_
 

Additional Inherited Members

- Protected Member Functions inherited from framework::EventProcessor
void abortEvent ()
 Abort the event immediately.
 
- Protected Attributes inherited from framework::EventProcessor
HistogramPool histograms_
 helper object for making and filling histograms
 
NtupleManagerntuple_ {NtupleManager::getInstance()}
 Manager for any ntuples.
 
logging::logger the_log_
 The logger for this EventProcessor.
 

Detailed Description

Definition at line 49 of file VertexProcessor.h.

Constructor & Destructor Documentation

◆ VertexProcessor()

tracking::reco::VertexProcessor::VertexProcessor ( const std::string & name,
framework::Process & process )

Constructor.

Parameters
nameThe name of the instance of this object.
processThe process running this producer.

Definition at line 12 of file VertexProcessor.cxx.

Base class for a module which produces a data product.
virtual void process(Event &event) final
Processing an event for a Producer is calling produce.

Member Function Documentation

◆ configure()

void tracking::reco::VertexProcessor::configure ( framework::config::Parameters & parameters)
overridevirtual

Configure the processor using the given user specified parameters.

Parameters
parametersSet of parameters used to configure this processor.

Reimplemented from framework::EventProcessor.

Definition at line 42 of file VertexProcessor.cxx.

42 {
43 // TODO:: the bfield map should be taken automatically
44 field_map_ = parameters.get<std::string>("field_map");
45
46 trk_coll_name_ = parameters.get<std::string>("trk_coll_name", "Tracks");
47
48 seeds_coll_name_ =
49 parameters.get<std::string>("seeds_coll_name", "RecoilTruthSeeds");
50
51 input_pass_name_ = parameters.get<std::string>("input_pass_name");
52}
const T & get(const std::string &name) const
Retrieve the parameter of the given name.
Definition Parameters.h:78
std::string field_map_
Path to the magnetic field map.

References field_map_, and framework::config::Parameters::get().

◆ onProcessEnd()

void tracking::reco::VertexProcessor::onProcessEnd ( )
overridevirtual

Callback for the EventProcessor to take any necessary action when the processing of events finishes, such as calculating job-summary quantities.

Reimplemented from framework::EventProcessor.

Definition at line 177 of file VertexProcessor.cxx.

177 {
178 TFile* outfile = new TFile("VertexingResults.root", "RECREATE");
179 outfile->cd();
180
181 h_m_->Write();
182 h_m_truth_->Write();
183 h_m_truth_filter_->Write();
184 outfile->Close();
185 delete outfile;
186
187 ldmx_log(info) << "AVG Time/Event: " << std::fixed << std::setprecision(3)
188 << processing_time_ / nevents_ << " ms";
189}

◆ onProcessStart()

void tracking::reco::VertexProcessor::onProcessStart ( )
overridevirtual

Callback for the EventProcessor to take any necessary action when the processing of events starts, such as creating histograms.

Reimplemented from framework::EventProcessor.

Definition at line 16 of file VertexProcessor.cxx.

16 {
17 bctx_ = Acts::MagneticFieldContext();
18
19 h_m_ = new TH1F("m", "m", 100, 0., 1.);
20 h_m_truth_filter_ = new TH1F("m_filter", "m", 100, 0., 1.);
21 h_m_truth_ = new TH1F("m_truth", "m_truth", 100, 0., 1.);
22
23 /*
24 * this is unused, should it be? FIXME
25 auto localToGlobalBin_xyz = [](std::array<size_t, 3> bins,
26 std::array<size_t, 3> sizes) {
27 return (bins[0] * (sizes[1] * sizes[2]) + bins[1] * sizes[2] +
28 bins[2]); // xyz - field space
29 // return (bins[1] * (sizes[2] * sizes[0]) + bins[2] * sizes[0] + bins[0]);
30 // //zxy
31 };
32 */
33
34 // Setup a interpolated bfield map
35 sp_interpolated_b_field_ =
36 std::make_shared<InterpolatedMagneticField3>(loadDefaultBField(
37 field_map_, defaultTransformPos, defaultTransformBField));
38
39 ldmx_log(info) << "Check if nullptr::" << sp_interpolated_b_field_.get();
40}
Acts::MagneticFieldContext bctx_
The contexts - TODO: they should move to some global location, I guess.

References bctx_, and field_map_.

◆ produce()

void tracking::reco::VertexProcessor::produce ( framework::Event & event)
overridevirtual

Run the processor.

Parameters
eventThe event to process.

Implements framework::Producer.

Definition at line 54 of file VertexProcessor.cxx.

54 {
55 // TODO:: Move this to an external file
56 // And move all this to a single time per processor not for each event!!
57
58 nevents_++;
59 auto start = std::chrono::high_resolution_clock::now();
60 auto&& stepper = Acts::EigenStepper<>{sp_interpolated_b_field_};
61
62 // Set up propagator with void navigator
63 propagator_ = std::make_shared<VoidPropagator>(stepper);
64
65 // Note: FullBilloirVertexFitter setup commented out — fit() is not called yet
66 // and v46 Config now requires extractParameters/trackLinearizer delegates.
67 // Acts::VertexingOptions vf_options(gctx_, bctx_);
68
69 // Retrieve the track collection
70 const auto& tracks =
71 event.getCollection<ldmx::Track>(trk_coll_name_, input_pass_name_);
72
73 // Retrieve the truth seeds
74 const auto& seeds =
75 event.getCollection<ldmx::Track>(seeds_coll_name_, input_pass_name_);
76
77 if (tracks.size() < 1) return;
78
79 // Transform the EDM ldmx::tracks to the format needed by ACTS
80 std::vector<Acts::BoundTrackParameters> billoir_tracks;
81
82 // TODO:: The perigee surface should be common between all tracks.
83 // So should only be created once in principle.
84 // There should be no perigeeSurface2
85
86 Acts::Vector3 perigee_acts = tracking::sim::utils::ldmx2Acts(
87 Acts::Vector3(tracks.front().getPerigeeX(), tracks.front().getPerigeeY(),
88 tracks.front().getPerigeeZ()));
89 std::shared_ptr<Acts::PerigeeSurface> perigee_surface =
90 Acts::Surface::makeShared<Acts::PerigeeSurface>(perigee_acts);
91
92 for (unsigned int i_track = 0; i_track < tracks.size(); i_track++) {
93 Acts::BoundVector param_vec;
94 param_vec << tracks.at(i_track).getD0(), tracks.at(i_track).getZ0(),
95 tracks.at(i_track).getPhi(), tracks.at(i_track).getTheta(),
96 tracks.at(i_track).getQoP(), tracks.at(i_track).getT();
97
98 Acts::BoundMatrix cov_mat =
99 tracking::sim::utils::unpackCov(tracks.at(i_track).getPerigeeCov());
100 auto part{Acts::ParticleHypothesis(
101 Acts::PdgParticle(tracks.at(i_track).getPdgID()))};
102 billoir_tracks.push_back(Acts::BoundTrackParameters(
103 perigee_surface, param_vec, std::move(cov_mat), part));
104 }
105
106 // Select exactly 2 tracks
107 if (billoir_tracks.size() != 2) {
108 return;
109 }
110
111 if (billoir_tracks.at(0).charge() * billoir_tracks.at(1).charge() > 0) return;
112
113 // Pion mass hypothesis
114 double pion_mass = 139.570 * Acts::UnitConstants::MeV;
115
116 TLorentzVector p1, p2;
117 p1.SetXYZM(billoir_tracks.at(0).momentum()(0),
118 billoir_tracks.at(0).momentum()(1),
119 billoir_tracks.at(0).momentum()(2), pion_mass);
120
121 p2.SetXYZM(billoir_tracks.at(1).momentum()(0),
122 billoir_tracks.at(1).momentum()(1),
123 billoir_tracks.at(1).momentum()(2), pion_mass);
124
125 std::vector<TLorentzVector> pion_seeds;
126
127 if (seeds.size() == 2) {
128 for (int i_seed = 0; i_seed < seeds.size(); i_seed++) {
129 Acts::Vector3 seed_perigee_acts =
130 tracking::sim::utils::ldmx2Acts(Acts::Vector3(
131 seeds.at(i_seed).getPerigeeX(), seeds.at(i_seed).getPerigeeY(),
132 seeds.at(i_seed).getPerigeeZ()));
133 std::shared_ptr<Acts::PerigeeSurface> perigee_surface2 =
134 Acts::Surface::makeShared<Acts::PerigeeSurface>(seed_perigee_acts);
135
136 Acts::BoundVector param_vec;
137 param_vec << seeds.at(i_seed).getD0(), seeds.at(i_seed).getZ0(),
138 seeds.at(i_seed).getPhi(), seeds.at(i_seed).getTheta(),
139 seeds.at(i_seed).getQoP(), seeds.at(i_seed).getT();
140
141 Acts::BoundMatrix cov_mat =
142 tracking::sim::utils::unpackCov(seeds.at(i_seed).getPerigeeCov());
143 int pion_pdg_id = 211; // pi+
144 if (seeds.at(i_seed).getCharge() < 0) pion_pdg_id = -211;
145 // BoundTrackParameters needs the particle hypothesis
146 auto part{Acts::ParticleHypothesis(Acts::PdgParticle(pion_pdg_id))};
147 auto bound_seed_params = Acts::BoundTrackParameters(
148 perigee_surface, param_vec, std::move(cov_mat), part);
149
150 TLorentzVector pion4v;
151 pion4v.SetXYZM(bound_seed_params.momentum()(0),
152 bound_seed_params.momentum()(1),
153 bound_seed_params.momentum()(2), pion_mass);
154
155 pion_seeds.push_back(pion4v);
156 } // loops on seeds
157
158 h_m_truth_->Fill((pion_seeds.at(0) + pion_seeds.at(1)).M());
159 }
160
161 if ((pion_seeds.size() == 2) &&
162 (pion_seeds.at(0) + pion_seeds.at(1)).M() > 0.490 &&
163 (pion_seeds.at(0) + pion_seeds.at(1)).M() < 0.510) {
164 // Check if the tracks have opposite charge
165 h_m_truth_filter_->Fill((p1 + p2).M());
166 }
167
168 h_m_->Fill((p1 + p2).M());
169
170 auto end = std::chrono::high_resolution_clock::now();
171 // long long microseconds =
172 // std::chrono::duration_cast<std::chrono::microseconds>(end-start).count();
173 auto diff = end - start;
174 processing_time_ += std::chrono::duration<double, std::milli>(diff).count();
175}
Implementation of a track object.
Definition Track.h:53

Member Data Documentation

◆ bctx_

Acts::MagneticFieldContext tracking::reco::VertexProcessor::bctx_
private

The contexts - TODO: they should move to some global location, I guess.

Definition at line 82 of file VertexProcessor.h.

Referenced by onProcessStart().

◆ field_map_

std::string tracking::reco::VertexProcessor::field_map_ {""}
private

Path to the magnetic field map.

Definition at line 91 of file VertexProcessor.h.

91{""};

Referenced by configure(), and onProcessStart().

◆ h_m_

TH1F* tracking::reco::VertexProcessor::h_m_
private

Definition at line 107 of file VertexProcessor.h.

◆ h_m_truth_

TH1F* tracking::reco::VertexProcessor::h_m_truth_
private

Definition at line 109 of file VertexProcessor.h.

◆ h_m_truth_filter_

TH1F* tracking::reco::VertexProcessor::h_m_truth_filter_
private

Definition at line 108 of file VertexProcessor.h.

◆ input_pass_name_

std::string tracking::reco::VertexProcessor::input_pass_name_ {""}
private

Definition at line 99 of file VertexProcessor.h.

99{""};

◆ nevents_

int tracking::reco::VertexProcessor::nevents_ {0}
private

Definition at line 85 of file VertexProcessor.h.

85{0};

◆ processing_time_

double tracking::reco::VertexProcessor::processing_time_ {0.}
private

Definition at line 105 of file VertexProcessor.h.

105{0.};

◆ propagator_

std::shared_ptr<VoidPropagator> tracking::reco::VertexProcessor::propagator_
private

Definition at line 102 of file VertexProcessor.h.

◆ seeds_coll_name_

std::string tracking::reco::VertexProcessor::seeds_coll_name_ {"RecoilTruthSeeds"}
private

Definition at line 97 of file VertexProcessor.h.

97{"RecoilTruthSeeds"};

◆ sp_interpolated_b_field_

std::shared_ptr<InterpolatedMagneticField3> tracking::reco::VertexProcessor::sp_interpolated_b_field_
private

Definition at line 88 of file VertexProcessor.h.

◆ trk_coll_name_

std::string tracking::reco::VertexProcessor::trk_coll_name_ {"Tracks"}
private

Definition at line 95 of file VertexProcessor.h.

95{"Tracks"};

The documentation for this class was generated from the following files: