11 #include <ktracker/SRawEvent.h>
12 #include <ktracker/SRecEvent.h>
14 #include <GenFit/FieldManager.h>
15 #include <phfield/PHFieldConfig.h>
16 #include <phfield/PHFieldConfig_v3.h>
17 #include <phfield/PHFieldUtility.h>
45 if (m_raw)
delete m_raw;
46 if (m_rec)
delete m_rec;
65 rc->
set_CharFlag(
"AlignmentMille",
"$E1039_RESOURCE/alignment/run0/align_mille_v10_a.txt");
81 if (m_dir_out !=
".") gSystem->mkdir(m_dir_out.c_str(),
true);
82 m_ofs.open((m_dir_out +
"/output.txt").c_str());
83 m_file_out =
new TFile((m_dir_out +
"/output.root").c_str(),
"RECREATE");
92 ana_tree =
new TTree(
"ana_tree",
"tree to store analysis variables");
115 cout<<
"\n\n================= Collecting track and event info starts ===================" <<endl;
119 start = std::clock();
123 for (
auto it = list_in.begin(); it != list_in.end(); it++) {
124 cout <<
"Input = " << *it << endl;
125 const string fn_raw = *it;
126 const string fn_rec = *it;
128 unsigned int n_evt_rec = 0;
130 file_rec =
new TFile(fn_rec.c_str());
132 cout <<
"Cannot get the DST tree. Continue." << endl;
137 tree_rec = (TTree*)file_rec->Get(
"T");
139 cout <<
"Cannot find the rec data tree. Continue." << endl;
149 tree_rec->SetBranchAddress(
"DST.SQEvent", &sq_evt);
150 tree_rec->SetBranchAddress(
"DST.SQRecTrackVector", &sq_trk_vec);
152 tree_rec->SetBranchAddress(
"DST.SQHitVector", &sq_hitvec);
153 n_evt_rec = tree_rec->GetEntries();
155 cout <<
"N of events: all = " << n_evt_rec <<
", to be analyzed = " << n_evt_rec << endl;
162 for (std::size_t i_evt = 0; i_evt < n_evt_rec; i_evt++) {
164 if ((i_evt+1) % 10000 == 0) cout << i_evt+1 << endl;
165 else if ((i_evt+1) % 1000 == 0) cout <<
" . " << flush;
167 tree_rec->GetEntry(i_evt);
220 for (
auto it = sq_trk_vec->
begin(); it != sq_trk_vec->
end(); it++) {
242 std::cout<<std::endl;
243 if (m_use_rec) file_rec->Close();
244 std::cout<<
"Current total events in the run = " <<events_tot<<std::endl;
248 duration = ( std::clock() - start ) / (
double) CLOCKS_PER_SEC;
250 std::cout<<
"\n================Collecting track and envent info Ended, cpu time taken: ==="<< duration <<endl;
284 cout<<
"\n\n================= Sorting starts ===================" <<endl;
288 start = std::clock();
294 Int_t nentries = (Int_t)tree_to_sort->GetEntries();
296 tree_to_sort->Draw(
"occuD1",
"",
"goff");
298 Int_t *index =
new Int_t[nentries];
301 TMath::Sort(nentries,tree_to_sort->GetV1(),index);
304 cout<<
" No. of enteries to be sorted: "<<nentries<<endl;
305 for (Int_t i=0;i<nentries;i++) {
306 tree_to_sort->GetEntry(index[i]);
307 tree_to_sort->LoadBaskets(2000000000);
310 tree_to_sort->DropBaskets();
313 tree_to_sort->Delete();
317 duration = ( std::clock() - start ) / (
double) CLOCKS_PER_SEC;
318 std::cout<<
"\n================ Sorting Ended, cpu time taken: ==="<< duration <<endl;
330 cout<<
"\n\n====================== Mixing Begins========================"<<endl;
333 start = std::clock();
337 mixed_tree =
new TTree(
"mixed_tree",
"tree from mixing");
368 std::vector<SRecTrack>* pos_tracks_ = 0;
369 std::vector<SRecTrack>* neg_tracks_ = 0;
371 int occuD1_,occuD2_, occuD3p_, occuD3m_,TargetPos_, fpga1_, event_ID_, spill_ID_;
372 occuD1_ = occuD2_ = occuD3p_ = occuD3m_ = TargetPos_ = event_ID_ = spill_ID_ = 0;
373 float rfp00c_, pot_p00_, liveP_;
374 rfp00c_ = pot_p00_ = liveP_ = 0.0;
377 sorted_tree1->SetBranchAddress(
"pos_tracks", &pos_tracks_);
378 sorted_tree1->SetBranchAddress(
"neg_tracks", &neg_tracks_);
379 sorted_tree1->SetBranchAddress(
"fpga1", &fpga1_);
380 sorted_tree1->SetBranchAddress(
"occuD1", &occuD1_);
381 sorted_tree1->SetBranchAddress(
"occuD2", &occuD2_);
382 sorted_tree1->SetBranchAddress(
"occuD3p", &occuD3p_);
383 sorted_tree1->SetBranchAddress(
"occuD3m", &occuD3m_);
384 sorted_tree1->SetBranchAddress(
"TargetPos", &TargetPos_);
385 sorted_tree1->SetBranchAddress(
"rfp00c", &rfp00c_);
386 sorted_tree1->SetBranchAddress(
"pot_p00", &pot_p00_);
387 sorted_tree1->SetBranchAddress(
"liveP", &liveP_);
388 sorted_tree1->SetBranchAddress(
"spill_ID", &spill_ID_);
389 sorted_tree1->SetBranchAddress(
"event_ID", &event_ID_);
391 cout<<
"No. of entries from sorted tree: "<<sorted_tree1->GetEntries()<<endl;
393 for(
int i_evt=0;i_evt<sorted_tree1->GetEntries();i_evt++)
399 sorted_tree1->GetEntry(i_evt);
412 for (std::size_t j=0; j<pos_tracks_->size(); ++j)
420 sorted_tree1->GetEntry(i_evt+1);
433 for (std::size_t k=0; k<neg_tracks_->size(); ++k)
467 duration = ( std::clock() - start ) / (
double) CLOCKS_PER_SEC;
468 std::cout<<
"\n================ Mixing Ended, CPU time taken in sec: ==="<< duration<<endl;
478 cout<<
"\n\n======================== Vertexing Starts ================ "<<endl;
479 cout<<
"Mixflag: "<<mix_flag<<endl;
482 start = std::clock();
484 std::cout<<
"No. of events in the tree "<<input_tree->GetEntries()<<std::endl;
492 save_sorted =
new TTree(
"save_sorted",
"the sorted tree after vertexing");
509 save_mix =
new TTree(
"save_mix",
"the mixed tree after vertexing");
539 vtxfit->
set_geom_file_name((
string)gSystem->Getenv(
"E1039_RESOURCE") +
"/geometry/geom_run005433.root");
549 std::vector<SRecTrack> * pos_tracks_input = 0;
550 std::vector<SRecTrack> * neg_tracks_input = 0;
552 int plus_fpga1_, plus_occuD1_,plus_occuD2_,plus_occuD3p_, plus_occuD3m_, plus_TargetPos_;
553 plus_occuD1_ =plus_occuD2_ = plus_occuD3p_ = plus_occuD3m_ = plus_TargetPos_ = 0;
554 float plus_rfp00c_, plus_pot_p00_, plus_liveP_ ;
555 plus_rfp00c_ = plus_pot_p00_ = plus_liveP_ = 0.0;
557 int minus_fpga1_, minus_occuD1_, minus_occuD2_, minus_occuD3p_,minus_occuD3m_,minus_TargetPos_;
558 minus_occuD1_ = minus_occuD2_ = minus_occuD3p_ = minus_occuD3m_ = minus_TargetPos_ = 0;
559 float minus_rfp00c_, minus_pot_p00_, minus_liveP_;
560 minus_rfp00c_ = minus_pot_p00_ = minus_liveP_ = 0.;
562 int fpga1_, occuD1_, occuD2_, occuD3p_, occuD3m_, TargetPos_;
563 int event_ID_, spill_ID_, plus_event_ID_, plus_spill_ID_,minus_event_ID_, minus_spill_ID_;
564 occuD1_ = occuD2_ = occuD3p_ = occuD3m_ =TargetPos_ = 0;
565 event_ID_=spill_ID_=plus_event_ID_ = plus_spill_ID_ = minus_event_ID_ = minus_spill_ID_= 0;
567 float rfp00c_, pot_p00_ , liveP_;
568 rfp00c_ = pot_p00_ = liveP_ = 0;
570 input_tree->SetBranchAddress(
"pos_tracks", &pos_tracks_input);
571 input_tree->SetBranchAddress(
"neg_tracks", &neg_tracks_input);
575 input_tree->SetBranchAddress(
"plus_fpga1", &plus_fpga1_);
576 input_tree->SetBranchAddress(
"plus_occuD1", &plus_occuD1_);
577 input_tree->SetBranchAddress(
"plus_occuD2", &plus_occuD2_);
578 input_tree->SetBranchAddress(
"plus_occuD3m", &plus_occuD3m_);
579 input_tree->SetBranchAddress(
"plus_occuD3p", &plus_occuD3p_);
580 input_tree->SetBranchAddress(
"plus_rfp00c", &plus_rfp00c_);
581 input_tree->SetBranchAddress(
"plus_pot_p00", &plus_pot_p00_);
582 input_tree->SetBranchAddress(
"plus_liveP", &plus_liveP_);
583 input_tree->SetBranchAddress(
"plus_TargetPos", &plus_TargetPos_);
584 input_tree->SetBranchAddress(
"plus_spill_ID", &plus_spill_ID_);
585 input_tree->SetBranchAddress(
"plus_event_ID", &plus_event_ID_);
587 input_tree->SetBranchAddress(
"minus_fpga1", &minus_fpga1_);
588 input_tree->SetBranchAddress(
"minus_occuD1", &minus_occuD1_);
589 input_tree->SetBranchAddress(
"minus_occuD2", &minus_occuD2_);
590 input_tree->SetBranchAddress(
"minus_occuD3m", &minus_occuD3m_);
591 input_tree->SetBranchAddress(
"minus_occuD3p", &minus_occuD3p_);
592 input_tree->SetBranchAddress(
"minus_rfp00c", &minus_rfp00c_);
593 input_tree->SetBranchAddress(
"minus_pot_p00", &minus_pot_p00_);
594 input_tree->SetBranchAddress(
"minus_liveP", &minus_liveP_);
595 input_tree->SetBranchAddress(
"minus_TargetPos", &minus_TargetPos_);
596 input_tree->SetBranchAddress(
"minus_spill_ID", &minus_spill_ID_);
597 input_tree->SetBranchAddress(
"minus_event_ID", &minus_event_ID_);
601 input_tree->SetBranchAddress(
"fpga1", &fpga1_);
602 input_tree->SetBranchAddress(
"occuD1", &occuD1_);
603 input_tree->SetBranchAddress(
"occuD2", &occuD2_);
604 input_tree->SetBranchAddress(
"occuD3p", &occuD3p_);
605 input_tree->SetBranchAddress(
"occuD3m", &occuD3m_);
606 input_tree->SetBranchAddress(
"TargetPos", &TargetPos_);
607 input_tree->SetBranchAddress(
"rfp00c", &rfp00c_);
608 input_tree->SetBranchAddress(
"pot_p00", &pot_p00_);
609 input_tree->SetBranchAddress(
"liveP", &liveP_);
610 input_tree->SetBranchAddress(
"spill_ID", &spill_ID_);
611 input_tree->SetBranchAddress(
"event_ID", &event_ID_);
614 for(
int i_evt=0;i_evt<input_tree->GetEntries();i_evt++)
616 input_tree->GetEntry(i_evt);
693 if(i_evt%1000==0) cout<<
"No. of events analyzed: "<<i_evt<<endl;
695 std::vector<SRecTrack> pos_tracks_hold, neg_tracks_hold ;
697 for (std::size_t j=0; j<pos_tracks_input->size(); ++j)
699 SRecTrack* trk_p = &(pos_tracks_input->at(j));
700 pos_tracks_hold.push_back(*trk_p);
705 for (std::size_t k=0; k<neg_tracks_input->size(); ++k)
707 SRecTrack* trk_n = &(neg_tracks_input->at(k));
708 neg_tracks_hold.push_back(*trk_n);
712 for(std::size_t j=0; j<pos_tracks_hold.size(); ++j)
714 for (std::size_t k=0; k<neg_tracks_hold.size(); ++k)
719 if((pos_tracks_hold.at(j).getTriggerRoad() > 0 && neg_tracks_hold.at(k).getTriggerRoad() > 0) || (pos_tracks_hold.at(j).getTriggerRoad() < 0 && neg_tracks_hold.at(k).getTriggerRoad() < 0))
continue;
723 SRecTrack* track1 = &pos_tracks_hold.at(j);
724 SRecTrack* track2 = &neg_tracks_hold.at(k);
728 if (track1->
getStateVector(0).GetNcols()==0) std::cout<<
"track1 Ncols ==0 "<<std::endl;
729 if (track2->
getStateVector(0).GetNcols()==0) std::cout<<
"track2 Ncols ==0 "<<std::endl;
732 recDimuon.
set_track_id_neg(
static_cast<int>(k) +
static_cast<int>(pos_tracks_hold.size()));
743 pos_tracks_hold.clear();
744 neg_tracks_hold.clear();
747 duration = ( std::clock() - start ) / (
double) CLOCKS_PER_SEC;
748 std::cout<<
"\n================ Vertexing Ended, CPU time taken in sec: ==="<< duration<<endl;
827 cout<<
"creating tree to store embedded event"<<endl;
828 TTree* mixed_embed_tree =
new TTree(
"tree",
"MC signals embeded on mixed tree");
832 std::vector<double> dim_M_mixed, dim_M_mc;
833 mixed_embed_tree->Branch(
"pos_tracks",&
pos_tracks);
834 mixed_embed_tree->Branch(
"neg_tracks",&
neg_tracks);
836 mixed_embed_tree->Branch(
"dim_M_mc", &dim_M_mc);
840 cout<<
"Reading MC tree: "<<file_mcsignal<<endl;
843 std::vector<SRecTrack> * pos_tracks_mc = 0;
844 std::vector<SRecTrack> * neg_tracks_mc = 0;
845 std::vector<double> * dim_M_mc_ = 0;
847 TFile* mc_file =
new TFile (file_mcsignal,
"read");
848 TTree* mc_tree = (TTree*)mc_file->Get(
"mc_tree");
851 mc_tree->SetBranchAddress(
"pos_tracks", &pos_tracks_mc);
852 mc_tree->SetBranchAddress(
"neg_tracks", &neg_tracks_mc);
853 mc_tree->SetBranchAddress(
"dim_M_mc", &dim_M_mc_);
857 std::vector<SRecTrack> * pos_tracks_ = 0;
858 std::vector<SRecTrack> * neg_tracks_ = 0;
859 cout<<
"Reading Mixed tree: "<<file_mixed<<endl;
861 TFile* _mixedFile =
new TFile (file_mixed,
"read");
862 TTree* T = (TTree*)_mixedFile->Get(
"tree");
864 T->SetBranchAddress(
"pos_tracks", &pos_tracks_);
865 T->SetBranchAddress(
"neg_tracks", &neg_tracks_);
870 cout<<
"Total entries in the mixed tree: "<<T->GetEntries()<<endl;
872 for(
int i_evt=0;i_evt<T->GetEntries();i_evt++)
882 for (std::size_t j=0; j<pos_tracks_->size(); ++j)
890 for (std::size_t k=0; k<neg_tracks_->size(); ++k)
900 mc_tree->GetEntry(i_mc_evt);
903 dim_M_mc.push_back(dim_M_mc_->at(0));
910 mixed_embed_tree ->Fill();
float liveP
proton number corrsponding to RF+00 (pedestal corrected)
std::vector< SRecTrack > pos_tracks_mix
AnaSortMixVertex(const std::string name="ana_mixvertex")
virtual void Init(const int run_id)
Function to initialize all variables for the 1st analysis step.
virtual void DoVertex(TTree *inputtree, const int run_id, bool mix)
std::vector< SRecTrack > neg_tracks_mix
SQGenFit::GFField * gfield_v2
virtual void MixTracks(TTree *sorted_tree)
Mixing tracks from sorted_tree.
std::vector< SRecTrack > pos_tracks
virtual ~AnaSortMixVertex()
virtual void Analyze(const int run_id, const std::vector< std::string > list_in)
float rfp00c
RF+00 corrected for the pedestal.
std::vector< SRecTrack > neg_tracks
virtual void SortTree(TTree *tree_to_sort)
virtual void EmbedMCSignal(char *file_mixed, char *file_mcsignal)
MC preperation for embedding.
virtual void set_IntFlag(const std::string &name, const int flag)
virtual void set_BoolFlag(const std::string &name, const bool flag)
virtual void set_DoubleFlag(const std::string &name, const double flag)
An SQ interface class to hold one event header.
An SQ interface class to hold a list of SQHit objects.
An SQ interface class to hold a list of SQTrack objects.
virtual ConstIter begin() const =0
virtual ConstIter end() const =0
void set_legacy_rec_container(const bool enable=true)
int InitGeom(PHCompositeNode *topNode)
void set_geom_file_name(const std::string &geomFileName)
int InitField(PHCompositeNode *topNode)
bool processOneDimuon(SRecTrack *track1, SRecTrack *track2, SRecDimuon &dimuon)
bool isTriggeredBy(Int_t trigger)
void calcVariables(int choice=0)
Calculate the kinematic vairables, 0 = vertex, 1 = target, 2 = dump.
virtual void set_track_id_pos(const int a)
virtual void set_track_id_neg(const int a)
void insertTrack(SRecTrack trk)
Insert tracks.
void insertDimuon(SRecDimuon dimuon)
Insert dimuon.
void clear()
Clear everything.
Int_t getCharge() const
Gets.
TMatrixD getStateVector(Int_t i)
Bool_t isKalmanFitted()
Fit status.
static recoConsts * instance()
virtual void set_CharFlag(const std::string &name, const std::string &flag)
overide the virtual function to expand the environmental variables
double PoTPerQIE(const unsigned int spill_id)
Return PoT/QIEsum.
double PoTLive(const unsigned int spill_id)
Return the live number of PoT.
bool SetEvent(SRawEvent *sraw, const SQEvent *evt, const bool do_assert=false)
bool SetHit(SRawEvent *sraw, const SQHitVector *hit_vec, std::map< int, size_t > *hitID_idx=0, const bool do_assert=false)