9 #include "StEvent/StBTofHeader.h"
10 #include "StEvent/StTrackTopologyMap.h"
11 #include "StMuDSTMaker/COMMON/StMuDst.h"
12 #include "StMuDSTMaker/COMMON/StMuDstMaker.h"
13 #include "StMuDSTMaker/COMMON/StMuEvent.h"
14 #include "StMuDSTMaker/COMMON/StMuMcTrack.h"
15 #include "StMuDSTMaker/COMMON/StMuMcVertex.h"
16 #include "StMuDSTMaker/COMMON/StMuPrimaryVertex.h"
17 #include "StMuDSTMaker/COMMON/StMuTrack.h"
18 #include "StSecondaryVertexMaker/DecayVertexFinder.h"
19 #include "StVertexRootIO/TPrimaryVertex.h"
20 #include "StVertexRootIO/TDecayVertexContainers.h"
22 #include "travex/ProgramOptions.h"
27 namespace po = boost::program_options;
41 int main(
int argc,
char **argv)
43 tvx::ProgramOptions prgOpts(argc, argv);
45 prgOpts.ProcessOptions();
52 vertexOutFile.Write();
53 vertexOutFile.Close();
63 TPrimaryVertex *primVtx =
new TPrimaryVertex();
65 TTree *primVertexTree =
new TTree(
"primVertexTree",
"The Primary Vertices");
66 primVertexTree->Branch(
"v.",
"TPrimaryVertex", &primVtx, 64000, 99);
69 TDecayVertexVec *decayVertices =
new TDecayVertexVec();
71 TTree *decayVertexTree =
new TTree(
"decayVertexTree",
"Secondary Decay Vertices");
72 decayVertexTree->Branch(
"v.",
"TDecayVertexVec", &decayVertices, 64000, 99);
74 DecayVertexFinder decayVertexFinder;
76 StMuDstMaker *maker =
new StMuDstMaker(0, 0,
"", outFile.GetPrgOptions().PathToInputFile().c_str(),
"st:MuDst.root", 1e9);
84 maker->SetStatus(
"*", 0);
86 std::vector<std::string> activeBranchNames = {
98 for (
const auto& branchName : activeBranchNames)
99 maker->SetStatus(branchName.c_str(), 1);
101 TChain *tree = maker->chain();
102 unsigned int nentries = tree->GetEntries();
103 unsigned int nEventsUser = outFile.GetPrgOptions().GetMaxEventsUser();
104 unsigned int nevent = nEventsUser > 0 ? std::min(nEventsUser, nentries) : nentries;
105 std::cout << nentries <<
" events in chain, " << nevent <<
" will be read." << std::endl;
106 tree->SetCacheSize(-1);
107 tree->SetCacheLearnEntries(1);
108 tree->SetCacheEntryRange(0, nevent);
112 int nEventsNoRecoVertex = 0;
115 for (
int iEvent = 0; iEvent < nevent; iEvent++)
117 if (maker->Make())
break;
121 StMuDst *muDst = maker->muDst();
122 StMuEvent *muEvent = muDst->event();
125 decayVertexFinder.Find(*muDst, decayVertices->mVertices);
127 TClonesArray *primaryVertices = muDst->primaryVertices();
128 int nPrimaryVertices = primaryVertices->GetEntriesFast();
130 if (nPrimaryVertices == 0) nEventsNoRecoVertex++;
132 TClonesArray *MuMcVertices = muDst->mcArray(0);
133 int nMcVertices = MuMcVertices->GetEntriesFast();
135 int maxMultiplicity = 0;
136 double maxRank = -DBL_MAX;
138 StMuPrimaryVertex *maxRankVertex =
nullptr;
141 for (
int iVertex = 0; iVertex < nPrimaryVertices; iVertex++)
143 StMuPrimaryVertex *recoVertex = (StMuPrimaryVertex *) primaryVertices->UncheckedAt(iVertex);
145 if (!recoVertex)
continue;
148 if (recoVertex->noTracks() > maxMultiplicity) {
149 maxMultiplicity = recoVertex->noTracks();
153 if (recoVertex->ranking() > maxRank) {
154 maxRank = recoVertex->ranking();
155 maxRankVertex = recoVertex;
159 int idTruth = recoVertex->idTruth();
162 if (idTruth != 1)
continue;
164 StMuMcVertex *mcVertex = (idTruth > 0 && idTruth <= nMcVertices) ? (StMuMcVertex *) MuMcVertices->UncheckedAt(idTruth - 1) :
nullptr;
166 float zVpd = (muDst->btofHeader() ? muDst->btofHeader()->vpdVz(): 999.);
167 bool isMaxMult = (recoVertex->noTracks() == maxMultiplicity);
169 primVtx->Set(*recoVertex, mcVertex, isMaxMult, zVpd);
170 primVertexTree->Fill();
177 outFile.
FillHists(*recoVertex, mcVertex);
178 outFile.
FillHists(*recoVertex, decayVertices->mVertices);
184 int idTruth = maxRankVertex->idTruth();
185 StMuMcVertex* mcVertex = (idTruth > 0 && idTruth <= nMcVertices) ?
186 (StMuMcVertex *) MuMcVertices->UncheckedAt(idTruth - 1) :
nullptr;
195 decayVertices->mPrimaryVertex = *primVtx;
197 decayVertexTree->Fill();
202 std::cout <<
"Number of events: " << nevent
203 <<
", with 0 reconstructed verticies: " << nEventsNoRecoVertex << std::endl;
213 stMuDst.setVertexIndex(vertexIndex);
215 TObjArray *primaryTracks = stMuDst.primaryTracks();
220 int nPrimaryTracks = primaryTracks->GetEntriesFast();
222 for (
int i=0; i<nPrimaryTracks; i++)
224 StMuTrack *stTrack =
static_cast<StMuTrack*
>(primaryTracks->UncheckedAt(i));
225 StTrackTopologyMap trackHitMap = stTrack->topologyMap();
227 if ( trackHitMap.hasHitInPxlLayer(1) || trackHitMap.hasHitInPxlLayer(2) || trackHitMap.hasHitInPxlLayer(3) )
238 static std::string prev_file_name(
"");
239 static std::string curr_file_name(
"");
240 static int curr_event_index = 0;
242 curr_file_name = maker.GetFileName();
244 if (curr_file_name != prev_file_name) {
245 std::cout <<
"Processing new file: " << curr_file_name << std::endl;
246 prev_file_name = curr_file_name;
247 curr_event_index = 0;
251 if (curr_event_index < 2) {
252 std::cout <<
"Skipping this event index: " << curr_event_index << std::endl;
263 std::vector<const StMuMcTrack*> mcTracks;
265 if (!mcVertex)
return mcTracks;
267 TClonesArray *muMcTracks = stMuDst.mcArray(1);
268 int nMuMcTracks = muMcTracks->GetEntriesFast();
270 for (
int i = 0; i < nMuMcTracks; i++)
272 StMuMcTrack *mcTrack =
static_cast<StMuMcTrack*
>( muMcTracks->UncheckedAt(i) );
274 if ( !mcTrack || mcTrack->IdVx() != mcVertex->Id() )
continue;
276 mcTracks.push_back(mcTrack);
vtxeval::VectorMcTracks getMcTracksMatchingMcVertex(const StMuDst &stMuDst, const StMuMcVertex *mcVertex)
bool SkipCurrentEvent(const StMuDstMaker &maker)
int main(int argc, char **argv)
void FillHistsMaxRank(const StMuPrimaryVertex &vertex, const StMuMcVertex *mcVertex=nullptr)
bool checkVertexHasPxlHit(int vertexIndex, const StMuDst &stMuDst)
Returns true if at least one PXL hit is on a track pointing to vertex with vertexIndex.
void FillHistsHftTracks(const StMuPrimaryVertex &vertex, const StMuMcVertex *mcVertex=nullptr)
std::vector< const StMuMcTrack * > VectorMcTracks
void process_muDst(VertexRootFile &outFile)
void FillHists(const StMuDst &event)