ROOT logo
#include "CommonDefs.C"

/**************************************************************/
/*** HISTOS AND BINNING ***************************************/
/**************************************************************/

/**************************************************************/
enum ECharge_t {
  kPositive,
  kNegative,
  kNCharges
};
const Char_t *chargeName[kNCharges] = {
  "positive",
  "negative",
};
/**************************************************************/
enum EHistoParam_t {
  kCentrality,
  kPtpc,
  kTPCNcls,
  kTPCdelta,
  kTPCgain,
  kTOFsignal,
  kNHistoParams
};
/**************************************************************/
const Int_t NclsBins = 200;
Double_t clsBin[NclsBins + 1];
Double_t clsMin = 0., clsMax = 200., clsStep = (clsMax - clsMin) / NclsBins;
/**************************************************************/
const Int_t NtpcdeltaBins = 200;
Double_t tpcdeltaBin[NtpcdeltaBins + 1];
Double_t tpcdeltaMin = -100., tpcdeltaMax = 100., tpcdeltaStep = (tpcdeltaMax - tpcdeltaMin) / NtpcdeltaBins;
/**************************************************************/
const Int_t NtpcgainBins = 200;
Double_t tpcgainBin[NtpcgainBins + 1];
Double_t tpcgainMin = 0., tpcgainMax = 2., tpcgainStep = (tpcgainMax - tpcgainMin) / NtpcgainBins;
/**************************************************************/
const Int_t NsigmaBins = 20;
Double_t sigmaBin[NsigmaBins + 1];
Double_t sigmaMin = -5., sigmaMax = 5., sigmaStep = (sigmaMax - sigmaMin) / NsigmaBins;
/**************************************************************/
Int_t NparamsBins[kNHistoParams] = {NcentralityBins, NpBins, NclsBins, NtpcdeltaBins, NtpcgainBins, NsigmaBins};
Double_t *paramBin[kNHistoParams] = {centralityBin, pBin, clsBin, tpcdeltaBin, tpcgainBin, sigmaBin};
/**************************************************************/

/**************************************************************/


TPCcalib(const Char_t *filename, Int_t evMax = kMaxInt, Int_t startEv = 0)
{
  
  /* include path for ACLic */
  gSystem->AddIncludePath("-I$ALICE_ROOT/include");
  gSystem->AddIncludePath("-I$ALICE_ROOT/TOF");
  /* load libraries */
  gSystem->Load("libANALYSIS");
  gSystem->Load("libANALYSISalice");
  /* build analysis task class */
  gROOT->LoadMacro("AliAnalysisParticle.cxx+g");
  gROOT->LoadMacro("AliAnalysisEvent.cxx+g");
  gROOT->LoadMacro("AliAnalysisTrack.cxx+g");

  /* open file, get tree and connect */
  TFile *filein = TFile::Open(filename);
  TTree *treein = (TTree *)filein->Get("aodTree");
  printf("got \"aodTree\": %d entries\n", treein->GetEntries());
  AliAnalysisEvent *analysisEvent = new AliAnalysisEvent();
  TClonesArray *analysisTrackArray = new TClonesArray("AliAnalysisTrack");
  AliAnalysisTrack *analysisTrack = NULL;
  treein->SetBranchAddress("AnalysisEvent", &analysisEvent);
  treein->SetBranchAddress("AnalysisTrack", &analysisTrackArray);

  /* open enabled flag map */
  TH1F *hEnabledFlag = NULL;
  if (enabledChannelsFileName) {
    TFile *enabledfile = TFile::Open(enabledChannelsFileName);
    hEnabledFlag = (TH1F *)enabledfile->Get("hEnabledFlag");
  }

  /**************************************************************/
  /*** HISTOS ***************************************************/
  /**************************************************************/

  /* run-time binning */
  for (Int_t ibin = 0; ibin < NclsBins + 1; ibin++)
    clsBin[ibin] = clsMin + ibin * clsStep;
  for (Int_t ibin = 0; ibin < NtpcdeltaBins + 1; ibin++)
    tpcdeltaBin[ibin] = tpcdeltaMin + ibin * tpcdeltaStep;
  for (Int_t ibin = 0; ibin < NtpcgainBins + 1; ibin++)
    tpcgainBin[ibin] = tpcgainMin + ibin * tpcgainStep;
  for (Int_t ibin = 0; ibin < NsigmaBins + 1; ibin++)
    sigmaBin[ibin] = sigmaMin + ibin * sigmaStep;

  /* THnSparse */
  THnSparse *hTPCcalib[AliPID::kSPECIES][kNCharges];
  for (Int_t ipart = 0; ipart < AliPID::kSPECIES; ipart++) {
    for (Int_t icharge = 0; icharge< kNCharges; icharge++) {
      hTPCcalib[ipart][icharge] = new THnSparseF(Form("hTPCcalib_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]), "", kNHistoParams, NparamsBins);
      for (Int_t iparam = 0; iparam < kNHistoParams; iparam++) {
	hTPCcalib[ipart][icharge]->SetBinEdges(iparam, paramBin[iparam]);
      }
    }
  }

  /**************************************************************/
  /**************************************************************/
  /**************************************************************/

  /* TOF PID response */
  AliTOFPIDResponse tofResponse;
  tofResponse.SetTimeResolution(tofReso);
  /* TPC PID response */
  AliTPCPIDResponse *tpcResponse = AliAnalysisTrack::GetTPCResponse();

  /* Start stopwatch */
  TStopwatch timer;
  timer.Start();

  if (1) {
    TFile *calibfile = TFile::Open("TZEROcalibration.root");
    hCentrality_TZEROA_mean = (TH1 *)calibfile->Get("hCentrality_TZEROA_mean");
    hCentrality_TZEROA_sigma = (TH1 *)calibfile->Get("hCentrality_TZEROA_sigma");
    hCentrality_TZEROC_mean = (TH1 *)calibfile->Get("hCentrality_TZEROC_calib");
    hCentrality_TZEROC_sigma = (TH1 *)calibfile->Get("hCentrality_TZEROC_sigma");
    hCentrality_TOF_mean = (TH1 *)calibfile->Get("hCentrality_TOF_mean");
    hCentrality_TOF_TZEROA_mean = (TH1 *)calibfile->Get("hCentrality_TOF_TZEROA_mean");
    hCentrality_TOF_TZEROC_mean = (TH1 *)calibfile->Get("hCentrality_TOF_TZEROC_mean");
    hCentrality_TOF_TZEROTOF_mean = (TH1 *)calibfile->Get("hCentrality_TOF_TZEROTOF_mean");

    TFile *resofile = TFile::Open("TZEROresolution.root");
    hCentrality_TZEROA_reso = (TH1 *)resofile->Get("hTZEROA_reso");
    hCentrality_TZEROC_reso = (TH1 *)resofile->Get("hTZEROC_reso");
    hCentrality_TZEROAND_reso = (TH1 *)resofile->Get("hTZEROAND_reso");
  }
  Double_t TZEROA_mean;
  Double_t TZEROA_sigma;
  Double_t TZEROC_mean;
  Double_t TZEROC_sigma;
  Double_t TOF_mean;
  Double_t TOF_TZEROA_mean;
  Double_t TOF_TZEROC_mean;
  Double_t TOF_TZEROTOF_mean;
  Double_t TZEROA;
  Double_t TZEROA_reso;
  Bool_t hasTZEROA;
  Double_t TZEROC;
  Double_t TZEROC_reso;
  Bool_t hasTZEROC;
  Double_t TZEROAND;
  Double_t TZEROAND_reso;
  Bool_t hasTZEROAND;
  Double_t TZEROTOF;
  Double_t TZEROTOF_reso;
  Bool_t hasTZEROTOF;
  Double_t TZEROMEAN;
  Double_t TZEROMEAN_weight;
  Double_t TZEROBEST;
  Double_t TZEROBEST_reso;


  /* loop over events */
  Bool_t hastofpid;
  Int_t charge, index;
  UShort_t dedxN;
  Double_t ptpc, dedx, bethe, deltadedx, dedx_sigma, tpcsignal;
  Double_t p, time, time_sigma, timezero, timezero_sigma, tof, tof_sigma, texp, texp_sigma, deltat, deltat_sigma, tofsignal;
  Double_t tpctofsignal;
  Double_t param[kNHistoParams];
  for (Int_t iev = startEv; iev < treein->GetEntries() && iev < evMax; iev++) {
    /* get event */
    treein->GetEvent(iev);
    if (iev % 10000 == 0) printf("iev = %d\n", iev);
    /* check event */
    if (!analysisEvent->AcceptEvent(acceptEventType)) continue;

    /*** ACCEPTED EVENT ***/

    /* get centrality */
    param[kCentrality] = analysisEvent->GetCentralityPercentile(centralityEstimator);
    cent = analysisEvent->GetCentralityPercentile(centralityEstimator);


    /* TZERO corrections */
    Int_t icent;
    for (icent = 0; icent < NcentralityBins; icent++)
      if (cent < centralityBin[icent + 1])
	break;
    TZEROA_mean = hCentrality_TZEROA_mean ? hCentrality_TZEROA_mean->GetBinContent(icent + 1) : 0.;
    TZEROA_sigma = hCentrality_TZEROA_sigma ? hCentrality_TZEROA_sigma->GetBinContent(icent + 1) : 1000.;
    TZEROC_mean  = hCentrality_TZEROC_mean ? hCentrality_TZEROC_mean->GetBinContent(icent + 1) : 0.;
    TZEROC_sigma = hCentrality_TZEROC_sigma ? hCentrality_TZEROC_sigma->GetBinContent(icent + 1) : 1000.;

    TOF_mean = hCentrality_TOF_mean ? hCentrality_TOF_mean->GetBinContent(icent + 1) : 0.;
    TOF_TZEROA_mean = hCentrality_TOF_TZEROA_mean ? hCentrality_TOF_TZEROA_mean->GetBinContent(icent + 1) : 0.;
    TOF_TZEROC_mean = hCentrality_TOF_TZEROC_mean ? hCentrality_TOF_TZEROC_mean->GetBinContent(icent + 1) : 0.;
    TOF_TZEROTOF_mean = hCentrality_TOF_TZEROTOF_mean ? hCentrality_TOF_TZEROTOF_mean->GetBinContent(icent + 1) : 0.;

    TZEROA_reso = hCentrality_TZEROA_reso ? hCentrality_TZEROA_reso->GetBinContent(icent + 1) : 70.;
    TZEROC_reso = hCentrality_TZEROC_reso ? hCentrality_TZEROC_reso->GetBinContent(icent + 1) : 70.;
    TZEROAND_reso = hCentrality_TZEROAND_reso ? hCentrality_TZEROAND_reso->GetBinContent(icent + 1) : 50.;

    /* loop over tracks */
    for (Int_t itrk = 0; itrk < analysisTrackArray->GetEntries(); itrk++) {
      /* get track */
      analysisTrack = (AliAnalysisTrack *)analysisTrackArray->At(itrk);
      if (!analysisTrack) continue;
      /* check accepted track */
      if (!analysisTrack->AcceptTrack()) continue;
      /* get charge */
      charge = analysisTrack->GetSign() > 0. ? kPositive : kNegative;

      /*** ACCEPTED TRACK ***/
      
      /* check TOF pid */
      if (!analysisTrack->HasTOFPID(hEnabledFlag) || !analysisTrack->HasTPCPID()) continue;
      

      /* get TOF info */
      index = analysisTrack->GetTOFIndex();
      time = analysisTrack->GetTOFTime() - TOF_mean;
      time_sigma = tofReso;
      /* TZEROTOF */
      TZEROTOF = analysisEvent->GetTimeZeroTOF(analysisTrack->GetP());
      TZEROTOF_reso = analysisEvent->GetTimeZeroTOFSigma(analysisTrack->GetP());
      hasTZEROTOF = TZEROTOF_reso < 150.;
      if (hasTZEROTOF) {
	TZEROTOF += TOF_TZEROTOF_mean - TOF_mean;
	TZEROTOF_reso *= TZEROTOF_resoScaleFactor;
      }
      /* TZEROA */
      TZEROA = analysisEvent->GetTimeZeroT0(1) - TZEROA_shift;
      //      TZEROA_reso = TZEROA_resolution[icent];
      hasTZEROA = TMath::Abs(TZEROA - TZEROA_mean) < 3. * TZEROA_sigma;
      TZEROA += TOF_TZEROA_mean - TOF_mean;
      /* TZEROC */
      TZEROC = analysisEvent->GetTimeZeroT0(2) - TZEROC_shift;
      //      TZEROC_reso = TZEROC_resolution[icent];
      hasTZEROC = TMath::Abs(TZEROC - TZEROC_mean) < 3. * TZEROC_sigma;
      TZEROC += TOF_TZEROC_mean - TOF_mean;
      /* TZEROAND */
      TZEROAND = (TZEROA + TZEROC) * 0.5;
      //      TZEROAND_reso = TZEROAND_resolution[icent];
      hasTZEROAND = hasTZEROA && hasTZEROC;
      /* TZEROMEAN */
      TZEROMEAN = TZEROTOF / TZEROTOF_reso / TZEROTOF_reso;
      TZEROMEAN_weight = 1. / TZEROTOF_reso / TZEROTOF_reso;
      if (hasTZEROAND) {
	//	printf("TZEROAND\n");
	TZEROMEAN += TZEROAND / TZEROAND_reso / TZEROAND_reso;
	TZEROMEAN_weight = 1. / TZEROAND_reso / TZEROAND_reso;
      }
      else if (hasTZEROA) {
	//	printf("TZEROA\n");
	TZEROMEAN += TZEROA / TZEROA_reso / TZEROA_reso;
	TZEROMEAN_weight = 1. / TZEROA_reso / TZEROA_reso;
      }
      else if (hasTZEROC) {
	//	printf("TZEROC\n");
	TZEROMEAN += TZEROC / TZEROC_reso / TZEROC_reso;
	TZEROMEAN_weight = 1. / TZEROC_reso / TZEROC_reso;
      }
      timezero = TZEROMEAN / TZEROMEAN_weight;
      timezero_sigma = TMath::Sqrt(1. / TZEROMEAN_weight);
      /* TZEROBEST */
      TZEROBEST = TZEROTOF;
      TZEROBEST_reso = TZEROTOF_reso;
      if (hasTZEROAND && TZEROAND_reso < TZEROBEST_reso) {
	TZEROBEST = TZEROAND;
	TZEROBEST_reso = TZEROAND_reso;
      }
      else if (hasTZEROA && TZEROA_reso < TZEROBEST_reso) {
	TZEROBEST = TZEROA;
	TZEROBEST_reso = TZEROA_reso;
      }
      if (hasTZEROC && TZEROC_reso < TZEROBEST_reso) {
	TZEROBEST = TZEROC;
	TZEROBEST_reso = TZEROC_reso;
      }
      timezero = TZEROBEST;
      timezero_sigma = TZEROBEST_reso;

      /* DEBUG */
      //      timezero = 0.;//TZEROTOF;
      //      timezero_sigma = 203.854691;//TZEROTOF_reso;

      //      if (timezero == 0.)
      //	printf("%f %f\n", timezero, timezero_sigma);

      timezero_sigma *= scaletimezerosigma;

      if (resetTZERO) {
	timezero = 0.;
	timezero_sigma = timezero_spread;
      }


      tof = time - timezero;
      tof_sigma = TMath::Sqrt(time_sigma * time_sigma + timezero_sigma * timezero_sigma);
      
      /* TOF expected time */
      texp = analysisTrack->GetTOFExpTime(iipart);
      texp_sigma = analysisTrack->GetTOFExpTimeSigma(iipart) * scaletexpreso[iipart];
      
      /* TOF signal */
      deltat = tof - texp;
      deltat_sigma = TMath::Sqrt(tof_sigma * tof_sigma + texp_sigma * texp_sigma);
      tofsignal = deltat / deltat_sigma;
      


      /*** ACCEPTED TRACK WITH TPC+TOF PID ***/
      
      /* get track info */
      p = analysisTrack->GetP();

      /* get TPC info */
      dedx = analysisTrack->GetTPCdEdx();
      dedxN = analysisTrack->GetTPCdEdxN();
      ptpc = analysisTrack->GetTPCmomentum();
      param[kPtpc] = ptpc;
      param[kTPCNcls] = dedxN;
      
      /* get TOF info */
      time = analysisTrack->GetTOFTime() - TOF_mean;
      time_sigma = tofReso;
      timezero = analysisEvent->GetTimeZeroTOF(p);
      timezero_sigma = analysisEvent->GetTimeZeroTOFSigma(p);
      tof = time - timezero;
      tof_sigma = TMath::Sqrt(time_sigma * time_sigma + timezero_sigma * timezero_sigma);

      /* loop over particle IDs */
      for (Int_t ipart = 0; ipart < AliPID::kSPECIES; ipart++) {
	
	/* check rapidity */
	if (TMath::Abs(analysisTrack->GetY(AliPID::ParticleMass(ipart))) > 0.5) continue;

	/*** ACCEPTED TRACK WITHIN CORRECT RAPIDITY ***/
	
	/* TOF expected time */
	texp = analysisTrack->GetTOFExpTime(ipart);
	texp_sigma = analysisTrack->GetTOFExpTimeSigma(ipart);
	
	/* TOF signal */
	deltat = tof - texp;
	deltat_sigma = TMath::Sqrt(tof_sigma * tof_sigma + texp_sigma * texp_sigma);
	tofsignal = deltat / deltat_sigma;
	param[kTOFsignal] = tofsignal;

	/* check TOF PID with 3-sigma cut */
	if (TMath::Abs(tofsignal) > 3.) continue;

	/*** ACCEPTED TRACK WITH COMPATIBLE TOF PID ***/

	/* TPC signal */
	bethe = tpcResponse->GetExpectedSignal(ptpc, ipart);
	deltadedx = dedx - bethe;
	param[kTPCdelta] = deltadedx;
	param[kTPCgain] = dedx / bethe;
	
	/* fill histo */
	hTPCcalib[ipart][charge]->Fill(param);

      } /* end of loop over particle IDs */      
    } /* end of loop over tracks */
  } /* end of loop over events */
  
  /* start stopwatch */
  timer.Stop();
  timer.Print();
  
  /* output */
  TFile *fileout = TFile::Open(Form("TPCcalib.%s", filename), "RECREATE");
  for (Int_t ipart = 0; ipart < AliPID::kSPECIES; ipart++) {
    for (Int_t icharge = 0; icharge < kNCharges; icharge++) {
      hTPCcalib[ipart][icharge]->Write();
    }
  }
  fileout->Close();
  
}

/**************************************************************/

TPCcalib_delta(const Char_t *filename, Int_t ipart, Int_t icharge, Float_t tofsigmaMin = -3., Float_t tofsigmaMax = 3.)
{

  Double_t ptMin[AliPID::kSPECIES] = {0., 0., 0.5, 0.5, 0.5};
  Double_t ptMax[AliPID::kSPECIES] = {0.5, 0., 1.5, 1.5, 2.0};

  /* load HistoUtils */
  gROOT->LoadMacro("HistoUtils.C");

  /* open data */
  TFile *filein = TFile::Open(filename);
  THnSparseF *hTPCcalib = (THnSparseF *)filein->Get(Form("hTPCcalib_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]));

  /* set momentum range */
  hTPCcalib->GetAxis(kPtpc)->SetRangeUser(ptMin[ipart] + 0.001, ptMax[ipart] - 0.001);

  /* set TOF pid range */
  //  hTPCcalib->GetAxis(kTOFsignal)->SetRangeUser(tofsigmaMin + 0.001, tofsigmaMax - 0.001);

  /* minimum-bias projection */
  hTPCcalib->GetAxis(kCentrality)->SetRange(1, NcentralityBins);
  TH2 *hDeltaPtpc = hTPCcalib->Projection(kTPCdelta, kPtpc);
  TObjArray *oaTPCdelta_mb = HistoUtils_FitPeak(NULL, hDeltaPtpc, 5, 3., 3., 100, Form("hTPCdelta_mb_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]));
  delete hDeltaPtpc;

  /* convert to bethe-blok */
  TH1D *hTPCdelta_mb = (TH1D *)oaTPCdelta_mb->At(1);
  TH1D *hTPCbethe_mb = TPCcalib_delta2bethe(hTPCdelta_mb, ipart, Form("hTPCbethe_mb_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]));
  
  /* centrality projections */
  TObjArray *oaTPCdelta_cent[NcentralityBins];
  for (Int_t icent = 0; icent < NcentralityBins; icent++) {

    hTPCcalib->GetAxis(kCentrality)->SetRange(icent + 1, icent + 1);
    hDeltaPtpc = hTPCcalib->Projection(kTPCdelta, kPtpc);
    oaTPCdelta_cent[icent] = HistoUtils_FitPeak(NULL, hDeltaPtpc, 5, 3., 3., 100, Form("hTPCdelta_cent%d_%s_%s", icent, AliPID::ParticleName(ipart), chargeName[icharge]));
    delete hDeltaPtpc;
  }

}

/**************************************************************/

TF1 *
TPCcalib_BetheBlochAleph(Double_t min, Double_t max)
{

  TF1 *f = new TF1("fBetheBlochAleph", "[0] * AliExternalTrackParam::BetheBlochAleph(x, [1], [2], [3], [4], [5])", min, max);
  f->SetParameter(0, 50.);
  f->SetParameter(1, 0.0283086);
  f->SetParameter(2, 2.63394e+01);
  f->SetParameter(3, 5.04114e-11);
  f->SetParameter(4, 2.12543);
  f->SetParameter(5, 4.88663);

#if 0
   1  p0           4.94077e+01           nan           nan  -4.26724e+00
   2  p1           2.83086e-02           nan           nan  -7.44772e+03
   3  p2           2.62767e+01           nan           nan   3.89671e-01
   4  p3          -1.00486e-03           nan           nan   7.91984e+04
   5  p4           2.43863e+00           nan           nan  -1.64563e-04
   6  p5           4.37961e+00           nan           nan           inf
#endif


  return f;

};

/**************************************************************/

void
TPCcalib_fitBetheBloch(TGraphErrors *g, TF1 *f, Int_t param = -1)
{

  TVirtualFitter::SetMaxIterations(1000000);
  if (param >= 0) {
    for (Int_t ipar = 0; ipar < 6; ipar++)
      if (ipar != param)
	f->FixParameter(ipar, f->GetParameter(ipar));
      else
	f->ReleaseParameter(ipar);
  }
  else {
    for (Int_t ipar = 0; ipar < 6; ipar++)
      f->ReleaseParameter(ipar);
  }
  g->Fit(f, "", "", 0.5, 5.);

}

/**************************************************************/

TPCcalib_bethe(const Char_t *filename, Int_t icent = -1, Float_t tofsigmaMin = -3., Float_t tofsigmaMax = 3.)
{

  /* include path for ACLic */
  gSystem->AddIncludePath("-I$ALICE_ROOT/include");
  gSystem->AddIncludePath("-I$ALICE_ROOT/TOF");
  /* load libraries */
  gSystem->Load("libANALYSIS");
  gSystem->Load("libANALYSISalice");
  /* build analysis task class */
  gROOT->LoadMacro("AliAnalysisParticle.cxx+g");
  gROOT->LoadMacro("AliAnalysisEvent.cxx+g");
  gROOT->LoadMacro("AliAnalysisTrack.cxx+g");


  AliAnalysisTrack t;
  
  Double_t ptMin[AliPID::kSPECIES] = {0., 0., 0.5, 0.5, 0.5};
  Double_t ptMax[AliPID::kSPECIES] = {0., 0., 1.5, 1.5, 2.0};

  /* set centrality name */
  Char_t centName[1024];
  if (icent < 0 || icent >= NcentralityBins)
    sprintf(centName, "cent0090");
  else
    sprintf(centName, "cent%02d%02d", , centralityBin[icent], centralityBin[icent + 1]);
  
  /* load HistoUtils */
  gROOT->LoadMacro("HistoUtils.C");

  /* open data */
  TFile *filein = TFile::Open(filename);

  /* output */
  TFile *fileout = TFile::Open(Form("TPCcalib_bethe_%s.%s", centName, filename), "RECREATE");
  
  /* loop over particles and charges */
  TH1D *hTPCbethe[AliPID::kSPECIES][kNCharges];
  TGraphErrors *gTPCbethe = new TGraphErrors();
  gTPCbethe->SetName("gTPCbethe");
  Int_t nPoints = 0;
  for (Int_t ipart = 0; ipart < AliPID::kSPECIES; ipart++) {
    for (Int_t icharge = 0; icharge < kNCharges; icharge++) {

      /* check momentum range */
      if (ptMax[ipart] == 0. || ptMax[ipart] < ptMin[ipart]) continue;
      
      /* get histo */
      THnSparseF *hTPCcalib = (THnSparseF *)filein->Get(Form("hTPCcalib_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]));
      
      /* set centrality range */
      if (icent < 0 || icent >= NcentralityBins)
	hTPCcalib->GetAxis(kCentrality)->SetRange(1, NcentralityBins);
      else
	hTPCcalib->GetAxis(kCentrality)->SetRange(icent + 1, icent + 1);
      
      /* set TOF pid range */
      hTPCcalib->GetAxis(kTOFsignal)->SetRangeUser(tofsigmaMin + 0.001, tofsigmaMax - 0.001);
      
      /* set momentum range */
      hTPCcalib->GetAxis(kPtpc)->SetRangeUser(ptMin[ipart] + 0.001, ptMax[ipart] - 0.001);
      
      /* minimum-bias projection */
      TH2 *hDeltaPtpc = hTPCcalib->Projection(kTPCdelta, kPtpc);
      TObjArray *oaTPCdelta = HistoUtils_FitPeak(NULL, hDeltaPtpc, 5, 3., 3., 100, Form("hTPCdelta_%s_%s_%s", centName, AliPID::ParticleName(ipart), chargeName[icharge]));
      delete hDeltaPtpc;
      
      /* convert to bethe-blok */
      TH1D *hTPCdelta = (TH1D *)oaTPCdelta->At(1);
      hTPCbethe[ipart][icharge] = TPCcalib_delta2bethe(hTPCdelta, ipart, Form("hTPCbethe_%s_%s_%s", centName, AliPID::ParticleName(ipart), chargeName[icharge]));
      
      /* delete array */
      delete oaTPCdelta;

      /* add points to graph */
      for (Int_t ibin = 0; ibin < hTPCbethe[ipart][icharge]->GetNbinsX(); ibin++) {
	gTPCbethe->SetPoint(nPoints, hTPCbethe[ipart][icharge]->GetBinCenter(ibin + 1), hTPCbethe[ipart][icharge]->GetBinContent(ibin + 1));
	gTPCbethe->SetPointError(nPoints, 0.5 * hTPCbethe[ipart][icharge]->GetBinWidth(ibin + 1), hTPCbethe[ipart][icharge]->GetBinError(ibin + 1));
	nPoints++;
      }
      
      /* write */
      fileout->cd();
      hTPCbethe[ipart][icharge]->Write();
    }
  }


  TF1 *fBethe = TPCcalib_BetheBlochAleph(0.1, 1.e3);
  for (Int_t i = 0; i < 50; i++)
    for (Int_t ii = 0; ii < 6; ii++)
      TPCcalib_fitBetheBloch(gTPCbethe, fBethe, ii);
  TPCcalib_fitBetheBloch(gTPCbethe, fBethe, -1);

  /* write */
  fileout->cd();
  gTPCbethe->Write("gTPCbethe");
  fBethe->Write("fBetheBlochAleph");

  /* close file */
  fileout->Close();
  
  return;

}

/**************************************************************/

TPCcalib_gain(const Char_t *filename, Int_t ipart, Int_t icharge, Float_t tofsigmaMin = -3., Float_t tofsigmaMax = 3.)
{

  /* load HistoUtils */
  gROOT->LoadMacro("HistoUtils.C");

  /* open data */
  TFile *filein = TFile::Open(filename);
  THnSparseF *hTPCcalib = (THnSparseF *)filein->Get(Form("hTPCcalib_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]));

  /* set TOF pid range */
  //  hTPCcalib->GetAxis(kTOFsignal)->SetRangeUser(tofsigmaMin + 0.001, tofsigmaMax - 0.001);

  /* minimum-bias projection */
  hTPCcalib->GetAxis(kCentrality)->SetRange(1, NcentralityBins);
  TH2 *hGainPtpc = hTPCcalib->Projection(kTPCgain, kPtpc);
  TObjArray *oaTPCgain_mb = HistoUtils_FitPeak(NULL, hGainPtpc, 5, 3., 3., 100, Form("hTPCgain_mb_%s_%s", AliPID::ParticleName(ipart), chargeName[icharge]));
  delete hGainPtpc;
  TH1D *hmb = (TH1D *)oaTPCgain_mb->At(1);
  
  /* centrality projections */
  TObjArray *oaTPCgain_cent[NcentralityBins];
  for (Int_t icent = 0; icent < NcentralityBins; icent++) {

    hTPCcalib->GetAxis(kCentrality)->SetRange(icent + 1, icent + 1);
    hGainPtpc = hTPCcalib->Projection(kTPCgain, kPtpc);
    oaTPCgain_cent[icent] = HistoUtils_FitPeak(NULL, hGainPtpc, 5, 3., 3., 100, Form("hTPCgain_cent%d_%s_%s", icent, AliPID::ParticleName(ipart), chargeName[icharge]));
    TH1D *hcent = (TH1D *)oaTPCgain_cent[icent]->At(1);
    hcent->Divide(hmb);
    delete hGainPtpc;
  }

}

/**************************************************************/

TH1D *
TPCcalib_delta2bethe(TH1D *hDelta, Int_t ipart, const Char_t *name = "hTPCbethe")
{

  Int_t nbins = hDelta->GetNbinsX();
  Float_t *xbins = new Float_t[nbins + 1];
  for(Int_t ibin = 0; ibin <= nbins; ibin++)
    xbins[ibin] = hDelta->GetBinLowEdge(ibin + 1) / AliPID::ParticleMass(ipart);
  
  TH1D *hBethe = new TH1D(name, "", nbins, xbins);
  /* TPC PID response */
  AliTPCPIDResponse *tpcResponse = AliAnalysisTrack::GetTPCResponse();
  Double_t ptpc, delta, bethe, deltae;
  for (Int_t ibin = 0; ibin < nbins; ibin++) {
    ptpc = hDelta->GetBinCenter(ibin + 1);
    delta = hDelta->GetBinContent(ibin + 1);
    deltae = hDelta->GetBinError(ibin + 1);
    bethe = tpcResponse->GetExpectedSignal(ptpc, ipart);
    hBethe->SetBinContent(ibin + 1, bethe + delta);
    hBethe->SetBinError(ibin + 1, deltae);
  }

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