1 #include "MiniTreeConverter.hxx" 2 #include "BasicUtils.hxx" 3 #include "VersioningUtils.hxx" 4 #include "Parameters.hxx" 5 #include "GeometryManager.hxx" 6 #include "ND280AnalysisUtils.hxx" 12 MiniTreeConverter::MiniTreeConverter(
bool readRooTrackerVtx):
InputConverter(
"MiniTree"){
20 minitree = GetChain(_treeName);
21 NRooTrackerVTX = NULL;
22 GRooTrackerVTX = NULL;
33 _readRooTrackerVtx = readRooTrackerVtx;
41 if (!fChain)
return false;
44 if (!gDirectory->FindObjectAny(_treeName.c_str()))
return false;
47 fChain->SetMakeClass(1);
53 MiniTreeConverter::~MiniTreeConverter(){
58 if (minitree)
delete minitree->GetCurrentFile();
59 if (GRooTrackerVTX)
delete GRooTrackerVTX->GetCurrentFile();
60 if (NRooTrackerVTX)
delete NRooTrackerVTX->GetCurrentFile();
61 if (minitree)
delete minitree;
62 if (GRooTrackerVTX)
delete GRooTrackerVTX;
63 if (NRooTrackerVTX)
delete NRooTrackerVTX;
70 std::cout <<
"MiniTreeConverter::AddFileToTChain(). Adding file: " << inputString << std::endl;
73 TChain dummy(_treeName.c_str());
74 dummy.AddFile(inputString.c_str());
76 if (dummy.GetEntries() == 0){
77 std::cout <<
" ----> This file does not contain any entries. IGNORED !!!!" << std::endl;
82 TFile *f = TFile::Open(inputString.c_str());
88 if (!gDirectory->FindObjectAny(
"header")){
89 std::cout <<
" ----> This file does not contain a header tree. IGNORED !!!!" << std::endl;
93 TChain chain(
"header");
94 chain.AddFile(inputString.c_str());
96 chain.SetBranchAddress(
"POTInfo", &header);
107 if( gDirectory->FindObjectAny(
"NRooTrackerVtx")) {
109 AddChain(
"NRooTrackerVtx");
110 NRooTrackerVTX = GetChain(
"NRooTrackerVtx");
111 NRooTrackerVTX->SetBranchAddress(
"RunID", &RunID);
112 NRooTrackerVTX->SetBranchAddress(
"SubrunID", &SubrunID);
113 NRooTrackerVTX->SetBranchAddress(
"EventID", &EventID);
114 NVtx =
new TClonesArray(
"ND::NRooTrackerVtx",100);
115 NRooTrackerVTX->SetBranchAddress(
"NVtx",&NNVtx);
116 NRooTrackerVTX->SetBranchAddress(
"Vtx",&NVtx);
117 std::cout <<
"MiniTreeConverter::AddFileToTChain(). NEUT RooTrackerVtx tree found !!" << std::endl;
119 else if(gDirectory->FindObjectAny(
"GRooTrackerVtx")) {
121 AddChain(
"GRooTrackerVtx");
122 GRooTrackerVTX = GetChain(
"GRooTrackerVtx");
123 GRooTrackerVTX->SetBranchAddress(
"RunID", &RunID);
124 GRooTrackerVTX->SetBranchAddress(
"SubrunID", &SubrunID);
125 GRooTrackerVTX->SetBranchAddress(
"EventID", &EventID);
126 GVtx =
new TClonesArray(
"ND::GRooTrackerVtx",100);
127 GRooTrackerVTX->SetBranchAddress(
"NVtx",&NGVtx);
128 GRooTrackerVTX->SetBranchAddress(
"Vtx",&GVtx);
129 std::cout <<
"MiniTreeConverter::AddFileToTChain(). GENIE RooTrackerVtx tree found !!" << std::endl;
138 if( fGenie && GRooTrackerVTX) {
139 GRooTrackerVTX->AddFile(inputString.c_str());
141 else if( fNeut && NRooTrackerVTX) {
142 NRooTrackerVTX->AddFile(inputString.c_str());
146 minitree->AddFile(inputString.c_str());
148 bool bySpillPOT = (versionUtils::prod6_POT || !isMC);
149 return header().AddHeader(inputString,bySpillPOT);
161 if (RawSpill && _currentBunch < (Int_t)(RawSpill->
Bunches.size()-1)){
165 if (RawSpill)
delete RawSpill;
166 entry_temp = GetSpill(entry,RawSpillC);
167 if (entry_temp<=0 || !RawSpill || RawSpill->Bunches.size()==0)
return 0;
172 event = MakeEvent(*RawSpill,*static_cast<AnaBunchB*>((RawSpill->
Bunches[_currentBunch])));
182 if (!fChain)
return 0;
191 fChain->SetBranchAddress(
"Spill", &spill);
194 std::string filename =minitree->GetFile()->GetName();
195 if( filename != _currentfilename ) {
196 std::cout <<
" Running on file: " << filename << std::endl;
197 _currentfilename = filename;
201 Int_t entry_temp = minitree->GetEntry(entry);
204 if (!anaUtils::CheckSkimmedEvent(_spill->EventInfo->Run,_spill->EventInfo->SubRun,_spill->EventInfo->Event)){
209 if (_spill->EventInfo){
210 if (_readRooTrackerVtx){
211 bool sIsMC = _spill->EventInfo->IsMC;
212 Int_t sEvt = _spill->EventInfo->Event;
213 Int_t sSubrun = _spill->EventInfo->SubRun;
214 Int_t sRun = _spill->EventInfo->Run;
217 if (entry_temp>0 && sIsMC && (fGenie || fNeut) && sEvt>=0) {
221 if (NRooTrackerVTX) NRooTrackerVTX->GetEntry(_entry_roo);
222 else if (GRooTrackerVTX) GRooTrackerVTX->GetEntry(_entry_roo);
223 if ((RunID> sRun ) ||
224 (RunID==sRun && SubrunID> sSubrun ) ||
225 (RunID==sRun && SubrunID==sSubrun && EventID>sEvt ))
229 }
while(EventID!=sEvt || RunID!=sRun || SubrunID!=sSubrun);
234 _spill->CopyVectorsIntoArrays();
246 if (_spill->GeomID!=999)
247 ND::hgman().
LoadGeometry(filename,(Int_t)_spill->GeomID,
"geom");
256 anaUtils::IncrementPOTBySpill(*_spill,header());
273 event->Particles = NULL;
274 event->Vertices = NULL;
275 event->TrueParticles = NULL;
276 event->TrueVertices = NULL;
277 event->FgdTimeBins = NULL;
278 event->nParticles = 0;
279 event->nVertices = 0;
280 event->nFgdTimeBins = 0;
281 event->nTrueParticles = 0;
282 event->nTrueVertices = 0;
284 event->DataQuality = NULL;
285 event->isClone =
false;
287 event->nEventBoxes=0;
288 for (UInt_t i=0;i<NMAXEVENTBOXES;i++)
289 event->EventBoxes[i]=NULL;
298 std::map<AnaRecObjectC*, AnaRecObjectC*> clonedRecObject;
299 std::map<AnaTrueObjectC*, AnaTrueObjectC*> clonedTrueObject;
300 std::map<AnaTrueVertexB*, AnaTrueVertexB*> clonedTrueVertex;
304 event->Weight = bunch.
Weight;
305 event->Bunch = bunch.
Bunch;
311 event->nParticles = 0;
312 anaUtils::CreateArray(event->Particles, bunch.
Particles.size());
313 for (UInt_t i=0;i<bunch.
Particles.size();i++){
314 clonedRecObject[bunch.
Particles[i]] =
event->Particles[
event->nParticles] = bunch.
Particles[i]->Clone();
317 if (bunch.
Particles[i]->TrueObject->ID>=0){
318 clonedTrueObject[bunch.
Particles[i]->TrueObject] =
event->Particles[
event->nParticles]->TrueObject = bunch.
Particles[i]->TrueObject->Clone();
322 event->Particles[
event->nParticles]->TrueObject = clonedTrueObject[bunch.
Particles[i]->TrueObject];
324 if (bunch.
Particles[i]->GetTrueParticle()->TrueVertex){
325 if(bunch.
Particles[i]->GetTrueParticle()->TrueVertex->ID>=0){
326 clonedTrueVertex[bunch.
Particles[i]->GetTrueParticle()->TrueVertex] =
event->Particles[
event->nParticles]->GetTrueParticle()->TrueVertex = bunch.
Particles[i]->GetTrueParticle()->TrueVertex->Clone();
327 bunch.
Particles[i]->GetTrueParticle()->TrueVertex->ID*=-1;
330 event->Particles[
event->nParticles]->GetTrueParticle()->TrueVertex = clonedTrueVertex[bunch.
Particles[i]->GetTrueParticle()->TrueVertex];
337 event->nTrueParticles = 0;
338 anaUtils::CreateArray(event->TrueParticles, spill.
TrueParticles.size());
347 clonedTrueVertex[spill.
TrueParticles[i]->TrueVertex] =
event->TrueParticles[
event->nTrueParticles]->TrueVertex = spill.
TrueParticles[i]->TrueVertex->Clone();
351 event->TrueParticles[
event->nTrueParticles]->TrueVertex = clonedTrueVertex[spill.
TrueParticles[i]->TrueVertex];
357 event->nTrueParticles++;
361 event->nTrueVertices = 0;
362 anaUtils::CreateArray(event->TrueVertices, spill.
TrueVertices.size());
365 clonedTrueVertex[spill.
TrueVertices[i]] =
event->TrueVertices[
event->nTrueVertices] = spill.
TrueVertices[i]->Clone();
369 event->TrueVertices[
event->nTrueVertices] = clonedTrueVertex[spill.
TrueVertices[i]];
371 for (Int_t j=0; j<
event->TrueVertices[
event->nTrueVertices]->nTrueParticles;j++){
372 event->TrueVertices[
event->nTrueVertices]->TrueParticles[j] =
static_cast<AnaTrueParticleB*
>(clonedTrueObject[spill.
TrueVertices[i]->TrueParticles[j]]);
374 event->nTrueVertices++;
379 event->nVertices = 0;
380 anaUtils::CreateArray(event->Vertices, bunch.
Vertices.size());
381 for (UInt_t i=0;i<bunch.
Vertices.size();i++){
384 event->Vertices[
event->nVertices]->TrueVertex = clonedTrueVertex[bunch.
Vertices[i]->TrueVertex];
386 for (Int_t j=0;j<bunch.
Vertices[i]->nParticles;j++){
387 event->Vertices[i]->Particles[j] =
static_cast<AnaParticleB*
>(clonedRecObject[ bunch.
Vertices[i]->Particles[j] ]);
394 event->nFgdTimeBins = 0;
395 anaUtils::CreateArray(event->FgdTimeBins, spill.
FgdTimeBins.size());
397 event->FgdTimeBins[
event->nFgdTimeBins] = spill.
FgdTimeBins[i]->Clone();
398 event->nFgdTimeBins++;
419 Int_t entries = entries0;
420 if (entries0==-1) entries=GetEntries();
virtual bool Initialize()
Int_t GetEvent(Long64_t &entry, AnaEventC *&event)
std::vector< AnaTrueVertexB * > TrueVertices
The true MC vertices used in this spill.
std::vector< AnaBunchC * > Bunches
The reconstructed objects, split into timing bunches.
AnaEventInfoB * EventInfo
Run, sunrun, event, time stamp, etc.
std::vector< AnaVertexB * > Vertices
Representation of a true Monte Carlo trajectory/particle.
AnaBeamB * Beam
The beam quality flags for this spill.
std::vector< AnaFgdTimeBinB * > FgdTimeBins
The FGD time bins.
Float_t Weight
The weight to apply to this bunch (nominally 1). An example is the beam flux weight.
std::vector< AnaTrueParticleB * > TrueParticles
The true MC particles used in this spill.
virtual AnaBeamB * Clone()
Clone this object.
Int_t Bunch
The index of this bunch (0-7).
std::vector< AnaParticleB * > Particles
Representation of a reconstructed particle (track or shower).
AnaDataQualityB * DataQuality
The ND280 data quality flags for this spill.
virtual AnaDataQualityB * Clone()
Clone this object.
Int_t GetNEvents(Int_t entries=-1)
Return the total number of events for a given number of entries in the tree.
Int_t GetSpill(Long64_t &entry, AnaSpillC *&spill)
bool AddFileToTChain(const std::string &inputString)
Add the file specified to fChain, and any friend chains that were set up.
void IncrementPOTBySpill()
bool LoadGeometry(const std::string &file="", Int_t geomID=-1, const std::string &geomDir="")
Load the TGeoManager from the input root file. Returns true when the new geometry was loaded...