17 #include <ktracker/FastTracklet.h>
18 #include <ktracker/SRecEvent.h>
32 m_file_name(
"output.root"),
38 saveDimuonOnly(false),
40 reco_dimu_mode(false),
42 data_trig_mode(false),
61 m_file =
new TFile(m_file_name.c_str(),
"RECREATE");
63 if (!m_file || m_file->IsZombie()) {
64 std::cerr <<
"Error: Could not create file " << m_file_name << std::endl;
67 std::cout <<
"File " << m_file->GetName() <<
" opened successfully." << std::endl;
70 m_tree =
new TTree(m_tree_name.c_str(),
"Tree for storing events");
72 std::cerr <<
"Error: Could not create tree " << m_tree_name << std::endl;
75 std::cout <<
"Tree " << m_tree->GetName() <<
" created successfully." << std::endl;
78 m_tree->Branch(
"eventID", &eventID,
"eventID/I");
79 m_tree->Branch(
"runID", &runID,
"runID/I");
80 m_tree->Branch(
"spillID", &spillID,
"spillID/I");
81 m_tree->Branch(
"eventID", &eventID,
"eventID/I");
82 m_tree->Branch(
"rfID", &rfID,
"rfID/I");
83 m_tree->Branch(
"turnID", &turnID,
"turnID/I");
84 m_tree->Branch(
"rfIntensity", rfIntensity,
"rfIntensity[33]/I");
85 m_tree->Branch(
"fpgaTrigger", fpgaTrigger,
"fpgaTrigger[5]/I");
86 m_tree->Branch(
"nimTrigger", nimTrigger,
"nimTrigger[5]/I");
88 m_tree->Branch(
"hitID", &hitID);
89 m_tree->Branch(
"hitTrackID", &hitTrackID);
90 m_tree->Branch(
"processID", &processID);
91 m_tree->Branch(
"detectorID", &detectorID);
92 m_tree->Branch(
"elementID", &elementID);
93 m_tree->Branch(
"tdcTime", &tdcTime);
94 m_tree->Branch(
"driftDistance", &driftDistance);
97 m_tree->Branch(
"gCharge", &gCharge);
98 m_tree->Branch(
"trackID", &trackID);
99 m_tree->Branch(
"gvx", &gvx);
100 m_tree->Branch(
"gvy", &gvy);
101 m_tree->Branch(
"gvz", &gvz);
102 m_tree->Branch(
"gpx", &gpx);
103 m_tree->Branch(
"gpy", &gpy);
104 m_tree->Branch(
"gpz", &gpz);
106 m_tree->Branch(
"gx_st1", &gx_st1);
107 m_tree->Branch(
"gy_st1", &gy_st1);
108 m_tree->Branch(
"gz_st1", &gz_st1);
109 m_tree->Branch(
"gpx_st1", &gpx_st1);
110 m_tree->Branch(
"gpy_st1", &gpy_st1);
111 m_tree->Branch(
"gpz_st1", &gpz_st1);
113 m_tree->Branch(
"gx_st3", &gx_st3);
114 m_tree->Branch(
"gy_st3", &gy_st3);
115 m_tree->Branch(
"gz_st3", &gz_st3);
116 m_tree->Branch(
"gpx_st3", &gpx_st3);
117 m_tree->Branch(
"gpy_st3", &gpy_st3);
118 m_tree->Branch(
"gpz_st3", &gpz_st3);
122 m_tree->Branch(
"rec_track_id", &rec_track_id);
123 m_tree->Branch(
"rec_track_charge", &rec_track_charge);
124 m_tree->Branch(
"rec_track_vx", &rec_track_vx);
125 m_tree->Branch(
"rec_track_vy", &rec_track_vy);
126 m_tree->Branch(
"rec_track_vz", &rec_track_vz);
127 m_tree->Branch(
"rec_track_px", &rec_track_px);
128 m_tree->Branch(
"rec_track_py", &rec_track_py);
129 m_tree->Branch(
"rec_track_pz", &rec_track_pz);
130 m_tree->Branch(
"rec_track_x_st1", &rec_track_x_st1);
131 m_tree->Branch(
"rec_track_y_st1", &rec_track_y_st1);
132 m_tree->Branch(
"rec_track_z_st1", &rec_track_z_st1);
133 m_tree->Branch(
"rec_track_px_st1", &rec_track_px_st1);
134 m_tree->Branch(
"rec_track_py_st1", &rec_track_py_st1);
135 m_tree->Branch(
"rec_track_pz_st1", &rec_track_pz_st1);
136 m_tree->Branch(
"rec_track_x_st3", &rec_track_x_st3);
137 m_tree->Branch(
"rec_track_y_st3", &rec_track_y_st3);
138 m_tree->Branch(
"rec_track_z_st3", &rec_track_z_st3);
139 m_tree->Branch(
"rec_track_px_st3", &rec_track_px_st3);
140 m_tree->Branch(
"rec_track_py_st3", &rec_track_py_st3);
141 m_tree->Branch(
"rec_track_pz_st3", &rec_track_pz_st3);
142 m_tree->Branch(
"rec_track_num_hits", &rec_track_num_hits);
143 m_tree->Branch(
"rec_track_chisq", &rec_track_chisq);
144 m_tree->Branch(
"rec_track_chisq_tgt", &rec_track_chisq_tgt);
145 m_tree->Branch(
"rec_track_chisq_dump", &rec_track_chisq_dump);
146 m_tree->Branch(
"rec_track_chisq_upstream", &rec_track_chisq_upstream);
147 m_tree->Branch(
"rec_track_x_tgt", &rec_track_x_tgt);
148 m_tree->Branch(
"rec_track_y_tgt", &rec_track_y_tgt);
149 m_tree->Branch(
"rec_track_z_tgt", &rec_track_z_tgt);
150 m_tree->Branch(
"rec_track_px_tgt", &rec_track_px_tgt);
151 m_tree->Branch(
"rec_track_py_tgt", &rec_track_py_tgt);
152 m_tree->Branch(
"rec_track_pz_tgt", &rec_track_pz_tgt);
153 m_tree->Branch(
"rec_track_x_dump", &rec_track_x_dump);
154 m_tree->Branch(
"rec_track_y_dump", &rec_track_y_dump);
155 m_tree->Branch(
"rec_track_z_dump", &rec_track_z_dump);
156 m_tree->Branch(
"rec_track_px_dump", &rec_track_px_dump);
157 m_tree->Branch(
"rec_track_py_dump", &rec_track_py_dump);
158 m_tree->Branch(
"rec_track_pz_dump", &rec_track_pz_dump);
159 m_tree->Branch(
"rec_hit_ids", &rec_hit_ids);
160 m_tree->Branch(
"rec_track_hit_x", &rec_track_hit_x);
161 m_tree->Branch(
"rec_track_hit_y", &rec_track_hit_y);
165 m_tree->Branch(
"rec_dimuon_id", &rec_dimuon_id);
166 m_tree->Branch(
"rec_dimuon_true_id", &rec_dimuon_true_id);
167 m_tree->Branch(
"rec_dimuon_track_id_pos", &rec_dimuon_track_id_pos);
168 m_tree->Branch(
"rec_dimuon_track_id_neg", &rec_dimuon_track_id_neg);
170 m_tree->Branch(
"rec_dimuon_x", &rec_dimuon_x);
171 m_tree->Branch(
"rec_dimuon_y", &rec_dimuon_y);
172 m_tree->Branch(
"rec_dimuon_z", &rec_dimuon_z);
174 m_tree->Branch(
"rec_dimuon_px_pos", &rec_dimuon_px_pos);
175 m_tree->Branch(
"rec_dimuon_py_pos", &rec_dimuon_py_pos);
176 m_tree->Branch(
"rec_dimuon_pz_pos", &rec_dimuon_pz_pos);
178 m_tree->Branch(
"rec_dimuon_px_neg", &rec_dimuon_px_neg);
179 m_tree->Branch(
"rec_dimuon_py_neg", &rec_dimuon_py_neg);
180 m_tree->Branch(
"rec_dimuon_pz_neg", &rec_dimuon_pz_neg);
182 m_tree->Branch(
"rec_dimuon_px_pos_tgt", &rec_dimuon_px_pos_tgt);
183 m_tree->Branch(
"rec_dimuon_py_pos_tgt", &rec_dimuon_py_pos_tgt);
184 m_tree->Branch(
"rec_dimuon_pz_pos_tgt", &rec_dimuon_pz_pos_tgt);
186 m_tree->Branch(
"rec_dimuon_px_neg_tgt", &rec_dimuon_px_neg_tgt);
187 m_tree->Branch(
"rec_dimuon_py_neg_tgt", &rec_dimuon_py_neg_tgt);
188 m_tree->Branch(
"rec_dimuon_pz_neg_tgt", &rec_dimuon_pz_neg_tgt);
190 m_tree->Branch(
"rec_dimuon_px_pos_dump", &rec_dimuon_px_pos_dump);
191 m_tree->Branch(
"rec_dimuon_py_pos_dump", &rec_dimuon_py_pos_dump);
192 m_tree->Branch(
"rec_dimuon_pz_pos_dump", &rec_dimuon_pz_pos_dump);
194 m_tree->Branch(
"rec_dimuon_px_neg_dump", &rec_dimuon_px_neg_dump);
195 m_tree->Branch(
"rec_dimuon_py_neg_dump", &rec_dimuon_py_neg_dump);
196 m_tree->Branch(
"rec_dimuon_pz_neg_dump", &rec_dimuon_pz_neg_dump);
203 m_sq_trk_vec = findNode::getClass<SQTrackVector>(startNode,
"SQRecTrackVector");
204 if(
reco_dimu_mode==
true) m_sq_dim_vec = findNode::getClass<SQDimuonVector>(startNode,
"SQRecDimuonVector_PM");
207 std::cerr <<
"Error: m_sq_trk_vec is null!" << std::endl;
213 std::cerr <<
"Error: m_sq_dim_vec is null!" << std::endl;
218 m_evt = findNode::getClass<SQEvent>(startNode,
"SQEvent");
221 m_hit_vec = findNode::getClass<SQHitVector>(startNode,
"SQHitVector");
222 m_vec_trk = findNode::getClass<SQTrackVector>(startNode,
"SQTruthTrackVector");
223 if (!m_evt || !m_hit_vec || !m_vec_trk) {
228 m_hit_vec = findNode::getClass<SQHitVector>(startNode,
"SQHitVector");
229 if (!m_evt || !m_hit_vec) {
236 SQRun* sq_run = findNode::getClass<SQRun>(startNode,
"SQRun");
237 if (!sq_run) std::cout <<
"Error: SQRun is null!" << std::endl;
243 cout <<
"!!WARNING!! OnlMonTrigEP::InitRunOnlMon(): roadset.LoadConfig returned " << ret <<
".\n";
245 cout <<
"Roadset " <<
m_rs.
str(1) << endl;
251 cout <<
"!!WARNING!! OnlMonTrigEP::InitRunOnlMon(): roadset.LoadConfig returned " << ret <<
".\n";
283 for (
int i = -16; i <= 16; ++i) {
290 for (
int ihit = 0; ihit < m_hit_vec->
size(); ++ihit) {
291 SQHit* hit = m_hit_vec->
at(ihit);
301 const double muon_mass = 0.10566;
307 for (
unsigned int ii = 0; ii < m_vec_trk->
size(); ii++) {
341 for (
int ihit = 0; ihit < m_hit_vec->
size(); ++ihit) {
342 SQHit* hit = m_hit_vec->
at(ihit);
348 else processID_ =
proc_id +10 ;
350 unsigned int encodedValue =
EncodeProcess(processID_, sourceFlag_);
355 processID.push_back(encodedValue);
372 for (
auto it = m_sq_trk_vec->
begin(); it != m_sq_trk_vec->
end(); ++it) {
378 rec_track_id.push_back(index);
380 rec_track_charge.push_back(trk->
get_charge());
392 rec_track_px_st1.push_back(trk->
get_mom_st1().Px());
393 rec_track_py_st1.push_back(trk->
get_mom_st1().Py());
394 rec_track_pz_st1.push_back(trk->
get_mom_st1().Pz());
400 rec_track_px_st3.push_back(trk->
get_mom_st3().Px());
401 rec_track_py_st3.push_back(trk->
get_mom_st3().Py());
402 rec_track_pz_st3.push_back(trk->
get_mom_st3().Pz());
405 rec_track_chisq.push_back(trk->
get_chisq());
430 std::vector<int> hit_ids;
431 std::vector<double> hit_ids_pos_x;
432 std::vector<double> hit_ids_pos_y;
433 for (
int i_hit = 0; i_hit < trk->
get_num_hits(); ++i_hit) {
437 Double_t x = 0.0, y = 0.0;
440 hit_ids_pos_x.push_back(x);
441 hit_ids_pos_y.push_back(y);
443 rec_hit_ids.push_back(hit_ids);
444 rec_track_hit_x.push_back(hit_ids_pos_x);
445 rec_track_hit_y.push_back(hit_ids_pos_y);
450 for (
auto it = m_sq_dim_vec->
begin(); it != m_sq_dim_vec->
end(); it++) {
460 rec_dimuon_track_id_pos.push_back(trk_id_pos);
461 rec_dimuon_track_id_neg.push_back(trk_id_neg);
462 rec_dimuon_px_pos.push_back(sdim.
get_mom_pos().Px());
463 rec_dimuon_py_pos.push_back(sdim.
get_mom_pos().Py());
464 rec_dimuon_pz_pos.push_back(sdim.
get_mom_pos().Pz());
465 rec_dimuon_px_neg.push_back(sdim.
get_mom_neg().Px());
466 rec_dimuon_py_neg.push_back(sdim.
get_mom_neg().Py());
467 rec_dimuon_pz_neg.push_back(sdim.
get_mom_neg().Pz());
468 rec_dimuon_x.push_back(sdim.
get_pos().X());
469 rec_dimuon_y.push_back(sdim.
get_pos().Y());
470 rec_dimuon_z.push_back(sdim.
get_pos().Z());
473 rec_dimuon_px_pos_tgt.push_back(sdim.
p_pos_target.Px());
474 rec_dimuon_py_pos_tgt.push_back(sdim.
p_pos_target.Py());
475 rec_dimuon_pz_pos_tgt.push_back(sdim.
p_pos_target.Pz());
476 rec_dimuon_px_neg_tgt.push_back(sdim.
p_neg_target.Px());
477 rec_dimuon_py_neg_tgt.push_back(sdim.
p_neg_target.Py());
478 rec_dimuon_pz_neg_tgt.push_back(sdim.
p_neg_target.Pz());
481 rec_dimuon_px_pos_dump.push_back(sdim.
p_pos_dump.Px());
482 rec_dimuon_py_pos_dump.push_back(sdim.
p_pos_dump.Py());
483 rec_dimuon_pz_pos_dump.push_back(sdim.
p_pos_dump.Pz());
484 rec_dimuon_px_neg_dump.push_back(sdim.
p_neg_dump.Px());
485 rec_dimuon_py_neg_dump.push_back(sdim.
p_neg_dump.Py());
486 rec_dimuon_pz_neg_dump.push_back(sdim.
p_neg_dump.Pz());
510 driftDistance.clear();
513 gCharge.clear(); trackID.clear();
514 gvx.clear(); gvy.clear(); gvz.clear();
515 gpx.clear(); gpy.clear(); gpz.clear();
516 gx_st1.clear(); gy_st1.clear(); gz_st1.clear();
517 gpx_st1.clear(); gpy_st1.clear(); gpz_st1.clear();
518 gx_st3.clear(); gy_st3.clear(); gz_st3.clear();
519 gpx_st3.clear(); gpy_st3.clear(); gpz_st3.clear();
523 rec_track_id.clear();
524 rec_track_charge.clear();
525 rec_track_vx.clear(); rec_track_vy.clear(); rec_track_vz.clear();
526 rec_track_px.clear(); rec_track_py.clear(); rec_track_pz.clear();
527 rec_track_x_st1.clear(); rec_track_y_st1.clear(); rec_track_z_st1.clear();
528 rec_track_px_st1.clear(); rec_track_py_st1.clear(); rec_track_pz_st1.clear();
529 rec_track_x_st3.clear(); rec_track_y_st3.clear(); rec_track_z_st3.clear();
530 rec_track_px_st3.clear(); rec_track_py_st3.clear(); rec_track_pz_st3.clear();
531 rec_track_chisq.clear();
532 rec_track_chisq_tgt.clear();
533 rec_track_chisq_dump.clear();
534 rec_track_chisq_upstream.clear();
535 rec_track_num_hits.clear();
536 rec_track_x_tgt.clear(); rec_track_y_tgt.clear(); rec_track_z_tgt.clear();
537 rec_track_px_tgt.clear(); rec_track_py_tgt.clear(); rec_track_pz_tgt.clear();
538 rec_track_x_dump.clear(); rec_track_y_dump.clear(); rec_track_z_dump.clear();
539 rec_track_px_dump.clear(); rec_track_py_dump.clear(); rec_track_pz_dump.clear();
541 rec_track_hit_x.clear();
542 rec_track_hit_y.clear();
546 rec_dimuon_id.clear(); rec_dimuon_true_id.clear(); rec_dimuon_track_id_pos.clear(); rec_dimuon_track_id_neg.clear();
547 rec_dimuon_x.clear(); rec_dimuon_y.clear(); rec_dimuon_z.clear();
548 rec_dimuon_px_pos.clear(); rec_dimuon_py_pos.clear(); rec_dimuon_pz_pos.clear();
549 rec_dimuon_px_neg.clear(); rec_dimuon_py_neg.clear(); rec_dimuon_pz_neg.clear();
550 rec_dimuon_px_pos_tgt.clear(); rec_dimuon_py_pos_tgt.clear(); rec_dimuon_pz_pos_tgt.clear();
551 rec_dimuon_px_neg_tgt.clear(); rec_dimuon_py_neg_tgt.clear(); rec_dimuon_pz_neg_tgt.clear();
552 rec_dimuon_px_pos_dump.clear(); rec_dimuon_py_pos_dump.clear(); rec_dimuon_pz_pos_dump.clear();
553 rec_dimuon_px_neg_dump.clear(); rec_dimuon_py_neg_dump.clear(); rec_dimuon_pz_neg_dump.clear();
559 return ( (sourceFlag & 0x3) << 5 ) |
563 return (encoded >> 5) & 0x3;
566 return encoded & 0x1F;
570 if (!m_hit_vec)
return {-1, -1};
572 for (
const auto* hit : *m_hit_vec) {
573 if (hit->get_hit_id() == hit_id) {
static int DecodeProcessID(unsigned int encoded)
unsigned int EncodeProcess(int processID, int sourceFlag)
int process_event(PHCompositeNode *startNode)
int InitRun(PHCompositeNode *startNode)
int End(PHCompositeNode *startNode)
Called at the end of all processing.
std::pair< int, int > GetDetElemIDFromHitID(int hit_id) const
DimuAnaRUS(const std::string &name="DimuAnaRUS")
UtilTrigger::TrigRoadset m_rs
void ResetRecoDimuBranches()
static int DecodeSourceFlag(unsigned int encoded)
int Init(PHCompositeNode *startNode)
User interface class about the geometry of detector planes.
static GeomSvc * instance()
singlton instance
double getDetectorZ0(const std::string detectorName) const
std::string getDetectorName(const int &detectorID) const
virtual ConstIter begin() const =0
virtual ConstIter end() const =0
virtual int get_run_id() const =0
Return the run ID.
virtual int get_qie_rf_intensity(const short i) const =0
Return the i-th QIE RF intensity, where i=-16...+16.
virtual bool get_trigger(const SQEvent::TriggerMask i) const =0
Return the trigger bit (fired or not) of the selected trigger channel.
virtual int get_qie_turn_id() const =0
Return the QIE turn ID.
virtual int get_qie_rf_id() const =0
Return the QIE RF ID.
virtual int get_spill_id() const =0
Return the spill ID.
virtual int get_event_id() const =0
Return the event ID, which is unique per run.
virtual const SQHit * at(const size_t idkey) const =0
virtual size_t size() const =0
An SQ interface class to hold one detector hit.
virtual float get_drift_distance() const
Return the drift distance of this hit. Probably the value is not properly set at present....
virtual short get_element_id() const
Return the element ID of this hit.
virtual int get_hit_id() const
Return the ID of this hit.
virtual float get_tdc_time() const
Return the TDC time (nsec) of this hit.
virtual short get_detector_id() const
Return the detector ID of this hit.
virtual int get_track_id() const
Return the track ID associated with this hit. Probably the value is not properly set at present.
An SQ interface class to hold the run-level info.
virtual int get_v1495_id(const int chan) const
Return the ID of the chan-th V1495 boards.
virtual ConstIter begin() const =0
virtual const SQTrack * at(const size_t id) const =0
virtual ConstIter end() const =0
virtual size_t size() const =0
An SQ interface class to hold one true or reconstructed track.
virtual int get_track_id() const =0
Return the track ID, which is unique per event(?).
virtual TVector3 get_pos_vtx() const =0
Return the track position at vertex.
virtual int get_charge() const =0
Return the charge, i.e. +1 or -1.
virtual TLorentzVector get_mom_vtx() const =0
Return the track momentum at vertex.
virtual TLorentzVector get_mom_st1() const =0
Return the track momentum at Station 1.
virtual TVector3 get_pos_st3() const =0
Return the track position at Station 3.
virtual TVector3 get_pos_st1() const =0
Return the track position at Station 1.
virtual TLorentzVector get_mom_st3() const =0
Return the track momentum at Station 3.
virtual int get_rec_dimuon_id() const
Return the dimuon ID of associated reconstructed dimuon. Valid only if this object holds truth dimuon...
virtual int get_dimuon_id() const
SQDimuon virtual functions.
void calcVariables(int choice=0)
Calculate the kinematic vairables, 0 = vertex, 1 = target, 2 = dump.
TLorentzVector p_neg_target
virtual TVector3 get_pos() const
Return the dimuon position at vertex.
TLorentzVector p_pos_target
Track momentum projections at different location.
virtual int get_track_id_neg() const
Return the track ID of the negative track.
virtual int get_track_id_pos() const
Return the track ID of the positive track.
TLorentzVector p_pos_dump
virtual TLorentzVector get_mom_neg() const
Return the momentum of the negative track at vertex.
TLorentzVector p_neg_dump
virtual TLorentzVector get_mom_pos() const
Return the momentum of the positive track at vertex.
virtual TVector3 get_pos_st3() const
Return the track position at Station 3.
Double_t getChisqTarget()
virtual TLorentzVector get_mom_st3() const
Return the track momentum at Station 3.
virtual int get_charge() const
Return the charge, i.e. +1 or -1.
virtual TLorentzVector get_mom_target() const
void getExpPositionFast(Double_t z, Double_t &x, Double_t &y, Int_t iNode=-1)
virtual TVector3 get_pos_st1() const
Return the track position at Station 1.
virtual int get_hit_id(const int i) const
virtual double get_chisq_upstream() const
virtual TLorentzVector get_mom_st1() const
Return the track momentum at Station 1.
virtual TVector3 get_pos_dump() const
virtual TLorentzVector get_mom_dump() const
virtual int get_num_hits() const
Return the number of hits associated to this track.
virtual TVector3 get_pos_target() const
virtual double get_chisq_dump() const
virtual TLorentzVector get_mom_vtx() const
Return the track momentum at vertex.
virtual double get_chisq() const
virtual TVector3 get_pos_vtx() const
Return the track position at vertex.
int LoadConfig(const std::string dir)
std::string str(const int level=0) const