1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 //////////////////////////////////////////////////////////////////////////
20 // Container for the distributions of dE/dx and the time bin of the //
21 // max. cluster for electrons and pions //
24 // Prashant Shukla <shukla@pi0.physi.uni-heidelberg.de> //
25 // Alex Bercuci <a.bercuci@gsi.de> //
27 //////////////////////////////////////////////////////////////////////////
35 #include <TParticle.h>
36 #include <TPrincipal.h>
39 #include "AliHeader.h"
40 #include "AliGenEventHeader.h"
42 #include "AliRunLoader.h"
46 #include "AliESDtrack.h"
48 #include "AliTRDCalPIDLQ.h"
49 #include "AliTRDCalPIDLQRef.h"
50 #include "AliTRDpidESD.h"
51 #include "AliTRDcalibDB.h"
52 #include "AliTRDtrack.h"
53 #include "AliTRDgeometry.h"
55 ClassImp(AliTRDCalPIDLQ)
57 Char_t* AliTRDCalPIDLQ::fpartName[AliPID::kSPECIES] = {"electron", "muon", "pion", "kaon", "proton"};
58 Char_t* AliTRDCalPIDLQ::fpartSymb[AliPID::kSPECIES] = {"EL", "MU", "PI", "KA", "PR"};
60 //_________________________________________________________________________
61 AliTRDCalPIDLQ::AliTRDCalPIDLQ()
62 :TNamed("pid", "PID for TRD")
76 // The Default constructor
83 //_________________________________________________________________________
84 AliTRDCalPIDLQ::AliTRDCalPIDLQ(const Text_t *name, const Text_t *title)
99 // The main constructor
106 //_____________________________________________________________________________
107 AliTRDCalPIDLQ::AliTRDCalPIDLQ(const AliTRDCalPIDLQ &c)
110 ,fNLength(c.fNLength)
112 ,fTrackSegLength(0x0)
113 ,fNTimeBins(c.fNTimeBins)
114 ,fMeanChargeRatio(c.fMeanChargeRatio)
116 ,fBinSize(c.fBinSize)
125 if (this != &c) ((AliTRDCalPIDLQ &) c).Copy(*this);
129 //_________________________________________________________________________
130 AliTRDCalPIDLQ::~AliTRDCalPIDLQ()
140 //_________________________________________________________________________
141 void AliTRDCalPIDLQ::CleanUp()
144 // Delets all newly created objects
157 if (fTrackMomentum) {
158 delete[] fTrackMomentum;
159 fTrackMomentum = 0x0;
162 if (fTrackSegLength) {
163 delete[] fTrackSegLength;
164 fTrackSegLength = 0x0;
174 //_____________________________________________________________________________
175 AliTRDCalPIDLQ &AliTRDCalPIDLQ::operator=(const AliTRDCalPIDLQ &c)
178 // Assignment operator
181 if (this != &c) ((AliTRDCalPIDLQ &) c).Copy(*this);
186 //_____________________________________________________________________________
187 void AliTRDCalPIDLQ::Copy(TObject &c) const
193 AliTRDCalPIDLQ& target = (AliTRDCalPIDLQ &) c;
197 target.fNbins = fNbins;
198 target.fBinSize = fBinSize;
199 target.fMeanChargeRatio = fMeanChargeRatio;
200 target.fNTimeBins = fNTimeBins;
202 //target.fNMom = fNMom;
203 target.fTrackMomentum = new Double_t[fNMom];
204 for (Int_t i=0; i<fNMom; ++i) {
205 target.fTrackMomentum[i] = fTrackMomentum[i];
208 //target.fNLength = fNLength;
209 target.fTrackSegLength = new Double_t[fNLength];
210 for (Int_t i=0; i<fNLength; ++i) {
211 target.fTrackSegLength[i] = fTrackSegLength[i];
215 target.fHistdEdx = (TObjArray*) fHistdEdx->Clone();
218 target.fHistTimeBin = (TObjArray*) fHistTimeBin->Clone();
221 target.fEstimator = new AliTRDCalPIDLQRef(*fEstimator);
227 //_________________________________________________________________________
228 void AliTRDCalPIDLQ::Init()
237 fTrackMomentum = new Double_t[fNMom];
238 fTrackMomentum[0] = 0.6;
239 fTrackMomentum[1] = 0.8;
240 fTrackMomentum[2] = 1.0;
241 fTrackMomentum[3] = 1.5;
242 fTrackMomentum[4] = 2.0;
243 fTrackMomentum[5] = 3.0;
244 fTrackMomentum[6] = 4.0;
245 fTrackMomentum[7] = 5.0;
246 fTrackMomentum[8] = 6.0;
247 fTrackMomentum[9] = 8.0;
248 fTrackMomentum[10] = 10.0;
250 fTrackSegLength = new Double_t[fNLength];
251 fTrackSegLength[0] = 3.7;
252 fTrackSegLength[1] = 3.9;
253 fTrackSegLength[2] = 4.2;
254 fTrackSegLength[3] = 5.0;
256 fHistdEdx = new TObjArray(AliPID::kSPECIES * fNMom/* * fNLength*/);
257 fHistdEdx->SetOwner();
258 fHistTimeBin = new TObjArray(2 * fNMom);
259 fHistTimeBin->SetOwner();
261 // Initialization of estimator at object instantiation because late
262 // initialization in function GetProbability() is not working due to
263 // constantness of this function.
264 fEstimator = new AliTRDCalPIDLQRef();
266 // Number of Time bins
267 AliTRDcalibDB *calibration = AliTRDcalibDB::Instance();
269 AliWarning("No AliTRDcalibDB available. Using 22 time bins.");
272 if (calibration->GetRun() > -1) {
273 fNTimeBins = calibration->GetNumberOfTimeBins();
276 AliWarning("No run number set. Using 22 time bins.");
281 // ADC Gain normalization
282 fMeanChargeRatio = 1.0;
284 // Number of bins and bin size
289 //_________________________________________________________________________
290 Bool_t AliTRDCalPIDLQ::ReadReferences(Char_t *responseFile)
293 // Read the TRD dEdx histograms.
296 // Read histogram Root file
297 TFile *histFile = new TFile(responseFile, "READ");
298 if (!histFile || !histFile->IsOpen()) {
299 AliError(Form("Opening TRD histgram file %s failed", responseFile));
305 for (Int_t iparticle = 0; iparticle < AliPID::kSPECIES; iparticle++){
306 for (Int_t imom = 0; imom < fNMom; imom++){
307 TH2D* hist = (TH2D*)histFile->Get(Form("h2dEdx%s%02d", fpartSymb[iparticle], imom/*, ilength*/))->Clone();
308 hist->Scale(1./hist->Integral());
309 fHistdEdx->AddAt(hist, GetHistID(iparticle, imom));
311 if (iparticle != AliPID::kElectron && iparticle != AliPID::kPion) continue;
313 TH1F* ht = (TH1F*)histFile->Get(Form("h1MaxTB%s%02d", fpartSymb[iparticle], imom))->Clone();
314 if(ht->GetNbinsX() != fNTimeBins) AliWarning(Form("The number of time bins %d defined in h1MaxTB%s%02d differs from calibration value of %d. This may lead to erroneous results.", ht->GetNbinsX(), fpartSymb[iparticle], imom, fNTimeBins));
315 ht->Scale(1./ht->Integral());
316 fHistTimeBin->AddAt(ht, ((iparticle==AliPID::kElectron)?0:1)*fNMom + imom);
323 // Number of bins and bin size
324 //TH1F* hist = (TH1F*) fHistdEdx->At(GetHistID(AliPID::kPion, 1));
325 //fNbins = hist->GetNbinsX();
326 //fBinSize = hist->GetBinWidth(1);
332 // //_________________________________________________________________________
333 // Double_t AliTRDCalPIDLQ::GetMean(Int_t k, Int_t ip) const
336 // // Gets mean of de/dx dist. of e
339 // AliInfo(Form("Mean for particle = %s and momentum = %.2f is:\n"
341 // ,fTrackMomentum[ip]));
342 // if (k < 0 || k > AliPID::kSPECIES) {
346 // return ((TH1F*) fHistdEdx->At(GetHistID(k,ip)))->GetMean();
350 // //_________________________________________________________________________
351 // Double_t AliTRDCalPIDLQ::GetNormalization(Int_t k, Int_t ip) const
354 // // Gets Normalization of de/dx dist. of e
357 // AliInfo(Form("Normalization for particle = %s and momentum = %.2f is:\n"
359 // ,fTrackMomentum[ip]));
360 // if (k < 0 || k > AliPID::kSPECIES) {
364 // return ((TH1F*) fHistdEdx->At(GetHistID(k,ip)))->Integral();
368 //_________________________________________________________________________
369 TH1* AliTRDCalPIDLQ::GetHistogram(Int_t k, Int_t ip/*, Int_t il*/) const
372 // Returns one selected dEdx histogram
375 if (k < 0 || k >= AliPID::kSPECIES) return 0x0;
376 if(ip<0 || ip>= fNMom ) return 0x0;
378 AliInfo(Form("Retrive dEdx histogram for %s of %5.2f GeV/c", fpartName[k], fTrackMomentum[ip]));
380 return (TH1*)fHistdEdx->At(GetHistID(k, ip));
384 //_________________________________________________________________________
385 TH1* AliTRDCalPIDLQ::GetHistogramT(Int_t k, Int_t ip) const
388 // Returns one selected time bin max histogram
391 if (k < 0 || k >= AliPID::kSPECIES) return 0x0;
392 if(ip<0 || ip>= fNMom ) return 0x0;
394 AliInfo(Form("Retrive MaxTB histogram for %s of %5.2f GeV/c", fpartName[k], fTrackMomentum[ip]));
396 return (TH1*)fHistTimeBin->At(((k==AliPID::kElectron)?0:1)*fNMom+ip);
399 //_________________________________________________________________________
400 Double_t AliTRDCalPIDLQ::GetProbability(Int_t spec, Float_t mom, Float_t *dedx, Float_t length) const
403 // Core function of AliTRDCalPIDLQ class for calculating the
404 // likelihood for species "spec" (see AliTRDtrack::kNspecie) of a
405 // given momentum "mom" and a given dE/dx (slice "dedx") yield per
409 if (spec < 0 || spec >= AliPID::kSPECIES) return 0.;
411 //Double_t dedx = dedx1/fMeanChargeRatio;
413 // find the interval in momentum and track segment length which applies for this data
415 while(ilength<fNLength-1 && length>fTrackSegLength[ilength]){
419 while(imom<fNMom-1 && mom>fTrackMomentum[imom]) imom++;
421 Int_t nbinsx, nbinsy;
422 TAxis *ax = 0x0, *ay = 0x0;
424 Double_t mom1 = fTrackMomentum[imom-1], mom2 = fTrackMomentum[imom];
426 if(!(hist = (TH2D*)fHistdEdx->At(GetHistID(spec, imom-1/*, ilength*/)))){
427 AliInfo(Form("Looking for spec(%d) mom(%f) Ex(%f) Ey(%f) length(%f)", spec, mom, dedx[0], dedx[1], length));
428 AliError(Form("EHistogram id %d not found in DB.", GetHistID(spec, imom-1)));
431 ax = hist->GetXaxis(); nbinsx = ax->GetNbins();
432 ay = hist->GetYaxis(); nbinsy = ay->GetNbins();
433 Float_t x = dedx[0]+dedx[1], y = dedx[2];
434 Bool_t kX = (x < ax->GetBinUpEdge(nbinsx));
435 Bool_t kY = (y < ay->GetBinUpEdge(nbinsy));
437 if(kY) LQ1 = hist->GetBinContent( hist->FindBin(x, y));
438 //fEstimator->Estimate2D2(hist, x, y);
439 else LQ1 = hist->GetBinContent(ax->FindBin(x), nbinsy);
441 if(kY) LQ1 = hist->GetBinContent(nbinsx, ay->FindBin(y));
442 else LQ1 = hist->GetBinContent(nbinsx, nbinsy);
445 if(!(hist = (TH2D*)fHistdEdx->At(GetHistID(spec, imom/*, ilength*/)))){
446 AliInfo(Form("Looking for spec(%d) mom(%f) Ex(%f) Ey(%f) length(%f)", spec, mom, dedx[0], dedx[1], length));
447 AliError(Form("EHistogram id %d not found in DB.", GetHistID(spec, imom)));
451 if(kY) LQ2 = hist->GetBinContent( hist->FindBin(x, y));
452 //fEstimator->Estimate2D2(hist, x, y);
453 else LQ2 = hist->GetBinContent(ax->FindBin(x), nbinsy);
455 if(kY) LQ2 = hist->GetBinContent(nbinsx, ay->FindBin(y));
456 else LQ2 = hist->GetBinContent(nbinsx, nbinsy);
459 // return interpolation over momentum binning
460 return LQ1 + (LQ2 - LQ1)*(mom - mom1)/(mom2 - mom1);
464 //_________________________________________________________________________
465 Double_t AliTRDCalPIDLQ::GetProbabilityT(Int_t spec, Double_t mom, Int_t timbin) const
468 // Gets the Probability of having timbin at a given momentum (mom)
469 // and particle type (spec) (0 for e) and (2 for pi)
470 // from the precalculated timbin distributions
473 if (spec < 0 || spec >= AliPID::kSPECIES) return 0.;
474 if (timbin<0 || timbin >= fNTimeBins) return 0.;
476 Int_t iTBin = timbin+1;
478 // Everything which is not an electron counts as a pion for time bin max
479 //if(spec != AliPID::kElectron) spec = AliPID::kPion;
484 while(imom<fNMom-1 && mom>fTrackMomentum[imom]) imom++;
486 Double_t mom1 = fTrackMomentum[imom-1], mom2 = fTrackMomentum[imom];
488 if(!(hist = (TH1F*) fHistTimeBin->At(((spec==AliPID::kElectron)?0:1)*fNMom+imom-1))){
489 AliInfo(Form("Looking for spec(%d) mom(%f) timbin(%d)", spec, mom, timbin));
490 AliError(Form("THistogram id %d not found in DB.", ((spec==AliPID::kElectron)?0:1)*fNMom+imom-1));
493 Double_t LQ1 = hist->GetBinContent(iTBin);
495 if(!(hist = (TH1F*) fHistTimeBin->At(((spec==AliPID::kElectron)?0:1)*fNMom+imom))){
496 AliInfo(Form("Looking for spec(%d) mom(%f) timbin(%d)", spec, mom, timbin));
497 AliError(Form("THistogram id %d not found in DB.", ((spec==AliPID::kElectron)?0:1)*fNMom+imom));
500 Double_t LQ2 = hist->GetBinContent(iTBin);
502 // return interpolation over momentum binning
503 return LQ1 + (LQ2 - LQ1)*(mom - mom1)/(mom2 - mom1);
506 //__________________________________________________________________
507 Bool_t AliTRDCalPIDLQ::WriteReferences(Char_t *File, Char_t *dir)
509 // Build, Fill and write to file the histograms used for PID.
510 // The simulations are looked in the
511 // directories with the general form Form("p%3.1f", momentum)
512 // starting from dir (default .). Here momentum belongs to the list
513 // of known momentum to PID (see fTrackMomentum).
514 // The output histograms are
515 // written to the file "File" in cwd (default
516 // TRDPIDHistograms.root). In order to build a DB entry
517 // consider running $ALICE_ROOT/Cal/AliTRDCreateDummyCDB.C
520 // Alex Bercuci (A.Bercuci@gsi.de)
522 const Int_t nDirs = 1;
523 Int_t partCode[AliPID::kSPECIES] =
524 {kElectron, kMuonMinus, kPiPlus, kKPlus, kProton};
526 // minimal test of simulation location
527 TFile *f = new TFile(Form("%s/p%3.1f/galice.root", dir, 2.));
528 if(!f || f->IsZombie()){
529 AliError(Form("Could not access file galice in directry \"%s/p%3.1f\". Please check the location and try again.", dir, 2.));
532 f->Close(); delete f;
533 f = new TFile(Form("%s/p%3.1f/AliESDs.root", dir, 2.));
534 if(!f || f->IsZombie()){
535 AliError(Form("Could not access file AliESDs in directry \"%s/p%3.1f\". Please check the location and try again.", dir, 2.));
538 f->Close(); delete f;
542 Int_t nPart[AliPID::kSPECIES], nTotPart;
544 for(Int_t ispec=0; ispec<AliPID::kSPECIES; ispec++) printf(" %s[%%] ", fpartSymb[ispec]);
545 printf("\n-----------------------------------------------\n");
549 // Build PID reference histograms and reference object
550 const Int_t color[] = {4, 3, 2, 7, 6};
551 for (Int_t ispec = 0; ispec < AliPID::kSPECIES; ispec++){
552 if (ispec != AliPID::kElectron && ispec != AliPID::kPion) continue;
554 h1MaxTB[(ispec>0)?1:0] = new TH1F(Form("h1%s", fpartSymb[ispec]), "", fNTimeBins, -.5, fNTimeBins-.5);
555 h1MaxTB[(ispec>0)?1:0]->SetLineColor(color[ispec]);
557 AliTRDCalPIDLQRef ref;
560 AliRunLoader *fRunLoader = 0x0;
561 TFile *esdFile = 0x0;
562 TTree *esdTree = 0x0;
564 AliESDtrack *esdTrack = 0x0;
565 for (Int_t imom = 0; imom < fNMom; imom++) {
566 //for (Int_t imom = 4; imom < 5; imom++) {
569 for(Int_t idir = 0; idir<nDirs; idir++){
570 // open run loader and load gAlice, kinematics and header
571 fRunLoader = AliRunLoader::Open(Form("%s/p%3.1f/galice.root", dir, fTrackMomentum[imom]));
573 AliError(Form("Getting run loader for momentum %3.1f failed.", fTrackMomentum[imom]));
576 TString s; s.Form("%s/p%3.1f/", dir, fTrackMomentum[imom]);
577 fRunLoader->SetDirName(s);
578 fRunLoader->LoadgAlice();
579 gAlice = fRunLoader->GetAliRun();
581 AliError(Form("galice object not found for momentum %3.1f.", fTrackMomentum[imom]));
584 fRunLoader->LoadKinematics();
585 fRunLoader->LoadHeader();
588 esdFile = TFile::Open(Form("%s/p%3.1f/AliESDs.root", dir, fTrackMomentum[imom]));
589 if (!esdFile || esdFile->IsZombie()) {
590 AliError(Form("Opening ESD file failed for momentum", fTrackMomentum[imom]));
594 esdTree = (TTree*)esdFile->Get("esdTree");
596 AliError(Form("ESD tree not found for momentum %3.1f.", fTrackMomentum[imom]));
599 esdTree->SetBranchAddress("ESD", &esd);
601 for(Int_t ispec=0; ispec<AliPID::kSPECIES; ispec++) nPart[ispec] = 0;
605 for (Int_t iEvent = 0; iEvent < fRunLoader->GetNumberOfEvents(); iEvent++) {
606 fRunLoader->GetEvent(iEvent);
609 AliStack* stack = gAlice->Stack();
611 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(vertex);
613 // Load event summary data
614 esdTree->GetEvent(iEvent);
616 AliWarning(Form("ESD object not found for event %d. [@ momentum %3.1f]", iEvent, imom));
620 for(Int_t iTrack=0; iTrack<esd->GetNumberOfTracks(); iTrack++){
621 esdTrack = esd->GetTrack(iTrack);
623 if(!AliTRDpidESD::CheckTrack(esdTrack)) continue;
624 //if((esdTrack->GetStatus() & AliESDtrack::kITSrefit) == 0) continue;
625 //if(esdTrack->GetConstrainedChi2() > 1E9) continue;
626 //if ((esdTrack->GetStatus() & AliESDtrack::kESDpid) == 0) continue;
627 if (esdTrack->GetTRDsignal() == 0.) continue;
630 Int_t label = esdTrack->GetLabel();
631 if(label<0) continue;
632 if (label > stack->GetNtrack()) continue; // background
633 TParticle* particle = stack->Particle(label);
635 AliWarning(Form("Retriving particle with index %d from AliStack failed. [@ event %d track %d]", label, iEvent, iTrack));
638 if(particle->Pt() < 1.E-3) continue;
639 // if (TMath::Abs(particle->Eta()) > 0.3) continue;
640 TVector3 dVertex(particle->Vx() - vertex[0],
641 particle->Vy() - vertex[1],
642 particle->Vz() - vertex[2]);
643 if (dVertex.Mag() > 1.E-4){
644 //AliInfo(Form("Particle with index %d generated too far from vertex. Skip from analysis. Details follows. [@ event %d track %d]", label, iEvent, iTrack));
649 for (Int_t ispec=0; ispec<AliPID::kSPECIES; ispec++)
650 if(TMath::Abs(particle->GetPdgCode()) == partCode[ispec]){
656 nPart[iGen]++; nTotPart++;
659 Double_t dedx[AliTRDtrack::kNslice], dEdx;
661 for (Int_t iPlane=0; iPlane<AliTRDgeometry::kNplan; iPlane++){
662 // read data for track segment
663 for(int iSlice=0; iSlice<AliTRDtrack::kNslice; iSlice++)
664 dedx[iSlice] = esdTrack->GetTRDsignals(iPlane, iSlice);
665 dEdx = esdTrack->GetTRDsignals(iPlane, -1);
666 timebin = esdTrack->GetTRDTimBin(iPlane);
669 if ((dEdx <= 0.) || (timebin <= -1.)) continue;
671 // retrive kinematic info for this track segment
673 //if(!AliTRDpidESD::RecalculateTrackSegmentKine(esdTrack, iPlane, mom, length)) continue;
674 mom = esdTrack->GetOuterParam()->GetP();
676 // find segment length and momentum bin
677 Int_t jmom = 1, refMom = -1;
678 while(jmom<fNMom-1 && mom>fTrackMomentum[jmom]) jmom++;
679 if(TMath::Abs(fTrackMomentum[jmom-1] - mom) < fTrackMomentum[jmom-1] * .2) refMom = jmom-1;
680 else if(TMath::Abs(fTrackMomentum[jmom] - mom) < fTrackMomentum[jmom] * .2) refMom = jmom;
682 AliInfo(Form("Momentum at plane %d entrance not in momentum window. [@ event %d track %d]", iPlane, iEvent, iTrack));
685 /*while(jleng<fNLength-1 && length>fTrackSegLength[jleng]) jleng++;*/
687 // this track segment has fulfilled all requierments
690 if(dedx[0] > 0. && dedx[1] > 0.){
691 dedx[0] = log(dedx[0]); dedx[1] = log(dedx[1]);
692 ref.GetPrincipal(iGen)->AddRow(dedx);
694 h1MaxTB[(iGen>0)?1:0]->Fill(timebin);
699 delete esd; esd = 0x0;
701 delete esdFile; esdFile = 0x0;
703 fRunLoader->UnloadHeader();
704 fRunLoader->UnloadKinematics();
705 delete fRunLoader; fRunLoader = 0x0;
706 } // end directory loop
708 // use data to prepare references
709 ref.Prepare2DReferences();
710 // save this dEdx references
711 ref.SaveReferences(imom, File);
712 // save MaxTB references
713 SaveMaxTimeBin(imom, File);
716 // print momentum statistics
717 printf(" %3.1f ", fTrackMomentum[imom]);
718 for(Int_t ispec=0; ispec<AliPID::kSPECIES; ispec++) printf(" %5.2f ", 100.*nPart[ispec]/nTotPart);
720 } // end momentum loop
723 TListIter it((TList*)gROOT->GetListOfFiles());
724 while((fSave=(TFile*)it.Next()))
725 if(strcmp(File, fSave->GetName())==0) break;
734 //__________________________________________________________________
735 void AliTRDCalPIDLQ::SaveMaxTimeBin(const Int_t mom, const char *fn)
738 // Save the histograms
742 TListIter it((TList*)gROOT->GetListOfFiles());
743 TDirectory *pwd = gDirectory;
744 Bool_t kFOUND = kFALSE;
745 while((fSave=(TFile*)it.Next()))
746 if(strcmp(fn, fSave->GetName())==0){
750 if(!kFOUND) fSave = new TFile(fn, "RECREATE");
754 h = (TH1F*)h1MaxTB[0]->Clone(Form("h1MaxTBEL%02d", mom));
755 h->SetTitle(Form("Maximum Time Bin distribution for electrons @ %4.1f GeV", fTrackMomentum[mom]));
756 h->GetXaxis()->SetTitle("time [100 ns]");
757 h->GetYaxis()->SetTitle("Probability");
760 h = (TH1F*)h1MaxTB[1]->Clone(Form("h1MaxTBPI%02d", mom));
761 h->SetTitle(Form("Maximum Time Bin distribution for pions @ %4.1f GeV", fTrackMomentum[mom]));
762 h->GetXaxis()->SetTitle("time [100 ns]");
763 h->GetYaxis()->SetTitle("Probability");