42 #include <boost/progress.hpp>
47 #include "TClonesArray.h"
48 #include "TObjString.h"
51 #include "reportingUtils.hpp"
52 #include "reportingUtilsRoot.hpp"
57 using namespace boost;
63 TClonesArray* partMomenta[3],
64 const unsigned int index,
65 const bool absoluteDiff,
66 const bool debug =
false)
68 const TVector3* momenta[2] = {((TVector3*)(*(partMomenta[0]))[index]),
69 ((TVector3*)(*(partMomenta[1]))[index])};
72 diff = *(momenta[0]) - *(momenta[1]);
74 diff.SetX((momenta[0]->X() - momenta[1]->X()) / momenta[0]->X());
75 diff.SetY((momenta[0]->Y() - momenta[1]->Y()) / momenta[0]->Y());
76 diff.SetZ((momenta[0]->Z() - momenta[1]->Z()) / momenta[0]->Z());
78 new((*(partMomenta[2]))[index]) TVector3(diff);
81 const TObjString name = *((TObjString*)partNames[index]);
82 printDebug <<
"particle[" << index <<
"]: '" << name.GetString().Data() <<
"', "
83 << *(momenta[0]) <<
" vs. " << *(momenta[1]) <<
", "
84 << ((absoluteDiff) ?
"absolute" :
"relative" ) <<
" difference " << diff << endl;
91 const string& inFileNamePatternB =
"testEvents2.root",
92 const string& outFileName =
"testDiffTree.root",
93 const bool absoluteDiff =
true,
94 const long int maxNmbEvents = -1,
95 const string& inTreeName =
"rootPwaEvtTree",
96 const string& prodKinPartNamesObjName =
"prodKinParticles",
97 const string& prodKinMomentaLeafName =
"prodKinMomenta",
98 const string& decayKinPartNamesObjName =
"decayKinParticles",
99 const string& decayKinMomentaLeafName =
"decayKinMomenta",
100 const bool debug =
false,
101 const long int treeCacheSize = 25000000)
104 const string inFileNamePatterns[2] = {inFileNamePatternA, inFileNamePatternB};
105 TTree* inTrees [2] = {0, 0};
106 TClonesArray* prodKinPartNames [2] = {0, 0};
107 TClonesArray* decayKinPartNames [2] = {0, 0};
108 for (
unsigned int i = 0;
i < 2; ++
i) {
109 vector<string> rootFileNames;
110 rootFileNames.push_back(inFileNamePatterns[
i]);
111 vector<string> evtFileNames;
112 vector<TTree*> trees;
114 rootFileNames, evtFileNames,
115 inTreeName, prodKinPartNamesObjName, prodKinMomentaLeafName,
116 decayKinPartNamesObjName, decayKinMomentaLeafName,
debug)) {
117 printErr <<
"problems opening input file(s). exiting." << endl;
120 inTrees[
i] = trees[0];
124 const long int nmbEventsInTrees[2] = {inTrees[0]->GetEntries(), inTrees[1]->GetEntries()};
125 if (nmbEventsInTrees[0] != nmbEventsInTrees[1])
126 printWarn <<
"trees have different number of events: " << nmbEventsInTrees[0] <<
" vs. "
127 << nmbEventsInTrees[1] << endl;
128 const int nmbProdKinPart [2] = {prodKinPartNames [0]->GetEntriesFast(),
129 prodKinPartNames [1]->GetEntriesFast()};
130 const int nmbDecayKinPart[2] = {decayKinPartNames[0]->GetEntriesFast(),
131 decayKinPartNames[1]->GetEntriesFast()};
132 assert(nmbProdKinPart [0] == nmbProdKinPart [1]);
133 assert(nmbDecayKinPart[0] == nmbDecayKinPart[1]);
134 for (
int i = 0;
i < nmbProdKinPart[0];
i++)
135 assert( ((TObjString*)(*(prodKinPartNames[0]))[
i])->GetString()
136 == ((TObjString*)(*(prodKinPartNames[1]))[i])->GetString());
137 for (
int i = 0; i < nmbDecayKinPart[0]; i++)
138 assert( ((TObjString*)(*(decayKinPartNames[0]))[i])->GetString()
139 == ((TObjString*)(*(decayKinPartNames[1]))[i])->GetString());
142 printInfo <<
"creating output file '" << outFileName <<
"'" << endl;
143 TFile* outFile = TFile::Open(outFileName.c_str(),
"RECREATE");
145 printWarn <<
"cannot open output file '" << outFileName <<
"'" << endl;
150 prodKinPartNames [0]->Write(prodKinPartNamesObjName.c_str (), TObject::kSingleKey);
151 decayKinPartNames[0]->Write(decayKinPartNamesObjName.c_str(), TObject::kSingleKey);
154 TTree* tree =
new TTree(inTreeName.c_str(), inTreeName.c_str());
156 printErr <<
"problems creating tree '" << inTreeName <<
"' "
157 <<
"in file '" << outFileName <<
"'" << endl;
162 TClonesArray* prodKinMomenta [3] = {0, 0,
new TClonesArray(
"TVector3", 0)};
163 TClonesArray* decayKinMomenta[3] = {0, 0,
new TClonesArray(
"TVector3", 0)};
166 for (
unsigned int i = 0; i < 2; ++
i) {
167 inTrees[
i]->SetBranchAddress(prodKinMomentaLeafName.c_str(), &prodKinMomenta [
i]);
168 inTrees[
i]->SetBranchAddress(decayKinMomentaLeafName.c_str(), &decayKinMomenta[
i]);
172 const int splitLevel = 99;
173 const int bufSize = 256000;
174 tree->Branch(prodKinMomentaLeafName.c_str(),
"TClonesArray", &prodKinMomenta [2], bufSize, splitLevel);
175 tree->Branch(decayKinMomentaLeafName.c_str(),
"TClonesArray", &decayKinMomenta[2], bufSize, splitLevel);
178 long int nmbEvents = min(nmbEventsInTrees[0], nmbEventsInTrees[1]);
179 if (maxNmbEvents > 0)
180 nmbEvents = min(maxNmbEvents, nmbEvents);
182 for (
long int eventIndex = 0; eventIndex < nmbEvents; ++eventIndex) {
183 if (progressIndicator)
184 ++(*progressIndicator);
186 if ((inTrees[0]->LoadTree(eventIndex) < 0) or (inTrees[1]->LoadTree(eventIndex) < 0))
188 inTrees[0]->GetEntry(eventIndex);
189 inTrees[1]->GetEntry(eventIndex);
191 assert( (prodKinMomenta[0]->GetEntriesFast() == nmbProdKinPart[0])
192 and (prodKinMomenta[1]->GetEntriesFast() == nmbProdKinPart[0]));
194 printDebug <<
"event[" << eventIndex <<
"]: " << nmbProdKinPart[0]
195 <<
" production kinematics particles:" << endl;
196 prodKinMomenta[2]->Clear();
197 for (
int i = 0; i < nmbProdKinPart[0]; ++
i)
200 assert( (decayKinMomenta[0]->GetEntriesFast() == nmbDecayKinPart[0])
201 and (decayKinMomenta[1]->GetEntriesFast() == nmbDecayKinPart[0]));
203 printDebug <<
"event[" << eventIndex <<
"]: " << nmbDecayKinPart[0]
204 <<
" decay kinematics particles:" << endl;
205 decayKinMomenta[2]->Clear();
206 for (
int i = 0; i < nmbDecayKinPart[0]; ++
i)
214 tree->OptimizeBaskets(treeCacheSize, 1,
"d");
217 printSucc <<
"wrote " << nmbEvents <<
" events to file '" << outFileName <<
"'" << endl;