ROOT logo
/*************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercialf purposes is hereby granted  *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

/* $Id: AliTRDpidRefMakerNN.cxx 27496 2008-07-22 08:35:45Z cblume $ */

////////////////////////////////////////////////////////////////////////////
//                                                                        //
//  Builds the reference tree for the training of neural networks         //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

#include "TSystem.h"
#include "TDatime.h"
#include "TPDGCode.h"
#include "TH1F.h"
#include "TH2F.h"
#include "TFile.h"
#include "TGraphErrors.h"
#include "TTree.h"
#include "TEventList.h"
#include "TMultiLayerPerceptron.h"

#include "AliPID.h"
#include "AliESDtrack.h"
#include "AliTrackReference.h"

#include "AliTRDtrackV1.h"
#include "AliTRDpidUtil.h"
#include "AliTRDpidRefMakerNN.h"
#include "AliTRDpidUtil.h"

#include "Cal/AliTRDCalPID.h"
#include "Cal/AliTRDCalPIDNN.h"
#include "info/AliTRDtrackInfo.h"
#include "info/AliTRDv0Info.h"
#include "info/AliTRDpidInfo.h"

ClassImp(AliTRDpidRefMakerNN)

//________________________________________________________________________
  AliTRDpidRefMakerNN::AliTRDpidRefMakerNN() 
  :AliTRDpidRefMaker()
  ,fNet(NULL)
  ,fTrainMomBin(kAll)
  ,fEpochs(1000)
  ,fMinTrain(100)
  ,fDate(0)
  ,fDoTraining(0)
  ,fContinueTraining(0)
  ,fTrainPath(0)
  ,fScale(0)
  ,fLy(0)
  ,fNtrkl(0)
  ,fRef(NULL)
{
  //
  // Default constructor
  //
  SetNameTitle("PIDrefMakerNN", "PID(NN) Reference Maker");

  memset(fTrain, 0, AliTRDCalPID::kNMom*sizeof(TEventList*));
  memset(fTest, 0, AliTRDCalPID::kNMom*sizeof(TEventList*));
  memset(fTrainData, 0, AliTRDCalPID::kNMom*sizeof(TTree*));

  SetAbundance(.67);
  SetScaledEdx(Float_t(AliTRDCalPIDNN::kMLPscale));
  TDatime datime;
  fDate = datime.GetDate();
}

//________________________________________________________________________
  AliTRDpidRefMakerNN::AliTRDpidRefMakerNN(const char *name) 
  :AliTRDpidRefMaker(name, "PID(NN) Reference Maker")
  ,fNet(NULL)
  ,fTrainMomBin(kAll)
  ,fEpochs(1000)
  ,fMinTrain(100)
  ,fDate(0)
  ,fDoTraining(0)
  ,fContinueTraining(0)
  ,fTrainPath(0)
  ,fScale(0)
  ,fLy(0)
  ,fNtrkl(0)
  ,fRef(NULL)
{
  //
  // Default constructor
  //

  memset(fTrain, 0, AliTRDCalPID::kNMom*sizeof(TEventList*));
  memset(fTest, 0, AliTRDCalPID::kNMom*sizeof(TEventList*));
  memset(fTrainData, 0, AliTRDCalPID::kNMom*sizeof(TTree*));

  SetAbundance(.67);
  SetScaledEdx(Float_t(AliTRDCalPIDNN::kMLPscale));
  TDatime datime;
  fDate = datime.GetDate();
}


//________________________________________________________________________
AliTRDpidRefMakerNN::~AliTRDpidRefMakerNN() 
{
}


//________________________________________________________________________
void AliTRDpidRefMakerNN::MakeTrainTestTrees()
{
  // Create output file and tree
  // Called once

  fRef = new TFile("TRD.CalibPIDrefMakerNN.root", "RECREATE");
  for(Int_t ip = 0; ip < AliTRDCalPID::kNMom; ip++){
    fTrainData[ip] = new TTree(Form("fTrainData_%d", ip), Form("NN Reference Data for MomBin %d", ip));
    fTrainData[ip] -> Branch("fdEdx", fdEdx, Form("fdEdx[%d]/F", AliTRDpidUtil::kNNslices));
    fTrainData[ip] -> Branch("fPID", fPID, Form("fPID[%d]/F", AliPID::kSPECIES));
    fTrainData[ip] -> Branch("fLy", &fLy, "fLy/I");
    fTrainData[ip] -> Branch("fNtrkl", &fNtrkl, "fNtrkl/I");
    
    fTrain[ip] = new TEventList(Form("fTrainMom%d", ip), Form("Training list for momentum intervall %d", ip));
    fTest[ip] = new TEventList(Form("fTestMom%d", ip), Form("Test list for momentum intervall %d", ip));
  }
}



//________________________________________________________________________
Bool_t AliTRDpidRefMakerNN::PostProcess()
{
  // Draw result to the screen
  // Called once at the end of the query

  TFile *fCalib = TFile::Open(Form("AnalysisResults.root"));
  if (!fCalib) {
    AliError("Calibration file not available");
    return kFALSE;
  }
  TDirectoryFile *dCalib = (TDirectoryFile*)fCalib->Get("TRD.CalibPIDrefMaker");
  if (!dCalib) {
    AliError("Calibration directory not available");
    return kFALSE;
  }
  fData = (TTree*)dCalib->Get("RefPID");
  if (!fData) {
    AliError("Calibration data not available");
    return kFALSE;
  }
  TObjArray *o = NULL;
  if(!(o = (TObjArray*)dCalib->Get("MonitorNN"))) {
    AliWarning("Missing monitoring container.");
    return kFALSE;
  }
  fContainer = (TObjArray*)o->Clone("monitor");


  
  if (!fRef) {
    AliDebug(2, "Loading file TRD.CalibPIDrefMakerNN.root");
    LoadFile("TRD.CalibPIDrefMakerNN.root");
  }
  else AliDebug(2, "file available");

  if (!fRef) {
    MakeTrainingSample();
  }
  else AliDebug(2, "file available");


  // build the training and the test list for the neural networks
  for(Int_t ip = 0; ip < AliTRDCalPID::kNMom; ip++){
    MakeTrainingLists(ip);        
  }
  if(!fDoTraining) return kTRUE;



  // train the neural networks
  gSystem->Exec(Form("mkdir ./Networks_%d/",fDate));
  AliDebug(2, Form("TrainMomBin [%d] [%d]", fTrainMomBin, kAll));

  // train single network for a single momentum (recommended)
  if(!(fTrainMomBin == kAll)){
    if(fTrain[fTrainMomBin] -> GetN() < fMinTrain){
      AliError("Warning in AliTRDpidRefMakerNN::PostProcess : Not enough events for training available! Please check Data sample!");
      return kFALSE;
    }
    MakeRefs(fTrainMomBin);
    MonitorTraining(fTrainMomBin);
  }
  // train all momenta
  else{
    for(Int_t iMomBin = 0; iMomBin < AliTRDCalPID::kNMom; iMomBin++){
      if(fTrain[iMomBin] -> GetN() < fMinTrain){
        AliError(Form("Warning in AliTRDpidRefMakerNN::PostProcess : Not enough events for training available for momentum bin [%d]! Please check Data sample!", iMomBin));
        continue;
      }
      MakeRefs(iMomBin);
      MonitorTraining(iMomBin);
    }
  }

  return kTRUE; // testing protection
}


//________________________________________________________________________
Bool_t AliTRDpidRefMakerNN::MakeTrainingSample() 
{
  // convert AnalysisResults.root to training file
  TFile *fCalib = TFile::Open(Form("AnalysisResults.root"));
  if (!fCalib) {
    AliError("Calibration file not available");
    return kFALSE;
  }
  TDirectoryFile *dCalib = (TDirectoryFile*)fCalib->Get("TRD.CalibPIDrefMaker");
  if (!dCalib) {
    AliError("Calibration directory not available");
    return kFALSE;
  }
  fData = (TTree*)dCalib->Get("RefPID");
  if (!fData) {
    AliError("Calibration data not available");
    return kFALSE;
  }
  TObjArray *o = NULL;
  if(!(o = (TObjArray*)dCalib->Get("MonitorNN"))) {
    AliWarning("Missing monitoring container.");
    return kFALSE;
  }
  fContainer = (TObjArray*)o->Clone("monitor");

  if (!fRef) {
    MakeTrainTestTrees();
  
    // Convert the CaliPIDrefMaker tree to 11 (different momentum bin) trees for NN training

    LinkPIDdata();
    for(Int_t ip=0; ip < AliTRDCalPID::kNMom; ip++){ 
      for(Int_t is=0; is < AliPID::kSPECIES; is++) {
	memset(fPID, 0, AliPID::kSPECIES*sizeof(Float_t));
	fPID[is] = 1;
	Int_t n(0); // index of data
	for(Int_t itrk = 0; itrk<fData->GetEntries() && n<kMaxStat; itrk++){
	  if(!(fData->GetEntry(itrk))) continue;
	  if(fPIDdataArray->GetPID()!=is) continue;
    fNtrkl = fPIDdataArray->GetNtracklets();
	  for(Int_t ily=fPIDdataArray->GetNtracklets(); ily--;){
	    fLy = ily;
	    if(fPIDdataArray->GetData(ily)->Momentum()!= ip) continue;
	    memset(fdEdx, 0, AliTRDpidUtil::kNNslices*sizeof(Float_t));
	    for(Int_t islice=AliTRDCalPID::kNSlicesNN; islice--;){
	      fdEdx[islice]+=fPIDdataArray->GetData(ily)->fdEdx[islice];
	      fdEdx[islice]/=fScale;
	    }
	    fTrainData[ip] -> Fill();
	    n++;
	  }
	}
	AliDebug(2, Form("%d %d %d", ip, is, n));
      }
    }

  
    fRef -> cd();
    for(Int_t ip = 0; ip < AliTRDCalPID::kNMom; ip++){
      fTrainData[ip] -> Write();
    }
    return kTRUE;

  }
  else AliWarning("Training file available. No conversion done!");
  return kFALSE;

}

//________________________________________________________________________
void AliTRDpidRefMakerNN::MakeTrainingLists(Int_t mombin) 
{
  //
  // build the training lists for the neural networks
  //

  if (!fRef) {
    LoadFile(Form("TRD.Calib%s.root", GetName()));
  }

  if (!fRef) {
    AliError("ERROR file for building training list not available");
    return;
  }

  AliDebug(2, "\n Making training lists! \n");

  Int_t nPart[AliPID::kSPECIES];
  memset(nPart, 0, AliPID::kSPECIES*sizeof(Int_t));

  // set needed branches
  fTrainData[mombin] -> SetBranchAddress("fdEdx", fdEdx);
  fTrainData[mombin] -> SetBranchAddress("fPID", fPID);
  fTrainData[mombin] -> SetBranchAddress("fLy", &fLy);
  fTrainData[mombin] -> SetBranchAddress("fNtrkl", &fNtrkl);
  
  // start first loop to check total number of each particle type
  for(Int_t iEv=0; iEv < fTrainData[mombin] -> GetEntries(); iEv++){
    fTrainData[mombin] -> GetEntry(iEv);

    // use only events with goes through 6 layers TRD
    if(fNtrkl != AliTRDgeometry::kNlayer) continue;

    if(fPID[AliPID::kElectron] == 1)
      nPart[AliPID::kElectron]++;
    else if(fPID[AliPID::kMuon] == 1)
      nPart[AliPID::kMuon]++;
    else if(fPID[AliPID::kPion] == 1)
      nPart[AliPID::kPion]++;
    else if(fPID[AliPID::kKaon] == 1)
      nPart[AliPID::kKaon]++;
    else if(fPID[AliPID::kProton] == 1)
      nPart[AliPID::kProton]++;
  }

  AliDebug(2, "Particle multiplicities:");
  AliDebug(2, Form("Momentum[%d]  Elecs[%d] Muons[%d] Pions[%d] Kaons[%d] Protons[%d]", mombin, nPart[AliPID::kElectron], nPart[AliPID::kMuon], nPart[AliPID::kPion], nPart[AliPID::kKaon], nPart[AliPID::kProton]));

  

  //   // implement counter of training and test sample size
  Int_t iTrain = 0, iTest = 0;

  // set training sample size per momentum interval to 2/3 
  // of smallest particle counter and test sample to 1/3
  iTrain = nPart[0];
  for(Int_t iPart = 1; iPart < AliPID::kSPECIES; iPart++){
    // exclude muons and kaons if not availyable
    // this is neeeded since we do not have v0 candiates
    if((iPart == AliPID::kMuon || iPart == AliPID::kKaon) && (nPart[AliPID::kMuon] == 0 || nPart[AliPID::kKaon] == 0)) continue;
    if(iTrain > nPart[iPart])
      iTrain = nPart[iPart];
  } 
  iTest = Int_t( iTrain * (1-fFreq));
  iTrain = Int_t(iTrain * fFreq);
  AliDebug(2, Form("Momentum[%d]  Train[%d] Test[%d]", mombin, iTrain, iTest));



  // reset couters
  memset(nPart, 0, AliPID::kSPECIES*sizeof(Int_t));

  // start second loop to set the event lists
  for(Int_t iEv = 0; iEv < fTrainData[mombin] -> GetEntries(); iEv++){
    fTrainData[mombin] -> GetEntry(iEv);

    // set event list
    for(Int_t is = 0; is < AliPID::kSPECIES; is++){
      if(nPart[is] < iTrain && fPID[is] == 1){
       fTrain[mombin] -> Enter(iEv);
        nPart[is]++;
      } else if(nPart[is] < iTest+iTrain && fPID[is] == 1){
        fTest[mombin] -> Enter(iEv);
        nPart[is]++;
      } else continue;
    }
  }
  
  AliDebug(2, "Particle multiplicities in both lists:");
  AliDebug(2, Form("Momentum[%d]  Elecs[%d] Muons[%d] Pions[%d] Kaons[%d] Protons[%d]", mombin, nPart[AliPID::kElectron], nPart[AliPID::kMuon], nPart[AliPID::kPion], nPart[AliPID::kKaon], nPart[AliPID::kProton]));

  return;
}


//________________________________________________________________________
void AliTRDpidRefMakerNN::MakeRefs(Int_t mombin) 
{
  //
  // train the neural networks
  //
  
  
  if (!fTrainData[mombin]) LoadFile(Form("TRD.CalibPIDrefMakerNN.root"));

  if (!fTrainData[mombin]) {
    AliError("Tree for training list not available");
    return;
  }

  TDatime datime;
  fDate = datime.GetDate();

  AliDebug(2, Form("Training momentum bin %d", mombin));

  // set variable to monitor the training and to save the development of the networks
  Int_t nEpochs = fEpochs/kMoniTrain;       
  AliDebug(2, Form("Training %d times %d epochs", kMoniTrain, nEpochs));

  // make directories to save the networks 
  gSystem->Exec(Form("rm -r ./Networks_%d/MomBin_%d",fDate, mombin));
  gSystem->Exec(Form("mkdir ./Networks_%d/MomBin_%d",fDate, mombin));

  // variable to check if network can load weights from previous training
  Bool_t bFirstLoop = kTRUE;

  // train networks over several loops and save them after each loop
  for(Int_t iLoop = 0; iLoop < kMoniTrain; iLoop++){
    fTrainData[mombin] -> SetEventList(fTrain[mombin]);
    fTrainData[mombin] -> SetEventList(fTest[mombin]);
      
    AliDebug(2, Form("Momentum[%d] Trainingloop[%d]", mombin, iLoop));
      
    // check if network is already implemented
    if(bFirstLoop == kTRUE){
      fNet = new TMultiLayerPerceptron("fdEdx[0],fdEdx[1],fdEdx[2],fdEdx[3],fdEdx[4],fdEdx[5],fdEdx[6],fdEdx[7]:15:7:fPID[0],fPID[1],fPID[2],fPID[3],fPID[4]!",fTrainData[mombin],fTrain[mombin],fTest[mombin]);
      fNet -> SetLearningMethod(TMultiLayerPerceptron::kStochastic);       // set learning method
      fNet -> TMultiLayerPerceptron::SetEta(0.001);                        // set learning speed
      if(!fContinueTraining){
	if(AliLog::GetDebugLevel("","AliTRDpidRefMakerNN")>=2) fNet -> Train(nEpochs,"text update=10, graph");
	else fNet -> Train(nEpochs,"");
      }
      else{
	fNet -> LoadWeights(Form("./Networks_%d/MomBin_%d/Net_%d",fTrainPath, mombin, kMoniTrain - 1));
	if(AliLog::GetDebugLevel("","AliTRDpidRefMakerNN")>=2) fNet -> Train(nEpochs,"text update=10, graph+");      
	else fNet -> Train(nEpochs,"+");                   
      }
      bFirstLoop = kFALSE;
    }
    else{    
      if(AliLog::GetDebugLevel("","AliTRDpidRefMakerNN")>=2) fNet -> Train(nEpochs,"text update=10, graph+");      
      else fNet -> Train(nEpochs,"+");                   
    }
      
    // save weights for monitoring of the training
    fNet -> DumpWeights(Form("./Networks_%d/MomBin_%d/Net_%d",fDate, mombin, iLoop));
  }   // end training loop
}



//________________________________________________________________________
void AliTRDpidRefMakerNN::MonitorTraining(Int_t mombin) 
{
  //
  // train the neural networks
  //
  
  if (!fTrainData[mombin]) LoadFile(Form("TRD.CalibPIDrefMakerNN.root"));
  if (!fTrainData[mombin]) {
    AliError("Tree for training list not available");
    return;
  }

  // init networks and set event list
  for(Int_t iChamb = 0; iChamb < AliTRDgeometry::kNlayer; iChamb++){
  fNet = new TMultiLayerPerceptron("fdEdx[0],fdEdx[1],fdEdx[2],fdEdx[3],fdEdx[4],fdEdx[5],fdEdx[6],fdEdx[7]:15:7:fPID[0],fPID[1],fPID[2],fPID[3],fPID[4]!",fTrainData[mombin],fTrain[mombin],fTest[mombin]);   
  fTrainData[mombin] -> SetEventList(fTrain[mombin]);
  fTrainData[mombin] -> SetEventList(fTest[mombin]);
  }

  // implement variables for likelihoods
  Float_t like[AliPID::kSPECIES][AliTRDgeometry::kNlayer];
  memset(like, 0, AliPID::kSPECIES*AliTRDgeometry::kNlayer*sizeof(Float_t));
  Float_t likeAll[AliPID::kSPECIES], totProb;

  Double_t pionEffiTrain[kMoniTrain], pionEffiErrTrain[kMoniTrain];
  Double_t pionEffiTest[kMoniTrain], pionEffiErrTest[kMoniTrain];
  memset(pionEffiTrain, 0, kMoniTrain*sizeof(Double_t));
  memset(pionEffiErrTrain, 0, kMoniTrain*sizeof(Double_t));
  memset(pionEffiTest, 0, kMoniTrain*sizeof(Double_t));
  memset(pionEffiErrTest, 0, kMoniTrain*sizeof(Double_t));

  // init histos
  const Float_t epsilon = 1/(2*(AliTRDpidUtil::kBins-1));     // get nice histos with bin center at 0 and 1
  TH1F *hElecs, *hPions;
  hElecs = new TH1F("hElecs","Likelihood for electrons", AliTRDpidUtil::kBins, 0.-epsilon, 1.+epsilon);
  hPions = new TH1F("hPions","Likelihood for pions", AliTRDpidUtil::kBins, 0.-epsilon, 1.+epsilon);

  TGraphErrors *gEffisTrain = new TGraphErrors(kMoniTrain);
  gEffisTrain -> SetLineColor(4);
  gEffisTrain -> SetMarkerColor(4);
  gEffisTrain -> SetMarkerStyle(29);
  gEffisTrain -> SetMarkerSize(1);

  TGraphErrors *gEffisTest = new TGraphErrors(kMoniTrain);
  gEffisTest -> SetLineColor(2);
  gEffisTest -> SetMarkerColor(2);
  gEffisTest -> SetMarkerStyle(29);
  gEffisTest -> SetMarkerSize(1);

  AliTRDpidUtil *util = new AliTRDpidUtil();
  
  // monitor training progress
  for(Int_t iLoop = 0; iLoop < kMoniTrain; iLoop++){

    // load weights
    fNet -> LoadWeights(Form("./Networks_%d/MomBin_%d/Net_%d",fDate, mombin, iLoop));
    AliDebug(2, Form("./Networks_%d/MomBin_%d/Net_%d",fDate, mombin, iLoop));

    // event loop training list

    for(Int_t is = 0; is < AliPID::kSPECIES; is++){

      if(!((is == AliPID::kElectron) || (is == AliPID::kPion))) continue;

      Int_t iChamb = 0;
      // reset particle probabilities
      for(Int_t iPart = 0; iPart < AliPID::kSPECIES; iPart++){
	likeAll[iPart] = 1./AliPID::kSPECIES;
      }
      totProb = 0.;

      AliDebug(2, Form("%d",fTrain[mombin] -> GetN()));
      for(Int_t iEvent = 0; iEvent < fTrain[mombin] -> GetN(); iEvent++ ){
	fTrainData[mombin] -> GetEntry(fTrain[mombin] -> GetEntry(iEvent));
	// use event only if it is electron or pion
	if(fPID[is] <1.e-5) continue;
	// get the probabilities for each particle type in each chamber
	for(Int_t iPart = 0; iPart < AliPID::kSPECIES; iPart++){
	  like[iPart][iChamb] = fNet -> Result(fTrain[mombin] -> GetEntry(iEvent), iPart);
	  likeAll[iPart] *=  like[iPart][iChamb];
	}
	//end chamber loop
	iChamb++;

	// get total probability and normalize it
	for(Int_t iPart = 0; iPart < AliPID::kSPECIES; iPart++){
	  totProb += likeAll[iPart];
	}
	for(Int_t iPart = 0; iPart < AliPID::kSPECIES; iPart++){
	  likeAll[iPart] /= totProb;
	}

	if(iChamb == 5){
	  // fill likelihood distributions
	  if(fPID[AliPID::kElectron] == 1)      
	    hElecs -> Fill(likeAll[AliPID::kElectron]);
	  if(fPID[AliPID::kPion] == 1)      
	    hPions -> Fill(likeAll[AliPID::kElectron]);
	  iChamb = 0;
	  // reset particle probabilities
	  for(Int_t iPart = 0; iPart < AliPID::kSPECIES; iPart++){
	    likeAll[iPart] = 1./AliPID::kSPECIES;
	  }
	  totProb = 0.;
	}
      } // end event loop
    } // end species loop
    

    // calculate the pion efficiency and fill the graph
    util -> CalculatePionEffi(hElecs, hPions);
    pionEffiTrain[iLoop] = util -> GetPionEfficiency();
    pionEffiErrTrain[iLoop] = util -> GetError();

    gEffisTrain -> SetPoint(iLoop, iLoop+1, pionEffiTrain[iLoop]);
    gEffisTrain -> SetPointError(iLoop, 0, pionEffiErrTrain[iLoop]);
    hElecs -> Reset();
    hPions -> Reset();
    AliDebug(2, Form("TrainingLoop[%d] PionEfficiency[%f +/- %f]", iLoop, pionEffiTrain[iLoop], pionEffiErrTrain[iLoop]));
    // end training loop
    


    // monitor validation progress
    for(Int_t is = 0; is < AliPID::kSPECIES; is++){

      if(!((is == AliPID::kElectron) || (is == AliPID::kPion))) continue;

      Int_t iChamb = 0;
      // reset particle probabilities
      for(Int_t iPart = 0; iPart < AliPID::kSPECIES; iPart++){
	likeAll[iPart] = 1./AliPID::kSPECIES;
      }
      totProb = 0.;

      for(Int_t iEvent = 0; iEvent < fTest[mombin] -> GetN(); iEvent++ ){
	fTrainData[mombin] -> GetEntry(fTest[mombin] -> GetEntry(iEvent));
	// use event only if it is electron or pion
	if(TMath::Abs(fPID[is]- 1.)<1.e-5) continue;

	// get the probabilities for each particle type in each chamber
	for(Int_t iPart = 0; iPart < AliPID::kSPECIES; iPart++){
	  like[iPart][iChamb] = fNet -> Result(fTest[mombin] -> GetEntry(iEvent), iPart);
	  likeAll[iPart] *=  like[iPart][iChamb];
	}
	iChamb++;

	// get total probability and normalize it
	for(Int_t iPart = 0; iPart < AliPID::kSPECIES; iPart++){
	  totProb += likeAll[iPart];
	}
	for(Int_t iPart = 0; iPart < AliPID::kSPECIES; iPart++){
	  likeAll[iPart] /= totProb;
	}

	if(iChamb == 5){
	  // fill likelihood distributions
	  if(fPID[AliPID::kElectron] == 1)      
	    hElecs -> Fill(likeAll[AliPID::kElectron]);
	  if(fPID[AliPID::kPion] == 1)      
	    hPions -> Fill(likeAll[AliPID::kElectron]);
	  iChamb = 0;
	  // reset particle probabilities
	  for(Int_t iPart = 0; iPart < AliPID::kSPECIES; iPart++){
	    likeAll[iPart] = 1./AliPID::kSPECIES;
	  }
	  totProb = 0.;
	}
      } // end event loop
    } // end species loop
    
    // calculate the pion efficiency and fill the graph
    util -> CalculatePionEffi(hElecs, hPions);
    pionEffiTest[iLoop] = util -> GetPionEfficiency();
    pionEffiErrTest[iLoop] = util -> GetError();

    gEffisTest -> SetPoint(iLoop, iLoop+1, pionEffiTest[iLoop]);
    gEffisTest -> SetPointError(iLoop, 0, pionEffiErrTest[iLoop]);
    hElecs -> Reset();
    hPions -> Reset();
    AliDebug(2, Form("TestLoop[%d] PionEfficiency[%f +/- %f] \n", iLoop, pionEffiTest[iLoop], pionEffiErrTest[iLoop]));
    
  } //   end validation loop

  util -> Delete();

  gEffisTest -> Draw("PAL");
  gEffisTrain -> Draw("PL");

}


//________________________________________________________________________
Bool_t AliTRDpidRefMakerNN::LoadFile(const Char_t *InFileNN) 
{
  //
  // Loads the files and sets the event list
  // for neural network training.
  // Useable for training outside of the makeResults.C macro
  //

  fRef = TFile::Open(Form("%s", InFileNN));
  if(!fRef) return 0;
  for(Int_t ip = 0; ip < AliTRDCalPID::kNMom; ip++){
    fTrainData[ip] = (TTree*)fRef -> Get(Form("fTrainData_%d", ip));
  }

  for(Int_t iMom = 0; iMom < AliTRDCalPID::kNMom; iMom++){
      fTrain[iMom] = new TEventList(Form("fTrainMom%d", iMom), Form("Training list for momentum intervall %d", iMom));
      fTest[iMom] = new TEventList(Form("fTestMom%d", iMom), Form("Test list for momentum intervall %d", iMom));
  }
  return 1;
}


 AliTRDpidRefMakerNN.cxx:1
 AliTRDpidRefMakerNN.cxx:2
 AliTRDpidRefMakerNN.cxx:3
 AliTRDpidRefMakerNN.cxx:4
 AliTRDpidRefMakerNN.cxx:5
 AliTRDpidRefMakerNN.cxx:6
 AliTRDpidRefMakerNN.cxx:7
 AliTRDpidRefMakerNN.cxx:8
 AliTRDpidRefMakerNN.cxx:9
 AliTRDpidRefMakerNN.cxx:10
 AliTRDpidRefMakerNN.cxx:11
 AliTRDpidRefMakerNN.cxx:12
 AliTRDpidRefMakerNN.cxx:13
 AliTRDpidRefMakerNN.cxx:14
 AliTRDpidRefMakerNN.cxx:15
 AliTRDpidRefMakerNN.cxx:16
 AliTRDpidRefMakerNN.cxx:17
 AliTRDpidRefMakerNN.cxx:18
 AliTRDpidRefMakerNN.cxx:19
 AliTRDpidRefMakerNN.cxx:20
 AliTRDpidRefMakerNN.cxx:21
 AliTRDpidRefMakerNN.cxx:22
 AliTRDpidRefMakerNN.cxx:23
 AliTRDpidRefMakerNN.cxx:24
 AliTRDpidRefMakerNN.cxx:25
 AliTRDpidRefMakerNN.cxx:26
 AliTRDpidRefMakerNN.cxx:27
 AliTRDpidRefMakerNN.cxx:28
 AliTRDpidRefMakerNN.cxx:29
 AliTRDpidRefMakerNN.cxx:30
 AliTRDpidRefMakerNN.cxx:31
 AliTRDpidRefMakerNN.cxx:32
 AliTRDpidRefMakerNN.cxx:33
 AliTRDpidRefMakerNN.cxx:34
 AliTRDpidRefMakerNN.cxx:35
 AliTRDpidRefMakerNN.cxx:36
 AliTRDpidRefMakerNN.cxx:37
 AliTRDpidRefMakerNN.cxx:38
 AliTRDpidRefMakerNN.cxx:39
 AliTRDpidRefMakerNN.cxx:40
 AliTRDpidRefMakerNN.cxx:41
 AliTRDpidRefMakerNN.cxx:42
 AliTRDpidRefMakerNN.cxx:43
 AliTRDpidRefMakerNN.cxx:44
 AliTRDpidRefMakerNN.cxx:45
 AliTRDpidRefMakerNN.cxx:46
 AliTRDpidRefMakerNN.cxx:47
 AliTRDpidRefMakerNN.cxx:48
 AliTRDpidRefMakerNN.cxx:49
 AliTRDpidRefMakerNN.cxx:50
 AliTRDpidRefMakerNN.cxx:51
 AliTRDpidRefMakerNN.cxx:52
 AliTRDpidRefMakerNN.cxx:53
 AliTRDpidRefMakerNN.cxx:54
 AliTRDpidRefMakerNN.cxx:55
 AliTRDpidRefMakerNN.cxx:56
 AliTRDpidRefMakerNN.cxx:57
 AliTRDpidRefMakerNN.cxx:58
 AliTRDpidRefMakerNN.cxx:59
 AliTRDpidRefMakerNN.cxx:60
 AliTRDpidRefMakerNN.cxx:61
 AliTRDpidRefMakerNN.cxx:62
 AliTRDpidRefMakerNN.cxx:63
 AliTRDpidRefMakerNN.cxx:64
 AliTRDpidRefMakerNN.cxx:65
 AliTRDpidRefMakerNN.cxx:66
 AliTRDpidRefMakerNN.cxx:67
 AliTRDpidRefMakerNN.cxx:68
 AliTRDpidRefMakerNN.cxx:69
 AliTRDpidRefMakerNN.cxx:70
 AliTRDpidRefMakerNN.cxx:71
 AliTRDpidRefMakerNN.cxx:72
 AliTRDpidRefMakerNN.cxx:73
 AliTRDpidRefMakerNN.cxx:74
 AliTRDpidRefMakerNN.cxx:75
 AliTRDpidRefMakerNN.cxx:76
 AliTRDpidRefMakerNN.cxx:77
 AliTRDpidRefMakerNN.cxx:78
 AliTRDpidRefMakerNN.cxx:79
 AliTRDpidRefMakerNN.cxx:80
 AliTRDpidRefMakerNN.cxx:81
 AliTRDpidRefMakerNN.cxx:82
 AliTRDpidRefMakerNN.cxx:83
 AliTRDpidRefMakerNN.cxx:84
 AliTRDpidRefMakerNN.cxx:85
 AliTRDpidRefMakerNN.cxx:86
 AliTRDpidRefMakerNN.cxx:87
 AliTRDpidRefMakerNN.cxx:88
 AliTRDpidRefMakerNN.cxx:89
 AliTRDpidRefMakerNN.cxx:90
 AliTRDpidRefMakerNN.cxx:91
 AliTRDpidRefMakerNN.cxx:92
 AliTRDpidRefMakerNN.cxx:93
 AliTRDpidRefMakerNN.cxx:94
 AliTRDpidRefMakerNN.cxx:95
 AliTRDpidRefMakerNN.cxx:96
 AliTRDpidRefMakerNN.cxx:97
 AliTRDpidRefMakerNN.cxx:98
 AliTRDpidRefMakerNN.cxx:99
 AliTRDpidRefMakerNN.cxx:100
 AliTRDpidRefMakerNN.cxx:101
 AliTRDpidRefMakerNN.cxx:102
 AliTRDpidRefMakerNN.cxx:103
 AliTRDpidRefMakerNN.cxx:104
 AliTRDpidRefMakerNN.cxx:105
 AliTRDpidRefMakerNN.cxx:106
 AliTRDpidRefMakerNN.cxx:107
 AliTRDpidRefMakerNN.cxx:108
 AliTRDpidRefMakerNN.cxx:109
 AliTRDpidRefMakerNN.cxx:110
 AliTRDpidRefMakerNN.cxx:111
 AliTRDpidRefMakerNN.cxx:112
 AliTRDpidRefMakerNN.cxx:113
 AliTRDpidRefMakerNN.cxx:114
 AliTRDpidRefMakerNN.cxx:115
 AliTRDpidRefMakerNN.cxx:116
 AliTRDpidRefMakerNN.cxx:117
 AliTRDpidRefMakerNN.cxx:118
 AliTRDpidRefMakerNN.cxx:119
 AliTRDpidRefMakerNN.cxx:120
 AliTRDpidRefMakerNN.cxx:121
 AliTRDpidRefMakerNN.cxx:122
 AliTRDpidRefMakerNN.cxx:123
 AliTRDpidRefMakerNN.cxx:124
 AliTRDpidRefMakerNN.cxx:125
 AliTRDpidRefMakerNN.cxx:126
 AliTRDpidRefMakerNN.cxx:127
 AliTRDpidRefMakerNN.cxx:128
 AliTRDpidRefMakerNN.cxx:129
 AliTRDpidRefMakerNN.cxx:130
 AliTRDpidRefMakerNN.cxx:131
 AliTRDpidRefMakerNN.cxx:132
 AliTRDpidRefMakerNN.cxx:133
 AliTRDpidRefMakerNN.cxx:134
 AliTRDpidRefMakerNN.cxx:135
 AliTRDpidRefMakerNN.cxx:136
 AliTRDpidRefMakerNN.cxx:137
 AliTRDpidRefMakerNN.cxx:138
 AliTRDpidRefMakerNN.cxx:139
 AliTRDpidRefMakerNN.cxx:140
 AliTRDpidRefMakerNN.cxx:141
 AliTRDpidRefMakerNN.cxx:142
 AliTRDpidRefMakerNN.cxx:143
 AliTRDpidRefMakerNN.cxx:144
 AliTRDpidRefMakerNN.cxx:145
 AliTRDpidRefMakerNN.cxx:146
 AliTRDpidRefMakerNN.cxx:147
 AliTRDpidRefMakerNN.cxx:148
 AliTRDpidRefMakerNN.cxx:149
 AliTRDpidRefMakerNN.cxx:150
 AliTRDpidRefMakerNN.cxx:151
 AliTRDpidRefMakerNN.cxx:152
 AliTRDpidRefMakerNN.cxx:153
 AliTRDpidRefMakerNN.cxx:154
 AliTRDpidRefMakerNN.cxx:155
 AliTRDpidRefMakerNN.cxx:156
 AliTRDpidRefMakerNN.cxx:157
 AliTRDpidRefMakerNN.cxx:158
 AliTRDpidRefMakerNN.cxx:159
 AliTRDpidRefMakerNN.cxx:160
 AliTRDpidRefMakerNN.cxx:161
 AliTRDpidRefMakerNN.cxx:162
 AliTRDpidRefMakerNN.cxx:163
 AliTRDpidRefMakerNN.cxx:164
 AliTRDpidRefMakerNN.cxx:165
 AliTRDpidRefMakerNN.cxx:166
 AliTRDpidRefMakerNN.cxx:167
 AliTRDpidRefMakerNN.cxx:168
 AliTRDpidRefMakerNN.cxx:169
 AliTRDpidRefMakerNN.cxx:170
 AliTRDpidRefMakerNN.cxx:171
 AliTRDpidRefMakerNN.cxx:172
 AliTRDpidRefMakerNN.cxx:173
 AliTRDpidRefMakerNN.cxx:174
 AliTRDpidRefMakerNN.cxx:175
 AliTRDpidRefMakerNN.cxx:176
 AliTRDpidRefMakerNN.cxx:177
 AliTRDpidRefMakerNN.cxx:178
 AliTRDpidRefMakerNN.cxx:179
 AliTRDpidRefMakerNN.cxx:180
 AliTRDpidRefMakerNN.cxx:181
 AliTRDpidRefMakerNN.cxx:182
 AliTRDpidRefMakerNN.cxx:183
 AliTRDpidRefMakerNN.cxx:184
 AliTRDpidRefMakerNN.cxx:185
 AliTRDpidRefMakerNN.cxx:186
 AliTRDpidRefMakerNN.cxx:187
 AliTRDpidRefMakerNN.cxx:188
 AliTRDpidRefMakerNN.cxx:189
 AliTRDpidRefMakerNN.cxx:190
 AliTRDpidRefMakerNN.cxx:191
 AliTRDpidRefMakerNN.cxx:192
 AliTRDpidRefMakerNN.cxx:193
 AliTRDpidRefMakerNN.cxx:194
 AliTRDpidRefMakerNN.cxx:195
 AliTRDpidRefMakerNN.cxx:196
 AliTRDpidRefMakerNN.cxx:197
 AliTRDpidRefMakerNN.cxx:198
 AliTRDpidRefMakerNN.cxx:199
 AliTRDpidRefMakerNN.cxx:200
 AliTRDpidRefMakerNN.cxx:201
 AliTRDpidRefMakerNN.cxx:202
 AliTRDpidRefMakerNN.cxx:203
 AliTRDpidRefMakerNN.cxx:204
 AliTRDpidRefMakerNN.cxx:205
 AliTRDpidRefMakerNN.cxx:206
 AliTRDpidRefMakerNN.cxx:207
 AliTRDpidRefMakerNN.cxx:208
 AliTRDpidRefMakerNN.cxx:209
 AliTRDpidRefMakerNN.cxx:210
 AliTRDpidRefMakerNN.cxx:211
 AliTRDpidRefMakerNN.cxx:212
 AliTRDpidRefMakerNN.cxx:213
 AliTRDpidRefMakerNN.cxx:214
 AliTRDpidRefMakerNN.cxx:215
 AliTRDpidRefMakerNN.cxx:216
 AliTRDpidRefMakerNN.cxx:217
 AliTRDpidRefMakerNN.cxx:218
 AliTRDpidRefMakerNN.cxx:219
 AliTRDpidRefMakerNN.cxx:220
 AliTRDpidRefMakerNN.cxx:221
 AliTRDpidRefMakerNN.cxx:222
 AliTRDpidRefMakerNN.cxx:223
 AliTRDpidRefMakerNN.cxx:224
 AliTRDpidRefMakerNN.cxx:225
 AliTRDpidRefMakerNN.cxx:226
 AliTRDpidRefMakerNN.cxx:227
 AliTRDpidRefMakerNN.cxx:228
 AliTRDpidRefMakerNN.cxx:229
 AliTRDpidRefMakerNN.cxx:230
 AliTRDpidRefMakerNN.cxx:231
 AliTRDpidRefMakerNN.cxx:232
 AliTRDpidRefMakerNN.cxx:233
 AliTRDpidRefMakerNN.cxx:234
 AliTRDpidRefMakerNN.cxx:235
 AliTRDpidRefMakerNN.cxx:236
 AliTRDpidRefMakerNN.cxx:237
 AliTRDpidRefMakerNN.cxx:238
 AliTRDpidRefMakerNN.cxx:239
 AliTRDpidRefMakerNN.cxx:240
 AliTRDpidRefMakerNN.cxx:241
 AliTRDpidRefMakerNN.cxx:242
 AliTRDpidRefMakerNN.cxx:243
 AliTRDpidRefMakerNN.cxx:244
 AliTRDpidRefMakerNN.cxx:245
 AliTRDpidRefMakerNN.cxx:246
 AliTRDpidRefMakerNN.cxx:247
 AliTRDpidRefMakerNN.cxx:248
 AliTRDpidRefMakerNN.cxx:249
 AliTRDpidRefMakerNN.cxx:250
 AliTRDpidRefMakerNN.cxx:251
 AliTRDpidRefMakerNN.cxx:252
 AliTRDpidRefMakerNN.cxx:253
 AliTRDpidRefMakerNN.cxx:254
 AliTRDpidRefMakerNN.cxx:255
 AliTRDpidRefMakerNN.cxx:256
 AliTRDpidRefMakerNN.cxx:257
 AliTRDpidRefMakerNN.cxx:258
 AliTRDpidRefMakerNN.cxx:259
 AliTRDpidRefMakerNN.cxx:260
 AliTRDpidRefMakerNN.cxx:261
 AliTRDpidRefMakerNN.cxx:262
 AliTRDpidRefMakerNN.cxx:263
 AliTRDpidRefMakerNN.cxx:264
 AliTRDpidRefMakerNN.cxx:265
 AliTRDpidRefMakerNN.cxx:266
 AliTRDpidRefMakerNN.cxx:267
 AliTRDpidRefMakerNN.cxx:268
 AliTRDpidRefMakerNN.cxx:269
 AliTRDpidRefMakerNN.cxx:270
 AliTRDpidRefMakerNN.cxx:271
 AliTRDpidRefMakerNN.cxx:272
 AliTRDpidRefMakerNN.cxx:273
 AliTRDpidRefMakerNN.cxx:274
 AliTRDpidRefMakerNN.cxx:275
 AliTRDpidRefMakerNN.cxx:276
 AliTRDpidRefMakerNN.cxx:277
 AliTRDpidRefMakerNN.cxx:278
 AliTRDpidRefMakerNN.cxx:279
 AliTRDpidRefMakerNN.cxx:280
 AliTRDpidRefMakerNN.cxx:281
 AliTRDpidRefMakerNN.cxx:282
 AliTRDpidRefMakerNN.cxx:283
 AliTRDpidRefMakerNN.cxx:284
 AliTRDpidRefMakerNN.cxx:285
 AliTRDpidRefMakerNN.cxx:286
 AliTRDpidRefMakerNN.cxx:287
 AliTRDpidRefMakerNN.cxx:288
 AliTRDpidRefMakerNN.cxx:289
 AliTRDpidRefMakerNN.cxx:290
 AliTRDpidRefMakerNN.cxx:291
 AliTRDpidRefMakerNN.cxx:292
 AliTRDpidRefMakerNN.cxx:293
 AliTRDpidRefMakerNN.cxx:294
 AliTRDpidRefMakerNN.cxx:295
 AliTRDpidRefMakerNN.cxx:296
 AliTRDpidRefMakerNN.cxx:297
 AliTRDpidRefMakerNN.cxx:298
 AliTRDpidRefMakerNN.cxx:299
 AliTRDpidRefMakerNN.cxx:300
 AliTRDpidRefMakerNN.cxx:301
 AliTRDpidRefMakerNN.cxx:302
 AliTRDpidRefMakerNN.cxx:303
 AliTRDpidRefMakerNN.cxx:304
 AliTRDpidRefMakerNN.cxx:305
 AliTRDpidRefMakerNN.cxx:306
 AliTRDpidRefMakerNN.cxx:307
 AliTRDpidRefMakerNN.cxx:308
 AliTRDpidRefMakerNN.cxx:309
 AliTRDpidRefMakerNN.cxx:310
 AliTRDpidRefMakerNN.cxx:311
 AliTRDpidRefMakerNN.cxx:312
 AliTRDpidRefMakerNN.cxx:313
 AliTRDpidRefMakerNN.cxx:314
 AliTRDpidRefMakerNN.cxx:315
 AliTRDpidRefMakerNN.cxx:316
 AliTRDpidRefMakerNN.cxx:317
 AliTRDpidRefMakerNN.cxx:318
 AliTRDpidRefMakerNN.cxx:319
 AliTRDpidRefMakerNN.cxx:320
 AliTRDpidRefMakerNN.cxx:321
 AliTRDpidRefMakerNN.cxx:322
 AliTRDpidRefMakerNN.cxx:323
 AliTRDpidRefMakerNN.cxx:324
 AliTRDpidRefMakerNN.cxx:325
 AliTRDpidRefMakerNN.cxx:326
 AliTRDpidRefMakerNN.cxx:327
 AliTRDpidRefMakerNN.cxx:328
 AliTRDpidRefMakerNN.cxx:329
 AliTRDpidRefMakerNN.cxx:330
 AliTRDpidRefMakerNN.cxx:331
 AliTRDpidRefMakerNN.cxx:332
 AliTRDpidRefMakerNN.cxx:333
 AliTRDpidRefMakerNN.cxx:334
 AliTRDpidRefMakerNN.cxx:335
 AliTRDpidRefMakerNN.cxx:336
 AliTRDpidRefMakerNN.cxx:337
 AliTRDpidRefMakerNN.cxx:338
 AliTRDpidRefMakerNN.cxx:339
 AliTRDpidRefMakerNN.cxx:340
 AliTRDpidRefMakerNN.cxx:341
 AliTRDpidRefMakerNN.cxx:342
 AliTRDpidRefMakerNN.cxx:343
 AliTRDpidRefMakerNN.cxx:344
 AliTRDpidRefMakerNN.cxx:345
 AliTRDpidRefMakerNN.cxx:346
 AliTRDpidRefMakerNN.cxx:347
 AliTRDpidRefMakerNN.cxx:348
 AliTRDpidRefMakerNN.cxx:349
 AliTRDpidRefMakerNN.cxx:350
 AliTRDpidRefMakerNN.cxx:351
 AliTRDpidRefMakerNN.cxx:352
 AliTRDpidRefMakerNN.cxx:353
 AliTRDpidRefMakerNN.cxx:354
 AliTRDpidRefMakerNN.cxx:355
 AliTRDpidRefMakerNN.cxx:356
 AliTRDpidRefMakerNN.cxx:357
 AliTRDpidRefMakerNN.cxx:358
 AliTRDpidRefMakerNN.cxx:359
 AliTRDpidRefMakerNN.cxx:360
 AliTRDpidRefMakerNN.cxx:361
 AliTRDpidRefMakerNN.cxx:362
 AliTRDpidRefMakerNN.cxx:363
 AliTRDpidRefMakerNN.cxx:364
 AliTRDpidRefMakerNN.cxx:365
 AliTRDpidRefMakerNN.cxx:366
 AliTRDpidRefMakerNN.cxx:367
 AliTRDpidRefMakerNN.cxx:368
 AliTRDpidRefMakerNN.cxx:369
 AliTRDpidRefMakerNN.cxx:370
 AliTRDpidRefMakerNN.cxx:371
 AliTRDpidRefMakerNN.cxx:372
 AliTRDpidRefMakerNN.cxx:373
 AliTRDpidRefMakerNN.cxx:374
 AliTRDpidRefMakerNN.cxx:375
 AliTRDpidRefMakerNN.cxx:376
 AliTRDpidRefMakerNN.cxx:377
 AliTRDpidRefMakerNN.cxx:378
 AliTRDpidRefMakerNN.cxx:379
 AliTRDpidRefMakerNN.cxx:380
 AliTRDpidRefMakerNN.cxx:381
 AliTRDpidRefMakerNN.cxx:382
 AliTRDpidRefMakerNN.cxx:383
 AliTRDpidRefMakerNN.cxx:384
 AliTRDpidRefMakerNN.cxx:385
 AliTRDpidRefMakerNN.cxx:386
 AliTRDpidRefMakerNN.cxx:387
 AliTRDpidRefMakerNN.cxx:388
 AliTRDpidRefMakerNN.cxx:389
 AliTRDpidRefMakerNN.cxx:390
 AliTRDpidRefMakerNN.cxx:391
 AliTRDpidRefMakerNN.cxx:392
 AliTRDpidRefMakerNN.cxx:393
 AliTRDpidRefMakerNN.cxx:394
 AliTRDpidRefMakerNN.cxx:395
 AliTRDpidRefMakerNN.cxx:396
 AliTRDpidRefMakerNN.cxx:397
 AliTRDpidRefMakerNN.cxx:398
 AliTRDpidRefMakerNN.cxx:399
 AliTRDpidRefMakerNN.cxx:400
 AliTRDpidRefMakerNN.cxx:401
 AliTRDpidRefMakerNN.cxx:402
 AliTRDpidRefMakerNN.cxx:403
 AliTRDpidRefMakerNN.cxx:404
 AliTRDpidRefMakerNN.cxx:405
 AliTRDpidRefMakerNN.cxx:406
 AliTRDpidRefMakerNN.cxx:407
 AliTRDpidRefMakerNN.cxx:408
 AliTRDpidRefMakerNN.cxx:409
 AliTRDpidRefMakerNN.cxx:410
 AliTRDpidRefMakerNN.cxx:411
 AliTRDpidRefMakerNN.cxx:412
 AliTRDpidRefMakerNN.cxx:413
 AliTRDpidRefMakerNN.cxx:414
 AliTRDpidRefMakerNN.cxx:415
 AliTRDpidRefMakerNN.cxx:416
 AliTRDpidRefMakerNN.cxx:417
 AliTRDpidRefMakerNN.cxx:418
 AliTRDpidRefMakerNN.cxx:419
 AliTRDpidRefMakerNN.cxx:420
 AliTRDpidRefMakerNN.cxx:421
 AliTRDpidRefMakerNN.cxx:422
 AliTRDpidRefMakerNN.cxx:423
 AliTRDpidRefMakerNN.cxx:424
 AliTRDpidRefMakerNN.cxx:425
 AliTRDpidRefMakerNN.cxx:426
 AliTRDpidRefMakerNN.cxx:427
 AliTRDpidRefMakerNN.cxx:428
 AliTRDpidRefMakerNN.cxx:429
 AliTRDpidRefMakerNN.cxx:430
 AliTRDpidRefMakerNN.cxx:431
 AliTRDpidRefMakerNN.cxx:432
 AliTRDpidRefMakerNN.cxx:433
 AliTRDpidRefMakerNN.cxx:434
 AliTRDpidRefMakerNN.cxx:435
 AliTRDpidRefMakerNN.cxx:436
 AliTRDpidRefMakerNN.cxx:437
 AliTRDpidRefMakerNN.cxx:438
 AliTRDpidRefMakerNN.cxx:439
 AliTRDpidRefMakerNN.cxx:440
 AliTRDpidRefMakerNN.cxx:441
 AliTRDpidRefMakerNN.cxx:442
 AliTRDpidRefMakerNN.cxx:443
 AliTRDpidRefMakerNN.cxx:444
 AliTRDpidRefMakerNN.cxx:445
 AliTRDpidRefMakerNN.cxx:446
 AliTRDpidRefMakerNN.cxx:447
 AliTRDpidRefMakerNN.cxx:448
 AliTRDpidRefMakerNN.cxx:449
 AliTRDpidRefMakerNN.cxx:450
 AliTRDpidRefMakerNN.cxx:451
 AliTRDpidRefMakerNN.cxx:452
 AliTRDpidRefMakerNN.cxx:453
 AliTRDpidRefMakerNN.cxx:454
 AliTRDpidRefMakerNN.cxx:455
 AliTRDpidRefMakerNN.cxx:456
 AliTRDpidRefMakerNN.cxx:457
 AliTRDpidRefMakerNN.cxx:458
 AliTRDpidRefMakerNN.cxx:459
 AliTRDpidRefMakerNN.cxx:460
 AliTRDpidRefMakerNN.cxx:461
 AliTRDpidRefMakerNN.cxx:462
 AliTRDpidRefMakerNN.cxx:463
 AliTRDpidRefMakerNN.cxx:464
 AliTRDpidRefMakerNN.cxx:465
 AliTRDpidRefMakerNN.cxx:466
 AliTRDpidRefMakerNN.cxx:467
 AliTRDpidRefMakerNN.cxx:468
 AliTRDpidRefMakerNN.cxx:469
 AliTRDpidRefMakerNN.cxx:470
 AliTRDpidRefMakerNN.cxx:471
 AliTRDpidRefMakerNN.cxx:472
 AliTRDpidRefMakerNN.cxx:473
 AliTRDpidRefMakerNN.cxx:474
 AliTRDpidRefMakerNN.cxx:475
 AliTRDpidRefMakerNN.cxx:476
 AliTRDpidRefMakerNN.cxx:477
 AliTRDpidRefMakerNN.cxx:478
 AliTRDpidRefMakerNN.cxx:479
 AliTRDpidRefMakerNN.cxx:480
 AliTRDpidRefMakerNN.cxx:481
 AliTRDpidRefMakerNN.cxx:482
 AliTRDpidRefMakerNN.cxx:483
 AliTRDpidRefMakerNN.cxx:484
 AliTRDpidRefMakerNN.cxx:485
 AliTRDpidRefMakerNN.cxx:486
 AliTRDpidRefMakerNN.cxx:487
 AliTRDpidRefMakerNN.cxx:488
 AliTRDpidRefMakerNN.cxx:489
 AliTRDpidRefMakerNN.cxx:490
 AliTRDpidRefMakerNN.cxx:491
 AliTRDpidRefMakerNN.cxx:492
 AliTRDpidRefMakerNN.cxx:493
 AliTRDpidRefMakerNN.cxx:494
 AliTRDpidRefMakerNN.cxx:495
 AliTRDpidRefMakerNN.cxx:496
 AliTRDpidRefMakerNN.cxx:497
 AliTRDpidRefMakerNN.cxx:498
 AliTRDpidRefMakerNN.cxx:499
 AliTRDpidRefMakerNN.cxx:500
 AliTRDpidRefMakerNN.cxx:501
 AliTRDpidRefMakerNN.cxx:502
 AliTRDpidRefMakerNN.cxx:503
 AliTRDpidRefMakerNN.cxx:504
 AliTRDpidRefMakerNN.cxx:505
 AliTRDpidRefMakerNN.cxx:506
 AliTRDpidRefMakerNN.cxx:507
 AliTRDpidRefMakerNN.cxx:508
 AliTRDpidRefMakerNN.cxx:509
 AliTRDpidRefMakerNN.cxx:510
 AliTRDpidRefMakerNN.cxx:511
 AliTRDpidRefMakerNN.cxx:512
 AliTRDpidRefMakerNN.cxx:513
 AliTRDpidRefMakerNN.cxx:514
 AliTRDpidRefMakerNN.cxx:515
 AliTRDpidRefMakerNN.cxx:516
 AliTRDpidRefMakerNN.cxx:517
 AliTRDpidRefMakerNN.cxx:518
 AliTRDpidRefMakerNN.cxx:519
 AliTRDpidRefMakerNN.cxx:520
 AliTRDpidRefMakerNN.cxx:521
 AliTRDpidRefMakerNN.cxx:522
 AliTRDpidRefMakerNN.cxx:523
 AliTRDpidRefMakerNN.cxx:524
 AliTRDpidRefMakerNN.cxx:525
 AliTRDpidRefMakerNN.cxx:526
 AliTRDpidRefMakerNN.cxx:527
 AliTRDpidRefMakerNN.cxx:528
 AliTRDpidRefMakerNN.cxx:529
 AliTRDpidRefMakerNN.cxx:530
 AliTRDpidRefMakerNN.cxx:531
 AliTRDpidRefMakerNN.cxx:532
 AliTRDpidRefMakerNN.cxx:533
 AliTRDpidRefMakerNN.cxx:534
 AliTRDpidRefMakerNN.cxx:535
 AliTRDpidRefMakerNN.cxx:536
 AliTRDpidRefMakerNN.cxx:537
 AliTRDpidRefMakerNN.cxx:538
 AliTRDpidRefMakerNN.cxx:539
 AliTRDpidRefMakerNN.cxx:540
 AliTRDpidRefMakerNN.cxx:541
 AliTRDpidRefMakerNN.cxx:542
 AliTRDpidRefMakerNN.cxx:543
 AliTRDpidRefMakerNN.cxx:544
 AliTRDpidRefMakerNN.cxx:545
 AliTRDpidRefMakerNN.cxx:546
 AliTRDpidRefMakerNN.cxx:547
 AliTRDpidRefMakerNN.cxx:548
 AliTRDpidRefMakerNN.cxx:549
 AliTRDpidRefMakerNN.cxx:550
 AliTRDpidRefMakerNN.cxx:551
 AliTRDpidRefMakerNN.cxx:552
 AliTRDpidRefMakerNN.cxx:553
 AliTRDpidRefMakerNN.cxx:554
 AliTRDpidRefMakerNN.cxx:555
 AliTRDpidRefMakerNN.cxx:556
 AliTRDpidRefMakerNN.cxx:557
 AliTRDpidRefMakerNN.cxx:558
 AliTRDpidRefMakerNN.cxx:559
 AliTRDpidRefMakerNN.cxx:560
 AliTRDpidRefMakerNN.cxx:561
 AliTRDpidRefMakerNN.cxx:562
 AliTRDpidRefMakerNN.cxx:563
 AliTRDpidRefMakerNN.cxx:564
 AliTRDpidRefMakerNN.cxx:565
 AliTRDpidRefMakerNN.cxx:566
 AliTRDpidRefMakerNN.cxx:567
 AliTRDpidRefMakerNN.cxx:568
 AliTRDpidRefMakerNN.cxx:569
 AliTRDpidRefMakerNN.cxx:570
 AliTRDpidRefMakerNN.cxx:571
 AliTRDpidRefMakerNN.cxx:572
 AliTRDpidRefMakerNN.cxx:573
 AliTRDpidRefMakerNN.cxx:574
 AliTRDpidRefMakerNN.cxx:575
 AliTRDpidRefMakerNN.cxx:576
 AliTRDpidRefMakerNN.cxx:577
 AliTRDpidRefMakerNN.cxx:578
 AliTRDpidRefMakerNN.cxx:579
 AliTRDpidRefMakerNN.cxx:580
 AliTRDpidRefMakerNN.cxx:581
 AliTRDpidRefMakerNN.cxx:582
 AliTRDpidRefMakerNN.cxx:583
 AliTRDpidRefMakerNN.cxx:584
 AliTRDpidRefMakerNN.cxx:585
 AliTRDpidRefMakerNN.cxx:586
 AliTRDpidRefMakerNN.cxx:587
 AliTRDpidRefMakerNN.cxx:588
 AliTRDpidRefMakerNN.cxx:589
 AliTRDpidRefMakerNN.cxx:590
 AliTRDpidRefMakerNN.cxx:591
 AliTRDpidRefMakerNN.cxx:592
 AliTRDpidRefMakerNN.cxx:593
 AliTRDpidRefMakerNN.cxx:594
 AliTRDpidRefMakerNN.cxx:595
 AliTRDpidRefMakerNN.cxx:596
 AliTRDpidRefMakerNN.cxx:597
 AliTRDpidRefMakerNN.cxx:598
 AliTRDpidRefMakerNN.cxx:599
 AliTRDpidRefMakerNN.cxx:600
 AliTRDpidRefMakerNN.cxx:601
 AliTRDpidRefMakerNN.cxx:602
 AliTRDpidRefMakerNN.cxx:603
 AliTRDpidRefMakerNN.cxx:604
 AliTRDpidRefMakerNN.cxx:605
 AliTRDpidRefMakerNN.cxx:606
 AliTRDpidRefMakerNN.cxx:607
 AliTRDpidRefMakerNN.cxx:608
 AliTRDpidRefMakerNN.cxx:609
 AliTRDpidRefMakerNN.cxx:610
 AliTRDpidRefMakerNN.cxx:611
 AliTRDpidRefMakerNN.cxx:612
 AliTRDpidRefMakerNN.cxx:613
 AliTRDpidRefMakerNN.cxx:614
 AliTRDpidRefMakerNN.cxx:615
 AliTRDpidRefMakerNN.cxx:616
 AliTRDpidRefMakerNN.cxx:617
 AliTRDpidRefMakerNN.cxx:618
 AliTRDpidRefMakerNN.cxx:619
 AliTRDpidRefMakerNN.cxx:620
 AliTRDpidRefMakerNN.cxx:621
 AliTRDpidRefMakerNN.cxx:622
 AliTRDpidRefMakerNN.cxx:623
 AliTRDpidRefMakerNN.cxx:624
 AliTRDpidRefMakerNN.cxx:625
 AliTRDpidRefMakerNN.cxx:626
 AliTRDpidRefMakerNN.cxx:627
 AliTRDpidRefMakerNN.cxx:628
 AliTRDpidRefMakerNN.cxx:629
 AliTRDpidRefMakerNN.cxx:630
 AliTRDpidRefMakerNN.cxx:631
 AliTRDpidRefMakerNN.cxx:632
 AliTRDpidRefMakerNN.cxx:633
 AliTRDpidRefMakerNN.cxx:634
 AliTRDpidRefMakerNN.cxx:635
 AliTRDpidRefMakerNN.cxx:636
 AliTRDpidRefMakerNN.cxx:637
 AliTRDpidRefMakerNN.cxx:638
 AliTRDpidRefMakerNN.cxx:639
 AliTRDpidRefMakerNN.cxx:640
 AliTRDpidRefMakerNN.cxx:641
 AliTRDpidRefMakerNN.cxx:642
 AliTRDpidRefMakerNN.cxx:643
 AliTRDpidRefMakerNN.cxx:644
 AliTRDpidRefMakerNN.cxx:645
 AliTRDpidRefMakerNN.cxx:646
 AliTRDpidRefMakerNN.cxx:647
 AliTRDpidRefMakerNN.cxx:648
 AliTRDpidRefMakerNN.cxx:649
 AliTRDpidRefMakerNN.cxx:650
 AliTRDpidRefMakerNN.cxx:651
 AliTRDpidRefMakerNN.cxx:652
 AliTRDpidRefMakerNN.cxx:653
 AliTRDpidRefMakerNN.cxx:654
 AliTRDpidRefMakerNN.cxx:655
 AliTRDpidRefMakerNN.cxx:656
 AliTRDpidRefMakerNN.cxx:657
 AliTRDpidRefMakerNN.cxx:658
 AliTRDpidRefMakerNN.cxx:659
 AliTRDpidRefMakerNN.cxx:660
 AliTRDpidRefMakerNN.cxx:661
 AliTRDpidRefMakerNN.cxx:662
 AliTRDpidRefMakerNN.cxx:663
 AliTRDpidRefMakerNN.cxx:664
 AliTRDpidRefMakerNN.cxx:665
 AliTRDpidRefMakerNN.cxx:666
 AliTRDpidRefMakerNN.cxx:667