star-travex
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
vtxreco.cxx
Go to the documentation of this file.
1 #include <algorithm>
2 #include <cfloat>
3 #include <iostream>
4 #include <string>
5 
6 #include "TChain.h"
7 #include "TClonesArray.h"
8 #include "TFile.h"
9 #include "TString.h"
10 
11 #include "St_db_Maker/St_db_Maker.h"
12 #include "StEmcRawMaker/StBemcTables.h"
13 #include "StMuDSTMaker/COMMON/StMuDst.h"
14 #include "StMuDSTMaker/COMMON/StMuDstMaker.h"
15 #include "StMuDSTMaker/COMMON/StMuEvent.h"
16 
17 #include "StGenericVertexMaker/StGenericVertexFinder.h"
18 #include "StGenericVertexMaker/StiPPVertex/StPPVertexFinder.h"
19 
20 #include "travex/ProgramOptions.h"
21 
22 
23 bool switched_file(const StMuDstMaker& maker);
24 void process_muDst(tvx::ProgramOptions& prgOpts);
25 
26 
27 
28 int main(int argc, char **argv)
29 {
30  tvx::ProgramOptions prgOpts(argc, argv);
31 
32  prgOpts.ProcessOptions();
33  prgOpts.Print();
34 
35  process_muDst(prgOpts);
36 
37  return EXIT_SUCCESS;
38 }
39 
40 
41 
42 void process_muDst(tvx::ProgramOptions& prgOpts)
43 {
44  StMuDstMaker *muDstMaker = new StMuDstMaker(0, 0, "", prgOpts.PathToInputFile().c_str(), "st:MuDst.root", 1e9); // set up maker in read mode
45  // 0, 0 this mean read mode
46  // dir read all files in this directory
47  // file bla.lis real all file in this list, if (file!="") dir is ignored
48  // filter apply filter to filenames, multiple filters are separated by ':'
49  // 10 maximum number of file to read
50 
51  // Specify (active) branches to read but first disable all branches
52  muDstMaker->SetStatus("*", 0);
53 
54  std::vector<std::string> activeBranchNames = {
55  "MuEvent",
56  "GlobalTracks",
57  "CovGlobTrack",
58  "EmcTow",
59  "BTofHit",
60  "BTofHeader",
61  "StStMuMcVertex",
62  "StStMuMcTrack"
63  };
64 
65  // Enable selected branches
66  for (const auto& branchName : activeBranchNames)
67  muDstMaker->SetStatus(branchName.c_str(), 1);
68 
69  TChain *muDstChain = muDstMaker->chain();
70 
71  unsigned int nentries = muDstChain->GetEntries();
72  unsigned int nEventsUser = prgOpts.GetMaxEventsUser();
73  unsigned int nEventsToRead = nEventsUser > 0 ? std::min(nEventsUser, nentries) : nentries;
74 
75  std::cout << nentries << " events in chain, " << nEventsToRead << " will be read." << std::endl;
76 
77  // Output
78  // Create new branch
79  TClonesArray *verticesRefitted = new TClonesArray("StMuPrimaryVertex", 1000);
80 
81  TFile* outFile = nullptr;
82  TTree* muDstTreeOut = nullptr;
83  TBranch* new_branch = nullptr;
84 
85  TString new_name = TString("out_all.MuDst.root");
86  outFile = new TFile(new_name, "RECREATE");
87  //muDstTreeOut = muDstMaker->chain()->GetTree()->CloneTree(0);
88  muDstTreeOut = muDstMaker->chain()->CloneTree(0);
89  new_branch = muDstTreeOut->Branch("PrimaryVertices", &verticesRefitted, 65536, 99);
90 
92  StGenericVertexFinder* vertexFinder = new StPPVertexFinder();//VertexFit_t::Beamline1D);
93  //StGenericVertexFinder* vertexFinder = new StPPVertexFinder(VertexFit_t::Beamline3D);
94 
95 
96  St_db_Maker* st_db_maker = new St_db_Maker("db", "StarDb", "MySQL:StarDb", "$STAR/StarDb");
97  st_db_maker->SetMaxEntryTime(20140222, 0);
98  //st_db_maker->SetMaxEntryTime(20120102, 0);
99  st_db_maker->Init();
100 
101  //StBemcTables* bemcTables = new StBemcTables();
102 
103  // Keep track of the number of events with 0 reconstructed verticies
104  int nEventsNoRecoVertex = 0;
105  int currRunNumber = 0;
106  int file_id = 0;
107 
108  // Main loop over events
109  for (unsigned int iEvent = 0; iEvent < nEventsToRead; iEvent++)
110  {
111  if ( muDstMaker->Make() ) break;
112 
113  // Create new output file
114  if ( switched_file(*muDstMaker) )
115  {
116  // if (muDstTreeOut) {
117  // muDstTreeOut->Write();
118  // outFile->Close();
119  // delete outFile;
120  // file_id++;
121  // }
122  //
123  // TString new_name = TString("out_");
124  // new_name += file_id;
125  // new_name += ".MuDst.root";
126  // outFile = new TFile(new_name, "RECREATE");
127  // muDstTreeOut = muDstMaker->chain()->GetTree()->CloneTree();
128  // new_branch = muDstTreeOut->Branch("PrimaryVertices", &verticesRefitted, 65536, 99);
129  }
130 
131  // Access all event data
132  StMuDst *muDst = muDstMaker->muDst();
133 
134  // Access event header-wise information
135  StMuEvent *muEvent = muDst->event();
136 
137  // Perform new run initialization such as database access and info retrieval
138  if (currRunNumber != muEvent->runNumber())
139  {
140  currRunNumber = muEvent->runNumber();
141 
142  st_db_maker->InitRun(currRunNumber);
143  vertexFinder->InitRun(currRunNumber);//, st_db_maker);
144  }
145 
146  //vertexFinder->Fit(*muDst);
147  //vertexFinder->result(*verticesRefitted); // container refilled
148 
149  muDstTreeOut->Fill();
150 
151  vertexFinder->Clear();
152  }
153 
154  //if (muDstTreeOut) {
155  muDstTreeOut->Write();
156  outFile->Close();
157  delete outFile;
158  //}
159 
160  std::cout << "Number of events: " << nEventsToRead
161  << ", with zero reconstructed verticies: " << nEventsNoRecoVertex << std::endl;
162 }
163 
164 
165 bool switched_file(const StMuDstMaker& maker)
166 {
167  static std::string prev_file_name("");
168  static std::string curr_file_name("");
169 
170  curr_file_name = maker.GetFileName();
171 
172  if (curr_file_name != prev_file_name) {
173  std::cout << "Processing new file: " << curr_file_name << std::endl;
174  prev_file_name = curr_file_name;
175 
176  return true;
177  }
178 
179  return false;
180 }
void process_muDst(tvx::ProgramOptions &prgOpts)
Definition: vtxreco.cxx:42
bool switched_file(const StMuDstMaker &maker)
Definition: vtxreco.cxx:165
int main(int argc, char **argv)
Definition: vtxreco.cxx:28