ROOT logo
#include <TFile.h>
#include <TList.h>
#include <TTree.h>
#include <TChain.h>
#include <TClonesArray.h>
#include <TObjString.h>
#include <TString.h>
#include <TROOT.h>

#include "AliHighPtDeDxData.h"
#include "AliHighPtDeDxMc.h"
#include "AliHighPtDeDxCalib.h"

#include <AliXRDPROOFtoolkit.h>

#include "DebugClasses.C"
#include "my_tools.C"
#include "my_functions.C"

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

/*

  In this version the start step for calibrations is 2. We do not correct for
  the Ncl dependence as this is still uncertain of this should be done or not.

  It is good to make a small test first because the MIP peak might have to be
  adjusted. With pass0 the default 40-60 window should be good, but

  To run calibrations:
  ====================

  Use AliRoot because of AliXRDPROOFtoolkit:
   gSystem->AddIncludePath("-I$ALICE_ROOT/TPC")
   gSystem->AddIncludePath("-I../lib")
   gSystem->AddIncludePath("-I../grid")
   gSystem->AddIncludePath("-I../macros")
   gROOT->SetMacroPath(".:../macros:../grid:../lib/")
  .L libMyDeDxAnalysis.so 
  .L my_functions.C+
  .L my_tools.C+
  .L DebugClasses.C+
  .L run_code.C+

  // Step 1: create calibrations

  CreateCalib("7tev_b.dat", kFALSE, "7tev_b.root", 0, 2)  

  // This function is not used anymore
  // CreateCalibV0("7tev_b_v0.dat", kFALSE, "7tev_b_v0_loose.root", 0)


  // Step 2 and 3 are found in calibrate_de_dx.C


  // Step 5: create data
  CreateOutput("7tev_b.dat", kFALSE, "7tev_b.root", 0, "fitparameters/7tev_b.root")
  CreateOutputV0("7tev_b_v0.dat", kFALSE, "7tev_b_v0_loose.root", 0, "fitparameters/7tev_b.root")




  // Test examples
  // Step 1
  CreateCalib("7tev_b_test.dat", kFALSE, "7tev_b_test.root", 0, 2)  
  // Step 5
  CreateOutput("7tev_b_test.dat", kFALSE, "7tev_b_test.root", 0, "fitparameters/7tev_b_test.root")
  CreateOutputV0("7tev_b_test_v0.dat", kFALSE, "7tev_b_test_v0_loose.root", 0, "fitparameters/7tev_b_test.root")

 */


const Int_t nPtBins = 68;
//Double_t xBins[nPtBins+1] = {0., 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1.0, 1.1 , 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0, 3.2, 3.4, 3.6, 3.8, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 8.0, 9.0, 10.0};
Double_t xBins[nPtBins+1] = {0. ,  0.05, 0.1,  0.15, 0.2,  0.25, 0.3,  0.35, 0.4,  0.45,
			     0.5,  0.55, 0.6,  0.65, 0.7,  0.75, 0.8,  0.85, 0.9,  0.95,
			     1.0,  1.1 , 1.2,  1.3 , 1.4,  1.5 , 1.6,  1.7 , 1.8,  1.9 ,
			     2.0,  2.2 , 2.4,  2.6 , 2.8,  3.0 , 3.2,  3.4 , 3.6,  3.8 ,
			     4.0,  4.5 , 5.0,  5.5 , 6.0,  6.5 , 7.0,  8.0 , 9.0,  10.0,
			     11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 18.0, 20.0, 22.0, 24.0,
			     26.0, 28.0, 30.0, 32.0, 34.0, 36.0, 40.0, 45.0, 50.0 };

TFile* dataOutFile = 0;
TFile* mcOutFile   = 0;

TF1* piFunc = 0;
TF1* kFunc  = 0;
TF1* pFunc = 0;
TF1* eFunc = 0;
TF1* sigmaFunc = 0;

void CreateOutput(const Char_t* dataFileName, Bool_t isMc, 
		  const Char_t* outfilename, Int_t maxEvents,
		  const Char_t* fitFileName=0);
void AddObject(TList* list, Int_t filter, Bool_t phiCut, Int_t run, 
	       Bool_t analyzeMc, Bool_t etaCut = kFALSE, Bool_t etaAbs = kFALSE, 
	       Int_t etaLow=-8, Int_t etaHigh=8);
void CreateOutputV0(const Char_t* dataFileName, Bool_t isMc, 
		    const Char_t* outFileName, Int_t maxEvents,
		    const Char_t* fitFileName=0);
void AddObjectV0(TList* list, const Char_t* baseName, Bool_t phiCut, Int_t run, 
		 Bool_t analyzeMc, Bool_t etaCut = kFALSE, Bool_t etaAbs = kFALSE, 
	       Int_t etaLow=-8, Int_t etaHigh=8);

void CreateCalib(const Char_t* dataFileName, Bool_t isMc, 
		 const Char_t* outfilename, Int_t maxEvents, Int_t startStep);
void AddCalibObject(TList* list, Int_t filter, Bool_t phiCut, Int_t run, 
		    Bool_t analyzeMc, Bool_t etaCut = kFALSE, Bool_t etaAbs = kFALSE, 
		    Int_t etaLow=-8, Int_t etaHigh=8);
void CreateCalibV0(const Char_t* dataFileName, Bool_t isMc, 
		   const Char_t* outFileName, Int_t maxEvents);
void AddCalibObjectV0(TList* list, const Char_t* baseName, Bool_t phiCut, 
		      Int_t run, Bool_t analyzeMc);
Int_t CalculateFilter(DeDxTrack* track);

//____________________________________________________________________________
void CreateOutput(const Char_t* dataFileName, Bool_t isMc, 
		  const Char_t* outFileName, Int_t maxEvents,
		  const Char_t* fitFileName)
{

  TF1* fDeDxVsEtaNeg = 0;
  TF1* fDeDxVsEtaPos = 0;
  TF1* fDeDxVsNcl    = 0;

  if(fitFileName) {

    TFile* fitFile = FindFileFresh(fitFileName);
    if(!fitFile)
      return;
    DeDxFitInfo* fitPar = (DeDxFitInfo*)fitFile->Get("fitInfo");
    fitPar->Print();
  

    if(!fitPar->calibFileName.IsNull()) {

      cout << "Setting calibFile: " << fitPar->calibFileName << endl;
      TFile* calibFile = FindFileFresh(fitPar->calibFileName);
      if(!calibFile)
	return;
      AliHighPtDeDxCalib* calib = (AliHighPtDeDxCalib*)GetObject(calibFile, 1, kTRUE, 0);
      calib->Print();
      fDeDxVsEtaNeg = calib->GetDeDxVsEtaNeg();
      fDeDxVsEtaPos = calib->GetDeDxVsEtaPos();
      fDeDxVsNcl    = calib->GetDeDxVsNcl();
    }
  
    fixMIP      = fitPar->MIP;
    fixPlateau  = fitPar->plateau;

    Double_t dedxPar[6]  = {0, 0, 0, 0, 0, 0};
    Double_t sigmaPar[6] = {0, 0, 0, 0, 0, 0};
    
    dedxPar[0] = fitPar->optionDeDx;
    for(Int_t i = 0; i < fitPar->nDeDxPar; i++) {
      dedxPar[i+1] = fitPar->parDeDx[i];
    }

    sigmaPar[0] = fitPar->optionSigma;
    for(Int_t i = 0; i < fitPar->nSigmaPar; i++) {
      sigmaPar[i+1] = fitPar->parSigma[i];
    }

    piFunc = new TF1("piFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1);
    piFunc->SetParameters(dedxPar);

    kFunc = new TF1("kFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1);
    kFunc->SetParameters(dedxPar);
    kFunc->SetParameter(0, kFunc->GetParameter(0)+10);

    pFunc = new TF1("pFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1);
    pFunc->SetParameters(dedxPar);
    pFunc->SetParameter(0, pFunc->GetParameter(0)+20);

    eFunc = new TF1("eFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1);
    eFunc->SetParameters(dedxPar);
    eFunc->SetParameter(0, eFunc->GetParameter(0)+30);

    sigmaFunc = new TF1("sigmaFunc", SigmaFunc, 0, 100, fitPar->nSigmaPar+1); 
    sigmaFunc->SetParameters(sigmaPar);
  }

  CreateDir("data");
  dataOutFile = new TFile(Form("data/%s", outFileName), "RECREATE");
  if(isMc) {
    
    CreateDir("mc");
    mcOutFile = new TFile(Form("mc/%s", outFileName), "RECREATE");
  }

  // Create output objects
  dataOutFile->cd();
  TList* runList = new TList();
  runList->SetOwner(kTRUE);
  runList->SetBit(TObject::kSingleKey);
  
  TList* analysisList = new TList();
  analysisList->SetOwner(kFALSE);
  
  //        TList    filter, phi cut, run, isMc
  AddObject(analysisList, 1, kTRUE,  0, isMc); 
  if(kTRUE) {
    AddObject(analysisList, 1, kTRUE,  0, isMc, kTRUE, kFALSE, -8, -6); 
    AddObject(analysisList, 1, kTRUE,  0, isMc, kTRUE, kFALSE, -6, -4); 
    AddObject(analysisList, 1, kTRUE,  0, isMc, kTRUE, kFALSE, -4, -2); 
    AddObject(analysisList, 1, kTRUE,  0, isMc, kTRUE, kFALSE, -2,  0); 
    AddObject(analysisList, 1, kTRUE,  0, isMc, kTRUE, kFALSE, 0, 2); 
    AddObject(analysisList, 1, kTRUE,  0, isMc, kTRUE, kFALSE, 2, 4); 
    AddObject(analysisList, 1, kTRUE,  0, isMc, kTRUE, kFALSE, 4, 6); 
    AddObject(analysisList, 1, kTRUE,  0, isMc, kTRUE, kFALSE, 6, 8); 
  }
  AddObject(analysisList, 1, kTRUE,  0, isMc, kTRUE, kFALSE, -8, 0); 
  AddObject(analysisList, 1, kTRUE,  0, isMc, kTRUE, kFALSE, 0, 8); 
  AddObject(analysisList, 1, kTRUE,  0, isMc, kFALSE, kTRUE, 0, 4); 
  AddObject(analysisList, 1, kTRUE,  0, isMc, kFALSE, kTRUE, 4, 8); 
  AddObject(analysisList, 1, kFALSE, 0, isMc); 
  AddObject(analysisList, 2, kTRUE,  0, isMc); 
  AddObject(analysisList, 2, kFALSE, 0, isMc); 
  
  TTree* Tree = 0;
  
  if(strstr(dataFileName, ".dat")) {
    
    AliXRDPROOFtoolkit tool;
    TChain* chain = tool.MakeChain(dataFileName,"tree", 0, 1000);
    //    chain->Lookup();
    Tree = chain;
  } else {
    TFile* dataFile = FindFileFresh(dataFileName);
    if(!dataFile)
      return;
    
    Tree = (TTree*)dataFile->Get("tree");
  }

  TClonesArray* trackArray = 0;
  TClonesArray* mcTrackArray = 0;
  DeDxEvent* event = 0;
  Tree->SetBranchAddress("event", &event);
  Tree->SetBranchAddress("trackGlobalPar"  , &trackArray);
  if(isMc)
    Tree->SetBranchAddress("trackMC"  , &mcTrackArray);

  Int_t nEvents = Tree->GetEntries();
  cout << "Number of events: " << nEvents << endl;
  
  if(maxEvents>0 && maxEvents < nEvents) {
    
    nEvents = maxEvents;
    cout << "N events was reduced to: " << maxEvents << endl;
  }

  Int_t currentRun = 0;
  Int_t nBad = 0;
  TIter* iter = new TIter(analysisList);
  
  for(Int_t n = 0; n < nEvents; n++) {
    
    Tree->GetEntry(n);
    
    if((n+1)%1000000==0)
      cout << "Event: " << n+1 << "/" << nEvents << endl;

    // A few bad entries
    if(event->run == -1) {
      nBad++;
      continue;
    }

    if(event->run != currentRun) {
      
      cout << "New run: " << event->run << endl;
      currentRun = event->run;
      
      // Check if run objects exist
      TObjString* runString = new TObjString(Form("%d", currentRun));
      if(!runList->FindObject(runString->GetString().Data())) {
	
	runList->Add(runString);
	
	//        TList    filter, phi cut, run, isMc
	AddObject(analysisList, 1, kTRUE,  currentRun, isMc); 
	AddObject(analysisList, 1, kFALSE, currentRun, isMc); 
	// AddObject(analysisList, 2, kTRUE,  currentRun, isMc); 
	// AddObject(analysisList, 2, kFALSE, currentRun, isMc); 
	
	// Is this really necessary?
	delete iter;
	iter = new TIter(analysisList);

      } else {

	delete runString;
      }
    }

    // iterate over analysis list
    iter->Reset();
    AliHighPtDeDxBase* analysis = 0;
    while ((analysis = dynamic_cast<AliHighPtDeDxBase*> (iter->Next()))) {
      
      // First we set the global properties
      // If I want to use a narrower vtx I have here to redefine my 
      // vtxstatus according to the new vtx range
      analysis->SetEventRun(event->run);
      analysis->SetEventMag(event->mag);
      analysis->SetEventVtxStatus(event->vtxstatus);
      analysis->SetEventTrigger(event->trig);

      Int_t vtxstatusmc = 0;
      if(TMath::Abs(event->zvtxMC) < 10.0)
	vtxstatusmc = 1;
      analysis->SetEventVtxStatusMc(vtxstatusmc);

      if(!analysis->EventAccepted()) // only checks for runs currently
	continue;

      // There is a small prolem in making this really nice, because we need
      // also event info from events that are rejected by the vtx cut to
      // correct our data. That is why we for bnow only have the run cut there
      
      analysis->FillEventInfo();
      
      // First we do the special MC part
      if(isMc) {
	
	AliHighPtDeDxMc* mcAnalysis = dynamic_cast<AliHighPtDeDxMc*> (analysis);
	if(mcAnalysis) {
	  if(vtxstatusmc) {
	    
	    // loop over mc tracks
	    const Int_t nMcTracks = mcTrackArray->GetEntries();
	    
	    for(Int_t i = 0; i < nMcTracks; i++) {
	      
	      DeDxTrackMC* trackMC = (DeDxTrackMC*)mcTrackArray->At(i);
	      
	      mcAnalysis->SetTrackPtMc(trackMC->ptMC);
	      mcAnalysis->SetTrackEtaMc(trackMC->etaMC);
	      mcAnalysis->SetTrackChargeMc(trackMC->qMC);
	      mcAnalysis->SetTrackPidMc(trackMC->pidMC);
	      if(mcAnalysis->TrackAcceptedMc()) {
		// if(trackMC->ptMC<2.0)
		//   mcAnalysis->FillTrackInfoMc(100.0);
		// else
		  mcAnalysis->FillTrackInfoMc(1.0);
	      }
	    }
	  }
	}
      }
      
      // The trig==1 is always true for real data, but not for MC data
      if(!event->trig)
	continue;
	
      if(event->vtxstatus<1) // only fill tracks for events with vtx inside cuts
	continue;
      
      const Int_t nTracks = trackArray->GetEntries();
      
      for(Int_t i = 0; i < nTracks; i++) {
	
	DeDxTrack* track = (DeDxTrack*)trackArray->At(i);
	
	Double_t eta  = track->eta;
	Double_t dedx = track->dedx;
	Int_t ncl     = track->ncl;
	if(fDeDxVsEtaNeg) {

	  dedx *= 50.0 / fDeDxVsNcl->Eval(ncl);

	  if(eta < 0) 
	    dedx *= 50.0 / fDeDxVsEtaNeg->Eval(eta);
	  else
	    dedx *= 50.0 / fDeDxVsEtaPos->Eval(eta);
	}
	
	analysis->SetTrackCharge(track->q);
	analysis->SetTrackP(track->p);
	analysis->SetTrackPt(track->pt);
	//
	Int_t filter = CalculateFilter(track);
	analysis->SetTrackFilter(filter);
	analysis->SetTrackPhi(track->phi);
	analysis->SetTrackDeDx(dedx);
	analysis->SetTrackNcl(ncl);
	analysis->SetTrackEta(eta);
	analysis->SetTrackPidMc(track->pid);

	if(analysis->TrackAccepted()) {
	  // if(track->pt<2.0)
	  //   analysis->FillTrackInfo(100.0);
	  // else
	    analysis->FillTrackInfo(1.0);
	}
      }
    }
  }
  
  if(isMc) {

    TList* runListMc = (TList*)runList->Clone();
    mcOutFile->cd();
    runListMc->Write();

    // I need to somehow specify autowrite, but I am not sure how, so for now
    // this a bit stupid workaround...
    iter->Reset();
    AliHighPtDeDxBase* analysis = 0;
    while ((analysis = dynamic_cast<AliHighPtDeDxBase*> (iter->Next()))) {
      
      AliHighPtDeDxMc* mcAnalysis = dynamic_cast<AliHighPtDeDxMc*> (analysis);
      if(mcAnalysis) {
	mcAnalysis->Write();
      }
    }
    mcOutFile->Close();
    delete mcOutFile;
    mcOutFile = 0;
  }

  dataOutFile->cd();
  runList->Write("runList");
  iter->Reset();
  AliHighPtDeDxBase* analysis = 0;
  while ((analysis = dynamic_cast<AliHighPtDeDxBase*> (iter->Next()))) {
    
    AliHighPtDeDxData* dataAnalysis = dynamic_cast<AliHighPtDeDxData*> (analysis);
    if(dataAnalysis) {
      dataAnalysis->Write();
    }
  }
  dataOutFile->Close();
  delete dataOutFile;
  dataOutFile = 0;

  cout << "Nbad (runno == -1) : " << nBad << endl;
}

//___________________________________________________________________________
void AddObject(TList* list, Int_t filter, Bool_t phiCut, Int_t run, 
	       Bool_t analyzeMc, Bool_t etaCut, Bool_t etaAbs, 
	       Int_t etaLow, Int_t etaHigh)
{
  if(etaCut && etaAbs) {

    Fatal("AddObject", "You cannot have a cut on both abs and signed eta");
    return;
  }
  TString objectName("filter");
  objectName += filter;
  if(phiCut)
    objectName += "phicut";
  if(run) {
    objectName += "_";
    objectName += run;
  }
  if(etaCut) {
    objectName += "eta";
    objectName += etaLow;
    objectName += etaHigh;
  }
  if(etaAbs) {
    objectName += "etaabs";
    objectName += etaLow;
    objectName += etaHigh;
  }

  dataOutFile->cd();
  AliHighPtDeDxData* data = new AliHighPtDeDxData(objectName.Data(), "Analysis data");
  if(run) {
    data->SetUseRunCut(kTRUE);
    data->SetRun(run);
  }

  list->Add(data);
  data->SetIsMc(analyzeMc);
  data->SetUseFilterCut(kTRUE);
  data->SetFilter(filter);
  data->SetUsePhiCut(phiCut);
  if(phiCut) {
    data->SetPhiCutLow(data->GetStandardPhiCutLow());
    data->SetPhiCutHigh(data->GetStandardPhiCutHigh());
  }
  if(etaCut)
    data->SetUseEtaCut(kTRUE);
  if(etaAbs)
    data->SetUseEtaCutAbs(kTRUE);
  if(etaCut || etaAbs) {
    data->SetEtaLow(Double_t(etaLow)/10.0);
    data->SetEtaHigh(Double_t(etaHigh)/10.0);
  }

  data->Init(nPtBins, xBins);
  data->Print();

  if(piFunc && kFunc && pFunc && eFunc && sigmaFunc) {

    data->SetPionDeDxFunction(piFunc);
    data->SetKaonDeDxFunction(kFunc);
    data->SetProtonDeDxFunction(pFunc);
    data->SetElectronDeDxFunction(eFunc);
    data->SetSigmaDeDxFunction(sigmaFunc);
  }

  if(analyzeMc) {
    // create the correction class also
    
    mcOutFile->cd();
    AliHighPtDeDxMc* mc = new AliHighPtDeDxMc(objectName.Data(), "Analysis mc");
    if(run) {
      mc->SetUseRunCut(kTRUE);
      mc->SetRun(run);
    }
    
    list->Add(mc);
    mc->SetUseFilterCut(kTRUE);
    mc->SetFilter(filter);
    mc->SetUsePhiCut(phiCut);
    if(phiCut) {
      mc->SetPhiCutLow(mc->GetStandardPhiCutLow());
      mc->SetPhiCutHigh(mc->GetStandardPhiCutHigh());
    }
    mc->Init(nPtBins, xBins);
    mc->Print();
  }
}

//____________________________________________________________________________
void CreateOutputV0(const Char_t* dataFileName, Bool_t isMc, 
		    const Char_t* outFileName, Int_t maxEvents,
		    const Char_t* fitFileName)
{

  TF1* fDeDxVsEtaNeg = 0;
  TF1* fDeDxVsEtaPos = 0;
  TF1* fDeDxVsNcl    = 0;

  if(fitFileName) {

    TFile* fitFile = FindFileFresh(fitFileName);
    if(!fitFile)
      return;
    DeDxFitInfo* fitPar = (DeDxFitInfo*)fitFile->Get("fitInfo");
    fitPar->Print();
  

    if(!fitPar->calibFileName.IsNull()) {

      cout << "Setting calibFile: " << fitPar->calibFileName << endl;
      TFile* calibFile = FindFileFresh(fitPar->calibFileName);
      if(!calibFile)
	return;
      AliHighPtDeDxCalib* calib = (AliHighPtDeDxCalib*)GetObject(calibFile, 1, kTRUE, 0);
      calib->Print();
      fDeDxVsEtaNeg = calib->GetDeDxVsEtaNeg();
      fDeDxVsEtaPos = calib->GetDeDxVsEtaPos();
      fDeDxVsNcl    = calib->GetDeDxVsNcl();
    }
  
    fixMIP      = fitPar->MIP;
    fixPlateau  = fitPar->plateau;

    Double_t dedxPar[6]  = {0, 0, 0, 0, 0, 0};
    Double_t sigmaPar[6] = {0, 0, 0, 0, 0, 0};
    
    dedxPar[0] = fitPar->optionDeDx;
    for(Int_t i = 0; i < fitPar->nDeDxPar; i++) {
      dedxPar[i+1] = fitPar->parDeDx[i];
    }

    sigmaPar[0] = fitPar->optionSigma;
    for(Int_t i = 0; i < fitPar->nSigmaPar; i++) {
      sigmaPar[i+1] = fitPar->parSigma[i];
    }

    piFunc = new TF1("piFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1);
    piFunc->SetParameters(dedxPar);

    kFunc = new TF1("kFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1);
    kFunc->SetParameters(dedxPar);
    kFunc->SetParameter(0, kFunc->GetParameter(0)+10);

    pFunc = new TF1("pFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1);
    pFunc->SetParameters(dedxPar);
    pFunc->SetParameter(0, pFunc->GetParameter(0)+20);

    eFunc = new TF1("eFunc", FitFunc, 0, 100, fitPar->nDeDxPar+1);
    eFunc->SetParameters(dedxPar);
    eFunc->SetParameter(0, eFunc->GetParameter(0)+30);

    sigmaFunc = new TF1("sigmaFunc", SigmaFunc, 0, 100, fitPar->nSigmaPar+1); 
    sigmaFunc->SetParameters(sigmaPar);
  }

  CreateDir("data");
  dataOutFile = new TFile(Form("data/%s", outFileName), "RECREATE");

  // Create output objects
  dataOutFile->cd();
  TList* runList = new TList();
  runList->SetOwner(kTRUE);
  runList->SetBit(TObject::kSingleKey);
  
  TList* analysisList = new TList();
  analysisList->SetOwner(kFALSE);
  
  //               TList      v0type, phi cut, run, isMc
  AddObjectV0(analysisList, "lambda", kTRUE,  0, isMc); 
  AddObjectV0(analysisList, "lambda", kTRUE,  0, isMc, kTRUE, kFALSE, -8, 0); 
  AddObjectV0(analysisList, "lambda", kTRUE,  0, isMc, kTRUE, kFALSE, 0, 8); 
  AddObjectV0(analysisList, "lambda", kTRUE,  0, isMc, kFALSE, kTRUE, 0, 4); 
  AddObjectV0(analysisList, "lambda", kTRUE,  0, isMc, kFALSE, kTRUE, 4, 8); 
  AddObjectV0(analysisList, "kaon", kTRUE,  0, isMc); 
  AddObjectV0(analysisList, "kaon", kTRUE,  0, isMc, kTRUE, kFALSE, -8, 0); 
  AddObjectV0(analysisList, "kaon", kTRUE,  0, isMc, kTRUE, kFALSE, 0, 8); 
  AddObjectV0(analysisList, "kaon", kTRUE,  0, isMc, kFALSE, kTRUE, 0, 4); 
  AddObjectV0(analysisList, "kaon", kTRUE,  0, isMc, kFALSE, kTRUE, 4, 8); 
  
  TTree* Tree = 0;
  
  if(strstr(dataFileName, ".dat")) {
    
    AliXRDPROOFtoolkit tool;
    TChain* chain = tool.MakeChain(dataFileName,"tree", 0, 1000);
    //    chain->Lookup();
    Tree = chain;
  } else {
    TFile* dataFile = FindFileFresh(dataFileName);
    if(!dataFile)
      return;
    
    Tree = (TTree*)dataFile->Get("tree");
  }

  TClonesArray* v0Array = 0;
  DeDxEvent* event = 0;
  Tree->SetBranchAddress("event", &event);
  Tree->SetBranchAddress("v0GlobalPar"  , &v0Array);

  Int_t nEvents = Tree->GetEntries();
  cout << "Number of events: " << nEvents << endl;
  
  if(maxEvents>0 && maxEvents < nEvents) {
    
    nEvents = maxEvents;
    cout << "N events was reduced to: " << maxEvents << endl;
  }

  Int_t currentRun = 0;
  Int_t nBad = 0;
  TIter* iter = new TIter(analysisList);
  
  for(Int_t n = 0; n < nEvents; n++) {
    
    Tree->GetEntry(n);
    
    if((n+1)%1000000==0)
      cout << "Event: " << n+1 << "/" << nEvents << endl;

    if(event->run == -1) {
      nBad++;
      continue;
    }
    // if(event->run == 126437)
    //   continue;
    
    if(event->run != currentRun) {
      
      cout << "New run: " << event->run << endl;
      currentRun = event->run;
      
      // Check if run objects exist
      TObjString* runString = new TObjString(Form("%d", currentRun));
      if(!runList->FindObject(runString->GetString().Data())) {
	
	runList->Add(runString);
	
	//               TList      v0type, phi cut, run, isMc
	AddObjectV0(analysisList, "lambda", kTRUE,  currentRun, isMc); 
	AddObjectV0(analysisList, "kaon", kTRUE,  currentRun, isMc); 
	
	// Is this really necessary?
	delete iter;
	iter = new TIter(analysisList);

      } else {

	delete runString;
      }
    }

    // iterate over analysis list
    iter->Reset();
    AliHighPtDeDxBase* analysis = 0;
    while ((analysis = dynamic_cast<AliHighPtDeDxBase*> (iter->Next()))) {
      
      // First we set the global properties
      // If I want to use a narrower vtx I have here to redefine my 
      // vtxstatus according to the new vtx range
      analysis->SetEventRun(event->run);
      analysis->SetEventMag(event->mag);
      analysis->SetEventVtxStatus(event->vtxstatus);
      analysis->SetEventTrigger(event->trig);

      Int_t vtxstatusmc = 0;
      if(TMath::Abs(event->zvtxMC) < 10.0)
	vtxstatusmc = 1;
      analysis->SetEventVtxStatusMc(vtxstatusmc);

      if(!analysis->EventAccepted()) // only checks for runs currently
	continue;
      // There is a small prolem in making this really nice, because we need
      // also event info from events that are rejected by the vtx cut to
      // correct our data. That is why we for bnow only have the run cut there
      
      analysis->FillEventInfo();
      
      
      // The trig==1 is always true for real data, but not for MC data
      if(!event->trig)
	continue;
	
      if(event->vtxstatus<1) // only fill tracks for events with vtx inside cuts
	continue;
      
      const Int_t nV0s = v0Array->GetEntries();
      
      for(Int_t i = 0; i < nV0s; i++) {
	
	DeDxV0* v0 = (DeDxV0*)v0Array->At(i);
	
	// if(v0->ptrack.filter != 2)
	//   continue;

	if(v0->status != 0)
	  continue;

	if(v0->dmassG < 0.1)
	  continue;

	// if(v0->decayr < 5.0)
	//   continue;

	// if(v0->decayr > 40.0)
	//   continue;
	
	const Double_t dmassK  = TMath::Abs(v0->dmassK0);
	const Double_t dmassL  = TMath::Abs(v0->dmassL);
	const Double_t dmassAL = TMath::Abs(v0->dmassAL);
	
	Bool_t fillPos = kFALSE;
	Bool_t fillNeg = kFALSE;
					   
	
	if(strstr(analysis->GetName(), "lambda")) {
	  
	  if(dmassK<0.01)
	    continue;

	  if(dmassL<0.01&&dmassL>0.01)
	    fillPos = kTRUE;

	  if(dmassAL<0.01&&dmassL)
	    fillNeg = kTRUE;
	} else { // kaons

	  if(dmassL<0.01 || dmassAL<0.01)
	    continue;

	  if(dmassK<0.01) {
	    fillPos = kTRUE;
	    fillNeg = kTRUE;
	  }
	}

	for(Int_t j = 0; j < 2; j++) {

	  DeDxTrack* track = 0;
	  
	  if(j==0) {

	    if(fillNeg)
	      track = &(v0->ntrack);
	    else
	      continue;
	  } else {

	    if(fillPos)
	      track = &(v0->ptrack);
	    else
	      continue;
	  }

	  Double_t eta  = track->eta;
	  Double_t dedx = track->dedx;
	  Int_t ncl     = track->ncl;
	  if(fDeDxVsEtaNeg) {
	    
	    dedx *= 50.0 / fDeDxVsNcl->Eval(ncl);
	    
	    if(eta < 0) 
	      dedx *= 50.0 / fDeDxVsEtaNeg->Eval(eta);
	    else
	      dedx *= 50.0 / fDeDxVsEtaPos->Eval(eta);
	  }
	  
	  analysis->SetTrackCharge(track->q);
	  analysis->SetTrackP(track->p);
	  analysis->SetTrackPt(track->pt);
	  // NB! Not used
	  analysis->SetTrackFilter(track->filter);
	  analysis->SetTrackPhi(track->phi);
	  analysis->SetTrackDeDx(dedx);
	  analysis->SetTrackNcl(ncl);
	  analysis->SetTrackBeta(track->beta);
	  analysis->SetTrackPidMc(track->pid);
	  analysis->SetTrackEta(eta);
	  
	  if(analysis->TrackAccepted()) {
	    analysis->FillTrackInfo(1.0);
	  }
	}
      }
    }
  }
  
  dataOutFile->cd();
  runList->Write("runList");
  iter->Reset();
  AliHighPtDeDxBase* analysis = 0;
  while ((analysis = dynamic_cast<AliHighPtDeDxBase*> (iter->Next()))) {
    
    AliHighPtDeDxData* dataAnalysis = dynamic_cast<AliHighPtDeDxData*> (analysis);
    if(dataAnalysis) {
      dataAnalysis->Write();
    }
  }
  dataOutFile->Close();
  delete dataOutFile;
  dataOutFile = 0;

  cout << "Nbad (runno == -1) : " << nBad << endl;
}


//___________________________________________________________________________
void AddObjectV0(TList* list, const Char_t* baseName, Bool_t phiCut, Int_t run, 
		 Bool_t analyzeMc, Bool_t etaCut, Bool_t etaAbs, 
		 Int_t etaLow, Int_t etaHigh)
{
  if(etaCut && etaAbs) {

    Fatal("AddObject", "You cannot have a cut on both abs and signed eta");
    return;
  }

  TString objectName(baseName);
  if(phiCut)
    objectName += "phicut";
  if(run) {
    objectName += "_";
    objectName += run;
  }
  if(etaCut) {
    objectName += "eta";
    objectName += etaLow;
    objectName += etaHigh;
  }
  if(etaAbs) {
    objectName += "etaabs";
    objectName += etaLow;
    objectName += etaHigh;
  }
  dataOutFile->cd();
  AliHighPtDeDxData* data = new AliHighPtDeDxData(objectName.Data(), "Analysis data");
  if(run) {
    data->SetUseRunCut(kTRUE);
    data->SetRun(run);
  }
  
  list->Add(data);
  data->SetIsMc(analyzeMc);
  data->SetUseFilterCut(kFALSE);

  data->SetUsePhiCut(phiCut);
  if(phiCut) {
    data->SetPhiCutLow(data->GetStandardPhiCutLow());
    data->SetPhiCutHigh(data->GetStandardPhiCutHigh());
  }
  if(etaCut)
    data->SetUseEtaCut(kTRUE);
  if(etaAbs)
    data->SetUseEtaCutAbs(kTRUE);
  if(etaCut || etaAbs) {
    data->SetEtaLow(Double_t(etaLow)/10.0);
    data->SetEtaHigh(Double_t(etaHigh)/10.0);
  }

  data->Init(nPtBins, xBins);
  data->Print();

  if(piFunc && kFunc && pFunc && eFunc && sigmaFunc) {

    data->SetPionDeDxFunction(piFunc);
    data->SetKaonDeDxFunction(kFunc);
    data->SetProtonDeDxFunction(pFunc);
    data->SetElectronDeDxFunction(eFunc);
    data->SetSigmaDeDxFunction(sigmaFunc);
  }
}

//____________________________________________________________________________
void CreateCalib(const Char_t* dataFileName, Bool_t isMc, 
		 const Char_t* outFileName, Int_t maxEvents, Int_t startStep)
{
  if(startStep < 1 || startStep > 3) {

    cout << "Start step should be 1,2, or 3 - 2 is recommended" << endl;
  }

  if(startStep == 1) {

    for(Int_t i = 0; i < 10; i++)
      cout << "Step 1 calibration is depreceated! - 2 is recommended" << endl;
  }
  
  if(startStep<3) {

    CreateDir("calib_eta");
    dataOutFile = new TFile(Form("calib_eta/%s", outFileName), "RECREATE");
  } else {

    CreateDir("no_calib_eta");
    dataOutFile = new TFile(Form("no_calib_eta/%s", outFileName), "RECREATE");
  }

  // Create output objects
  dataOutFile->cd();
  TList* runList = new TList();
  runList->SetOwner(kTRUE);
  runList->SetBit(TObject::kSingleKey);
  
  TList* calibList = new TList();
  calibList->SetOwner(kFALSE);
  
  //        TList    filter, phi cut, run, isMc
  AddCalibObject(calibList, 1, kTRUE,  0, isMc); 
  AddCalibObject(calibList, 2, kTRUE,  0, isMc); 
  AddCalibObject(calibList, 1, kTRUE,  0, isMc, kTRUE, kFALSE, -8, 0); 
  AddCalibObject(calibList, 1, kTRUE,  0, isMc, kTRUE, kFALSE, 0, 8); 
  AddCalibObject(calibList, 1, kTRUE,  0, isMc, kFALSE, kTRUE, 0, 4); 
  AddCalibObject(calibList, 1, kTRUE,  0, isMc, kFALSE, kTRUE, 4, 8); 
  //  AddCalibObject(calibList, 1, kFALSE, 0, isMc); 
  //  AddCalibObject(calibList, 2, kTRUE,  0, isMc); 
  //  AddCalibObject(calibList, 2, kFALSE, 0, isMc); 
  
  TTree* Tree = 0;
  
  if(strstr(dataFileName, ".dat")) {
    
    AliXRDPROOFtoolkit tool;
    TChain* chain = tool.MakeChain(dataFileName,"tree", 0, 1000);
    //    chain->Lookup();
    Tree = chain;
  } else {
    TFile* dataFile = FindFileFresh(dataFileName);
    if(!dataFile)
      return;
    
    Tree = (TTree*)dataFile->Get("tree");
  }

  TClonesArray* trackArray = 0;
  TClonesArray* mcTrackArray = 0;
  DeDxEvent* event = 0;
  Tree->SetBranchAddress("event", &event);
  Tree->SetBranchAddress("trackGlobalPar"  , &trackArray);
  if(isMc)
    Tree->SetBranchAddress("trackMC"  , &mcTrackArray);

  Int_t nEvents = Tree->GetEntries();
  cout << "Number of events: " << nEvents << endl;
  
  if(maxEvents>0 && maxEvents < nEvents) {
    
    nEvents = maxEvents;
    cout << "N events was reduced to: " << maxEvents << endl;
  }

  Int_t currentRun = 0;
  Int_t nBad = 0;
  TIter* iter = new TIter(calibList);
  AliHighPtDeDxCalib* calib = 0;

  for(Int_t step = startStep; step <= 3; step++) {
    
    iter->Reset();
    while ((calib = dynamic_cast<AliHighPtDeDxCalib*> (iter->Next()))) {
      
      calib->SetStep(step);
      // Here you can set the MIP interval
      // default is 40-60
      if(step==startStep) {
	calib->SetDeDxMIPMin(25);
	calib->SetDeDxMIPMax(55);
      } else {
	calib->SetDeDxMIPMin(40);
	calib->SetDeDxMIPMax(60);
      }
      calib->Init(step, nPtBins, xBins);
    }
    
    for(Int_t n = 0; n < nEvents; n++) {
      
      Tree->GetEntry(n);
      
      if((n+1)%1000000==0)
	cout << "Event: " << n+1 << "/" << nEvents << endl;
      
      if(event->run == -1) {
	nBad++;
	continue;
      }
      // if(event->run == 126437)
      //   continue;
      
      if(event->run != currentRun) {
	
	cout << "New run: " << event->run << endl;
	currentRun = event->run;
	
	// Check if run objects exist
	TObjString* runString = new TObjString(Form("%d", currentRun));
	if(!runList->FindObject(runString->GetString().Data())) {
	  
	  runList->Add(runString);
	  
	  //        TList    filter, phi cut, run, isMc
	  AddCalibObject(calibList, 1, kTRUE,  currentRun, isMc); 
	  // AddCalibObject(calibList, 1, kFALSE, currentRun, isMc); 
	  // AddCalibObject(calibList, 2, kTRUE,  currentRun, isMc); 
	  // AddCalibObject(calibList, 2, kFALSE, currentRun, isMc); 
	  
	  // Is this really necessary?
	  delete iter;
	  iter = new TIter(calibList);

	  iter->Reset();
	  while ((calib = dynamic_cast<AliHighPtDeDxCalib*> (iter->Next()))) {
	    
	    calib->SetStep(step);
	    if(step==startStep) {
	      calib->SetDeDxMIPMin(25);
	      calib->SetDeDxMIPMax(55);
	    } else {
	      calib->SetDeDxMIPMin(40);
	      calib->SetDeDxMIPMax(60);
	    }
	    calib->Init(step, nPtBins, xBins);
	  }
	  
	} else {

	  delete runString;
	}
      }
      
      // iterate over calib list
      iter->Reset();
      while ((calib = dynamic_cast<AliHighPtDeDxCalib*> (iter->Next()))) {
	
	// First we set the global properties
	// If I want to use a narrower vtx I have here to redefine my 
	// vtxstatus according to the new vtx range
	calib->SetEventRun(event->run);
	calib->SetEventMag(event->mag);
	calib->SetEventVtxStatus(event->vtxstatus);
	calib->SetEventTrigger(event->trig);
	
	if(!calib->EventAccepted()) // only checks for runs currently
	  continue;

	calib->FillEventInfo();
	
	// The trig==1 is always true for real data, but not for MC data
	if(!event->trig)
	  continue;
	
	if(event->vtxstatus<1) // only fill tracks for events with vtx inside cuts
	  continue;
	
	const Int_t nTracks = trackArray->GetEntries();
	
	for(Int_t i = 0; i < nTracks; i++) {
	  
	  DeDxTrack* track = (DeDxTrack*)trackArray->At(i);
	  
	  calib->SetTrackCharge(track->q);
	  calib->SetTrackP(track->p);
	  calib->SetTrackPt(track->pt);
	  Int_t filter = CalculateFilter(track);
	  calib->SetTrackFilter(filter);
	  calib->SetTrackPhi(track->phi);
	  calib->SetTrackDeDx(track->dedx);
	  calib->SetTrackNcl(track->ncl);
	  calib->SetTrackBeta(track->beta);
	  calib->SetTrackPidMc(track->pid);
	  calib->SetTrackEta(track->eta);
	  
	  if(calib->TrackAccepted()) {
	    // if(track->pt<2.0)
	    //   calib->FillTrackInfo(100.0);
	    // else
	      calib->FillTrackInfo(1.0);
	  }
	}
      }
    }

    if(step == 2) { // perform eta calibration

      cout << "Starting Eta cal" << endl;
      iter->Reset();
      while ((calib = dynamic_cast<AliHighPtDeDxCalib*> (iter->Next()))) {
	
	calib->PerformEtaCal();
      }
      cout << "Finishing Eta cal" << endl;
    } else if(step == 1) { // perform ncl calibration
      

      cout << "Starting Ncl cal" << endl;
      iter->Reset();
      while ((calib = dynamic_cast<AliHighPtDeDxCalib*> (iter->Next()))) {
	
	calib->PerformNclCal();
      }
      cout << "Finished Ncl cal" << endl;
    }
  }

  cout << "Nbad (runno == -1) : " << nBad << endl;

  dataOutFile->cd();
  runList->Write("runList");
  iter->Reset();
  cout << "Writing calibration data" << endl;
  while ((calib = dynamic_cast<AliHighPtDeDxCalib*> (iter->Next()))) {
    
    cout << "Writing calibration object " << calib->GetName() << endl;
    calib->Write();
  }
  cout << "Finsihed writing calibration data" << endl;
  dataOutFile->Close();
  delete dataOutFile;
  dataOutFile = 0;
}

//___________________________________________________________________________
void AddCalibObject(TList* list, Int_t filter, Bool_t phiCut, Int_t run, 
		    Bool_t analyzeMc, Bool_t etaCut, Bool_t etaAbs, 
		    Int_t etaLow, Int_t etaHigh)
{
  if(etaCut && etaAbs) {

    Fatal("AddCalibObject", "You cannot have a cut on both abs and signed eta");
    return;
  }
  TString objectName("filter");
  objectName += filter;
  if(phiCut)
    objectName += "phicut";
  if(run) {
    objectName += "_";
    objectName += run;
  }
  if(etaCut) {
    objectName += "eta";
    objectName += etaLow;
    objectName += etaHigh;
  }
  if(etaAbs) {
    objectName += "etaabs";
    objectName += etaLow;
    objectName += etaHigh;
  }

  //  dataOutFile->cd();
  AliHighPtDeDxCalib* data = new AliHighPtDeDxCalib(objectName.Data(), "Calib data");
  if(run) {
    data->SetUseRunCut(kTRUE);
    data->SetRun(run);
  }

  list->Add(data);
  data->SetIsMc(analyzeMc);
  data->SetUseFilterCut(kTRUE);
  data->SetFilter(filter);
  data->SetUsePhiCut(phiCut);
  if(phiCut) {
    data->SetPhiCutLow(data->GetStandardPhiCutLow());
    data->SetPhiCutHigh(data->GetStandardPhiCutHigh());
  }
  if(etaCut)
    data->SetUseEtaCut(kTRUE);
  if(etaAbs)
    data->SetUseEtaCutAbs(kTRUE);
  if(etaCut || etaAbs) {
    data->SetEtaLow(Double_t(etaLow)/10.0);
    data->SetEtaHigh(Double_t(etaHigh)/10.0);
  }
  if(run) {
    data->SetUseRunCut(kTRUE);
    data->SetRun(run);
  }

  data->Init(nPtBins, xBins);
  data->Print();
}

//____________________________________________________________________________
void CreateCalibV0(const Char_t* dataFileName, Bool_t isMc, 
		   const Char_t* outFileName, Int_t maxEvents)
{
  CreateDir("no_calib_eta");
  dataOutFile = new TFile(Form("no_calib_eta/%s", outFileName), "RECREATE");
  
  // Create output objects
  dataOutFile->cd();
  TList* runList = new TList();
  runList->SetOwner(kTRUE);
  runList->SetBit(TObject::kSingleKey);
  
  TList* calibList = new TList();
  calibList->SetOwner(kFALSE);
  
  //        TList    filter, phi cut, run, isMc
  AddCalibObjectV0(calibList, "lambda", kTRUE,  0, isMc); 
  //  AddCalibObject(calibList, 1, kFALSE, 0, isMc); 
  AddCalibObjectV0(calibList, "kaon", kTRUE,  0, isMc); 
  //  AddCalibObject(calibList, 2, kFALSE, 0, isMc); 
  
  TTree* Tree = 0;
  
  if(strstr(dataFileName, ".dat")) {
    
    AliXRDPROOFtoolkit tool;
    TChain* chain = tool.MakeChain(dataFileName,"tree", 0, 1000);
    //    chain->Lookup();
    Tree = chain;
  } else {
    TFile* dataFile = FindFileFresh(dataFileName);
    if(!dataFile)
      return;
    
    Tree = (TTree*)dataFile->Get("tree");
  }
  
  TClonesArray* v0Array = 0;
  DeDxEvent* event = 0;
  Tree->SetBranchAddress("event", &event);
  Tree->SetBranchAddress("v0"  , &v0Array);
  
  Int_t nEvents = Tree->GetEntries();
  cout << "Number of events: " << nEvents << endl;
  
  if(maxEvents>0 && maxEvents < nEvents) {
    
    nEvents = maxEvents;
    cout << "N events was reduced to: " << maxEvents << endl;
  }
  
  Int_t currentRun = 0;
  Int_t nBad = 0;
  TIter* iter = new TIter(calibList);
  AliHighPtDeDxCalib* calib = 0;
  
  iter->Reset();
  while ((calib = dynamic_cast<AliHighPtDeDxCalib*> (iter->Next()))) {
    
    calib->SetStep(3);
  }
  
  for(Int_t n = 0; n < nEvents; n++) {
    
    Tree->GetEntry(n);
    
    if((n+1)%1000000==0)
      cout << "Event: " << n+1 << "/" << nEvents << endl;
    
    if(event->run == -1) {
      nBad++;
      continue;
    }
    // if(event->run == 126437)
    //   continue;
    
    if(event->run != currentRun) {
      
      cout << "New run: " << event->run << endl;
      currentRun = event->run;
      
      // Check if run objects exist
      TObjString* runString = new TObjString(Form("%d", currentRun));
      if(!runList->FindObject(runString->GetString().Data())) {
	
	runList->Add(runString);
	
	//        TList    filter, phi cut, run, isMc
	AddCalibObjectV0(calibList, "lambda", kTRUE,  currentRun, isMc); 
	AddCalibObjectV0(calibList, "kaon", kTRUE,  currentRun, isMc); 
	
	// Is this really necessary?
	delete iter;
	iter = new TIter(calibList);
	
	iter->Reset();
	while ((calib = dynamic_cast<AliHighPtDeDxCalib*> (iter->Next()))) {
	  
	  calib->SetStep(3);
	}
	
	} else {
	
	delete runString;
      }
    }
    
    // iterate over calib list
    iter->Reset();
    while ((calib = dynamic_cast<AliHighPtDeDxCalib*> (iter->Next()))) {
      
      // First we set the global properties
      // If I want to use a narrower vtx I have here to redefine my 
      // vtxstatus according to the new vtx range
      calib->SetEventRun(event->run);
      calib->SetEventMag(event->mag);
      calib->SetEventVtxStatus(event->vtxstatus);
      calib->SetEventTrigger(event->trig);
      
      if(!calib->EventAccepted()) // only checks for runs currently
	continue;

      calib->FillEventInfo();
	
      // The trig==1 is always true for real data, but not for MC data
      if(!event->trig)
	continue;
      
      if(event->vtxstatus<1) // only fill tracks for events with vtx inside cuts
	continue;
      
      const Int_t nV0s = v0Array->GetEntries();
      
      for(Int_t i = 0; i < nV0s; i++) {
	
	DeDxV0* v0 = (DeDxV0*)v0Array->At(i);
	
	// if(v0->ptrack.filter != 2)
	//   continue;

	if(v0->status != 0)
	  continue;

	if(v0->dmassG < 0.1)
	  continue;

	// if(v0->decayr < 5.0)
	//   continue;

	// if(v0->decayr > 40.0)
	//   continue;
	
	const Double_t dmassK  = TMath::Abs(v0->dmassK0);
	const Double_t dmassL  = TMath::Abs(v0->dmassL);
	const Double_t dmassAL = TMath::Abs(v0->dmassAL);
	
	Bool_t fillPos = kFALSE;
	Bool_t fillNeg = kFALSE;
					   

	if(strstr(calib->GetName(), "lambda")) {
	  
	  if(dmassK<0.01)
	    continue;

	  if(dmassL<0.01)
	    fillPos = kTRUE;

	  if(dmassAL<0.01)
	    fillNeg = kTRUE;
	} else { // kaons

	  if(dmassL<0.01 || dmassAL<0.01)
	    continue;

	  if(dmassK<0.01) {
	    fillPos = kTRUE;
	    fillNeg = kTRUE;
	  }
	}

	for(Int_t j = 0; j < 2; j++) {

	  DeDxTrack* track = 0;
	  
	  if(j==0) {

	    if(fillNeg)
	      track = &(v0->ntrack);
	    else
	      continue;
	  } else {

	    if(fillPos)
	      track = &(v0->ptrack);
	    else
	      continue;
	  }
	  
	  calib->SetTrackCharge(track->q);
	  calib->SetTrackP(track->p);
	  calib->SetTrackPt(track->pt);
	  // NB! Filter is not used for these tracks!
	  calib->SetTrackFilter(track->filter);
	  calib->SetTrackPhi(track->phi);
	  calib->SetTrackDeDx(track->dedx);
	  calib->SetTrackNcl(track->ncl);
	  calib->SetTrackBeta(track->beta);
	  calib->SetTrackPidMc(track->pid);
	  calib->SetTrackEta(track->eta);
	  
	  if(calib->TrackAccepted()) {
	    calib->FillTrackInfo(1.0);
	  }
	}
      }
    }
  }
  dataOutFile->cd();
  runList->Write("runList");
  iter->Reset();
  while ((calib = dynamic_cast<AliHighPtDeDxCalib*> (iter->Next()))) {
    
    calib->Write();
  }
  dataOutFile->Close();
  delete dataOutFile;
  dataOutFile = 0;

  cout << "Nbad (runno == -1) : " << nBad << endl;
}

//___________________________________________________________________________
void AddCalibObjectV0(TList* list, const Char_t* baseName, Bool_t phiCut, 
		      Int_t run, Bool_t analyzeMc)
{
  TString objectName(baseName);
  if(phiCut)
    objectName += "phicut";
  if(run) {
    objectName += "_";
    objectName += run;
  }
  dataOutFile->cd();
  AliHighPtDeDxCalib* data = new AliHighPtDeDxCalib(objectName.Data(), "Calib data");
  if(run) {
    data->SetUseRunCut(kTRUE);
    data->SetRun(run);
  }
  
  list->Add(data);
  data->SetIsMc(analyzeMc);
  data->SetUseFilterCut(kFALSE);
  data->SetUsePhiCut(phiCut);
  if(phiCut) {
    data->SetPhiCutLow(data->GetStandardPhiCutLow());
    data->SetPhiCutHigh(data->GetStandardPhiCutHigh());
  }
  data->Init(nPtBins, xBins);
  data->Print();
}

//___________________________________________________________________________
Int_t CalculateFilter(DeDxTrack* track)
{
  Int_t filter = 0;
  if(track->filterset3)
    filter += 1;
  if(track->filterset2 && !track->filterset3)
    filter += 2;
  if(track->filterset1)
    filter += 4;
  return filter;
}
 run_code.C:1
 run_code.C:2
 run_code.C:3
 run_code.C:4
 run_code.C:5
 run_code.C:6
 run_code.C:7
 run_code.C:8
 run_code.C:9
 run_code.C:10
 run_code.C:11
 run_code.C:12
 run_code.C:13
 run_code.C:14
 run_code.C:15
 run_code.C:16
 run_code.C:17
 run_code.C:18
 run_code.C:19
 run_code.C:20
 run_code.C:21
 run_code.C:22
 run_code.C:23
 run_code.C:24
 run_code.C:25
 run_code.C:26
 run_code.C:27
 run_code.C:28
 run_code.C:29
 run_code.C:30
 run_code.C:31
 run_code.C:32
 run_code.C:33
 run_code.C:34
 run_code.C:35
 run_code.C:36
 run_code.C:37
 run_code.C:38
 run_code.C:39
 run_code.C:40
 run_code.C:41
 run_code.C:42
 run_code.C:43
 run_code.C:44
 run_code.C:45
 run_code.C:46
 run_code.C:47
 run_code.C:48
 run_code.C:49
 run_code.C:50
 run_code.C:51
 run_code.C:52
 run_code.C:53
 run_code.C:54
 run_code.C:55
 run_code.C:56
 run_code.C:57
 run_code.C:58
 run_code.C:59
 run_code.C:60
 run_code.C:61
 run_code.C:62
 run_code.C:63
 run_code.C:64
 run_code.C:65
 run_code.C:66
 run_code.C:67
 run_code.C:68
 run_code.C:69
 run_code.C:70
 run_code.C:71
 run_code.C:72
 run_code.C:73
 run_code.C:74
 run_code.C:75
 run_code.C:76
 run_code.C:77
 run_code.C:78
 run_code.C:79
 run_code.C:80
 run_code.C:81
 run_code.C:82
 run_code.C:83
 run_code.C:84
 run_code.C:85
 run_code.C:86
 run_code.C:87
 run_code.C:88
 run_code.C:89
 run_code.C:90
 run_code.C:91
 run_code.C:92
 run_code.C:93
 run_code.C:94
 run_code.C:95
 run_code.C:96
 run_code.C:97
 run_code.C:98
 run_code.C:99
 run_code.C:100
 run_code.C:101
 run_code.C:102
 run_code.C:103
 run_code.C:104
 run_code.C:105
 run_code.C:106
 run_code.C:107
 run_code.C:108
 run_code.C:109
 run_code.C:110
 run_code.C:111
 run_code.C:112
 run_code.C:113
 run_code.C:114
 run_code.C:115
 run_code.C:116
 run_code.C:117
 run_code.C:118
 run_code.C:119
 run_code.C:120
 run_code.C:121
 run_code.C:122
 run_code.C:123
 run_code.C:124
 run_code.C:125
 run_code.C:126
 run_code.C:127
 run_code.C:128
 run_code.C:129
 run_code.C:130
 run_code.C:131
 run_code.C:132
 run_code.C:133
 run_code.C:134
 run_code.C:135
 run_code.C:136
 run_code.C:137
 run_code.C:138
 run_code.C:139
 run_code.C:140
 run_code.C:141
 run_code.C:142
 run_code.C:143
 run_code.C:144
 run_code.C:145
 run_code.C:146
 run_code.C:147
 run_code.C:148
 run_code.C:149
 run_code.C:150
 run_code.C:151
 run_code.C:152
 run_code.C:153
 run_code.C:154
 run_code.C:155
 run_code.C:156
 run_code.C:157
 run_code.C:158
 run_code.C:159
 run_code.C:160
 run_code.C:161
 run_code.C:162
 run_code.C:163
 run_code.C:164
 run_code.C:165
 run_code.C:166
 run_code.C:167
 run_code.C:168
 run_code.C:169
 run_code.C:170
 run_code.C:171
 run_code.C:172
 run_code.C:173
 run_code.C:174
 run_code.C:175
 run_code.C:176
 run_code.C:177
 run_code.C:178
 run_code.C:179
 run_code.C:180
 run_code.C:181
 run_code.C:182
 run_code.C:183
 run_code.C:184
 run_code.C:185
 run_code.C:186
 run_code.C:187
 run_code.C:188
 run_code.C:189
 run_code.C:190
 run_code.C:191
 run_code.C:192
 run_code.C:193
 run_code.C:194
 run_code.C:195
 run_code.C:196
 run_code.C:197
 run_code.C:198
 run_code.C:199
 run_code.C:200
 run_code.C:201
 run_code.C:202
 run_code.C:203
 run_code.C:204
 run_code.C:205
 run_code.C:206
 run_code.C:207
 run_code.C:208
 run_code.C:209
 run_code.C:210
 run_code.C:211
 run_code.C:212
 run_code.C:213
 run_code.C:214
 run_code.C:215
 run_code.C:216
 run_code.C:217
 run_code.C:218
 run_code.C:219
 run_code.C:220
 run_code.C:221
 run_code.C:222
 run_code.C:223
 run_code.C:224
 run_code.C:225
 run_code.C:226
 run_code.C:227
 run_code.C:228
 run_code.C:229
 run_code.C:230
 run_code.C:231
 run_code.C:232
 run_code.C:233
 run_code.C:234
 run_code.C:235
 run_code.C:236
 run_code.C:237
 run_code.C:238
 run_code.C:239
 run_code.C:240
 run_code.C:241
 run_code.C:242
 run_code.C:243
 run_code.C:244
 run_code.C:245
 run_code.C:246
 run_code.C:247
 run_code.C:248
 run_code.C:249
 run_code.C:250
 run_code.C:251
 run_code.C:252
 run_code.C:253
 run_code.C:254
 run_code.C:255
 run_code.C:256
 run_code.C:257
 run_code.C:258
 run_code.C:259
 run_code.C:260
 run_code.C:261
 run_code.C:262
 run_code.C:263
 run_code.C:264
 run_code.C:265
 run_code.C:266
 run_code.C:267
 run_code.C:268
 run_code.C:269
 run_code.C:270
 run_code.C:271
 run_code.C:272
 run_code.C:273
 run_code.C:274
 run_code.C:275
 run_code.C:276
 run_code.C:277
 run_code.C:278
 run_code.C:279
 run_code.C:280
 run_code.C:281
 run_code.C:282
 run_code.C:283
 run_code.C:284
 run_code.C:285
 run_code.C:286
 run_code.C:287
 run_code.C:288
 run_code.C:289
 run_code.C:290
 run_code.C:291
 run_code.C:292
 run_code.C:293
 run_code.C:294
 run_code.C:295
 run_code.C:296
 run_code.C:297
 run_code.C:298
 run_code.C:299
 run_code.C:300
 run_code.C:301
 run_code.C:302
 run_code.C:303
 run_code.C:304
 run_code.C:305
 run_code.C:306
 run_code.C:307
 run_code.C:308
 run_code.C:309
 run_code.C:310
 run_code.C:311
 run_code.C:312
 run_code.C:313
 run_code.C:314
 run_code.C:315
 run_code.C:316
 run_code.C:317
 run_code.C:318
 run_code.C:319
 run_code.C:320
 run_code.C:321
 run_code.C:322
 run_code.C:323
 run_code.C:324
 run_code.C:325
 run_code.C:326
 run_code.C:327
 run_code.C:328
 run_code.C:329
 run_code.C:330
 run_code.C:331
 run_code.C:332
 run_code.C:333
 run_code.C:334
 run_code.C:335
 run_code.C:336
 run_code.C:337
 run_code.C:338
 run_code.C:339
 run_code.C:340
 run_code.C:341
 run_code.C:342
 run_code.C:343
 run_code.C:344
 run_code.C:345
 run_code.C:346
 run_code.C:347
 run_code.C:348
 run_code.C:349
 run_code.C:350
 run_code.C:351
 run_code.C:352
 run_code.C:353
 run_code.C:354
 run_code.C:355
 run_code.C:356
 run_code.C:357
 run_code.C:358
 run_code.C:359
 run_code.C:360
 run_code.C:361
 run_code.C:362
 run_code.C:363
 run_code.C:364
 run_code.C:365
 run_code.C:366
 run_code.C:367
 run_code.C:368
 run_code.C:369
 run_code.C:370
 run_code.C:371
 run_code.C:372
 run_code.C:373
 run_code.C:374
 run_code.C:375
 run_code.C:376
 run_code.C:377
 run_code.C:378
 run_code.C:379
 run_code.C:380
 run_code.C:381
 run_code.C:382
 run_code.C:383
 run_code.C:384
 run_code.C:385
 run_code.C:386
 run_code.C:387
 run_code.C:388
 run_code.C:389
 run_code.C:390
 run_code.C:391
 run_code.C:392
 run_code.C:393
 run_code.C:394
 run_code.C:395
 run_code.C:396
 run_code.C:397
 run_code.C:398
 run_code.C:399
 run_code.C:400
 run_code.C:401
 run_code.C:402
 run_code.C:403
 run_code.C:404
 run_code.C:405
 run_code.C:406
 run_code.C:407
 run_code.C:408
 run_code.C:409
 run_code.C:410
 run_code.C:411
 run_code.C:412
 run_code.C:413
 run_code.C:414
 run_code.C:415
 run_code.C:416
 run_code.C:417
 run_code.C:418
 run_code.C:419
 run_code.C:420
 run_code.C:421
 run_code.C:422
 run_code.C:423
 run_code.C:424
 run_code.C:425
 run_code.C:426
 run_code.C:427
 run_code.C:428
 run_code.C:429
 run_code.C:430
 run_code.C:431
 run_code.C:432
 run_code.C:433
 run_code.C:434
 run_code.C:435
 run_code.C:436
 run_code.C:437
 run_code.C:438
 run_code.C:439
 run_code.C:440
 run_code.C:441
 run_code.C:442
 run_code.C:443
 run_code.C:444
 run_code.C:445
 run_code.C:446
 run_code.C:447
 run_code.C:448
 run_code.C:449
 run_code.C:450
 run_code.C:451
 run_code.C:452
 run_code.C:453
 run_code.C:454
 run_code.C:455
 run_code.C:456
 run_code.C:457
 run_code.C:458
 run_code.C:459
 run_code.C:460
 run_code.C:461
 run_code.C:462
 run_code.C:463
 run_code.C:464
 run_code.C:465
 run_code.C:466
 run_code.C:467
 run_code.C:468
 run_code.C:469
 run_code.C:470
 run_code.C:471
 run_code.C:472
 run_code.C:473
 run_code.C:474
 run_code.C:475
 run_code.C:476
 run_code.C:477
 run_code.C:478
 run_code.C:479
 run_code.C:480
 run_code.C:481
 run_code.C:482
 run_code.C:483
 run_code.C:484
 run_code.C:485
 run_code.C:486
 run_code.C:487
 run_code.C:488
 run_code.C:489
 run_code.C:490
 run_code.C:491
 run_code.C:492
 run_code.C:493
 run_code.C:494
 run_code.C:495
 run_code.C:496
 run_code.C:497
 run_code.C:498
 run_code.C:499
 run_code.C:500
 run_code.C:501
 run_code.C:502
 run_code.C:503
 run_code.C:504
 run_code.C:505
 run_code.C:506
 run_code.C:507
 run_code.C:508
 run_code.C:509
 run_code.C:510
 run_code.C:511
 run_code.C:512
 run_code.C:513
 run_code.C:514
 run_code.C:515
 run_code.C:516
 run_code.C:517
 run_code.C:518
 run_code.C:519
 run_code.C:520
 run_code.C:521
 run_code.C:522
 run_code.C:523
 run_code.C:524
 run_code.C:525
 run_code.C:526
 run_code.C:527
 run_code.C:528
 run_code.C:529
 run_code.C:530
 run_code.C:531
 run_code.C:532
 run_code.C:533
 run_code.C:534
 run_code.C:535
 run_code.C:536
 run_code.C:537
 run_code.C:538
 run_code.C:539
 run_code.C:540
 run_code.C:541
 run_code.C:542
 run_code.C:543
 run_code.C:544
 run_code.C:545
 run_code.C:546
 run_code.C:547
 run_code.C:548
 run_code.C:549
 run_code.C:550
 run_code.C:551
 run_code.C:552
 run_code.C:553
 run_code.C:554
 run_code.C:555
 run_code.C:556
 run_code.C:557
 run_code.C:558
 run_code.C:559
 run_code.C:560
 run_code.C:561
 run_code.C:562
 run_code.C:563
 run_code.C:564
 run_code.C:565
 run_code.C:566
 run_code.C:567
 run_code.C:568
 run_code.C:569
 run_code.C:570
 run_code.C:571
 run_code.C:572
 run_code.C:573
 run_code.C:574
 run_code.C:575
 run_code.C:576
 run_code.C:577
 run_code.C:578
 run_code.C:579
 run_code.C:580
 run_code.C:581
 run_code.C:582
 run_code.C:583
 run_code.C:584
 run_code.C:585
 run_code.C:586
 run_code.C:587
 run_code.C:588
 run_code.C:589
 run_code.C:590
 run_code.C:591
 run_code.C:592
 run_code.C:593
 run_code.C:594
 run_code.C:595
 run_code.C:596
 run_code.C:597
 run_code.C:598
 run_code.C:599
 run_code.C:600
 run_code.C:601
 run_code.C:602
 run_code.C:603
 run_code.C:604
 run_code.C:605
 run_code.C:606
 run_code.C:607
 run_code.C:608
 run_code.C:609
 run_code.C:610
 run_code.C:611
 run_code.C:612
 run_code.C:613
 run_code.C:614
 run_code.C:615
 run_code.C:616
 run_code.C:617
 run_code.C:618
 run_code.C:619
 run_code.C:620
 run_code.C:621
 run_code.C:622
 run_code.C:623
 run_code.C:624
 run_code.C:625
 run_code.C:626
 run_code.C:627
 run_code.C:628
 run_code.C:629
 run_code.C:630
 run_code.C:631
 run_code.C:632
 run_code.C:633
 run_code.C:634
 run_code.C:635
 run_code.C:636
 run_code.C:637
 run_code.C:638
 run_code.C:639
 run_code.C:640
 run_code.C:641
 run_code.C:642
 run_code.C:643
 run_code.C:644
 run_code.C:645
 run_code.C:646
 run_code.C:647
 run_code.C:648
 run_code.C:649
 run_code.C:650
 run_code.C:651
 run_code.C:652
 run_code.C:653
 run_code.C:654
 run_code.C:655
 run_code.C:656
 run_code.C:657
 run_code.C:658
 run_code.C:659
 run_code.C:660
 run_code.C:661
 run_code.C:662
 run_code.C:663
 run_code.C:664
 run_code.C:665
 run_code.C:666
 run_code.C:667
 run_code.C:668
 run_code.C:669
 run_code.C:670
 run_code.C:671
 run_code.C:672
 run_code.C:673
 run_code.C:674
 run_code.C:675
 run_code.C:676
 run_code.C:677
 run_code.C:678
 run_code.C:679
 run_code.C:680
 run_code.C:681
 run_code.C:682
 run_code.C:683
 run_code.C:684
 run_code.C:685
 run_code.C:686
 run_code.C:687
 run_code.C:688
 run_code.C:689
 run_code.C:690
 run_code.C:691
 run_code.C:692
 run_code.C:693
 run_code.C:694
 run_code.C:695
 run_code.C:696
 run_code.C:697
 run_code.C:698
 run_code.C:699
 run_code.C:700
 run_code.C:701
 run_code.C:702
 run_code.C:703
 run_code.C:704
 run_code.C:705
 run_code.C:706
 run_code.C:707
 run_code.C:708
 run_code.C:709
 run_code.C:710
 run_code.C:711
 run_code.C:712
 run_code.C:713
 run_code.C:714
 run_code.C:715
 run_code.C:716
 run_code.C:717
 run_code.C:718
 run_code.C:719
 run_code.C:720
 run_code.C:721
 run_code.C:722
 run_code.C:723
 run_code.C:724
 run_code.C:725
 run_code.C:726
 run_code.C:727
 run_code.C:728
 run_code.C:729
 run_code.C:730
 run_code.C:731
 run_code.C:732
 run_code.C:733
 run_code.C:734
 run_code.C:735
 run_code.C:736
 run_code.C:737
 run_code.C:738
 run_code.C:739
 run_code.C:740
 run_code.C:741
 run_code.C:742
 run_code.C:743
 run_code.C:744
 run_code.C:745
 run_code.C:746
 run_code.C:747
 run_code.C:748
 run_code.C:749
 run_code.C:750
 run_code.C:751
 run_code.C:752
 run_code.C:753
 run_code.C:754
 run_code.C:755
 run_code.C:756
 run_code.C:757
 run_code.C:758
 run_code.C:759
 run_code.C:760
 run_code.C:761
 run_code.C:762
 run_code.C:763
 run_code.C:764
 run_code.C:765
 run_code.C:766
 run_code.C:767
 run_code.C:768
 run_code.C:769
 run_code.C:770
 run_code.C:771
 run_code.C:772
 run_code.C:773
 run_code.C:774
 run_code.C:775
 run_code.C:776
 run_code.C:777
 run_code.C:778
 run_code.C:779
 run_code.C:780
 run_code.C:781
 run_code.C:782
 run_code.C:783
 run_code.C:784
 run_code.C:785
 run_code.C:786
 run_code.C:787
 run_code.C:788
 run_code.C:789
 run_code.C:790
 run_code.C:791
 run_code.C:792
 run_code.C:793
 run_code.C:794
 run_code.C:795
 run_code.C:796
 run_code.C:797
 run_code.C:798
 run_code.C:799
 run_code.C:800
 run_code.C:801
 run_code.C:802
 run_code.C:803
 run_code.C:804
 run_code.C:805
 run_code.C:806
 run_code.C:807
 run_code.C:808
 run_code.C:809
 run_code.C:810
 run_code.C:811
 run_code.C:812
 run_code.C:813
 run_code.C:814
 run_code.C:815
 run_code.C:816
 run_code.C:817
 run_code.C:818
 run_code.C:819
 run_code.C:820
 run_code.C:821
 run_code.C:822
 run_code.C:823
 run_code.C:824
 run_code.C:825
 run_code.C:826
 run_code.C:827
 run_code.C:828
 run_code.C:829
 run_code.C:830
 run_code.C:831
 run_code.C:832
 run_code.C:833
 run_code.C:834
 run_code.C:835
 run_code.C:836
 run_code.C:837
 run_code.C:838
 run_code.C:839
 run_code.C:840
 run_code.C:841
 run_code.C:842
 run_code.C:843
 run_code.C:844
 run_code.C:845
 run_code.C:846
 run_code.C:847
 run_code.C:848
 run_code.C:849
 run_code.C:850
 run_code.C:851
 run_code.C:852
 run_code.C:853
 run_code.C:854
 run_code.C:855
 run_code.C:856
 run_code.C:857
 run_code.C:858
 run_code.C:859
 run_code.C:860
 run_code.C:861
 run_code.C:862
 run_code.C:863
 run_code.C:864
 run_code.C:865
 run_code.C:866
 run_code.C:867
 run_code.C:868
 run_code.C:869
 run_code.C:870
 run_code.C:871
 run_code.C:872
 run_code.C:873
 run_code.C:874
 run_code.C:875
 run_code.C:876
 run_code.C:877
 run_code.C:878
 run_code.C:879
 run_code.C:880
 run_code.C:881
 run_code.C:882
 run_code.C:883
 run_code.C:884
 run_code.C:885
 run_code.C:886
 run_code.C:887
 run_code.C:888
 run_code.C:889
 run_code.C:890
 run_code.C:891
 run_code.C:892
 run_code.C:893
 run_code.C:894
 run_code.C:895
 run_code.C:896
 run_code.C:897
 run_code.C:898
 run_code.C:899
 run_code.C:900
 run_code.C:901
 run_code.C:902
 run_code.C:903
 run_code.C:904
 run_code.C:905
 run_code.C:906
 run_code.C:907
 run_code.C:908
 run_code.C:909
 run_code.C:910
 run_code.C:911
 run_code.C:912
 run_code.C:913
 run_code.C:914
 run_code.C:915
 run_code.C:916
 run_code.C:917
 run_code.C:918
 run_code.C:919
 run_code.C:920
 run_code.C:921
 run_code.C:922
 run_code.C:923
 run_code.C:924
 run_code.C:925
 run_code.C:926
 run_code.C:927
 run_code.C:928
 run_code.C:929
 run_code.C:930
 run_code.C:931
 run_code.C:932
 run_code.C:933
 run_code.C:934
 run_code.C:935
 run_code.C:936
 run_code.C:937
 run_code.C:938
 run_code.C:939
 run_code.C:940
 run_code.C:941
 run_code.C:942
 run_code.C:943
 run_code.C:944
 run_code.C:945
 run_code.C:946
 run_code.C:947
 run_code.C:948
 run_code.C:949
 run_code.C:950
 run_code.C:951
 run_code.C:952
 run_code.C:953
 run_code.C:954
 run_code.C:955
 run_code.C:956
 run_code.C:957
 run_code.C:958
 run_code.C:959
 run_code.C:960
 run_code.C:961
 run_code.C:962
 run_code.C:963
 run_code.C:964
 run_code.C:965
 run_code.C:966
 run_code.C:967
 run_code.C:968
 run_code.C:969
 run_code.C:970
 run_code.C:971
 run_code.C:972
 run_code.C:973
 run_code.C:974
 run_code.C:975
 run_code.C:976
 run_code.C:977
 run_code.C:978
 run_code.C:979
 run_code.C:980
 run_code.C:981
 run_code.C:982
 run_code.C:983
 run_code.C:984
 run_code.C:985
 run_code.C:986
 run_code.C:987
 run_code.C:988
 run_code.C:989
 run_code.C:990
 run_code.C:991
 run_code.C:992
 run_code.C:993
 run_code.C:994
 run_code.C:995
 run_code.C:996
 run_code.C:997
 run_code.C:998
 run_code.C:999
 run_code.C:1000
 run_code.C:1001
 run_code.C:1002
 run_code.C:1003
 run_code.C:1004
 run_code.C:1005
 run_code.C:1006
 run_code.C:1007
 run_code.C:1008
 run_code.C:1009
 run_code.C:1010
 run_code.C:1011
 run_code.C:1012
 run_code.C:1013
 run_code.C:1014
 run_code.C:1015
 run_code.C:1016
 run_code.C:1017
 run_code.C:1018
 run_code.C:1019
 run_code.C:1020
 run_code.C:1021
 run_code.C:1022
 run_code.C:1023
 run_code.C:1024
 run_code.C:1025
 run_code.C:1026
 run_code.C:1027
 run_code.C:1028
 run_code.C:1029
 run_code.C:1030
 run_code.C:1031
 run_code.C:1032
 run_code.C:1033
 run_code.C:1034
 run_code.C:1035
 run_code.C:1036
 run_code.C:1037
 run_code.C:1038
 run_code.C:1039
 run_code.C:1040
 run_code.C:1041
 run_code.C:1042
 run_code.C:1043
 run_code.C:1044
 run_code.C:1045
 run_code.C:1046
 run_code.C:1047
 run_code.C:1048
 run_code.C:1049
 run_code.C:1050
 run_code.C:1051
 run_code.C:1052
 run_code.C:1053
 run_code.C:1054
 run_code.C:1055
 run_code.C:1056
 run_code.C:1057
 run_code.C:1058
 run_code.C:1059
 run_code.C:1060
 run_code.C:1061
 run_code.C:1062
 run_code.C:1063
 run_code.C:1064
 run_code.C:1065
 run_code.C:1066
 run_code.C:1067
 run_code.C:1068
 run_code.C:1069
 run_code.C:1070
 run_code.C:1071
 run_code.C:1072
 run_code.C:1073
 run_code.C:1074
 run_code.C:1075
 run_code.C:1076
 run_code.C:1077
 run_code.C:1078
 run_code.C:1079
 run_code.C:1080
 run_code.C:1081
 run_code.C:1082
 run_code.C:1083
 run_code.C:1084
 run_code.C:1085
 run_code.C:1086
 run_code.C:1087
 run_code.C:1088
 run_code.C:1089
 run_code.C:1090
 run_code.C:1091
 run_code.C:1092
 run_code.C:1093
 run_code.C:1094
 run_code.C:1095
 run_code.C:1096
 run_code.C:1097
 run_code.C:1098
 run_code.C:1099
 run_code.C:1100
 run_code.C:1101
 run_code.C:1102
 run_code.C:1103
 run_code.C:1104
 run_code.C:1105
 run_code.C:1106
 run_code.C:1107
 run_code.C:1108
 run_code.C:1109
 run_code.C:1110
 run_code.C:1111
 run_code.C:1112
 run_code.C:1113
 run_code.C:1114
 run_code.C:1115
 run_code.C:1116
 run_code.C:1117
 run_code.C:1118
 run_code.C:1119
 run_code.C:1120
 run_code.C:1121
 run_code.C:1122
 run_code.C:1123
 run_code.C:1124
 run_code.C:1125
 run_code.C:1126
 run_code.C:1127
 run_code.C:1128
 run_code.C:1129
 run_code.C:1130
 run_code.C:1131
 run_code.C:1132
 run_code.C:1133
 run_code.C:1134
 run_code.C:1135
 run_code.C:1136
 run_code.C:1137
 run_code.C:1138
 run_code.C:1139
 run_code.C:1140
 run_code.C:1141
 run_code.C:1142
 run_code.C:1143
 run_code.C:1144
 run_code.C:1145
 run_code.C:1146
 run_code.C:1147
 run_code.C:1148
 run_code.C:1149
 run_code.C:1150
 run_code.C:1151
 run_code.C:1152
 run_code.C:1153
 run_code.C:1154
 run_code.C:1155
 run_code.C:1156
 run_code.C:1157
 run_code.C:1158
 run_code.C:1159
 run_code.C:1160
 run_code.C:1161
 run_code.C:1162
 run_code.C:1163
 run_code.C:1164
 run_code.C:1165
 run_code.C:1166
 run_code.C:1167
 run_code.C:1168
 run_code.C:1169
 run_code.C:1170
 run_code.C:1171
 run_code.C:1172
 run_code.C:1173
 run_code.C:1174
 run_code.C:1175
 run_code.C:1176
 run_code.C:1177
 run_code.C:1178
 run_code.C:1179
 run_code.C:1180
 run_code.C:1181
 run_code.C:1182
 run_code.C:1183
 run_code.C:1184
 run_code.C:1185
 run_code.C:1186
 run_code.C:1187
 run_code.C:1188
 run_code.C:1189
 run_code.C:1190
 run_code.C:1191
 run_code.C:1192
 run_code.C:1193
 run_code.C:1194
 run_code.C:1195
 run_code.C:1196
 run_code.C:1197
 run_code.C:1198
 run_code.C:1199
 run_code.C:1200
 run_code.C:1201
 run_code.C:1202
 run_code.C:1203
 run_code.C:1204
 run_code.C:1205
 run_code.C:1206
 run_code.C:1207
 run_code.C:1208
 run_code.C:1209
 run_code.C:1210
 run_code.C:1211
 run_code.C:1212
 run_code.C:1213
 run_code.C:1214
 run_code.C:1215
 run_code.C:1216
 run_code.C:1217
 run_code.C:1218
 run_code.C:1219
 run_code.C:1220
 run_code.C:1221
 run_code.C:1222
 run_code.C:1223
 run_code.C:1224
 run_code.C:1225
 run_code.C:1226
 run_code.C:1227
 run_code.C:1228
 run_code.C:1229
 run_code.C:1230
 run_code.C:1231
 run_code.C:1232
 run_code.C:1233
 run_code.C:1234
 run_code.C:1235
 run_code.C:1236
 run_code.C:1237
 run_code.C:1238
 run_code.C:1239
 run_code.C:1240
 run_code.C:1241
 run_code.C:1242
 run_code.C:1243
 run_code.C:1244
 run_code.C:1245
 run_code.C:1246
 run_code.C:1247
 run_code.C:1248
 run_code.C:1249
 run_code.C:1250
 run_code.C:1251
 run_code.C:1252
 run_code.C:1253
 run_code.C:1254
 run_code.C:1255
 run_code.C:1256
 run_code.C:1257
 run_code.C:1258
 run_code.C:1259
 run_code.C:1260
 run_code.C:1261
 run_code.C:1262
 run_code.C:1263
 run_code.C:1264
 run_code.C:1265
 run_code.C:1266
 run_code.C:1267
 run_code.C:1268
 run_code.C:1269
 run_code.C:1270
 run_code.C:1271
 run_code.C:1272
 run_code.C:1273
 run_code.C:1274
 run_code.C:1275
 run_code.C:1276
 run_code.C:1277
 run_code.C:1278
 run_code.C:1279
 run_code.C:1280
 run_code.C:1281
 run_code.C:1282
 run_code.C:1283
 run_code.C:1284
 run_code.C:1285
 run_code.C:1286
 run_code.C:1287
 run_code.C:1288
 run_code.C:1289
 run_code.C:1290
 run_code.C:1291
 run_code.C:1292
 run_code.C:1293
 run_code.C:1294
 run_code.C:1295
 run_code.C:1296
 run_code.C:1297
 run_code.C:1298
 run_code.C:1299
 run_code.C:1300
 run_code.C:1301
 run_code.C:1302
 run_code.C:1303
 run_code.C:1304
 run_code.C:1305
 run_code.C:1306
 run_code.C:1307
 run_code.C:1308
 run_code.C:1309
 run_code.C:1310
 run_code.C:1311
 run_code.C:1312
 run_code.C:1313
 run_code.C:1314
 run_code.C:1315
 run_code.C:1316
 run_code.C:1317
 run_code.C:1318
 run_code.C:1319
 run_code.C:1320
 run_code.C:1321
 run_code.C:1322
 run_code.C:1323
 run_code.C:1324
 run_code.C:1325
 run_code.C:1326
 run_code.C:1327
 run_code.C:1328
 run_code.C:1329
 run_code.C:1330
 run_code.C:1331
 run_code.C:1332
 run_code.C:1333
 run_code.C:1334
 run_code.C:1335
 run_code.C:1336
 run_code.C:1337
 run_code.C:1338
 run_code.C:1339
 run_code.C:1340
 run_code.C:1341
 run_code.C:1342
 run_code.C:1343
 run_code.C:1344
 run_code.C:1345
 run_code.C:1346
 run_code.C:1347
 run_code.C:1348
 run_code.C:1349
 run_code.C:1350
 run_code.C:1351
 run_code.C:1352
 run_code.C:1353
 run_code.C:1354
 run_code.C:1355
 run_code.C:1356
 run_code.C:1357
 run_code.C:1358
 run_code.C:1359
 run_code.C:1360
 run_code.C:1361
 run_code.C:1362
 run_code.C:1363
 run_code.C:1364
 run_code.C:1365
 run_code.C:1366
 run_code.C:1367
 run_code.C:1368
 run_code.C:1369
 run_code.C:1370
 run_code.C:1371
 run_code.C:1372
 run_code.C:1373
 run_code.C:1374
 run_code.C:1375
 run_code.C:1376
 run_code.C:1377
 run_code.C:1378
 run_code.C:1379
 run_code.C:1380
 run_code.C:1381
 run_code.C:1382
 run_code.C:1383
 run_code.C:1384
 run_code.C:1385
 run_code.C:1386
 run_code.C:1387
 run_code.C:1388
 run_code.C:1389
 run_code.C:1390
 run_code.C:1391
 run_code.C:1392
 run_code.C:1393
 run_code.C:1394
 run_code.C:1395
 run_code.C:1396
 run_code.C:1397
 run_code.C:1398
 run_code.C:1399
 run_code.C:1400
 run_code.C:1401
 run_code.C:1402
 run_code.C:1403
 run_code.C:1404
 run_code.C:1405
 run_code.C:1406
 run_code.C:1407
 run_code.C:1408
 run_code.C:1409
 run_code.C:1410
 run_code.C:1411
 run_code.C:1412
 run_code.C:1413
 run_code.C:1414
 run_code.C:1415
 run_code.C:1416
 run_code.C:1417
 run_code.C:1418
 run_code.C:1419
 run_code.C:1420
 run_code.C:1421
 run_code.C:1422
 run_code.C:1423
 run_code.C:1424
 run_code.C:1425
 run_code.C:1426
 run_code.C:1427
 run_code.C:1428
 run_code.C:1429
 run_code.C:1430
 run_code.C:1431
 run_code.C:1432
 run_code.C:1433
 run_code.C:1434
 run_code.C:1435
 run_code.C:1436
 run_code.C:1437
 run_code.C:1438
 run_code.C:1439
 run_code.C:1440
 run_code.C:1441
 run_code.C:1442
 run_code.C:1443
 run_code.C:1444
 run_code.C:1445
 run_code.C:1446
 run_code.C:1447
 run_code.C:1448
 run_code.C:1449
 run_code.C:1450
 run_code.C:1451
 run_code.C:1452
 run_code.C:1453
 run_code.C:1454
 run_code.C:1455
 run_code.C:1456
 run_code.C:1457
 run_code.C:1458
 run_code.C:1459
 run_code.C:1460
 run_code.C:1461
 run_code.C:1462
 run_code.C:1463
 run_code.C:1464
 run_code.C:1465
 run_code.C:1466
 run_code.C:1467
 run_code.C:1468
 run_code.C:1469
 run_code.C:1470
 run_code.C:1471
 run_code.C:1472
 run_code.C:1473
 run_code.C:1474
 run_code.C:1475
 run_code.C:1476
 run_code.C:1477
 run_code.C:1478
 run_code.C:1479
 run_code.C:1480
 run_code.C:1481
 run_code.C:1482
 run_code.C:1483
 run_code.C:1484
 run_code.C:1485
 run_code.C:1486
 run_code.C:1487
 run_code.C:1488
 run_code.C:1489
 run_code.C:1490
 run_code.C:1491
 run_code.C:1492
 run_code.C:1493
 run_code.C:1494
 run_code.C:1495
 run_code.C:1496
 run_code.C:1497
 run_code.C:1498
 run_code.C:1499
 run_code.C:1500
 run_code.C:1501
 run_code.C:1502