46 #include "TMultiGraph.h"
49 #include "TPostScript.h"
72 string::size_type pos = name.find(
" ");
73 while (pos != string::npos) {
74 name.replace(pos, 1,
"");
75 pos = name.find(
" ", pos + 1);
84 const pair<string, double>& b)
86 return a.second > b.second;
89 vector<pair<string, TVirtualPad*> >
92 const bool createPsFile,
93 const string& outPath,
94 const int* graphColors,
95 const double* graphScales,
96 const bool drawLegend,
97 const double yAxisRangeMax,
98 const string& branchName)
100 const double intensityThr = 0;
101 const int nmbPadsPerCanvMin = 4;
102 vector<pair<string, TVirtualPad*> > wavePads;
105 map<string, int> wavelist;
106 double totIntensity = 0;
107 int nmbBinsAboveThr = 0;
108 map<string, double> totIntensities;
111 for (
unsigned int i = 0;
i < nmbTrees; ++
i)
113 printErr <<
"null pointer to tree " << i <<
". exiting." << endl;
117 trees[
i]->SetBranchAddress(branchName.c_str(), &massBin);
118 for (
int imassbin = 0; imassbin < trees[
i]->GetEntries(); imassbin++){
119 trees[
i]->GetEntry(imassbin);
121 const double binIntensity = massBin->
intensity();
122 totIntensity += binIntensity;
123 for (
unsigned iwave = 0; iwave < massBin->
waveNames().size(); iwave++){
126 if (wavelist[massBin->
waveNames()[iwave]] == 1){
131 if (binIntensity > intensityThr) {
140 printInfo <<
"drawing wave intensities from tree '" << trees[0]->GetName() <<
"' for "
141 << wavelist.size() <<
" waves in " << nbinelements <<
" mass bins." << endl;
143 printInfo <<
"sorting waves according to their intensity" << endl;
144 vector<pair<string, double> > waveIntensities(totIntensities.size(), pair<string, double>(
"", 0));
147 for (map<string,double>::iterator it_intensity = totIntensities.begin(); it_intensity != totIntensities.end(); it_intensity++){
148 const double relIntensity = (*it_intensity).second / totIntensity;
149 const string waveName = (*it_intensity).first;
150 waveIntensities[
i] = make_pair(waveName, relIntensity);
156 printInfo <<
"grouping waves w.r.t. to their JPC ..." << endl;
157 map<string, int> nmbWavesPerJpc;
160 for (map<string,double>::iterator it_intensity = totIntensities.begin(); it_intensity != totIntensities.end(); it_intensity++){
161 const string waveName = (*it_intensity).first;
162 const string jpc = (waveName !=
"flat") ?
string(waveName, 2, 3) : waveName;
163 cout <<
" wave [" << i <<
"] of " << totIntensities.size() <<
": " << waveName <<
", JPC = " << jpc << endl;
164 ++nmbWavesPerJpc[jpc];
168 cout <<
" ... finished" << endl;
170 printInfo <<
"creating canvases for all JPCs ..." << endl;
171 const int nmbPadsHor = (
int)ceil(sqrt(nmbPadsPerCanvMin));
172 const int nmbPadsVert = (
int)ceil((
double)nmbPadsPerCanvMin / (double)nmbPadsHor);
173 const int nmbPadsPerCanv = nmbPadsHor * nmbPadsVert;
174 map<string, TCanvas*> canvases;
175 for (map<string, int>::const_iterator i = nmbWavesPerJpc.begin(); i != nmbWavesPerJpc.end(); ++
i) {
176 const string jpc = i->first;
177 const int nmbCanv = (
int)ceil((
double)i->second / (double)nmbPadsPerCanv);
178 for (
int j = 0; j < nmbCanv; ++j) {
180 if (canvases[name] == NULL) {
181 canvases[name] =
new TCanvas(name.c_str(), name.c_str(), 10, 10, 1000, 800);
182 canvases[name]->Divide(nmbPadsHor, nmbPadsVert);
187 printInfo <<
"creating output ROOT file ..." << endl;
188 const string outFileName = outPath +
"waveIntensities.root";
189 TFile* outFile = TFile::Open(outFileName.c_str(),
"RECREATE");
191 printErr <<
"could not create output file '" << outFileName <<
"'. exiting." << endl;
196 printInfo <<
"plotting waves ordered by decreasing intensity ..." << endl;
197 wavePads.resize(waveIntensities.size(), pair<string, TVirtualPad*>(
"", NULL));
198 map<string, int> canvJpcCounter;
199 for (
unsigned int i = 0; i < waveIntensities.size(); ++
i) {
201 const string waveName = waveIntensities[
i].first;
202 const string jpc = (waveName !=
"flat") ?
string(waveName, 2, 3) : waveName;
203 const int canvCount = canvJpcCounter[jpc];
204 const string canvName =
buildCanvName(jpc, (
int)floor((
double)canvCount / (
double)nmbPadsPerCanv));
205 const int padIndex = (canvCount % nmbPadsPerCanv) + 1;
206 TCanvas* canv = canvases[canvName];
209 <<
" Selecting canvas '" << canvName <<
"'." << endl
210 <<
" wave " << canvCount + 1 <<
" of " << nmbWavesPerJpc[jpc]
211 <<
" for JPC = " << jpc <<
", intensity rank = " << i + 1 << endl;
212 ++canvJpcCounter[jpc];
215 TMultiGraph* graph =
plotIntensity(nmbTrees, trees, waveName,
false, graphColors, graphScales, drawLegend,
216 "",
"AP", 1, yAxisRangeMax,
"", branchName);
226 const double intensity = floor(waveIntensities[i].second * 1000 + 0.5) / 10;
228 label <<
"I = " << intensity <<
"% (" << i + 1 <<
")";
229 TLatex* text =
new TLatex(0.15, 0.85, label.str().c_str());
234 wavePads[
i].first = waveName;
235 wavePads[
i].second = gPad;
239 TList* histList = gDirectory->GetList();
240 for (
unsigned int i = 0; i < nmbTrees; ++
i)
241 histList->Remove(trees[i]);
242 printInfo <<
"writing the following " << histList->GetEntries() <<
" objects to '" << outFile->GetName() <<
"'" << endl;
255 const string psFileName = outPath +
"waveIntensities.ps";
256 TCanvas dummyCanv(
"dummy",
"dummy");
257 dummyCanv.Print((psFileName +
"[").c_str());
258 for (map<string, TCanvas*>::iterator i = canvases.begin(); i != canvases.end(); ++
i) {
259 i->second->Print(psFileName.c_str());
263 dummyCanv.Print((psFileName +
"]").c_str());
264 gSystem->Exec((
"gv " + psFileName).c_str());