00001 #include "QCDAnalysis/ChargedHadronSpectra/interface/Histograms.h"
00002 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00003
00004 #include "TROOT.h"
00005 #include "TTree.h"
00006 #include "TFile.h"
00007 #include "TH1F.h"
00008 #include "TH2F.h"
00009 #include "TH3F.h"
00010
00011 #include <iostream>
00012
00013 #include <cmath>
00014 using namespace std;
00015
00016
00017 #define nCharges 2
00018 enum Charges
00019 { pos, neg, zero, undefined };
00020
00021 const char *chargeName[nCharges + 2] =
00022 { "pos", "neg", "zero", "undefined" };
00023
00024
00025 #define nParticles 21
00026 enum Particles
00027 {
00028 pip, pim, kap, kam,
00029 prp, prm, elp, elm,
00030 hap, ham,
00031 gam, k0s, lam, ala,
00032 rho, kst, aks, phi,
00033 sip, asi,
00034 any
00035 };
00036
00037 const char *partName[nParticles] =
00038 {
00039 "pip", "pim", "kap", "kam",
00040 "prp", "prm", "elp", "elm",
00041 "hap", "ham",
00042 "gam", "k0s", "lam", "ala",
00043 "rho", "kst", "aks", "phi",
00044 "sip", "asi",
00045 "any"
00046 };
00047
00048 const int partCharge[nParticles] =
00049 {
00050 pos , neg , pos , neg ,
00051 pos , neg , pos , neg ,
00052 pos , neg ,
00053 zero, zero, zero, zero,
00054 zero, zero, zero, zero,
00055 pos , neg ,
00056 undefined
00057 };
00058
00059
00060 #define nFeedDowns 18
00061 const std::pair<int,int> feedDown[nFeedDowns] =
00062 {
00063 std::pair<int,int>(k0s, pip), std::pair<int,int>(k0s, pim),
00064 std::pair<int,int>(lam, prp), std::pair<int,int>(lam, pim),
00065 std::pair<int,int>(ala, prm), std::pair<int,int>(ala, pip),
00066 std::pair<int,int>(sip, prp), std::pair<int,int>(asi, prm),
00067 std::pair<int,int>(any, pip), std::pair<int,int>(any, pim),
00068 std::pair<int,int>(any, kap), std::pair<int,int>(any, kam),
00069 std::pair<int,int>(any, prp), std::pair<int,int>(any, prm),
00070 std::pair<int,int>(any, elp), std::pair<int,int>(any, elm),
00071 std::pair<int,int>(any, hap), std::pair<int,int>(any, ham)
00072 };
00073
00074 #define nResonances 4
00075 const std::pair<int,int> resonance[nResonances] =
00076 {
00077 std::pair<int,int>(pip, pim),
00078 std::pair<int,int>(kap, pim),
00079 std::pair<int,int>(pip, kam),
00080 std::pair<int,int>(kap, kam)
00081 };
00082
00083
00084 Histograms::Histograms(const edm::ParameterSet& pset)
00085 {
00086 fillHistograms = pset.getParameter<bool>("fillHistograms");
00087 fillNtuples = pset.getParameter<bool>("fillNtuples");
00088
00089 std::string histoFileLabel = pset.getParameter<std::string>("histoFile");
00090 histoFile = new TFile(histoFileLabel.c_str(),"recreate");
00091
00092 std::string ntupleFileLabel = pset.getParameter<std::string>("ntupleFile");
00093 ntupleFile = new TFile(ntupleFileLabel.c_str(),"recreate");
00094
00095
00096 }
00097
00098
00099 Histograms::~Histograms()
00100 {
00101 }
00102
00103
00104 int Histograms::getParticle(int id)
00105 {
00106 switch(id)
00107 {
00108 case 211 : return pip; break;
00109 case -211 : return pim; break;
00110
00111 case 321 : return kap; break;
00112 case -321 : return kam; break;
00113
00114 case 2212 : return prp; break;
00115 case -2212 : return prm; break;
00116
00117 case 11 : return elp; break;
00118 case -11 : return elm; break;
00119
00120
00121
00122
00123
00124
00125
00126 case 22 : return gam; break;
00127 case 310 : return k0s; break;
00128 case 3122 : return lam; break;
00129 case -3122 : return ala; break;
00130
00131
00132
00133
00134
00135
00136
00137
00138 case 3222 : return sip; break;
00139 case -3222 : return asi; break;
00140
00141 default : return -1; break;
00142 }
00143 }
00144
00145
00146 int Histograms::getCharge(int charge)
00147 {
00148 if(charge > 0) return pos;
00149 else return neg;
00150 }
00151
00152
00153 void Histograms::declareHistograms()
00154 {
00155 if(fillNtuples)
00156 {
00157 TString leafStr;
00158
00159 trackTrees.push_back(new TTree("simTrackTree","simTrackTree"));
00160 leafStr = "ids/I:etas/F:pts/F:acc/I:prim/I:nrec/I:ntrkr/I";
00161 trackTrees[0]->Branch("simTrackValues", &simTrackValues, leafStr.Data());
00162
00163 trackTrees.push_back(new TTree("recTrackTree","recTrackTree"));
00164 leafStr = "charge/I:etar/F:ptr/F:phir/F:zr/F:logpr/F:logde/F:nhitr/I:prim/I:nsim/I:ids/I:parids/I:etas/F:pts/F:ntrkr/I";
00165 trackTrees[1]->Branch("recTrackValues", &recTrackValues, leafStr.Data());
00166
00167 trackTrees.push_back(new TTree("recVzeroTree","recVzeroTree"));
00168 leafStr = "etar/F:ptr/F:ima/F:rhor/F";
00169 trackTrees[2]->Branch("recVzeroValues", &recVzeroValues, leafStr.Data());
00170
00171 trackTrees.push_back(new TTree("eventInfoTree","eventInfoTree"));
00172 leafStr = "proc/I:strk/I:ntrkr/I";
00173 trackTrees[3]->Branch("eventInfoValues", &eventInfoValues, leafStr.Data());
00174 }
00175
00176 if(fillHistograms)
00177 {
00179
00180 const double small = 1e-3;
00181 double pt;
00182
00183 for(pt = 0; pt < 1 - small; pt += 0.05) ptBins.push_back(pt);
00184 for(pt = 1; pt < 2 - small; pt += 0.1 ) ptBins.push_back(pt);
00185 for(pt = 2; pt < 4 - small; pt += 0.2 ) ptBins.push_back(pt);
00186 for(pt = 4; pt < 8 - small; pt += 0.5 ) ptBins.push_back(pt);
00187 for(pt = 8; pt < 16 - small; pt += 1. ) ptBins.push_back(pt);
00188 for(pt = 16; pt < 32 - small; pt += 2. ) ptBins.push_back(pt);
00189 for(pt = 32; pt < 64 - small; pt += 4. ) ptBins.push_back(pt);
00190
00191 static float ratMin = 0.5;
00192 static float ratMax = 1.5;
00193 static float ratWidth = 1./200;
00194
00195 for(double rat = ratMin; rat < ratMax + ratWidth/2; rat += ratWidth)
00196 ratBins.push_back(rat);
00197
00199
00200 static float etaMin = -3.0;
00201 static float etaMax = 3.0;
00202 static float etaWidth = 0.2;
00203
00204 for(double eta = etaMin; eta < etaMax + etaWidth/2; eta += etaWidth)
00205 etaBins.push_back(eta);
00206
00207
00208 for(double eta = etaMin; eta < etaMax + etaWidth/2; eta += etaWidth/5)
00209 metaBins.push_back(eta);
00210
00211 static float zMin = -20.;
00212 static float zMax = 20.;
00213
00214 static float zWidth = 0.2;
00215
00216 for(double z = zMin; z < zMax + zWidth/2; z += zWidth)
00217 zBins.push_back(z);
00218
00220
00221 static float ntrkMin = 0.5;
00222
00223
00224
00225 static float ntrkMax = 1000.;
00226 static float ntrkWidth = 10.;
00227
00228 for(double ntrk = ntrkMin; ntrk < ntrkMax + ntrkWidth; ntrk += ntrkWidth)
00229 ntrkBins.push_back(ntrk);
00230
00231
00232 char histName[256];
00233
00235
00236 sprintf(histName,"heve");
00237 heve.push_back(new TH1F(histName,histName, 200, -0.5,199.5));
00238
00239 sprintf(histName,"hsdx");
00240 heve.push_back(new TH1F(histName,histName, 200, -0.5,199.5));
00241
00242 sprintf(histName,"hddx");
00243 heve.push_back(new TH1F(histName,histName, 200, -0.5,199.5));
00244
00245 sprintf(histName,"hndx");
00246 heve.push_back(new TH1F(histName,histName, 200, -0.5,199.5));
00247
00248 sprintf(histName,"hder");
00249 hder.push_back(new TH2F(histName,histName, 200, -0.5,199.5,
00250 200, -0.5,199.5));
00251
00253
00254 for(int part = pip; part <= ala; part++)
00255 {
00256
00257 sprintf(histName,"hsim_%s", partName[part]);
00258 hsim.push_back(new TH3F(histName,histName,
00259 etaBins.size()-1, &etaBins[0],
00260 ptBins.size()-1, &ptBins[0],
00261 ntrkBins.size()-1, &ntrkBins[0]));
00262
00263
00264 sprintf(histName,"hacc_%s", partName[part]);
00265 hacc.push_back(new TH3F(histName,histName,
00266 etaBins.size()-1, &etaBins[0],
00267 ptBins.size()-1, &ptBins[0],
00268 ntrkBins.size()-1, &ntrkBins[0]));
00269
00270
00271 sprintf(histName,"href_%s", partName[part]);
00272 href.push_back(new TH3F(histName,histName,
00273 etaBins.size()-1, &etaBins[0],
00274 ptBins.size()-1, &ptBins[0],
00275 ntrkBins.size()-1, &ntrkBins[0]));
00276
00277
00278 sprintf(histName,"hmul_%s", partName[part]);
00279 hmul.push_back(new TH3F(histName,histName,
00280 etaBins.size()-1, &etaBins[0],
00281 ptBins.size()-1, &ptBins[0],
00282 ntrkBins.size()-1, &ntrkBins[0]));
00283 }
00284
00286
00287 for(int charge = 0; charge < nCharges; charge++)
00288 {
00289 sprintf(histName,"hall_%s",chargeName[charge]);
00290 hall.push_back(new TH3F(histName,histName,
00291 etaBins.size()-1, &etaBins[0],
00292 ptBins.size()-1, &ptBins[0],
00293 ntrkBins.size()-1, &ntrkBins[0]));
00294
00295 sprintf(histName,"hdac_%s",chargeName[charge]);
00296 hdac.push_back(new TH2F(histName,histName,
00297 metaBins.size()-1, &metaBins[0],
00298 zBins.size()-1, &zBins[0]));
00299
00301
00302 sprintf(histName,"hfak_%s",chargeName[charge]);
00303 hfak.push_back(new TH3F(histName,histName,
00304 etaBins.size()-1, &etaBins[0],
00305 ptBins.size()-1, &ptBins[0],
00306 ntrkBins.size()-1, &ntrkBins[0]));
00307 }
00308
00310
00311 for(int part = pip; part <= ala; part++)
00312 {
00313
00314 sprintf(histName,"hvpt_%s",partName[part]);
00315 hvpt.push_back(new TH3F(histName,histName,
00316 etaBins.size()-1, &etaBins[0],
00317 ptBins.size()-1, &ptBins[0],
00318 ptBins.size()-1, &ptBins[0]));
00319
00320
00321 sprintf(histName,"hrpt_%s",partName[part]);
00322 hrpt.push_back(new TH3F(histName,histName,
00323 etaBins.size()-1, &etaBins[0],
00324 ptBins.size()-1, &ptBins[0],
00325 ratBins.size()-1, &ratBins[0]));
00326
00327 sprintf(histName,"hsp0_%s",partName[part]);
00328 hsp0.push_back(new TH2F(histName,histName,
00329 etaBins.size()-1, &etaBins[0],
00330 ptBins.size()-1, &ptBins[0]));
00331
00332 sprintf(histName,"hsp1_%s",partName[part]);
00333 hsp1.push_back(new TH2F(histName,histName,
00334 etaBins.size()-1, &etaBins[0],
00335 ptBins.size()-1, &ptBins[0]));
00336
00337 sprintf(histName,"hsp2_%s",partName[part]);
00338 hsp2.push_back(new TH2F(histName,histName,
00339 etaBins.size()-1, &etaBins[0],
00340 ptBins.size()-1, &ptBins[0]));
00341 }
00342
00344
00345 for(int k = 0; k < nFeedDowns; k++)
00346 {
00347 sprintf(histName,"hpro_%s_%s", partName[feedDown[k].first],
00348 partName[feedDown[k].second]);
00349 hpro.push_back(new TH2F(histName,histName,
00350 etaBins.size()-1, &etaBins[0],
00351 ptBins.size()-1, &ptBins[0]));
00352
00353 sprintf(histName,"hdec_%s_%s", partName[feedDown[k].first],
00354 partName[feedDown[k].second]);
00355 hdec.push_back(new TH2F(histName,histName,
00356 etaBins.size()-1, &etaBins[0],
00357 ptBins.size()-1, &ptBins[0]));
00358 }
00359
00361
00362 static float lpMin = -3;
00363 static float lpMax = 2;
00364 static float lpWidth = (lpMax - lpMin)/100;
00365 for(double lp = lpMin; lp < lpMax + lpWidth/2; lp += lpWidth)
00366 lpBins.push_back(lp);
00367
00368 static float ldeMin = log(1);
00369 static float ldeMax = log(100);
00370 static float ldeWidth = (ldeMax - ldeMin)/250;
00371 for(double lde = ldeMin; lde < ldeMax + ldeWidth/2; lde += ldeWidth)
00372 ldeBins.push_back(lde);
00373
00374 for(double nhit = -0.5; nhit < 50; nhit += 1)
00375 nhitBins.push_back(nhit);
00376
00377 for(int charge = 0; charge < nCharges; charge++)
00378 {
00379
00380
00381 sprintf(histName,"helo_%s", chargeName[charge]);
00382 helo.push_back(new TH3F(histName,histName,
00383 etaBins.size()-1, &etaBins[0],
00384 ptBins.size()-1, &ptBins[0],
00385 ldeBins.size()-1, &ldeBins[0]));
00386
00387
00388 sprintf(histName,"hnhi_%s", chargeName[charge]);
00389 hnhi.push_back(new TH3F(histName,histName,
00390 etaBins.size()-1, &etaBins[0],
00391 ptBins.size()-1, &ptBins[0],
00392 nhitBins.size()-1, &nhitBins[0]));
00393
00394
00395 sprintf(histName,"held_%s", chargeName[charge]);
00396 held.push_back(new TH2F(histName,histName,
00397 lpBins.size()-1, &lpBins[0],
00398 ldeBins.size()-1, &ldeBins[0]));
00399 }
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00428
00429 static float rhoMin = 0.;
00430 static float rhoMax = 5.;
00431 static float rhoWidth = 0.2;
00432 for(double rho_ = rhoMin; rho_ < rhoMax + rhoWidth/2; rho_ += rhoWidth)
00433 rhoBins.push_back(rho_);
00434
00435
00436 for(int part = gam; part <= phi; part++)
00437 {
00438 float imMin = 0;
00439 float imMax = 0;
00440 float imWidth = 0;
00441
00442 if(part == gam) { imMin = 0.0; imMax = 0.2; imWidth = 0.005; }
00443 if(part == k0s) { imMin = 0.3; imMax = 0.7; imWidth = 0.005; }
00444 if(part == lam ||
00445 part == ala) { imMin = 1.0; imMax = 1.3; imWidth = 0.002; }
00446
00447 if(part == rho) { imMin = 0.2; imMax = 1.2; imWidth = 0.010; }
00448 if(part == kst ||
00449 part == aks) { imMin = 0.6; imMax = 1.6; imWidth = 0.010; }
00450 if(part == phi) { imMin = 0.9; imMax = 1.1; imWidth = 0.002; }
00451
00452 std::vector<double> imBins;
00453 double im;
00454 for(im = imMin; im < imMax + imWidth/2; im += imWidth)
00455 imBins.push_back(im);
00456
00457 if(imWidth > 0)
00458 {
00459 sprintf(histName,"hima_%s", partName[part]);
00460 hima.push_back(new TH3F(histName,histName,
00461 etaBins.size()-1, &etaBins[0],
00462 ptBins.size()-1, &ptBins[0],
00463 imBins.size()-1, &imBins[0]));
00464
00465 if(part >= rho && part <= phi)
00466 {
00467 sprintf(histName,"himp_%s", partName[part]);
00468 hima.push_back(new TH3F(histName,histName,
00469 etaBins.size()-1, &etaBins[0],
00470 ptBins.size()-1, &ptBins[0],
00471 imBins.size()-1, &imBins[0]));
00472
00473 sprintf(histName,"himm_%s", partName[part]);
00474 hima.push_back(new TH3F(histName,histName,
00475 etaBins.size()-1, &etaBins[0],
00476 ptBins.size()-1, &ptBins[0],
00477 imBins.size()-1, &imBins[0]));
00478
00479 sprintf(histName,"himx_%s", partName[part]);
00480 hima.push_back(new TH3F(histName,histName,
00481 etaBins.size()-1, &etaBins[0],
00482 ptBins.size()-1, &ptBins[0],
00483 imBins.size()-1, &imBins[0]));
00484 }
00485
00486 sprintf(histName,"hrho_%s", partName[part]);
00487 hrho.push_back(new TH3F(histName,histName,
00488 rhoBins.size()-1, &rhoBins[0],
00489 ptBins.size()-1, &ptBins[0],
00490 imBins.size()-1, &imBins[0]));
00491 }
00492 }
00493 }
00494 }
00495
00496
00497 void Histograms::fillEventInfo(int proc, int strk, int ntrk)
00498 {
00499 if(fillNtuples)
00500 {
00501 EventInfo_t e;
00502 e.proc = proc;
00503 e.strk = strk;
00504 e.ntrkr = ntrk;
00505
00506 eventInfoValues = e;
00507
00508 trackTrees[3]->Fill();
00509 }
00510
00511 if(fillHistograms)
00512 {
00513 heve[0]->Fill(ntrk);
00514
00515 if(proc == 92 || proc == 93)
00516 heve[1]->Fill(ntrk);
00517
00518 if(proc == 94)
00519 heve[2]->Fill(ntrk);
00520
00521 if(!(proc == 92 || proc == 93 || proc == 94))
00522 heve[3]->Fill(ntrk);
00523
00524
00525 hder[0]->Fill(strk,ntrk);
00526 }
00527 }
00528
00529
00530 void Histograms::fillSimHistograms(const SimTrack_t & s)
00531 {
00532 if(fillNtuples)
00533 {
00534 if(s.prim)
00535 {
00536 simTrackValues = s;
00537 trackTrees[0]->Fill();
00538 }
00539 }
00540
00541 if(fillHistograms)
00542 {
00543 int part = getParticle(s.ids);
00544
00545 if(pip <= part && part <= ala && s.prim)
00546 {
00547 hsim[part]->Fill(s.etas, s.pts, s.ntrkr);
00548 if(s.acc) hacc[part]->Fill(s.etas, s.pts, s.ntrkr);
00549 if(s.acc)
00550 {
00551 if(s.nrec > 0) href[part]->Fill(s.etas, s.pts, s.ntrkr);
00552 if(s.nrec > 1) hmul[part]->Fill(s.etas, s.pts, s.ntrkr);
00553 }
00554
00555 if(partCharge[part] == pos || partCharge[part] == neg)
00556 {
00557 if(partCharge[part] == pos) part = hap;
00558 if(partCharge[part] == neg) part = ham;
00559
00560 hsim[part]->Fill(s.etas, s.pts, s.ntrkr);
00561 if(s.acc) hacc[part]->Fill(s.etas, s.pts, s.ntrkr);
00562 if(s.acc)
00563 {
00564 if(s.nrec > 0) href[part]->Fill(s.etas, s.pts, s.ntrkr);
00565 if(s.nrec > 1) hmul[part]->Fill(s.etas, s.pts, s.ntrkr);
00566 }
00567 }
00568 }
00569 }
00570 }
00571
00572
00573 void Histograms::fillRecHistograms(const RecTrack_t & r)
00574 {
00575 if(fillNtuples)
00576 {
00577 if(r.prim)
00578 {
00579 recTrackValues = r;
00580 trackTrees[1]->Fill();
00581 }
00582 }
00583
00584 if(fillHistograms)
00585 {
00586 int charge = getCharge(r.charge);
00587 double p = exp(r.logpr);
00588
00589 if(r.prim)
00590 {
00591 hall[charge]->Fill(r.etar, r.ptr, r.ntrkr);
00592
00593 if(r.ptr > 0.3)
00594 hdac[charge]->Fill(r.etar, r.zr);
00595
00596 if(r.nsim == 0)
00597 hfak[charge]->Fill(r.etar, r.ptr, r.ntrkr);
00598
00599 if(r.nsim == 1)
00600 {
00601 int part = getParticle(r.ids);
00602 int moth = getParticle(r.parids);
00603
00604 if(pip <= part && part <= ala)
00605 {
00606 hvpt[part]->Fill(r.etas, r.pts, r.ptr );
00607 hrpt[part]->Fill(r.etas, r.pts, r.ptr/r.pts);
00608
00609 hsp0[part]->Fill(r.etas, r.pts);
00610 hsp1[part]->Fill(r.etas, r.pts, p);
00611 hsp2[part]->Fill(r.etas, r.pts, p*p);
00612 }
00613
00614 for(int k = 0; k < nFeedDowns; k++)
00615 if(part == feedDown[k].second)
00616 {
00617 hpro[k]->Fill(r.etar, r.ptr);
00618
00619 if((r.parids != 0 && feedDown[k].first == any) ||
00620 feedDown[k].first == moth)
00621 hdec[k]->Fill(r.etar, r.ptr);
00622 }
00623
00624 if(partCharge[part] == pos || partCharge[part] == neg)
00625 {
00626 if(partCharge[part] == pos) part = hap;
00627 if(partCharge[part] == neg) part = ham;
00628
00629 hvpt[part]->Fill(r.etas, r.pts, r.ptr );
00630 hrpt[part]->Fill(r.etas, r.pts, r.ptr/r.pts);
00631
00632 hsp0[part]->Fill(r.etas, r.pts);
00633 hsp1[part]->Fill(r.etas, r.pts, p);
00634 hsp2[part]->Fill(r.etas, r.pts, p*p);
00635
00636 for(int k = 0; k < nFeedDowns; k++)
00637 if(part == feedDown[k].second)
00638 {
00639 hpro[k]->Fill(r.etar, r.ptr);
00640
00641 if((r.parids != 0 && feedDown[k].first == any) ||
00642 feedDown[k].first == moth)
00643 hdec[k]->Fill(r.etar, r.ptr);
00644 }
00645 }
00646 }
00647
00648
00649 helo[charge]->Fill(r.etar, r.ptr, r.logde);
00650 hnhi[charge]->Fill(r.etar, r.ptr, r.nhitr);
00651 held[charge]->Fill(r.logpr, r.logde);
00652
00653
00654
00655
00656
00657
00658
00659 }
00660 }
00661 }
00662
00663
00664 void Histograms::fillVzeroHistograms(const RecVzero_t & v, int part)
00665 {
00666 if(fillNtuples)
00667 {
00668 recVzeroValues = v;
00669 trackTrees[2]->Fill();
00670 }
00671
00672 if(fillHistograms)
00673 hima[part]->Fill(v.etar, v.ptr, v.ima);
00674 }
00675
00676
00677 void Histograms::writeHistograms()
00678 {
00679 typedef std::vector<TH3F *>::const_iterator H3I;
00680 typedef std::vector<TH2F *>::const_iterator H2I;
00681 typedef std::vector<TH1F *>::const_iterator H1I;
00682 typedef std::vector<TTree *>::const_iterator TI;
00683
00684 if(fillHistograms)
00685 {
00686 histoFile->cd();
00687 for(H1I h = heve.begin(); h!= heve.end(); h++) (*h)->Write();
00688 for(H2I h = hder.begin(); h!= hder.end(); h++) (*h)->Write();
00689
00690 for(H3I h = hsim.begin(); h!= hsim.end(); h++) (*h)->Write();
00691 for(H3I h = hacc.begin(); h!= hacc.end(); h++) (*h)->Write();
00692 for(H3I h = href.begin(); h!= href.end(); h++) (*h)->Write();
00693 for(H3I h = hmul.begin(); h!= hmul.end(); h++) (*h)->Write();
00694
00695 for(H3I h = hall.begin(); h!= hall.end(); h++) (*h)->Write();
00696 for(H2I h = hdac.begin(); h!= hdac.end(); h++) (*h)->Write();
00697
00698 for(H3I h = hvpt.begin(); h!= hvpt.end(); h++) (*h)->Write();
00699 for(H3I h = hrpt.begin(); h!= hrpt.end(); h++) (*h)->Write();
00700
00701 for(H2I h = hsp0.begin(); h!= hsp0.end(); h++) (*h)->Write();
00702 for(H2I h = hsp1.begin(); h!= hsp1.end(); h++) (*h)->Write();
00703 for(H2I h = hsp2.begin(); h!= hsp2.end(); h++) (*h)->Write();
00704
00705 for(H3I h = hfak.begin(); h!= hfak.end(); h++) (*h)->Write();
00706
00707 for(H2I h = hpro.begin(); h!= hpro.end(); h++) (*h)->Write();
00708 for(H2I h = hdec.begin(); h!= hdec.end(); h++) (*h)->Write();
00709
00710 for(H3I h = helo.begin(); h!= helo.end(); h++) (*h)->Write();
00711 for(H3I h = hnhi.begin(); h!= hnhi.end(); h++) (*h)->Write();
00712 for(H2I h = held.begin(); h!= held.end(); h++) (*h)->Write();
00713
00714 for(H3I h = hima.begin(); h!= hima.end(); h++) (*h)->Write();
00715 for(H3I h = hrho.begin(); h!= hrho.end(); h++) (*h)->Write();
00716 histoFile->Close();
00717 }
00718
00719 if(fillNtuples)
00720 {
00721 ntupleFile->cd();
00722 for(TI t = trackTrees.begin(); t!= trackTrees.end(); t++) (*t)->Write();
00723 ntupleFile->Close();
00724 }
00725 }
00726