ROOT logo
// Author: Daniel.Lohner@cern.ch

#include "AliTRDNDFast.h"
#include "TCanvas.h"

extern Double_t langaufunc(Double_t *x, Double_t *par) {

    // needs protection, parameter [3]>0!!!!!
    // needs protection, parameter [4]>0!!!!!

    //Fit parameters:
    //par[0]=Width (scale) parameter of Landau density
    //par[1]=Most Probable (MP, location) parameter of Landau density
    //par[2]=Total area (integral -inf to inf, normalization constant)
    //par[3]=Width (sigma) of convoluted Gaussian function
    //par[4]=Exponential Slope Parameter
    //
    //In the Landau distribution (represented by the CERNLIB approximation),
    //the maximum is located at x=-0.22278298 with the location parameter=0.
    //This shift is corrected within this function, so that the actual
    //maximum is identical to the MP parameter.

    // Numeric constants
    Double_t invsq2pi = 0.3989422804014;   // (2 pi)^(-1/2)
    Double_t mpshift  = -0.22278298;       // Landau maximum location

    // Control constants
    Double_t np = 100.0;      // number of convolution stpdf
    Double_t sc =   5.0;      // convolution extends to +-sc Gaussian sigmas

    // Variables
    Double_t xx;
    Double_t mpc;
    Double_t fland;
    Double_t sum = 0.0;
    Double_t xlow,xupp;
    Double_t step;
    Double_t i;

    // MP shift correction
    mpc = par[1] - mpshift * par[0];

    // Range of convolution integral
    xlow = x[0] - sc * par[3];
    xupp = x[0] + sc * par[3];

    if(xlow<0)xlow=0;
    if(xupp<xlow)cout<<"ERROR: Convolution around Negative MPV"<<endl;

    step = (xupp-xlow) / np;

    // Convolution integral of Landau and Gaussian by sum
    for(i=1.0; i<=np/2; i++) {
	xx = xlow + (i-.5) * step;
	fland = TMath::Landau(xx,mpc,par[0])*TMath::Exp(-par[4]*xx) / par[0];	// mpc taken out
	sum += fland * TMath::Gaus(x[0],xx,par[3]);

	xx = xupp - (i-.5) * step;
	fland = TMath::Landau(xx,mpc,par[0])*TMath::Exp(-par[4]*xx) / par[0];	// mpc taken out
	sum += fland * TMath::Gaus(x[0],xx,par[3]);
    }

    return (par[2] * step * sum * invsq2pi / par[3]);
}



ClassImp(AliTRDNDFast);

AliTRDNDFast::AliTRDNDFast(): TObject(),
    fNDim(0),
    fTitle(""),
    fFunc(NULL),
    fHistos(NULL),
    fPars()
{
    // default constructor
}

AliTRDNDFast::AliTRDNDFast(const char *name,Int_t ndim,Int_t nbins,Double_t xlow,Double_t xup): TObject(),
fNDim(ndim),
fTitle(name),
fFunc(NULL),
fHistos(NULL),
fPars()
{
    Init();
    for(Int_t idim=0;idim<fNDim;idim++){
	fHistos[idim]=new TH1F(Form("%s_axis_%d",fTitle.Data(),idim),Form("%s_axis_%d",fTitle.Data(),idim),nbins,xlow,xup);
	fHistos[idim]->SetDirectory(0);
    }
}

AliTRDNDFast::AliTRDNDFast(const AliTRDNDFast &ref) : TObject(ref),
fNDim(ref.fNDim),
fTitle(ref.fTitle),
fFunc(NULL),
fHistos(NULL),
fPars()
{
    Cleanup();
    Init();
    for(Int_t idim=0;idim<fNDim;idim++){
	fHistos[idim]=(TH1F*)ref.fHistos[idim]->Clone(Form("%s_axis_%d",GetName(),idim));
	fHistos[idim]->SetDirectory(0);
	for(Int_t ipar=0;ipar<kNpar;ipar++)fPars[idim][ipar]=ref.fPars[idim][ipar];
    }
}

AliTRDNDFast &AliTRDNDFast::operator=(const AliTRDNDFast &ref){
    //
    // Assignment operator
    //
    if(this != &ref){
	TObject::operator=(ref);
	fNDim=ref.fNDim;
	fTitle=ref.fTitle;
	fFunc = ref.fFunc;
	for(Int_t idim=0;idim<fNDim;idim++){
	  fHistos[idim]=(TH1F*)ref.fHistos[idim]->Clone(Form("%s_axis_%d",GetName(),idim));
	  fHistos[idim]->SetDirectory(0);
	  for(Int_t ipar=0;ipar<kNpar;ipar++)fPars[idim][ipar]=ref.fPars[idim][ipar];
	}
    }
    return *this;
}

AliTRDNDFast::~AliTRDNDFast(){
    Cleanup();

}

void AliTRDNDFast::Init(){

    for(Int_t ipar=0;ipar<kNpar;ipar++)fPars[ipar].Set(fNDim);
    fFunc=new TF1*[fNDim];
    fHistos=new TH1F*[fNDim];
    for(Int_t idim=0;idim<fNDim;idim++){
        fHistos[idim]=NULL;
	for(Int_t ipar=0;ipar<kNpar;ipar++)fPars[ipar].SetAt(0,idim);
	fFunc[idim]=NULL;
    }
}

void AliTRDNDFast::Cleanup(){
    if(fHistos){
	for(Int_t idim=0;idim<fNDim;idim++){
	    if(fHistos[idim]){
		delete fHistos[idim];
		fHistos[idim]=NULL;
	    }
	}
	delete[] fHistos;
	fHistos=NULL;
    }
    if(fPars){
	for(Int_t ipar=0;ipar<kNpar;ipar++){
	    fPars[ipar].Reset();
	}
    }
    if(fFunc){
	for(Int_t idim=0;idim<fNDim;idim++){
	    if(fFunc[idim]){
		delete fFunc[idim];
		fFunc[idim]=NULL;
	    }
	}
	delete[] fFunc;
	fFunc=NULL;
    }
}

void AliTRDNDFast::PrintPars(){
    for(Int_t idim=0;idim<fNDim;idim++){
	for(Int_t ipar=0;ipar<kNpar;ipar++)cout<<idim<<" "<<ipar<<" "<<GetParam(idim,ipar)<<endl;
    }
}

void AliTRDNDFast::ScaleLangauFun(TF1 *func,Double_t mpv){

    Double_t start[kNpar],low[kNpar],high[kNpar];
    for(Int_t ii=0;ii<kNpar;ii++){
	start[ii]=func->GetParameter(ii);
	func->GetParLimits(ii,low[ii],high[ii]);
    }

    Double_t scalefactor=mpv/start[1];

    for(Int_t ii=0;ii<kNpar;ii++){
	Double_t scale=1;
	if(ii==0||ii==1||ii==3)scale=scalefactor;
	if(ii==4)scale=1./scalefactor;
	start[ii]*=scale;
	low[ii]*=scale;
	high[ii]*=scale;
	func->SetParLimits(ii, low[ii], high[ii]);
    }
    func->SetParameters(start);
}

//---------------------------------------------------------------
//---------------------------------------------------------------
TF1 *AliTRDNDFast::GetLangauFun(TString funcname,Double_t range[2],Double_t scalefactor){

    Double_t start[kNpar] = {120, 1000, 1, 100, 1e-5};
    Double_t low[kNpar] = {10, 300, 0.01, 1, 0.};
    Double_t high[kNpar] = {1000, 3000, 100, 1000, 1.};

    TF1 *hlandauE=new TF1(funcname.Data(),langaufunc,0,range[1],kNpar);
    hlandauE->SetParameters(start);
    hlandauE->SetParNames("Width","MP","Area","GSigma","delta");
    for (int i=0; i<kNpar; i++) {
	hlandauE->SetParLimits(i, low[i], high[i]);
    }

    if(scalefactor!=1){ScaleLangauFun(hlandauE,scalefactor*start[1]);}

    return hlandauE;
}

TF1 *AliTRDNDFast::FitLandau(TString name,TH1F *htemp,Double_t range[2],TString option){

    TF1 *fitlandau1D=GetLangauFun(name,range);
    TF1 fit("land","landau");
    Double_t max=htemp->GetXaxis()->GetBinCenter(htemp->GetMaximumBin());
    fit.SetParameter(1,max);
    fit.SetParLimits(1,0,htemp->GetXaxis()->GetXmax());
    fit.SetParameter(2,0.3*max); // MPV may never become negative!!!!!
    htemp->Fit("land",option.Data(),"",range[0],range[1]);
    ScaleLangauFun(fitlandau1D,fit.GetParameter(1));
    htemp->Fit(fitlandau1D,option.Data(),"",range[0],range[1]); // range for references
    return fitlandau1D;
}

void AliTRDNDFast::BuildHistos(){

    for(Int_t idim=0;idim<fNDim;idim++){
        fHistos[idim]->Reset();
	// Fill Histo
	Double_t pars[kNpar];
	for(Int_t ipar=0;ipar<kNpar;ipar++)pars[ipar]=GetParam(idim,ipar);
        // Also Fill overflow bins!!!
	for(Int_t ii=1;ii<=fHistos[idim]->GetNbinsX()+1;ii++){
	    Double_t xval=fHistos[idim]->GetXaxis()->GetBinCenter(ii);
	    Double_t val=langaufunc(&xval,&pars[0]);
	    //Double_t val=fFunc[idim]->Eval(xval);
	    fHistos[idim]->SetBinContent(ii,val);
	}
	// Normalization
	fHistos[idim]->Scale(1./fHistos[idim]->Integral(1,fHistos[idim]->GetNbinsX(),"width"));
    }
}

void AliTRDNDFast::Build(Double_t **pars){
    // pars[ndim][npar]
    for(Int_t idim=0;idim<fNDim;idim++){
	for(Int_t ipar=0;ipar<kNpar;ipar++){
	    fPars[ipar].SetAt(pars[idim][ipar],idim);
	}
    }
    BuildHistos();
}


void AliTRDNDFast::Build(TH1F **hdEdx,TString path){

    Double_t range[2];

    TCanvas *CANV=new TCanvas("a","a");
    if(fNDim==2)CANV->Divide(2,1);
    if(fNDim==3)CANV->Divide(2,2);
    if(fNDim>6)CANV->Divide(3,3);
    // Fit and Extract Parameters
    for(Int_t idim=0;idim<fNDim;idim++){
	CANV->cd(idim+1);
        gPad->SetLogy();
	range[0]=hdEdx[idim]->GetXaxis()->GetXmin();
	range[1]=hdEdx[idim]->GetXaxis()->GetXmax();
	// Norm Histogram
	hdEdx[idim]->Scale(1./hdEdx[idim]->Integral(1,hdEdx[idim]->GetNbinsX(),"width"));
        // Fit Histogram
	fFunc[idim]=FitLandau(Form("fit%d",idim),hdEdx[idim],range,"RMB0");
	// Norm Landau
	fFunc[idim]->SetParameter(2,fFunc[idim]->GetParameter(2)/fFunc[idim]->Integral(range[0],range[1]));
	hdEdx[idim]->DrawCopy();
        fFunc[idim]->DrawCopy("same");
	// Set Pars
	for(Int_t ipar=0;ipar<kNpar;ipar++)fPars[ipar].SetAt(fFunc[idim]->GetParameter(ipar),idim);
    }
    if(path!="")CANV->Print(Form("%s/%s_Build.pdf",path.Data(),fTitle.Data()));
    delete CANV;

    BuildHistos();
}

Double_t AliTRDNDFast::Eval(Double_t *point) const{
    Double_t val=1;
    for(Int_t idim=0;idim<fNDim;idim++){
	Int_t bin=fHistos[idim]->GetXaxis()->FindBin(point[idim]);
	val*=fHistos[idim]->GetBinContent(bin);
    }
    return val;
}

void AliTRDNDFast::Random(Double_t *point) const{
    for(Int_t idim=0;idim<fNDim;idim++){
	point[idim]=fHistos[idim]->GetRandom();
    }
}

void AliTRDNDFast::Random(Double_t *point,AliTRDNDFast *nd0,AliTRDNDFast *nd1,Double_t w0,Double_t w1){
    for(Int_t idim=0;idim<nd0->fNDim;idim++){
	point[idim]=GetRandomInterpolation(nd0->fHistos[idim],nd1->fHistos[idim],w0,w1);
    }
}

Int_t AliTRDNDFast::BinarySearchInterpolation(Int_t start,Int_t end,Double_t *a0,Double_t *a1,Double_t w0,Double_t w1,Double_t val){

    if((end-start)==1)return start;
    Int_t mid=Int_t((end+start)/2);
    Double_t valmid=(w0*a0[mid]+w1*a1[mid])/(w0+w1);
    if(val>=valmid)return BinarySearchInterpolation(mid,end,a0,a1,w0,w1,val);
    return BinarySearchInterpolation(start,mid,a0,a1,w0,w1,val);
}

Double_t AliTRDNDFast::GetRandomInterpolation(TH1F *hist0,TH1F *hist1,Double_t w0,Double_t w1){

    // Draw Random Variable
    Double_t rand=gRandom->Rndm();

    // Get Integral Arrays
    Double_t *integral0=hist0->GetIntegral();
    Double_t *integral1=hist1->GetIntegral();

    Int_t nbinsX=hist0->GetNbinsX();

    Int_t ibin=BinarySearchInterpolation(1,nbinsX+1,integral0,integral1,w0,w1,rand);
    return hist0->GetXaxis()->GetBinCenter(ibin);
}



 AliTRDNDFast.cxx:1
 AliTRDNDFast.cxx:2
 AliTRDNDFast.cxx:3
 AliTRDNDFast.cxx:4
 AliTRDNDFast.cxx:5
 AliTRDNDFast.cxx:6
 AliTRDNDFast.cxx:7
 AliTRDNDFast.cxx:8
 AliTRDNDFast.cxx:9
 AliTRDNDFast.cxx:10
 AliTRDNDFast.cxx:11
 AliTRDNDFast.cxx:12
 AliTRDNDFast.cxx:13
 AliTRDNDFast.cxx:14
 AliTRDNDFast.cxx:15
 AliTRDNDFast.cxx:16
 AliTRDNDFast.cxx:17
 AliTRDNDFast.cxx:18
 AliTRDNDFast.cxx:19
 AliTRDNDFast.cxx:20
 AliTRDNDFast.cxx:21
 AliTRDNDFast.cxx:22
 AliTRDNDFast.cxx:23
 AliTRDNDFast.cxx:24
 AliTRDNDFast.cxx:25
 AliTRDNDFast.cxx:26
 AliTRDNDFast.cxx:27
 AliTRDNDFast.cxx:28
 AliTRDNDFast.cxx:29
 AliTRDNDFast.cxx:30
 AliTRDNDFast.cxx:31
 AliTRDNDFast.cxx:32
 AliTRDNDFast.cxx:33
 AliTRDNDFast.cxx:34
 AliTRDNDFast.cxx:35
 AliTRDNDFast.cxx:36
 AliTRDNDFast.cxx:37
 AliTRDNDFast.cxx:38
 AliTRDNDFast.cxx:39
 AliTRDNDFast.cxx:40
 AliTRDNDFast.cxx:41
 AliTRDNDFast.cxx:42
 AliTRDNDFast.cxx:43
 AliTRDNDFast.cxx:44
 AliTRDNDFast.cxx:45
 AliTRDNDFast.cxx:46
 AliTRDNDFast.cxx:47
 AliTRDNDFast.cxx:48
 AliTRDNDFast.cxx:49
 AliTRDNDFast.cxx:50
 AliTRDNDFast.cxx:51
 AliTRDNDFast.cxx:52
 AliTRDNDFast.cxx:53
 AliTRDNDFast.cxx:54
 AliTRDNDFast.cxx:55
 AliTRDNDFast.cxx:56
 AliTRDNDFast.cxx:57
 AliTRDNDFast.cxx:58
 AliTRDNDFast.cxx:59
 AliTRDNDFast.cxx:60
 AliTRDNDFast.cxx:61
 AliTRDNDFast.cxx:62
 AliTRDNDFast.cxx:63
 AliTRDNDFast.cxx:64
 AliTRDNDFast.cxx:65
 AliTRDNDFast.cxx:66
 AliTRDNDFast.cxx:67
 AliTRDNDFast.cxx:68
 AliTRDNDFast.cxx:69
 AliTRDNDFast.cxx:70
 AliTRDNDFast.cxx:71
 AliTRDNDFast.cxx:72
 AliTRDNDFast.cxx:73
 AliTRDNDFast.cxx:74
 AliTRDNDFast.cxx:75
 AliTRDNDFast.cxx:76
 AliTRDNDFast.cxx:77
 AliTRDNDFast.cxx:78
 AliTRDNDFast.cxx:79
 AliTRDNDFast.cxx:80
 AliTRDNDFast.cxx:81
 AliTRDNDFast.cxx:82
 AliTRDNDFast.cxx:83
 AliTRDNDFast.cxx:84
 AliTRDNDFast.cxx:85
 AliTRDNDFast.cxx:86
 AliTRDNDFast.cxx:87
 AliTRDNDFast.cxx:88
 AliTRDNDFast.cxx:89
 AliTRDNDFast.cxx:90
 AliTRDNDFast.cxx:91
 AliTRDNDFast.cxx:92
 AliTRDNDFast.cxx:93
 AliTRDNDFast.cxx:94
 AliTRDNDFast.cxx:95
 AliTRDNDFast.cxx:96
 AliTRDNDFast.cxx:97
 AliTRDNDFast.cxx:98
 AliTRDNDFast.cxx:99
 AliTRDNDFast.cxx:100
 AliTRDNDFast.cxx:101
 AliTRDNDFast.cxx:102
 AliTRDNDFast.cxx:103
 AliTRDNDFast.cxx:104
 AliTRDNDFast.cxx:105
 AliTRDNDFast.cxx:106
 AliTRDNDFast.cxx:107
 AliTRDNDFast.cxx:108
 AliTRDNDFast.cxx:109
 AliTRDNDFast.cxx:110
 AliTRDNDFast.cxx:111
 AliTRDNDFast.cxx:112
 AliTRDNDFast.cxx:113
 AliTRDNDFast.cxx:114
 AliTRDNDFast.cxx:115
 AliTRDNDFast.cxx:116
 AliTRDNDFast.cxx:117
 AliTRDNDFast.cxx:118
 AliTRDNDFast.cxx:119
 AliTRDNDFast.cxx:120
 AliTRDNDFast.cxx:121
 AliTRDNDFast.cxx:122
 AliTRDNDFast.cxx:123
 AliTRDNDFast.cxx:124
 AliTRDNDFast.cxx:125
 AliTRDNDFast.cxx:126
 AliTRDNDFast.cxx:127
 AliTRDNDFast.cxx:128
 AliTRDNDFast.cxx:129
 AliTRDNDFast.cxx:130
 AliTRDNDFast.cxx:131
 AliTRDNDFast.cxx:132
 AliTRDNDFast.cxx:133
 AliTRDNDFast.cxx:134
 AliTRDNDFast.cxx:135
 AliTRDNDFast.cxx:136
 AliTRDNDFast.cxx:137
 AliTRDNDFast.cxx:138
 AliTRDNDFast.cxx:139
 AliTRDNDFast.cxx:140
 AliTRDNDFast.cxx:141
 AliTRDNDFast.cxx:142
 AliTRDNDFast.cxx:143
 AliTRDNDFast.cxx:144
 AliTRDNDFast.cxx:145
 AliTRDNDFast.cxx:146
 AliTRDNDFast.cxx:147
 AliTRDNDFast.cxx:148
 AliTRDNDFast.cxx:149
 AliTRDNDFast.cxx:150
 AliTRDNDFast.cxx:151
 AliTRDNDFast.cxx:152
 AliTRDNDFast.cxx:153
 AliTRDNDFast.cxx:154
 AliTRDNDFast.cxx:155
 AliTRDNDFast.cxx:156
 AliTRDNDFast.cxx:157
 AliTRDNDFast.cxx:158
 AliTRDNDFast.cxx:159
 AliTRDNDFast.cxx:160
 AliTRDNDFast.cxx:161
 AliTRDNDFast.cxx:162
 AliTRDNDFast.cxx:163
 AliTRDNDFast.cxx:164
 AliTRDNDFast.cxx:165
 AliTRDNDFast.cxx:166
 AliTRDNDFast.cxx:167
 AliTRDNDFast.cxx:168
 AliTRDNDFast.cxx:169
 AliTRDNDFast.cxx:170
 AliTRDNDFast.cxx:171
 AliTRDNDFast.cxx:172
 AliTRDNDFast.cxx:173
 AliTRDNDFast.cxx:174
 AliTRDNDFast.cxx:175
 AliTRDNDFast.cxx:176
 AliTRDNDFast.cxx:177
 AliTRDNDFast.cxx:178
 AliTRDNDFast.cxx:179
 AliTRDNDFast.cxx:180
 AliTRDNDFast.cxx:181
 AliTRDNDFast.cxx:182
 AliTRDNDFast.cxx:183
 AliTRDNDFast.cxx:184
 AliTRDNDFast.cxx:185
 AliTRDNDFast.cxx:186
 AliTRDNDFast.cxx:187
 AliTRDNDFast.cxx:188
 AliTRDNDFast.cxx:189
 AliTRDNDFast.cxx:190
 AliTRDNDFast.cxx:191
 AliTRDNDFast.cxx:192
 AliTRDNDFast.cxx:193
 AliTRDNDFast.cxx:194
 AliTRDNDFast.cxx:195
 AliTRDNDFast.cxx:196
 AliTRDNDFast.cxx:197
 AliTRDNDFast.cxx:198
 AliTRDNDFast.cxx:199
 AliTRDNDFast.cxx:200
 AliTRDNDFast.cxx:201
 AliTRDNDFast.cxx:202
 AliTRDNDFast.cxx:203
 AliTRDNDFast.cxx:204
 AliTRDNDFast.cxx:205
 AliTRDNDFast.cxx:206
 AliTRDNDFast.cxx:207
 AliTRDNDFast.cxx:208
 AliTRDNDFast.cxx:209
 AliTRDNDFast.cxx:210
 AliTRDNDFast.cxx:211
 AliTRDNDFast.cxx:212
 AliTRDNDFast.cxx:213
 AliTRDNDFast.cxx:214
 AliTRDNDFast.cxx:215
 AliTRDNDFast.cxx:216
 AliTRDNDFast.cxx:217
 AliTRDNDFast.cxx:218
 AliTRDNDFast.cxx:219
 AliTRDNDFast.cxx:220
 AliTRDNDFast.cxx:221
 AliTRDNDFast.cxx:222
 AliTRDNDFast.cxx:223
 AliTRDNDFast.cxx:224
 AliTRDNDFast.cxx:225
 AliTRDNDFast.cxx:226
 AliTRDNDFast.cxx:227
 AliTRDNDFast.cxx:228
 AliTRDNDFast.cxx:229
 AliTRDNDFast.cxx:230
 AliTRDNDFast.cxx:231
 AliTRDNDFast.cxx:232
 AliTRDNDFast.cxx:233
 AliTRDNDFast.cxx:234
 AliTRDNDFast.cxx:235
 AliTRDNDFast.cxx:236
 AliTRDNDFast.cxx:237
 AliTRDNDFast.cxx:238
 AliTRDNDFast.cxx:239
 AliTRDNDFast.cxx:240
 AliTRDNDFast.cxx:241
 AliTRDNDFast.cxx:242
 AliTRDNDFast.cxx:243
 AliTRDNDFast.cxx:244
 AliTRDNDFast.cxx:245
 AliTRDNDFast.cxx:246
 AliTRDNDFast.cxx:247
 AliTRDNDFast.cxx:248
 AliTRDNDFast.cxx:249
 AliTRDNDFast.cxx:250
 AliTRDNDFast.cxx:251
 AliTRDNDFast.cxx:252
 AliTRDNDFast.cxx:253
 AliTRDNDFast.cxx:254
 AliTRDNDFast.cxx:255
 AliTRDNDFast.cxx:256
 AliTRDNDFast.cxx:257
 AliTRDNDFast.cxx:258
 AliTRDNDFast.cxx:259
 AliTRDNDFast.cxx:260
 AliTRDNDFast.cxx:261
 AliTRDNDFast.cxx:262
 AliTRDNDFast.cxx:263
 AliTRDNDFast.cxx:264
 AliTRDNDFast.cxx:265
 AliTRDNDFast.cxx:266
 AliTRDNDFast.cxx:267
 AliTRDNDFast.cxx:268
 AliTRDNDFast.cxx:269
 AliTRDNDFast.cxx:270
 AliTRDNDFast.cxx:271
 AliTRDNDFast.cxx:272
 AliTRDNDFast.cxx:273
 AliTRDNDFast.cxx:274
 AliTRDNDFast.cxx:275
 AliTRDNDFast.cxx:276
 AliTRDNDFast.cxx:277
 AliTRDNDFast.cxx:278
 AliTRDNDFast.cxx:279
 AliTRDNDFast.cxx:280
 AliTRDNDFast.cxx:281
 AliTRDNDFast.cxx:282
 AliTRDNDFast.cxx:283
 AliTRDNDFast.cxx:284
 AliTRDNDFast.cxx:285
 AliTRDNDFast.cxx:286
 AliTRDNDFast.cxx:287
 AliTRDNDFast.cxx:288
 AliTRDNDFast.cxx:289
 AliTRDNDFast.cxx:290
 AliTRDNDFast.cxx:291
 AliTRDNDFast.cxx:292
 AliTRDNDFast.cxx:293
 AliTRDNDFast.cxx:294
 AliTRDNDFast.cxx:295
 AliTRDNDFast.cxx:296
 AliTRDNDFast.cxx:297
 AliTRDNDFast.cxx:298
 AliTRDNDFast.cxx:299
 AliTRDNDFast.cxx:300
 AliTRDNDFast.cxx:301
 AliTRDNDFast.cxx:302
 AliTRDNDFast.cxx:303
 AliTRDNDFast.cxx:304
 AliTRDNDFast.cxx:305
 AliTRDNDFast.cxx:306
 AliTRDNDFast.cxx:307
 AliTRDNDFast.cxx:308
 AliTRDNDFast.cxx:309
 AliTRDNDFast.cxx:310
 AliTRDNDFast.cxx:311
 AliTRDNDFast.cxx:312
 AliTRDNDFast.cxx:313
 AliTRDNDFast.cxx:314
 AliTRDNDFast.cxx:315
 AliTRDNDFast.cxx:316
 AliTRDNDFast.cxx:317
 AliTRDNDFast.cxx:318
 AliTRDNDFast.cxx:319
 AliTRDNDFast.cxx:320
 AliTRDNDFast.cxx:321
 AliTRDNDFast.cxx:322
 AliTRDNDFast.cxx:323
 AliTRDNDFast.cxx:324
 AliTRDNDFast.cxx:325
 AliTRDNDFast.cxx:326
 AliTRDNDFast.cxx:327
 AliTRDNDFast.cxx:328
 AliTRDNDFast.cxx:329
 AliTRDNDFast.cxx:330
 AliTRDNDFast.cxx:331
 AliTRDNDFast.cxx:332
 AliTRDNDFast.cxx:333
 AliTRDNDFast.cxx:334
 AliTRDNDFast.cxx:335
 AliTRDNDFast.cxx:336
 AliTRDNDFast.cxx:337
 AliTRDNDFast.cxx:338
 AliTRDNDFast.cxx:339
 AliTRDNDFast.cxx:340
 AliTRDNDFast.cxx:341
 AliTRDNDFast.cxx:342