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
82 //_________________________________________________________________________
83 AliTRDCalPIDLQ::AliTRDCalPIDLQ(const Text_t *name, const Text_t *title)
98 // The main constructor
105 //_____________________________________________________________________________
106 AliTRDCalPIDLQ::AliTRDCalPIDLQ(const AliTRDCalPIDLQ &c)
110 ,fNLength(c.fNLength)
111 ,fTrackSegLength(0x0)
112 ,fNTimeBins(c.fNTimeBins)
113 ,fMeanChargeRatio(c.fMeanChargeRatio)
115 ,fBinSize(c.fBinSize)
124 if (this != &c) ((AliTRDCalPIDLQ &) c).Copy(*this);
128 //_________________________________________________________________________
129 AliTRDCalPIDLQ::~AliTRDCalPIDLQ()
139 //_________________________________________________________________________
140 void AliTRDCalPIDLQ::CleanUp()
143 // Delets all newly created objects
156 if (fTrackMomentum) {
157 delete[] fTrackMomentum;
158 fTrackMomentum = 0x0;
161 if (fTrackSegLength) {
162 delete[] fTrackSegLength;
163 fTrackSegLength = 0x0;
173 //_____________________________________________________________________________
174 AliTRDCalPIDLQ &AliTRDCalPIDLQ::operator=(const AliTRDCalPIDLQ &c)
177 // Assignment operator
180 if (this != &c) ((AliTRDCalPIDLQ &) c).Copy(*this);
185 //_____________________________________________________________________________
186 void AliTRDCalPIDLQ::Copy(TObject &c) const
192 AliTRDCalPIDLQ& target = (AliTRDCalPIDLQ &) c;
196 target.fNbins = fNbins;
197 target.fBinSize = fBinSize;
198 target.fMeanChargeRatio = fMeanChargeRatio;
199 target.fNTimeBins = fNTimeBins;
201 //target.fNMom = fNMom;
202 target.fTrackMomentum = new Double_t[fNMom];
203 for (Int_t i=0; i<fNMom; ++i) {
204 target.fTrackMomentum[i] = fTrackMomentum[i];
207 //target.fNLength = fNLength;
208 target.fTrackSegLength = new Double_t[fNLength];
209 for (Int_t i=0; i<fNLength; ++i) {
210 target.fTrackSegLength[i] = fTrackSegLength[i];
214 target.fHistdEdx = (TObjArray*) fHistdEdx->Clone();
217 target.fHistTimeBin = (TObjArray*) fHistTimeBin->Clone();
220 target.fEstimator = new AliTRDCalPIDLQRef(*fEstimator);
226 //_________________________________________________________________________
227 void AliTRDCalPIDLQ::Init()
236 fTrackMomentum = new Double_t[fNMom];
237 fTrackMomentum[0] = 0.6;
238 fTrackMomentum[1] = 0.8;
239 fTrackMomentum[2] = 1.0;
240 fTrackMomentum[3] = 1.5;
241 fTrackMomentum[4] = 2.0;
242 fTrackMomentum[5] = 3.0;
243 fTrackMomentum[6] = 4.0;
244 fTrackMomentum[7] = 5.0;
245 fTrackMomentum[8] = 6.0;
246 fTrackMomentum[9] = 8.0;
247 fTrackMomentum[10] = 10.0;
249 fTrackSegLength = new Double_t[fNLength];
250 fTrackSegLength[0] = 3.7;
251 fTrackSegLength[1] = 3.9;
252 fTrackSegLength[2] = 4.2;
253 fTrackSegLength[3] = 5.0;
255 fHistdEdx = new TObjArray(AliPID::kSPECIES * fNMom/* * fNLength*/);
256 fHistdEdx->SetOwner();
257 fHistTimeBin = new TObjArray(2 * fNMom);
258 fHistTimeBin->SetOwner();
259 // Initialization of estimator at object instantiation because late
260 // initialization in function GetProbability() is not working due to
261 // constantness of this function.
262 fEstimator = new AliTRDCalPIDLQRef();
264 // Number of Time bins
265 AliTRDcalibDB *calibration = AliTRDcalibDB::Instance();
267 AliWarning("No AliTRDcalibDB available. Using 22 time bins.");
269 } else fNTimeBins = calibration->GetNumberOfTimeBins();
271 // ADC Gain normalization
272 fMeanChargeRatio = 1.0;
274 // Number of bins and bin size
279 //_________________________________________________________________________
280 Bool_t AliTRDCalPIDLQ::ReadReferences(Char_t *responseFile)
283 // Read the TRD dEdx histograms.
286 // Read histogram Root file
287 TFile *histFile = new TFile(responseFile, "READ");
288 if (!histFile || !histFile->IsOpen()) {
289 AliError(Form("Opening TRD histgram file %s failed", responseFile));
295 for (Int_t iparticle = 0; iparticle < AliPID::kSPECIES; iparticle++){
296 for (Int_t imom = 0; imom < fNMom; imom++){
297 TH2D* hist = (TH2D*)histFile->Get(Form("h2dEdx%s%02d", fpartSymb[iparticle], imom/*, ilength*/))->Clone();
298 hist->Scale(1./hist->Integral());
299 fHistdEdx->AddAt(hist, GetHistID(iparticle, imom));
301 if (iparticle != AliPID::kElectron && iparticle != AliPID::kPion) continue;
303 TH1F* ht = (TH1F*)histFile->Get(Form("h1MaxTB%s%02d", fpartSymb[iparticle], imom))->Clone();
304 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));
305 ht->Scale(1./ht->Integral());
306 fHistTimeBin->AddAt(ht, ((iparticle==AliPID::kElectron)?0:1)*fNMom + imom);
313 // Number of bins and bin size
314 //TH1F* hist = (TH1F*) fHistdEdx->At(GetHistID(AliPID::kPion, 1));
315 //fNbins = hist->GetNbinsX();
316 //fBinSize = hist->GetBinWidth(1);
322 // //_________________________________________________________________________
323 // Double_t AliTRDCalPIDLQ::GetMean(Int_t k, Int_t ip) const
326 // // Gets mean of de/dx dist. of e
329 // AliInfo(Form("Mean for particle = %s and momentum = %.2f is:\n"
331 // ,fTrackMomentum[ip]));
332 // if (k < 0 || k > AliPID::kSPECIES) {
336 // return ((TH1F*) fHistdEdx->At(GetHistID(k,ip)))->GetMean();
340 // //_________________________________________________________________________
341 // Double_t AliTRDCalPIDLQ::GetNormalization(Int_t k, Int_t ip) const
344 // // Gets Normalization of de/dx dist. of e
347 // AliInfo(Form("Normalization for particle = %s and momentum = %.2f is:\n"
349 // ,fTrackMomentum[ip]));
350 // if (k < 0 || k > AliPID::kSPECIES) {
354 // return ((TH1F*) fHistdEdx->At(GetHistID(k,ip)))->Integral();
358 //_________________________________________________________________________
359 TH1* AliTRDCalPIDLQ::GetHistogram(Int_t k, Int_t ip/*, Int_t il*/) const
362 // Returns one selected dEdx histogram
365 if (k < 0 || k >= AliPID::kSPECIES) return 0x0;
366 if(ip<0 || ip>= fNMom ) return 0x0;
368 AliInfo(Form("Retrive dEdx histogram for %s of %5.2f GeV/c", fpartName[k], fTrackMomentum[ip]));
370 return (TH1*)fHistdEdx->At(GetHistID(k, ip));
374 //_________________________________________________________________________
375 TH1* AliTRDCalPIDLQ::GetHistogramT(Int_t k, Int_t ip) const
378 // Returns one selected time bin max histogram
381 if (k < 0 || k >= AliPID::kSPECIES) return 0x0;
382 if(ip<0 || ip>= fNMom ) return 0x0;
384 AliInfo(Form("Retrive MaxTB histogram for %s of %5.2f GeV/c", fpartName[k], fTrackMomentum[ip]));
386 return (TH1*)fHistTimeBin->At(((k==AliPID::kElectron)?0:1)*fNMom+ip);
389 //_________________________________________________________________________
390 Double_t AliTRDCalPIDLQ::GetProbability(Int_t spec, Double_t mom, Double_t *dedx, Double_t length) const
393 // Core function of AliTRDCalPIDLQ class for calculating the
394 // likelihood for species "spec" (see AliTRDtrack::kNspecie) of a
395 // given momentum "mom" and a given dE/dx (slice "dedx") yield per
399 if (spec < 0 || spec >= AliPID::kSPECIES) return 0.;
401 //Double_t dedx = dedx1/fMeanChargeRatio;
403 // find the interval in momentum and track segment length which applies for this data
405 while(ilength<fNLength-1 && length>fTrackSegLength[ilength]){
409 while(imom<fNMom-1 && mom>fTrackMomentum[imom]) imom++;
411 Int_t nbinsx, nbinsy;
412 TAxis *ax = 0x0, *ay = 0x0;
414 Double_t mom1 = fTrackMomentum[imom-1], mom2 = fTrackMomentum[imom];
416 if(!(hist = (TH2D*)fHistdEdx->At(GetHistID(spec, imom-1/*, ilength*/)))){
417 AliInfo(Form("Looking for spec(%d) mom(%f) Ex(%f) Ey(%f) length(%f)", spec, mom, dedx[0], dedx[1], length));
418 AliError(Form("EHistogram id %d not found in DB.", GetHistID(spec, imom-1)));
421 ax = hist->GetXaxis(); nbinsx = ax->GetNbins();
422 ay = hist->GetYaxis(); nbinsy = ay->GetNbins();
423 Bool_t kX = (dedx[0] < ax->GetBinUpEdge(nbinsx));
424 Bool_t kY = (dedx[1] < ay->GetBinUpEdge(nbinsy));
426 if(kY) LQ1 = hist->GetBinContent( hist->FindBin(dedx[0], dedx[1])); //fEstimator->Estimate2D2(hist, (Float_t&)dedx[0], (Float_t&)dedx[1]);
427 else LQ1 = hist->GetBinContent(ax->FindBin(dedx[0]), nbinsy);
429 if(kY) LQ1 = hist->GetBinContent(nbinsx, ay->FindBin(dedx[1]));
430 else LQ1 = hist->GetBinContent(nbinsx, nbinsy);
433 if(!(hist = (TH2D*)fHistdEdx->At(GetHistID(spec, imom/*, ilength*/)))){
434 AliInfo(Form("Looking for spec(%d) mom(%f) Ex(%f) Ey(%f) length(%f)", spec, mom, dedx[0], dedx[1], length));
435 AliError(Form("EHistogram id %d not found in DB.", GetHistID(spec, imom)));
439 if(kY) LQ2 = hist->GetBinContent( hist->FindBin(dedx[0], dedx[1])); //fEstimator->Estimate2D2(hist, (Float_t&)dedx[0], (Float_t&)dedx[1]);
440 else LQ2 = hist->GetBinContent(ax->FindBin(dedx[0]), nbinsy);
442 if(kY) LQ2 = hist->GetBinContent(nbinsx, ay->FindBin(dedx[1]));
443 else LQ2 = hist->GetBinContent(nbinsx, nbinsy);
446 // return interpolation over momentum binning
447 return LQ1 + (LQ2 - LQ1)*(mom - mom1)/(mom2 - mom1);
451 //_________________________________________________________________________
452 Double_t AliTRDCalPIDLQ::GetProbabilityT(Int_t spec, Double_t mom, Int_t timbin) const
455 // Gets the Probability of having timbin at a given momentum (mom)
456 // and particle type (spec) (0 for e) and (2 for pi)
457 // from the precalculated timbin distributions
460 if (spec < 0 || spec >= AliPID::kSPECIES) return 0.;
461 if (timbin<0 || timbin >= fNTimeBins) return 0.;
463 Int_t iTBin = timbin+1;
465 // Everything which is not an electron counts as a pion for time bin max
466 //if(spec != AliPID::kElectron) spec = AliPID::kPion;
471 while(imom<fNMom-1 && mom>fTrackMomentum[imom]) imom++;
473 Double_t mom1 = fTrackMomentum[imom-1], mom2 = fTrackMomentum[imom];
475 if(!(hist = (TH1F*) fHistTimeBin->At(((spec==AliPID::kElectron)?0:1)*fNMom+imom-1))){
476 AliInfo(Form("Looking for spec(%d) mom(%f) timbin(%d)", spec, mom, timbin));
477 AliError(Form("THistogram id %d not found in DB.", ((spec==AliPID::kElectron)?0:1)*fNMom+imom-1));
480 Double_t LQ1 = hist->GetBinContent(iTBin);
482 if(!(hist = (TH1F*) fHistTimeBin->At(((spec==AliPID::kElectron)?0:1)*fNMom+imom))){
483 AliInfo(Form("Looking for spec(%d) mom(%f) timbin(%d)", spec, mom, timbin));
484 AliError(Form("THistogram id %d not found in DB.", ((spec==AliPID::kElectron)?0:1)*fNMom+imom));
487 Double_t LQ2 = hist->GetBinContent(iTBin);
489 // return interpolation over momentum binning
490 return LQ1 + (LQ2 - LQ1)*(mom - mom1)/(mom2 - mom1);
493 //__________________________________________________________________
494 Bool_t AliTRDCalPIDLQ::WriteReferences(Char_t *File, Char_t *dir)
496 // Build, Fill and write to file the histograms used for PID.
497 // The simulations are looked in the
498 // directories with the general form Form("p%3.1f", momentum)
499 // starting from dir (default .). Here momentum belongs to the list
500 // of known momentum to PID (see fTrackMomentum).
501 // The output histograms are
502 // written to the file "File" in cwd (default
503 // TRDPIDHistograms.root). In order to build a DB entry
504 // consider running $ALICE_ROOT/Cal/AliTRDCreateDummyCDB.C
507 // Alex Bercuci (A.Bercuci@gsi.de)
509 const Int_t nDirs = 1;
510 Int_t partCode[AliPID::kSPECIES] =
511 {kElectron, kMuonMinus, kPiPlus, kKPlus, kProton};
513 // minimal test of simulation location
514 TFile *f = new TFile(Form("%s/p%3.1f/galice.root", dir, 2.));
515 if(!f || f->IsZombie()){
516 AliError(Form("Could not access file galice in directry \"%s/p%3.1f\". Please check the location and try again.", dir, 2.));
519 f->Close(); delete f;
520 f = new TFile(Form("%s/p%3.1f/AliESDs.root", dir, 2.));
521 if(!f || f->IsZombie()){
522 AliError(Form("Could not access file AliESDs in directry \"%s/p%3.1f\". Please check the location and try again.", dir, 2.));
525 f->Close(); delete f;
529 Int_t nPart[AliPID::kSPECIES], nTotPart;
531 for(Int_t ispec=0; ispec<AliPID::kSPECIES; ispec++) printf(" %s[%%] ", fpartSymb[ispec]);
532 printf("\n-----------------------------------------------\n");
536 // Build PID reference histograms and reference object
537 const Int_t color[] = {4, 3, 2, 7, 6};
538 for (Int_t ispec = 0; ispec < AliPID::kSPECIES; ispec++){
539 if (ispec != AliPID::kElectron && ispec != AliPID::kPion) continue;
541 h1MaxTB[(ispec>0)?1:0] = new TH1F(Form("h1%s", fpartSymb[ispec]), "", fNTimeBins, -.5, fNTimeBins-.5);
542 h1MaxTB[(ispec>0)?1:0]->SetLineColor(color[ispec]);
544 AliTRDCalPIDLQRef ref;
547 AliRunLoader *fRunLoader = 0x0;
548 TFile *esdFile = 0x0;
549 TTree *esdTree = 0x0;
551 AliESDtrack *esdTrack = 0x0;
552 for (Int_t imom = 0; imom < fNMom; imom++) {
553 //for (Int_t imom = 4; imom < 5; imom++) {
556 for(Int_t idir = 0; idir<nDirs; idir++){
557 // open run loader and load gAlice, kinematics and header
558 fRunLoader = AliRunLoader::Open(Form("%s/p%3.1f/galice.root", dir, fTrackMomentum[imom]));
560 AliError(Form("Getting run loader for momentum %3.1f failed.", fTrackMomentum[imom]));
563 TString s; s.Form("%s/p%3.1f/", dir, fTrackMomentum[imom]);
564 fRunLoader->SetDirName(s);
565 fRunLoader->LoadgAlice();
566 gAlice = fRunLoader->GetAliRun();
568 AliError(Form("galice object not found for momentum %3.1f.", fTrackMomentum[imom]));
571 fRunLoader->LoadKinematics();
572 fRunLoader->LoadHeader();
575 esdFile = TFile::Open(Form("%s/p%3.1f/AliESDs.root", dir, fTrackMomentum[imom]));
576 if (!esdFile || esdFile->IsZombie()) {
577 AliError(Form("Opening ESD file failed for momentum", fTrackMomentum[imom]));
581 esdTree = (TTree*)esdFile->Get("esdTree");
583 AliError(Form("ESD tree not found for momentum %3.1f.", fTrackMomentum[imom]));
586 esdTree->SetBranchAddress("ESD", &esd);
588 for(Int_t ispec=0; ispec<AliPID::kSPECIES; ispec++) nPart[ispec] = 0;
592 for (Int_t iEvent = 0; iEvent < fRunLoader->GetNumberOfEvents(); iEvent++) {
593 fRunLoader->GetEvent(iEvent);
596 AliStack* stack = gAlice->Stack();
598 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(vertex);
600 // Load event summary data
601 esdTree->GetEvent(iEvent);
603 AliWarning(Form("ESD object not found for event %d. [@ momentum %3.1f]", iEvent, imom));
607 for(Int_t iTrack=0; iTrack<esd->GetNumberOfTracks(); iTrack++){
608 esdTrack = esd->GetTrack(iTrack);
610 if(!AliTRDpidESD::CheckTrack(esdTrack)) continue;
611 //if((esdTrack->GetStatus() & AliESDtrack::kITSrefit) == 0) continue;
612 //if(esdTrack->GetConstrainedChi2() > 1E9) continue;
613 //if ((esdTrack->GetStatus() & AliESDtrack::kESDpid) == 0) continue;
614 if (esdTrack->GetTRDsignal() == 0.) continue;
617 Int_t label = esdTrack->GetLabel();
618 if(label<0) continue;
619 if (label > stack->GetNtrack()) continue; // background
620 TParticle* particle = stack->Particle(label);
622 AliWarning(Form("Retriving particle with index %d from AliStack failed. [@ event %d track %d]", label, iEvent, iTrack));
625 if(particle->Pt() < 1.E-3) continue;
626 // if (TMath::Abs(particle->Eta()) > 0.3) continue;
627 TVector3 dVertex(particle->Vx() - vertex[0],
628 particle->Vy() - vertex[1],
629 particle->Vz() - vertex[2]);
630 if (dVertex.Mag() > 1.E-4){
631 //AliInfo(Form("Particle with index %d generated too far from vertex. Skip from analysis. Details follows. [@ event %d track %d]", label, iEvent, iTrack));
636 for (Int_t ispec=0; ispec<AliPID::kSPECIES; ispec++)
637 if(TMath::Abs(particle->GetPdgCode()) == partCode[ispec]){
643 nPart[iGen]++; nTotPart++;
646 Double_t dedx[AliTRDtrack::kNslice], dEdx;
648 for (Int_t iPlane=0; iPlane<AliTRDgeometry::kNplan; iPlane++){
649 // read data for track segment
650 for(int iSlice=0; iSlice<AliTRDtrack::kNslice; iSlice++)
651 dedx[iSlice] = esdTrack->GetTRDsignals(iPlane, iSlice);
652 dEdx = esdTrack->GetTRDsignals(iPlane, -1);
653 timebin = esdTrack->GetTRDTimBin(iPlane);
656 if ((dEdx <= 0.) || (timebin <= -1.)) continue;
658 // retrive kinematic info for this track segment
659 if(!AliTRDpidESD::GetTrackSegmentKine(esdTrack, iPlane, mom, length)) continue;
661 // find segment length and momentum bin
662 Int_t jmom = 1, refMom = -1;
663 while(jmom<fNMom-1 && mom>fTrackMomentum[jmom]) jmom++;
664 if(TMath::Abs(fTrackMomentum[jmom-1] - mom) < fTrackMomentum[jmom-1] * .2) refMom = jmom-1;
665 else if(TMath::Abs(fTrackMomentum[jmom] - mom) < fTrackMomentum[jmom] * .2) refMom = jmom;
667 AliInfo(Form("Momentum at plane %d entrance not in momentum window. [@ event %d track %d]", iPlane, iEvent, iTrack));
670 /*while(jleng<fNLength-1 && length>fTrackSegLength[jleng]) jleng++;*/
672 // this track segment has fulfilled all requierments
675 if(dedx[0] > 0. && dedx[1] > 0.){
676 dedx[0] = log(dedx[0]); dedx[1] = log(dedx[1]);
677 ref.GetPrincipal(iGen)->AddRow(dedx);
679 h1MaxTB[(iGen>0)?1:0]->Fill(timebin);
684 delete esd; esd = 0x0;
686 delete esdFile; esdFile = 0x0;
688 fRunLoader->UnloadHeader();
689 fRunLoader->UnloadKinematics();
690 delete fRunLoader; fRunLoader = 0x0;
691 } // end directory loop
693 // use data to prepare references
694 ref.Prepare2DReferences();
695 // save this dEdx references
696 ref.SaveReferences(imom, File);
697 // save MaxTB references
698 SaveMaxTimeBin(imom, File);
701 // print momentum statistics
702 printf(" %3.1f ", fTrackMomentum[imom]);
703 for(Int_t ispec=0; ispec<AliPID::kSPECIES; ispec++) printf(" %5.2f ", 100.*nPart[ispec]/nTotPart);
705 } // end momentum loop
708 TListIter it((TList*)gROOT->GetListOfFiles());
709 while((fSave=(TFile*)it.Next()))
710 if(strcmp(File, fSave->GetName())==0) break;
719 //__________________________________________________________________
720 void AliTRDCalPIDLQ::SaveMaxTimeBin(const Int_t mom, const char *fn)
723 // Save the histograms
727 TListIter it((TList*)gROOT->GetListOfFiles());
728 TDirectory *pwd = gDirectory;
729 Bool_t kFOUND = kFALSE;
730 while((fSave=(TFile*)it.Next()))
731 if(strcmp(fn, fSave->GetName())==0){
735 if(!kFOUND) fSave = new TFile(fn, "RECREATE");
739 h = (TH1F*)h1MaxTB[0]->Clone(Form("h1MaxTBEL%02d", mom));
740 h->SetTitle(Form("Maximum Time Bin distribution for electrons @ %4.1f GeV", fTrackMomentum[mom]));
741 h->GetXaxis()->SetTitle("time [100 ns]");
742 h->GetYaxis()->SetTitle("Probability");
745 h = (TH1F*)h1MaxTB[1]->Clone(Form("h1MaxTBPI%02d", mom));
746 h->SetTitle(Form("Maximum Time Bin distribution for pions @ %4.1f GeV", fTrackMomentum[mom]));
747 h->GetXaxis()->SetTitle("time [100 ns]");
748 h->GetYaxis()->SetTitle("Probability");