ROOT logo
#if !defined(__CINT__) || defined(__MAKECINT__)
#include "TList.h"
#include "TFile.h"
#include "TStyle.h"
#include "TH1F.h"
#include "TH2F.h"
#include "THnSparse.h"
#include "TLegend.h"
#include "TSystem.h"
#include "TMath.h"
#include "TCanvas.h"
#include "TLegend.h"
#include "TLatex.h"
#include "TF1.h"
#include "TLine.h"
#include "TPaletteAxis.h"
#include "TArrayD.h"
#include "TGraphErrors.h"
//
//
#endif
#include "/home/shahoian/ALICE/mymacros/SaveCanvas.h"



const char kHStatName[]="hStat";
double kEps = 1e-6;
//
double kdPhiBgTailMin = 0.1; // lower limit of dphi tail to use for bg normalization  
double kdPhiBgTailMax = 0.3; // upper limit of dphi tail to use for bg normalization   
//
double kWDistBgTailMin = 5.; // lower limit of wgh.distance tail to use for bg normalization  
double kWDistBgTailMax = 25.; // upper limit of wgh.distance tail to use for bg normalization

double kdPhiSgCut=-1;       // cut in dphi-bent used to extract the signal, extracted from stat histo
double kWDistSgCut=-1;      // cut in w.distance used to extract the signal, extracted from stat histo
//
enum { kNormShapeDist,      // normalize bg tails usig weighted distance shape 
       kNormShapeDPhi,      // normalize bg tails usig dPhi-bend shape
       kNormShapes};

enum { kSclWghMean,         // normalize bg tails to data using weighted mean of bin-by-bin ratios 
       kSclIntegral,        // normalize bg tails to data using integral
       kSclTypes};


const char* figDir = "figMult";
const char* resDir = "resMult";
TString  useBgType    = "Inj";
Int_t    useShapeType = kNormShapeDist;    // which distribution to use for bg normalization
Bool_t   useMCLB      = 0;//kFALSE;             // use Comb MC Labels as a template for Bg.
Int_t    useScaleType = kSclIntegral;//kSclWghMean;       // which type of tails normalization to use
const double kEtaFitRange = 0.5;

enum {kBitNormPerEvent=BIT(14)};
  // bins for saved parameters in the hStat histo
  enum {kDummyBin,
	kEvTot0,      // events read
	kEvTot,       // events read after vertex quality selection
	kOneUnit,     // just 1 to track primate merges
	kNWorkers,    // n workers
	//
	kCentVar,     // cetrality var. used
	kDPhi,        // dphi window
	kDTht,        // dtheta window
	kNStd,        // N.standard deviations to keep
	kPhiShift,    // bending shift
	kThtS2,       // is dtheta scaled by 1/sin^2
	kThtCW,       // on top of w.dist cut cut also on 1 sigma dThetaX
	kPhiOvl,      // overlap params
	kZEtaOvl,     // overlap params
	kNoOvl,       // flag that overlap are suppressed
	//
	kPhiRot,      // rotation phi
	kInjScl,      // injection scaling
	kEtaMin,      // eta cut
	kEtaMax,      // eta cut
	kZVMin,       // min ZVertex to process
	kZVMax,       // max ZVertex to process
	//
	kDPiSCut,     // cut on dphi used to extract signal (when WDist is used in analysis, put it equal to kDPhi
	kNStdCut,     // cut on weighted distance (~1) used to extract signal 
	//
	kMCV0Scale,   // scaling value for V0 in MC
	//
	// here we put entries for each mult.bin
	kBinEntries = 50,
	kEvProcData,  // events with data mult.object (ESD or reco)
	kEvProcInj,   // events Injected, total
	kEvProcRot,   // events Rotated
	kEvProcMix,   // events Mixed
	kEntriesPerBin
  };


enum {kSigCorr,kMCPrim,kRawDtCut,kSignalEst,kSignalEstMC,kBgEst,k1MBeta,k1MBetaMC,kAlpha,kAlphaMC,kBgMC,kBgRescFc,kDataDist,kBgDist,kBgMCDist, kMCShift=20, kNHistos=kMCShift+kMCShift};

void    CorrectSpectraMulti(const char* flNameData, const char* flNameMC,const char* unique="",int maxBins=6);
Bool_t  PrepareHistos(int bin, TList* lst, Bool_t isMC);
void    ProcessHistos(int bin);
TH1*    NormalizeBg(TH1* dataH, TH1* bgH, double &scl, double &scle);
TObject* FindObject(int bin, const char* nameH, const TList* lst, Bool_t normPerEvent=kTRUE);
TList*  LoadList(const char* flName, const char* addPref, const char* nameL="clist");
void    GetRatE(double x,double xe, double y,double ye, double &rat, double &rate);
Int_t   CheckStat(const TList* lst,const char* dtType);
void    Integrate(TH1* hist, double xmn,double xmx, double &val, double& err);
void    CropHisto(TH1* histo, int b00, int b01, int b10=-1, int b11=-1);
void    CropHisto(TH1* histo, double b00, double b01, double b10=-1, double b11=-1);
void    GetRealMinMax(TH1* h, double &vmn, double &vmx);
const char*   HName(const char* prefix,const char* htype);

void PlotResults();
void PlotDNDEta(int bin);
void PlotAlphaBeta(int bin);
void PlotSpecies();

Float_t myMergeFactor = -1; // if the files were manually merged, scale everything except statistics by 1/myMergeFactor
Int_t nCentBins = -1;
TList *listDt=0, *listMC=0;
TObjArray resArr, resDnDeta;
char outStr[1000];
char outTitle[1000];
TString uniqueName="";
//
TArrayD dNdEta,dNdEtaErr;
TCanvas *canvFin=0;
//
Bool_t creatDnDEtaCMacro = kFALSE;
Bool_t creatAlphaBetaCMacro = kFALSE;
Bool_t creatSpeciesCMacro = kFALSE;

void CorrectSpectraMulti(const char* flNameData, const char* flNameMC, const char* uniqueNm,int maxBin) 
{
 //
  uniqueName = uniqueNm;
  listDt = LoadList(flNameData,"dt_");
  listMC = LoadList(flNameMC,"mc_");
  //
  resArr.Clear();
  //
  TH1* hstat = (TH1*)FindObject(-1,kHStatName,listDt,kFALSE);
  //TH1* hstat = (TH1*)FindObject(-1,kHStatName,listMC,kFALSE);
  //
  int nbstat = hstat->GetNbinsX();
  nCentBins = (nbstat - kBinEntries)/kEntriesPerBin;
  nCentBins = nCentBins>maxBin ? maxBin : nCentBins;
  printf("%d bins will be processed\n",nCentBins);
  if (nCentBins<1) return;
  myMergeFactor = hstat->GetBinContent(kOneUnit);
  printf("Detected %f mergings\n",myMergeFactor);
  if (myMergeFactor<1) myMergeFactor = 1.;
  //
  dNdEta.Set(nCentBins);
  dNdEtaErr.Set(nCentBins);
  //
  kdPhiSgCut  = hstat->GetBinContent(kDPiSCut)/myMergeFactor;
  kWDistSgCut = hstat->GetBinContent(kNStdCut)/myMergeFactor;
  printf("Signal cuts used: dPhiS: %f WDist:%f\n",kdPhiSgCut,kWDistSgCut);
  //
  for (int ib=0;ib<nCentBins;ib++) {
    if (!PrepareHistos(ib,listMC,kTRUE))  return;
    if (!PrepareHistos(ib,listDt,kFALSE)) return;
    ProcessHistos(ib); 
    //
  }
  //
  sprintf(outStr,"CutEta%.1f_%.1f_Zv%.1f_%.1f_bg%s_Shape_%s_mcLB%d_cutSig%.1f_cutBg%.1f",
	  hstat->GetBinContent(kEtaMin)/myMergeFactor,
	  hstat->GetBinContent(kEtaMax)/myMergeFactor,
	  hstat->GetBinContent(kZVMin)/myMergeFactor,
	  hstat->GetBinContent(kZVMax)/myMergeFactor,	 
	  useBgType.Data(),
	  useShapeType==kNormShapeDist ? "wdst":"dphi", 
	  useMCLB,
	  useShapeType==kNormShapeDist ? kWDistSgCut:kdPhiSgCut,
	  useShapeType==kNormShapeDist ? kWDistBgTailMin:kdPhiBgTailMin);
  //
  PlotResults();
  //
  printf("Final Results:\n");
  printf("dNdEta:    "); 
  for (int i=nCentBins;i--;) printf("%.2f,",dNdEta[i]); printf("\n");
  printf("dNdEtaErr: "); 
  for (int i=nCentBins;i--;) printf("%.2f,",dNdEtaErr[i]); printf("\n");
  //
  TString rtnm1 = resDir; rtnm1 += "/"; rtnm1 += uniqueName; 
  rtnm1 += "_"; rtnm1 += nCentBins; rtnm1+= "bins_";
  rtnm1 += outStr; rtnm1 += ".root";
  TFile* flRes = TFile::Open(rtnm1.Data(),"recreate");
  flRes->WriteObject(&resDnDeta, "TObjArray", "kSingleKey");
  flRes->Close();
  delete flRes;
  printf("Stored result in %s\n",rtnm1.Data());
  //
}

//_____________________________________________________________________
Bool_t PrepareHistos(int bin, TList* lst, Bool_t isMC)
{
  // fill standard histos for given bin
  //
  char buffn[500];
  char bufft[500];
  //
  double cutBgMin,cutBgMax;
  double cutSgMin,cutSgMax;
  //
  if (useShapeType==kNormShapeDist) {
    cutBgMin = kWDistBgTailMin;
    cutBgMax = kWDistBgTailMax;
    //
    cutSgMin = 0;
    cutSgMax = kWDistSgCut;
  }
  else {
    cutBgMin =  kdPhiBgTailMin;
    cutBgMax =  kdPhiBgTailMax;
    //
    cutSgMin =  0;
    cutSgMax =  kdPhiSgCut;
  }
  //
  const char* zeCut = "ZvEtaCutT";
  TObjArray* res = &resArr;
  int shift = bin*kNHistos + (isMC ? kMCShift : 0);
  //
  // histo for "data" Z vs Eta with default signal cut
  TH2* hRawDtCut = (TH2*) FindObject(bin,HName("Data",zeCut),lst);
  if (!hRawDtCut) return kFALSE;
  sprintf(buffn,"bin%d_%s_RawWithCut",bin,isMC ? "mc":"dt");
  sprintf(bufft,"bin%d %s Raw Data with cut on tracklets",bin,isMC ? "mc":"dt");
  hRawDtCut = (TH2*)hRawDtCut->Clone(buffn);
  hRawDtCut->SetTitle(bufft);
  res->AddAtAndExpand(hRawDtCut, kRawDtCut+shift);
  //
  int nbEta = hRawDtCut->GetXaxis()->GetNbins();
  int nbZV  = hRawDtCut->GetYaxis()->GetNbins();
  //
  // "Data - Est.Bg" histo with cut on tails where we look for signal
  sprintf(buffn,"bin%d_%s_SignalWithCut",bin,isMC ? "mc":"dt");
  sprintf(bufft,"bin%d %s Signal (raw-bg) with cut on tracklets",bin,isMC ? "mc":"dt");
  TH2* hSignalEst = (TH2F*)hRawDtCut->Clone(buffn);
  hSignalEst->SetTitle(bufft);
  res->AddAtAndExpand(hSignalEst, kSignalEst+shift);
  //
  // "Data - MC.Bg" histo with cut on tails where we look for signal
  TH2* hSignalEstMC = 0;
  if (isMC) {
    sprintf(buffn,"bin%d_%s_SignalWithCut_bgMCLabels",bin,isMC ? "mc":"dt");
    sprintf(bufft,"bin%d %s Signal (raw-bg_MCLabels) with cut on tracklets",bin,isMC ? "mc":"dt");
    hSignalEstMC = (TH2F*)hRawDtCut->Clone(buffn);
    hSignalEstMC->SetTitle(bufft);
    res->AddAtAndExpand(hSignalEstMC, kSignalEstMC+shift);
  }
  //
  // Estimated background in the cut range
  sprintf(buffn,"bin%d_%s_BgEst",bin,isMC ? "mc":"dt");
  sprintf(bufft,"bin%d %s Estimated Bg",bin,isMC ? "mc":"dt");
  TH2* hBgEst = (TH2*) FindObject(bin,HName(useBgType.Data(),zeCut),lst);
  if (!hBgEst) return kFALSE;
  hBgEst = (TH2*)hBgEst->Clone(buffn);
  hBgEst->SetTitle(bufft);
  res->AddAtAndExpand(hBgEst,kBgEst +shift);
  //
  // special feature: use MC Labels bg as a shape instead of generated bg
  if (useMCLB/* && !isMC*/) {
    TString nm  = hBgEst->GetName();   nm  += "_MCLB";
    TString tit = hBgEst->GetTitle();  tit += "_MCLB";
    TH2* hBMCLB = (TH2*) FindObject(bin,HName("Comb",zeCut),listMC);
    if (!hBMCLB) return kFALSE;
    hBMCLB = (TH2F*)hBMCLB->Clone(nm.Data());
    hBMCLB->SetTitle(tit.Data());
    delete hBgEst;
    hBgEst = hBMCLB;
    res->AddAtAndExpand(hBgEst,kBgEst +shift);
  }
  //
  // 1-beta for "data" = (Data_cut - Bg_cut) / Data_cut
  sprintf(buffn,"bin%d_%s_1mBeta",bin,isMC ? "mc":"dt");
  sprintf(bufft,"bin%d %s 1-#beta with estimated bg",bin,isMC ? "mc":"dt");
  TH2* h1mBeta = (TH2*)hBgEst->Clone(buffn);
  h1mBeta->SetTitle(bufft);
  h1mBeta->Reset();
  res->AddAtAndExpand(h1mBeta, k1MBeta+shift);
  //
  // If MC labels info is provided, prepare 1-beta with MC bg
  TH2* h1mBetaMC = 0;  // 1-beta for MC with bg from labels
  TH2* hBgMC = 0;      // bg from MC labels
  if (isMC) {
    sprintf(buffn,"bin%d_%s_BgMC",bin,isMC ? "mc":"dt");
    sprintf(bufft,"bin%d %s Bg from MC labels",bin,isMC ? "mc":"dt");
    hBgMC = (TH2*) FindObject(bin,HName("Comb",zeCut),listMC);
    if (!hBgMC) return kFALSE;
    hBgMC = (TH2F*)hBgMC->Clone(buffn);
    hBgMC->SetTitle(bufft);
    res->AddAtAndExpand(hBgMC, kBgMC+shift);
    //
    sprintf(buffn,"bin%d_%s_h1mBetaMC",bin,isMC ? "mc":"dt");
    sprintf(bufft,"bin%d %s 1-#beta with bg. from MC labels",bin,isMC ? "mc":"dt");
    h1mBetaMC = (TH2F*) hBgMC->Clone(buffn);
    h1mBetaMC->SetTitle(bufft);
    res->AddAtAndExpand(h1mBetaMC, k1MBetaMC+shift);
    printf(">>Here1\n");
    h1mBetaMC->Divide(hRawDtCut);
    printf("<<Here1\n");
    for (int ib0=1;ib0<=nbEta;ib0++) 
      for (int ib1=1;ib1<=nbZV;ib1++) 
	h1mBetaMC->SetBinContent(ib0,ib1, 1.- h1mBetaMC->GetBinContent(ib0,ib1));
    //
    hSignalEstMC->Add(hBgMC,-1);
  }
  //
  // uncut w.distance or dphi distribution for data
  TH1* hDstDt = (TH1*) FindObject(bin,HName("Data",useShapeType==kNormShapeDist ? "WDist":"DPhiS"),lst);
  if (!hDstDt) return kFALSE;
  sprintf(buffn,"bin%d_%s_DistRawData",bin,isMC ? "mc":"dt");
  sprintf(bufft,"bin%d %s Raw Distance for Data",bin,isMC ? "mc":"dt");
  hDstDt = (TH1*) hDstDt->Clone(buffn);
  hDstDt->SetTitle(bufft);
  double nrmDst,dumErr = 0;
  Integrate(hDstDt, cutBgMin,cutBgMax, nrmDst, dumErr);
  hDstDt->Scale(1./nrmDst);
  res->AddAtAndExpand(hDstDt, kDataDist+shift);
  //
  // uncut w.distance or dphi distribution for generated bg
  TH1* hDstBg = (TH1*) FindObject(bin,HName(useBgType.Data(),useShapeType==kNormShapeDist ? "WDist":"DPhiS"),lst);
  if (!hDstBg) return kFALSE;
  sprintf(buffn,"bin%d_%s_DistRawGenBgNorm",bin,isMC ? "mc":"dt");
  sprintf(bufft,"bin%d %s Raw Distance for Gen.Bg. Normalized to data",bin,isMC ? "mc":"dt");
  hDstBg = (TH1*) hDstBg->Clone(buffn);
  hDstBg->SetTitle(bufft);
  hDstBg->Scale(1./nrmDst);
  //  res->AddAtAndExpand(hDstBg, kBgDist+shift);
  //
  // uncut w.distance or dphi distribution for comb. MC labels
  TH1* hDstBgMC = 0; 
  if (isMC) {
    hDstBgMC = (TH1*) FindObject(bin,HName("Comb",useShapeType==kNormShapeDist ? "WDist":"DPhiS"),lst);
    if (!hDstBgMC) return kFALSE;
    sprintf(buffn,"bin%d_%s_DistBgMC",bin,isMC ? "mc":"dt");
    sprintf(bufft,"bin%d %s Bg. Distance from MC labels",bin,isMC ? "mc":"dt");
    hDstBgMC = (TH1*) hDstBgMC->Clone(buffn);
    hDstBgMC->SetTitle(bufft);
    hDstBgMC->Scale(1./nrmDst);
    res->AddAtAndExpand(hDstBgMC, kBgMCDist+shift);
  }
  //
  // fill 1-beta matrix
  double scl,sclE;
  hDstBg = NormalizeBg(hDstDt,hDstBg,scl,sclE);  // get rescaling factor for bg. from tails comparison
  res->AddAtAndExpand(hDstBg, kBgDist+shift);
  double bgVal,bgErr;
  double dtVal,dtErr;
  // integral in the range where we look for signal
  Integrate(hDstBg, cutSgMin, cutSgMax, bgVal, bgErr);
  Integrate(hDstDt, cutSgMin, cutSgMax, dtVal, dtErr);
  double sclb,sclbErr;
  GetRatE(bgVal,bgErr, dtVal, dtErr,sclb,sclbErr);
  //  hDstBg->Scale(1./nrmDst);
  //
  // finalize estimated bg and signal matrices
  hBgEst->Scale(scl);
  //
  hSignalEst->Add(hBgEst,-1);
  //
  // finalize 1-beta
  for (int ib0=1;ib0<=nbEta;ib0++) { // eta
    for (int ib1=1;ib1<=nbZV;ib1++) { // zv
      //      printf("Bin %d %d\n",ib0,ib1);
      double bg  = hBgEst->GetBinContent(ib0,ib1);
      double bgE = hBgEst->GetBinError(ib0,ib1);
      double dt  = hRawDtCut->GetBinContent(ib0,ib1);
      double dtE = hRawDtCut->GetBinError(ib0,ib1);
      double beta,betaE;
      GetRatE(bg,bgE,dt,dtE, beta,betaE );      
      h1mBeta->SetBinContent(ib0,ib1,1.-beta);
      h1mBeta->SetBinError(ib0,ib1,betaE);
      //
    }
  }  
  //
  if (isMC) {
    // prepare MC primary signal histo
    sprintf(buffn,"bin%d_zvEtaPrimMC",bin);
    sprintf(bufft,"bin%d MC True signal Zv vs Eta",bin);
    TH2F* mcPrim = (TH2F*)FindObject(bin,"zvEtaPrimMC", lst );
    mcPrim = (TH2F*) mcPrim->Clone(buffn);
    mcPrim->SetTitle(bufft);
    res->AddAtAndExpand(mcPrim, kMCPrim + shift);
  }
  //
  return kTRUE;
}

//_____________________________________________________________________
void ProcessHistos(int bin)
{
  //
  int shift = bin*kNHistos;
  //
  TString prefN = "bin"; prefN += bin; prefN+="_";
  TString prefT = "bin"; prefT += bin; prefT+=" ";
  TObjArray* res = &resArr;
  // build alpha matrix
  TH2* halp = (TH2*)res->At(shift + kMCShift + kMCPrim);
  halp = (TH2*) halp->Clone(prefN+"Alpha");
  halp->SetTitle(prefN+"#alpha");
  printf(">>Here2\n");
  printf("Halp: %p %d %d\n",halp,halp->GetNbinsX(),halp->GetNbinsY()); halp->Print();
  TH2* xxx = (TH2*)res->At(shift + kMCShift + k1MBeta);
  printf("other: %p %d %d\n",xxx,xxx->GetNbinsX(),xxx->GetNbinsY()); xxx->Print();
  halp->Divide( (TH2*)res->At(shift + kMCShift + k1MBeta) );
  printf(">>Here2a\n");
  halp->Divide( (TH2*)res->At(shift + kMCShift + kRawDtCut) );
  printf("<<Here2\n");
  res->AddAtAndExpand(halp, shift + kAlpha);
  //
  // build alpha matrix with MC labels bg
  TH2* halpMC = (TH2*)res->At(shift + kMCShift + kMCPrim);
  halpMC = (TH2*) halpMC->Clone(prefN + "AlphaMC");
  halpMC->SetTitle(prefT + "#alpha MC labels");
  printf(">>Here3\n");
  halpMC->Divide( (TH2*)res->At(shift + kMCShift + k1MBetaMC) );
  halpMC->Divide( (TH2*)res->At(shift + kMCShift + kRawDtCut) );
  printf("<<Here3\n");
  res->AddAtAndExpand(halpMC, shift + kAlphaMC);
  //
  // build corrected signal
  TH2* hsigCorr = (TH2*)res->At(shift + kSignalEst);
  hsigCorr = (TH2*) hsigCorr->Clone(prefN + "SignalEstCorr");
  hsigCorr->SetTitle(prefT + "Corrected Signal");
  hsigCorr->Multiply( halp );
  res->AddAtAndExpand(hsigCorr, shift + kSigCorr);
  //
  TH1* hsigCorrX = hsigCorr->ProjectionX("DataCorrSignalX");
  hsigCorrX->Scale(1./hsigCorr->GetBinWidth(1));
  TF1* pl0 = new TF1("pl0","pol0");
  pl0->SetParameter(0,hsigCorr->GetMinimum());
  hsigCorrX->Fit(pl0,"q0","",-kEtaFitRange,kEtaFitRange);
  double fval = pl0->GetParameter(0);
  double ferr = pl0->GetParError(0);
  delete hsigCorrX;
  dNdEta[bin]    = fval;
  dNdEtaErr[bin] = ferr;
  printf("Bin %d: dN/d#eta_{|#eta|<0.5} = %.2f  %.2f\n",bin, fval,ferr);
  //
}

void PlotResults() 
{
  TString psnm1 = figDir; psnm1 += "/"; psnm1 += uniqueName; 
  psnm1 += "_"; psnm1 += nCentBins; psnm1+= "bins_";
  psnm1 += outStr; psnm1 += ".ps";
  TString psnm0 = psnm1.Data(); 
  psnm0 += "[";
  TString psnm2 = psnm1.Data(); 
  psnm2 += "]";
  //
  TH1* hstat = (TH1*)FindObject(-1,kHStatName,listDt,kFALSE);
  //
  TH1* hbins = (TH1*)FindObject(-1,"EvCentr",listDt,kFALSE);
  //
  if (!canvFin) canvFin = new TCanvas("canvFin", "canvFin",0,50,700,1000);
  canvFin->Clear();
  //
  canvFin->Print(psnm0.Data());
  //
  printf(">>Here4\n");
  canvFin->Divide(1,2);
  printf("<<Here4\n");
  canvFin->cd(1);
  gPad->SetLeftMargin(0.15);
  TGraphErrors* grp = new TGraphErrors(nCentBins);
  for (int i=0;i<nCentBins;i++) {
    grp->SetPoint(i,hbins->GetBinCenter(i+1),dNdEta[i]);
    grp->SetPointError(i,hbins->GetBinWidth(i+1)/2,dNdEtaErr[i]);
  }
  grp->SetMarkerStyle(20);
  grp->SetMarkerColor(kRed);
  grp->SetLineColor(kRed);
  grp->SetMinimum(1e-6);
  grp->Draw("ap");
  grp->GetXaxis()->SetTitle("Centrality Variable");
  grp->GetYaxis()->SetTitle("dN/d#eta_{|#eta|<0.5}");
  grp->GetYaxis()->SetTitleOffset(1.8);
  gPad->SetGrid(1,1);
  //
  canvFin->cd(2);
  gPad->SetLeftMargin(0.15);
  hbins->Draw();
  hbins->SetMinimum(1e-6);
  hbins->SetMarkerStyle(20);
  hbins->SetMarkerColor(kRed);
  hbins->SetLineColor(kRed);
  hbins->GetYaxis()->SetTitle("accepted events");
  hbins->GetYaxis()->SetTitleOffset(1.8);
  gPad->SetGrid(1,1);
  //
  canvFin->cd(0);
  canvFin->Print(psnm1.Data());
  //
  const TArrayD &binArr = *hbins->GetXaxis()->GetXbins();
  //
  for (int i=0;i<nCentBins;i++) {
    //
    sprintf(outTitle,"%s, %d<C_%s<%d, %.1f<#eta<%.1f, %.1f<Z_{V}<%.1f,  Bg.:%s, UseMCLB=%d, CutVar:%s, |sig|<%.2f, %.2f<|bg.nrm|<%.2f",
	    uniqueName.Data(),
	    (int)binArr[i],
	    hstat->GetXaxis()->GetBinLabel(kCentVar),
	    (int)binArr[i+1],
	    hstat->GetBinContent(kEtaMin)/myMergeFactor,
	    hstat->GetBinContent(kEtaMax)/myMergeFactor,
	    hstat->GetBinContent(kZVMin)/myMergeFactor,
	    hstat->GetBinContent(kZVMax)/myMergeFactor,	  
	    useBgType.Data(),
	    useMCLB,
	    useShapeType==kNormShapeDist ? "#Delta":"#Delta#varphi-#delta_{#varphi}",
	    useShapeType==kNormShapeDist ? kWDistSgCut:kdPhiSgCut,
	    useShapeType==kNormShapeDist ? kWDistBgTailMin : kdPhiBgTailMin,
	    useShapeType==kNormShapeDist ? kWDistBgTailMax : kdPhiBgTailMax	  
	    );
    //
    PlotDNDEta(i);
    canvFin->Print(psnm1.Data());
    PlotAlphaBeta(i);
    canvFin->Print(psnm1.Data());
  }
  PlotSpecies();
  canvFin->Print(psnm1.Data());
  //
  canvFin->Print(psnm2.Data());    
}

void PlotDNDEta(int bin)
{
  //
  TObjArray *res = &resArr;
  TString prefN = "bin"; prefN += bin; prefN+="_";
  int shift = bin*kNHistos;
  //
  char buff[1000];
  // eta range
  gStyle->SetOptFit(0);
  gStyle->SetOptStat(0);
  gStyle->SetOptTitle(0);
  double mn = 1e6,mx = -1e6;
  if (!canvFin) canvFin = new TCanvas("canvFin", "canvFin",0,50,700,1000);
  canvFin->Clear();
  canvFin->Divide(1,2);
  canvFin->cd(1);
  gPad->SetLeftMargin(0.15);
  //
  // corrected data
  TString nms =  prefN;
  nms += "DataCorrSignal";
  nms += "_"; 
  nms += uniqueName;
  TH1* hsigCorr = ((TH2F*)res->At(shift + kSigCorr))->ProjectionX(nms.Data());
  SetHStyle(hsigCorr,kRed,20,1.0);
  hsigCorr->Scale(1./hsigCorr->GetBinWidth(1));
  hsigCorr->Draw();
  mx = TMath::Max(mx, hsigCorr->GetMaximum());
  mn = TMath::Min(mn, hsigCorr->GetMinimum());
  char ftres[1000];
  sprintf(ftres,"dN/d#eta_{|#eta|<%.1f} = %.1f #pm %.1f",kEtaFitRange,dNdEta[bin],dNdEtaErr[bin]);
  TLatex *txfit = new TLatex(-0.2,hsigCorr->GetMinimum()*0.9, ftres);
  txfit->SetTextSize(0.04);
  txfit->Draw();
  resDnDeta.AddAtAndExpand( hsigCorr, bin );
  hsigCorr->SetDirectory(0);
  //
  // raw data
  TH1* hraw = ((TH2F*)res->At(shift+kRawDtCut))->ProjectionX(prefN+"DataRaw");
  SetHStyle(hraw,kRed,21,1.0);
  hraw->Scale(1./hraw->GetBinWidth(1));
  hraw->Draw("same");
  mn = TMath::Min(mn, hraw->GetMinimum());
  mx = TMath::Max(mx, hraw->GetMaximum());
  //  
  // raw data bg sub
  TH1* hraws = ((TH2F*)res->At(shift+kSignalEst))->ProjectionX(prefN+"DataRawSub");
  SetHStyle(hraws,kRed,23,1.0);
  hraws->Scale(1./hraw->GetBinWidth(1));
  hraws->Draw("same");
  mn = TMath::Min(mn, hraw->GetMinimum());
  mx = TMath::Max(mx, hraw->GetMaximum());
  //
  // bg
  TH1* hbg = ((TH2F*)res->At(shift+kBgEst))->ProjectionX(prefN+"BgEst");
  SetHStyle(hbg,kMagenta,22,1.0);
  hbg->Scale(1./hbg->GetBinWidth(1));
  hbg->Draw("same");
  mn = TMath::Min(mn, hbg->GetMinimum());
  mx = TMath::Max(mx, hbg->GetMaximum());
  //
  // mc part ----------------------------
  // raw data
  TH1* hrawMC = ((TH2F*)res->At(shift+kRawDtCut+kMCShift))->ProjectionX(prefN+"DataRawMC");
  SetHStyle(hrawMC,kBlue,24,1.0);
  hrawMC->Scale(1./hrawMC->GetBinWidth(1));
  hrawMC->Draw("same");
  mn = TMath::Min(mn, hrawMC->GetMinimum());
  mx = TMath::Max(mx, hrawMC->GetMaximum());
  //  
  // raw data bg sub
  TH1* hrawsMC = ((TH2F*)res->At(shift+kSignalEst+kMCShift))->ProjectionX(prefN+"DataRawSubMC");
  SetHStyle(hrawsMC,kBlue,26,1.0);
  hrawsMC->Scale(1./hrawMC->GetBinWidth(1));
  hrawsMC->Draw("same");
  mn = TMath::Min(mn, hrawMC->GetMinimum());
  mx = TMath::Max(mx, hrawMC->GetMaximum());
  //
  // raw data bgMClabels sub
  TH1* hrawsMCLB = ((TH2F*)res->At(shift+kSignalEstMC+kMCShift))->ProjectionX(prefN+"DataRawSubMCLB");
  SetHStyle(hrawsMCLB,kGreen+2,30,1.0);
  hrawsMCLB->Scale(1./hrawsMCLB->GetBinWidth(1));
  hrawsMCLB->Draw("same");
  mn = TMath::Min(mn, hrawsMCLB->GetMinimum());
  mx = TMath::Max(mx, hrawsMCLB->GetMaximum());
  //
  // bg est
  TH1* hbgMCEst = ((TH2F*)res->At(shift+kBgEst+kMCShift))->ProjectionX(prefN+"BgEstMC");
  SetHStyle(hbgMCEst,kBlue,26,1.0);
  hbgMCEst->Scale(1./hbgMCEst->GetBinWidth(1));
  hbgMCEst->Draw("same");
  mn = TMath::Min(mn, hbgMCEst->GetMinimum());
  mx = TMath::Max(mx, hbgMCEst->GetMaximum());
  //  
  // bg MC
  TH1* hbgMC = ((TH2F*)res->At(shift+kBgMC+kMCShift))->ProjectionX(prefN+"BgMC");
  SetHStyle(hbgMC,kGreen+2,25,1.0);
  hbgMC->Scale(1./hbgMC->GetBinWidth(1));
  hbgMC->Draw("same");
  mn = TMath::Min(mn, hbgMC->GetMinimum());
  mx = TMath::Max(mx, hbgMC->GetMaximum());
  //
  mn = 0;
  hsigCorr->SetMinimum(mn);
  hsigCorr->SetMaximum(mx + 0.4*(mx-mn));
  gPad->Modified();
  //
  TLegend *legDnDeta = new TLegend(0.15,0.75, 0.45,0.95);
  legDnDeta->SetFillColor(kWhite);
  legDnDeta->SetHeader("Data");
  legDnDeta->AddEntry(hsigCorr,"Corrected","pl");
  legDnDeta->AddEntry(hraw,    "Reconstructed","pl");
  sprintf(buff,"Reconstructed - Bckg.%s.",useBgType.Data());
  legDnDeta->AddEntry(hraws,   buff,"pl");
  sprintf(buff,"Background %s.",useBgType.Data());
  legDnDeta->AddEntry(hbg,     buff,"pl");
  legDnDeta->Draw();
  //
  TLegend *legDnDetaMC = new TLegend(0.60,0.72, 0.95,0.95);
  legDnDetaMC->SetFillColor(kWhite);
  legDnDetaMC->SetHeader("MC");
  legDnDetaMC->AddEntry(hrawMC,    "Reconstructed","pl");
  sprintf(buff,"Reconstructed - Bckg.%s.",useBgType.Data());
  legDnDetaMC->AddEntry(hrawsMC,   buff,"pl");
  sprintf(buff,"Reconstructed - Bckg.%s.","MC.Labels");
  legDnDetaMC->AddEntry(hrawsMCLB,   buff,"pl");
  sprintf(buff,"Background %s.",useBgType.Data());
  legDnDetaMC->AddEntry(hbgMCEst,     buff,"pl");
  sprintf(buff,"Background %s.","MC Labels");
  legDnDetaMC->AddEntry(hbgMC,     buff,"pl");
  //
  legDnDetaMC->Draw();
  //
  gPad->SetGrid(1.1);
  gPad->Modified();
  AddLabel(outTitle,0.1,0.97, kBlack,0.02);
  //
  canvFin->cd();
  //
  //---------------- dsitributions
  canvFin->cd(2);
  //
  TH1* mcdst = (TH1*)res->At(shift+kDataDist+kMCShift);
  TH1* mcdstbg = (TH1*)res->At(shift+kBgDist+kMCShift);
  TH1* mcdstbgLB = (TH1*)res->At(shift+kBgMCDist+kMCShift);
  TH1* dtdst = (TH1*)res->At(shift+kDataDist);
  TH1* dtdstbg = (TH1*)res->At(shift+kBgDist);
  //
  TH1* mcDstN     = (TH1*)FindObject(bin,HName("Data", useShapeType==kNormShapeDist ? "WDist":"DPhiS"), listMC );
  TH1* mcDstSec   = (TH1*)FindObject(bin,HName("Sec",  useShapeType==kNormShapeDist ? "WDist":"DPhiS"), listMC );
  TH1* mcDstCombU = (TH1*)FindObject(bin,HName("CombU",useShapeType==kNormShapeDist ? "WDist":"DPhiS"), listMC );
  TH1* mcDstCombC = (TH1*)FindObject(bin,HName("Comb", useShapeType==kNormShapeDist ? "WDist":"DPhiS"), listMC );
  //  
  double scl,sclE;
  mcDstN = NormalizeBg(mcdst,mcDstN,scl,sclE);
  mcDstSec->Scale(scl);
  mcDstCombU->Scale(scl);
  mcDstCombC->Scale(scl);
  mcDstCombC->Add(mcDstCombU,-1);

  dtdst->Draw("");
  gPad->Modified();
  dtdst->GetXaxis()->SetLabelSize(0.03);
  dtdst->GetXaxis()->SetTitleSize(0.03);
  dtdst->GetXaxis()->SetTitleOffset(2);
  dtdstbg->Draw("same");
  //
  mcdst->Draw("same");
  mcDstSec->Draw("same");
  mcdstbgLB->Draw("same");
  mcdstbg->Draw("same");
  mcDstCombC->Draw("same");
  //

  SetHStyle(mcdst,kBlue, 25,0.7);
  SetHStyle(mcdstbgLB,kGreen, 7/*32*/,0.5);
  SetHStyle(mcdstbg,kCyan, 7/*26*/,0.5);
  SetHStyle(mcDstCombC,kGreen+2, 21,0.7);
  SetHStyle(mcDstSec,kBlue+2, 22,0.7);
  //
  SetHStyle(dtdst,kRed, 20,0.7);
  SetHStyle(dtdstbg,kBlue, 34,0.7);
  //
  double vmcTot,vmcTotE;
  double vmcSec,vmcSecE, ratSec,ratSecE;  
  double vmcCmbEst,vmcCmbEstE, ratCmbEst,ratCmbEstE;
  double vmcCmb,vmcCmbE, ratCmb,ratCmbE;
  double vmcCmbC,vmcCmbCE, ratCmbC,ratCmbCE;  
  double cutSgMin,cutSgMax;
  double cutBgMin,cutBgMax;
  if (useShapeType==kNormShapeDist) {
    cutSgMin = 0;
    cutSgMax = kWDistSgCut;
    cutBgMin = kWDistBgTailMin;
    cutBgMax = kWDistBgTailMax;
  }
  else {
    cutSgMin =  0;
    cutSgMax =  kdPhiSgCut;
    cutBgMin =  kdPhiBgTailMin;
    cutBgMax =  kdPhiBgTailMax;
  }  
  Integrate(mcdst,    cutSgMin,cutSgMax, vmcTot,vmcTotE);     
  Integrate(mcDstSec, cutSgMin,cutSgMax, vmcSec,vmcSecE);
  GetRatE(vmcSec,vmcSecE, vmcTot,vmcTotE, ratSec,ratSecE);
  //
  Integrate(mcdstbgLB, cutSgMin,cutSgMax, vmcCmb,vmcCmbE);  
  GetRatE(vmcCmb,vmcCmbE, vmcTot,vmcTotE, ratCmb,ratCmbE);
  //
  Integrate(mcdstbg,  cutSgMin,cutSgMax, vmcCmbEst,vmcCmbEstE); 
  GetRatE(vmcCmbEst,vmcCmbEstE, vmcTot,vmcTotE, ratCmbEst,ratCmbEstE);
  //
  Integrate(mcDstCombC,  cutSgMin,cutSgMax, vmcCmbC,vmcCmbCE);  
  GetRatE(vmcCmbC,vmcCmbCE, vmcTot,vmcTotE, ratCmbC,ratCmbCE);
  //
  double vdtTot,vdtTotE;
  double vdtBg,vdtBgE, ratdtBg,ratdtBgE;  
  //  
  Integrate(dtdst,    cutSgMin,cutSgMax, vdtTot,vdtTotE);     
  Integrate(dtdstbg,  cutSgMin,cutSgMax, vdtBg,vdtBgE);     
  GetRatE( vdtBg,vdtBgE,  vdtTot,vdtTotE, ratdtBg,ratdtBgE);
  //
  //
  double dmn = mcdst->GetMinimum();
  double dmx = mcdst->GetMaximum();
  TLine *ln = new TLine(cutSgMax, dmn, cutSgMax, dmx);
  ln->SetLineColor(kBlack);
  ln->Draw();
  TLine *lnc = new TLine(cutBgMin, dmn, cutBgMin, dmx);
  lnc->SetLineColor(kRed);
  lnc->Draw();
  if (useShapeType==kNormShapeDPhi) {
    ln = new TLine(-cutSgMax, dmn, -cutSgMax, dmx);
    ln->SetLineColor(kBlack);
    ln->Draw();
    //
    lnc = new TLine(-cutBgMin, dmn, -cutBgMin, dmx);
    lnc->SetLineColor(kRed);
    lnc->Draw();
  }
  //
  TLegend *legDstMC1 = new TLegend(0.60,0.72, 0.95,0.95);
  legDstMC1->SetFillColor(kWhite);

  //
  legDstMC1->AddEntry(dtdst,    "Data raw","pl");
  sprintf(buff,"Data Comb. %s. : %.1f%%",useBgType.Data(),ratdtBg*100);
  legDstMC1->AddEntry(dtdstbg,  buff,"pl");
  //


  legDstMC1->AddEntry(mcdst,    "MC raw","pl");
  sprintf(buff,"MC Comb. %s. : %.1f%%",useBgType.Data(),ratCmbEst*100);
  legDstMC1->AddEntry(mcdstbg,  buff,"pl");
  //
  sprintf(buff,"MC Comb. %s. : %.1f%%","MC Lbl.",ratCmb*100);
  legDstMC1->AddEntry(mcdstbgLB,  buff,"pl");

  sprintf(buff,"MC Comb.Uncorr %s. : %.1f%%","MC Lbl.",ratCmbC*100);
  legDstMC1->AddEntry(mcDstCombC,  buff,"pl");

  sprintf(buff,"MC Sec.   : %.1f%%",ratSec*100);
  legDstMC1->AddEntry(mcDstSec,  buff,"pl");

  legDstMC1->Draw();

  if (useShapeType==kNormShapeDist) gPad->SetLogx();
  gPad->SetLogy();
  gPad->SetGrid(1,1);
  gPad->Modified();
  //
  canvFin->cd();
  //
  if (creatDnDEtaCMacro) {
    sprintf(buff,"%s/%s_b%d_dNdEta_%s",figDir,uniqueName.Data(),bin,outStr);
    SaveCanvas(canvFin,buff,"cg");
  }
  //
}
//
void PlotAlphaBeta(int bin) 
{
  char buff[1000];
  int shift = bin*kNHistos;
  gStyle->SetOptFit(0);
  gStyle->SetOptStat(0);
  gStyle->SetOptTitle(0);
  TObjArray* res = &resArr;
  //------------------------------------------------------
  if (!canvFin) canvFin = new TCanvas("canvFin","canvFin",10,10,700,1000);
  canvFin->Clear();
  canvFin->Divide(2,3,0.01,0.01);
  canvFin->cd(1);
  TH1* dtBet = (TH1*)res->At(shift + k1MBeta);
  TH1* mcBet = (TH1*)res->At(shift + k1MBeta+kMCShift);
  TH1* mcBetLB = (TH1*)res->At(shift + k1MBetaMC+kMCShift);
  double mn,mx,mnt,mxt;
  GetRealMinMax(dtBet,mn,mx);
  GetRealMinMax(mcBet,mnt,mxt);
  if (mnt<mn) mn = mnt;
  if (mxt>mx) mx = mxt;
  GetRealMinMax(mcBetLB,mnt,mxt);
  if (mnt<mn) mn = mnt;
  if (mxt>mx) mx = mxt;
  //
  dtBet->SetMinimum(mn - 0.05*(mx-mn));
  dtBet->SetMaximum(mx + 0.05*(mx-mn));
  mcBet->SetMinimum(mn - 0.05*(mx-mn));
  mcBet->SetMaximum(mx + 0.05*(mx-mn));
  mcBetLB->SetMinimum(mn - 0.05*(mx-mn));
  mcBetLB->SetMaximum(mx + 0.05*(mx-mn));
  //
  canvFin->cd(1);
  gPad->SetRightMargin(0.15);
  dtBet->Draw("colz");
  AddLabel("#beta Data",0.2,0.95,kBlack,0.04);
  gPad->Modified();
  dtBet->GetYaxis()->SetTitleOffset(1.4);
  TPaletteAxis *p = (TPaletteAxis*)dtBet->FindObject("palette");
  if (p) p->SetX1NDC(0.85);
  canvFin->cd(2);
  gPad->SetRightMargin(0.15);
  mcBet->Draw("colz");
  AddLabel("#beta MC (bckg.estimated)",0.2,0.95,kBlack,0.04);
  gPad->Modified();
  mcBet->GetYaxis()->SetTitleOffset(1.4);
  p = (TPaletteAxis*)mcBet->FindObject("palette");
  if (p) p->SetX1NDC(0.85);
  canvFin->cd(3);
  gPad->SetRightMargin(0.15);
  mcBetLB->Draw("colz");
  AddLabel("#beta MC (bckg.from MC labels)",0.2,0.95,kBlack,0.04);
  gPad->Modified();
  mcBetLB->GetYaxis()->SetTitleOffset(1.4);
  p = (TPaletteAxis*)mcBetLB->FindObject("palette");
  if (p) p->SetX1NDC(0.85);
  //
  //------------------------------------------------------
  TH1* dtAlp = (TH1*)res->At(shift + kAlpha);
  TH1* mcAlp = (TH1*)res->At(shift + kAlphaMC);
  GetRealMinMax(dtAlp,mn,mx);
  GetRealMinMax(mcAlp,mnt,mxt);
  if (mnt<mn) mn = mnt;
  if (mxt>mx) mx = mxt;
  dtAlp->SetMinimum(mn - 0.05*(mx-mn));
  dtAlp->SetMaximum(mx + 0.05*(mx-mn));
  mcAlp->SetMinimum(mn - 0.05*(mx-mn));
  mcAlp->SetMaximum(mx + 0.05*(mx-mn));
  //
  canvFin->cd(4);
  gPad->SetRightMargin(0.15);
  dtAlp->Draw("colz");
  AddLabel("#alpha (bckg.estimated)",0.2,0.95,kBlack,0.04);
  gPad->Modified();
  dtAlp->GetYaxis()->SetTitleOffset(1.4);
  TPaletteAxis *pa = (TPaletteAxis*)dtBet->FindObject("palette");
  if (pa) pa->SetX1NDC(0.85);
  canvFin->cd(5);
  gPad->SetRightMargin(0.15);
  mcAlp->Draw("colz");
  AddLabel("#alpha (bckg.from MC labels)",0.2,0.95,kBlack,0.04);
  gPad->Modified();
  mcAlp->GetYaxis()->SetTitleOffset(1.4);
  pa = (TPaletteAxis*)mcBet->FindObject("palette");
  if (pa) pa->SetX1NDC(0.85);
  gPad->Modified();
  canvFin->cd(6);
  AddLabel(outTitle,0.1,0.5, kBlack, 0.02);
  //
  if (creatAlphaBetaCMacro) {
    sprintf(buff,"%s/%sAlphaBeta_%s",figDir,uniqueName.Data(),outStr);
    SaveCanvas(canvFin,buff,"cg");
  }
  //
}

void PlotSpecies() 
{
  char buff[1000];
  gStyle->SetOptFit(0);
  gStyle->SetOptStat(0);
  gStyle->SetOptTitle(0);
  //------------------------------------------------------
  TH2F* hSpecPrim  = (TH2F*)FindObject(-1, "pdgPrim", listMC,kFALSE);
  TH2F* hSpecSec   = (TH2F*)FindObject(-1, "pdgSec", listMC,kFALSE);
  TH2F* hSpecPrimP = (TH2F*)FindObject(-1, "pdgPrimPar", listMC,kFALSE);
  TH2F* hSpecSecP  = (TH2F*)FindObject(-1, "pdgSecPar", listMC,kFALSE);
  int nbd = hSpecPrim->GetXaxis()->GetNbins();
  //
  TH1* hSpecPrimAll = hSpecPrim->ProjectionX("specPrimAll",1,nbd+1,"e");
  hSpecPrimAll->Scale(100./hSpecPrimAll->Integral());
  hSpecPrimAll->GetYaxis()->SetTitle("Fraction,%");
  hSpecPrimAll->GetXaxis()->SetLabelSize(0.06);
  hSpecPrimAll->GetXaxis()->LabelsOption("v");
  //
  TH1* hSpecSecAll  = hSpecSec->ProjectionX("specSecAll",1,nbd+1,"e");
  hSpecSecAll->Scale(100./hSpecSecAll->Integral());
  hSpecSecAll->GetYaxis()->SetTitle("Fraction,%");
  hSpecSecAll->GetXaxis()->SetLabelSize(0.05);
  //
  TH1* hSpecPrimPAll = hSpecPrimP->ProjectionX("specPrimPAll",1,nbd+1,"e");
  hSpecPrimPAll->Scale(100./hSpecPrimPAll->Integral());
  hSpecPrimPAll->GetYaxis()->SetTitle("Fraction,%");
  hSpecPrimPAll->GetXaxis()->SetLabelSize(0.06);
  hSpecPrimPAll->GetXaxis()->LabelsOption("v");

  //
  TH1* hSpecSecPAll  = hSpecSecP->ProjectionX("specSecPAll",1,nbd+1,"e");
  hSpecSecPAll->Scale(100./hSpecSecPAll->Integral());
  hSpecSecPAll->GetYaxis()->SetTitle("Fraction,%");
  hSpecSecPAll->GetXaxis()->SetLabelSize(0.05);
  //
  int binCut = hSpecPrim->GetXaxis()->FindBin(kWDistSgCut-kEps);
  TH1* hSpecPrimSel = hSpecPrim->ProjectionX("specPrimSel",1,binCut,"e");
  hSpecPrimSel->Scale(100./hSpecPrimSel->Integral());
  hSpecPrimSel->GetYaxis()->SetTitle("Fraction,%");
  hSpecPrimSel->GetXaxis()->SetLabelSize(0.05);
  //
  TH1* hSpecSecSel  = hSpecSec->ProjectionX("specSecSel",1,binCut,"e");
  hSpecSecSel->Scale(100./hSpecSecSel->Integral());
  hSpecSecSel->GetYaxis()->SetTitle("Fraction,%");
  hSpecSecSel->GetXaxis()->SetLabelSize(0.05);
  //
  TH1* hSpecPrimPSel = hSpecPrimP->ProjectionX("specPrimPSel",1,binCut,"e");
  hSpecPrimPSel->Scale(100./hSpecPrimPSel->Integral());
  hSpecPrimPSel->GetYaxis()->SetTitle("Fraction,%");
  hSpecPrimPSel->GetXaxis()->SetLabelSize(0.05);
  //
  TH1* hSpecSecPSel  = hSpecSecP->ProjectionX("specSecPSel",1,binCut,"e");
  hSpecSecPSel->Scale(100./hSpecSecPSel->Integral());
  hSpecSecPSel->GetYaxis()->SetTitle("Fraction,%");
  hSpecSecPSel->GetXaxis()->SetLabelSize(0.05);
  //
  if (!canvFin) canvFin = new TCanvas("canvFin","canvFin",10,10,1100,800);
  canvFin->Clear();
  canvFin->Divide(1,2,0.01,0.01);
  canvFin->cd(1);
  hSpecPrimAll->Draw();
  SetHStyle(hSpecPrimAll,kBlue,25,1.1);
  hSpecPrimSel->Draw("same");
  SetHStyle(hSpecPrimSel,kRed,20,1);
  //
  hSpecSecAll->Draw("same");
  SetHStyle(hSpecSecAll,kGreen,32,1.1);
  hSpecSecSel->Draw("same");
  SetHStyle(hSpecSecSel,kBlack,22,1);
  //
  TLegend *legPart = new TLegend(0.8,0.72, 0.999,0.999);
  legPart->SetFillColor(kWhite);
  legPart->SetHeader("Tracklet PDG");
  //
  legPart->AddEntry(hSpecPrimAll,    "Prim., before #Delta cut","pl");
  legPart->AddEntry(hSpecPrimSel,    "Prim., after #Delta cut","pl");
  legPart->AddEntry(hSpecSecAll,     "Sec., before #Delta cut","pl");
  legPart->AddEntry(hSpecSecSel,     "Sec., after #Delta cut","pl");
  //
  legPart->Draw();
  gPad->SetLogy();
  gPad->SetGrid(1,1);
  gPad->Modified();
  //
  canvFin->cd(2);
  hSpecPrimPAll->Draw();
  SetHStyle(hSpecPrimPAll,kBlue,25,1.1);
  hSpecPrimPSel->Draw("same");
  SetHStyle(hSpecPrimPSel,kRed,20,1);
  //
  hSpecSecPAll->Draw("same");
  SetHStyle(hSpecSecPAll,kGreen,32,1.1);
  hSpecSecPSel->Draw("same");
  SetHStyle(hSpecSecPSel,kBlack,22,1);
  //
  TLegend *legPartP = new TLegend(0.8,0.72, 0.999,0.999);
  legPartP->SetFillColor(kWhite);
  legPartP->SetHeader("Tracklet Parents PDG");
  //
  legPartP->AddEntry(hSpecPrimPAll,    "Prim., before #Delta cut","pl");
  legPartP->AddEntry(hSpecPrimPSel,    "Prim., after #Delta cut","pl");
  legPartP->AddEntry(hSpecSecPAll,     "Sec., before #Delta cut","pl");
  legPartP->AddEntry(hSpecSecPSel,     "Sec., after #Delta cut","pl");
  //
  legPartP->Draw();
  gPad->SetLogy();
  gPad->SetGrid(1,1);
  gPad->Modified();
  //
  canvFin->cd(1);
  //  AddLabel(outTitle,0.1,0.97, kBlack, 0.02);
  canvFin->cd();
  //
  if (creatSpeciesCMacro) {
    sprintf(buff,"%s/%sSpecies_%s",figDir,uniqueName.Data(),outStr);
    SaveCanvas(canvFin,buff,"cg");
  }
}

//______________________________________________________________________
void CropHisto(TH1* histo, int bx0, int bx1, int by0, int by1)	       
{
  // fill 0 to all bins outside defined range
  TAxis *xax = histo->GetXaxis();
  int nbx = xax->GetNbins(); 
  double vmn=1e16,vmx=-1e16;
  if (histo->InheritsFrom(TH2::Class())) {
    TAxis *yax = histo->GetYaxis();
    int nby = yax->GetNbins();
    for (int ix=nbx+2;ix--;) {
      for (int iy=nby+2;iy--;) {
	if ((ix<bx0||ix>bx1)||(iy<by0||iy>by1)) {
	  histo->SetBinContent(ix,iy,0);
	  histo->SetBinError(ix,iy,0);
	}
	else {
	  double vl = histo->GetBinContent(ix,iy);
	  if (vl<vmn) vmn = vl;
	  if (vl>vmx) vmx = vl;
	}
      }
    }
  }
  else {
    for (int ix=nbx+2;ix--;) {
      if ((ix<bx0||ix>bx1)) {
	histo->SetBinContent(ix,0);
	histo->SetBinError(ix,0);
      }
      else {
	double vl = histo->GetBinContent(ix);
	if (vl<vmn) vmn = vl;
	if (vl>vmx) vmx = vl;
      }
    }
  }
  //
  if (vmn==vmx) {
    vmn = 0.95*vmn;
    vmx = 1.05*vmx;
  }
  histo->SetMaximum(vmx);
  histo->SetMinimum(vmn);
}

//______________________________________________________________________
void CropHisto(TH1* histo, double vx0, double vx1, double vy0, double vy1)	       
{
  // fill 0 to all bins outside defined range
  TAxis *xax = histo->GetXaxis();
  int bx0,bx1,by0=-1,by1=-1;
  bx0 = xax->FindBin(vx0+kEps);
  bx1 = xax->FindBin(vx1-kEps);
  if (histo->InheritsFrom(TH2::Class())) {
    TAxis *yax = histo->GetYaxis();
    by0 = yax->FindBin(vy0+kEps);
    by1 = yax->FindBin(vy1-kEps);
  }
  CropHisto(histo,bx0,bx1,by0,by1);
}

//______________________________________________________________________
TH1* NormalizeBg(TH1* dataH, TH1* bgH, double &scl, double &sclE)
{
  // match generated bg and data tails, calculate normalization, return normalized bg copy
  //
  TAxis* xax = dataH->GetXaxis();
  int nbtot = xax->GetNbins();
  int bgBins[2][2] = {{0}}; // limiting bins for tails integration
  Int_t ntails; // 0 for dphi plot, 1 for weighted dist plot  
  if  (useShapeType == kNormShapeDist) { // only positive tail
    bgBins[0][0] = xax->FindBin(kWDistBgTailMin+kEps); // positive tail min bin
    bgBins[0][1] = xax->FindBin(kWDistBgTailMax-kEps); // positive tail max bin
    ntails = 1;
  }
  else if (useShapeType == kNormShapeDPhi) {         // both tails
    bgBins[0][0] = xax->FindBin( kdPhiBgTailMin+kEps); // positive tail min bin
    bgBins[0][1] = xax->FindBin( kdPhiBgTailMax-kEps); // positive tail max bin
    bgBins[1][0] = xax->FindBin(-kdPhiBgTailMax+kEps); // negative tail min bin
    bgBins[1][1] = xax->FindBin(-kdPhiBgTailMin-kEps); // positive tail max bin    
    ntails = 2;
  }
  else {printf("NormalizeBg: unknown shape type %d\n",useShapeType);exit(1);}
  printf("NormalizeBg: bins for tails: right: %d:%d / left: %d:%d\n",bgBins[0][0],bgBins[0][1],bgBins[1][0],bgBins[1][1]);
  // 
  double meanR=0,meanRE=0,meanRE2=0;
  double meanD=0,meanDE2=0;
  double meanB=0,meanBE2=0;
  double meanRI=0,meanRIE=0;
  for (int itp=0;itp<=ntails;itp++) {
    for (int ib=bgBins[itp][0];ib<=bgBins[itp][1];ib++) {
      if (ib<1||ib>nbtot) continue;
      double vD = dataH->GetBinContent(ib);
      double vB = bgH->GetBinContent(ib);
      double eD = dataH->GetBinError(ib);
      double eB = bgH->GetBinError(ib);
      meanD += vD; meanDE2 += eD*eD;
      meanB += vB; meanBE2 += eB*eB;
      if (vD<=0 || vB<=0 || eD<=0 || eB<=0) continue;
      double rat = vD/vB;
      double ratE2 = rat*rat*(eD*eD/vD/vD + eB*eB/vB/vB); 
      meanR   += rat/ratE2; meanRE2 += 1.0/ratE2;
    }
  }
  //
  if (meanRE2>0) {
    meanR  /= meanRE2;
    meanRE2 = 1./meanRE2;
    meanRE = TMath::Sqrt(meanRE2);
  }
  if (meanDE2>0 && meanBE2>0) {
    meanRI  = meanD/meanB;
    meanRIE =  meanRI*TMath::Sqrt(meanDE2/meanD/meanD + meanBE2/meanB/meanB);
  }
  printf("NormalizeBg: Tails scaling %s wrt %s: Wgh.Mean:%.4f(%.4f) / Integral:%.4f(%.4f)\n",
	 bgH->GetName(),dataH->GetName(), meanR,meanRE, meanRI,meanRIE);
  printf("NormalizeBg: Select scaling type %s\n",useScaleType==kSclWghMean ? "Wgh.Mean":"Integral");
  //
  scl  = useScaleType==kSclWghMean ? meanR  : meanRI;
  sclE = useScaleType==kSclWghMean ? meanRE : meanRIE;
  //
  // rescaled bg
  char buff[1000];
  sprintf(buff,"%s_bgNorm",bgH->GetName());
  bgH = (TH1*)bgH->Clone(buff);
  sprintf(buff,"%s bgNorm%d %.4f+-%.4f",bgH->GetName(),useScaleType,scl,sclE);
  TH1* dumH = (TH1*)bgH->Clone("dummySCL$"); dumH->Reset();
  for (int i=1;i<=nbtot;i++) {
    dumH->SetBinContent(i,scl);
    dumH->SetBinError(i,sclE);
  }
  bgH->Multiply(dumH);
  delete dumH;
  return bgH;
}

//______________________________________________________________________
TObject* FindObject(int bin, const char* nameH, const TList* lst, Bool_t normPerEvent)
{
  // get histo, optionally normalizing it per processed event
  if (!lst) {printf("FindObject %s: No list provided\n",nameH); exit(1);}
  int nent = lst->GetEntries();
  //
  char buff[200];
  if (bin>=0) sprintf(buff,"b%d_%s",bin,nameH);
  else  sprintf(buff,"%s",nameH);
  TString nm;
  TObject *hst = 0;
  for (int i=nent;i--;) {
    nm = lst->At(i)->GetName();
    if (nm.EndsWith(buff)) {hst = lst->At(i); break;}
  }
  if (!hst) {printf("FindObject: No bin %d %s histo in list %s\n",bin,nameH,lst->GetName()); exit(1);}
  if (!normPerEvent || hst->TestBit(kBitNormPerEvent)) return hst; // already normalized
  TString nameHS = nameH;
  if (nameHS==kHStatName) return hst;                              // never scale stat. histo
  //
  TH1* hstat = (TH1*)FindObject(-1,kHStatName,lst,kFALSE);
  double nrm = hstat->GetBinContent(kBinEntries + kEvProcInj+bin*kEntriesPerBin);
  //  double nrm = hstat->GetBinContent(kBinEntries + kEvProcData+bin*kEntriesPerBin); // HACK
  if (nrm<1) {printf("FindObject %s: Anomaluous %d number of events processed in bin %d of list %p\n",
		     buff,int(nrm),bin,lst); return 0;}
  //
  if      (hst->InheritsFrom(TH1::Class())) ((TH1*)hst)->Scale(1./nrm);
  else if (hst->InheritsFrom(THnSparse::Class())) {
    THnSparse* spr = (THnSparse*) hst;
    spr->Sumw2();
    int coord[3] = {0,0,0};
    for (Long64_t i = 0; i < spr->GetNbins(); ++i) {
      // Get the content of the bin from the current histogram
      Double_t v = spr->GetBinContent(i, coord);
      spr->SetBinContent(coord, v/nrm);
      spr->SetBinError(coord,TMath::Sqrt(v)/nrm);
    }    
  }
  //
  hst->SetBit(kBitNormPerEvent);
  return hst;
}

//______________________________________________________________________
TList* LoadList(const char* flName, const char* addPref, const char* nameL)
{
  // load list with histos
  TString nms = flName;
  gSystem->ExpandPathName(nms);
  TFile* fl = TFile::Open(nms.Data());
  if (!fl) {printf("LoadList: No file %s\n",nms.Data()); exit(1);}
  TList* lst = (TList*)fl->Get(nameL);
  if (!lst) {printf("LoadList: No list %s in file %s\n",nameL,nms.Data()); exit(1);}
  lst->SetName(flName);
  //
  int nEnt = lst->GetSize();
  TString nm;
  for (int i=0;i<nEnt;i++) {
    TNamed* ob = (TNamed*)lst->At(i);
    nm = addPref;
    nm += ob->GetName();
    ob->SetName(nm.Data());
  }
  //
  return lst;
}

//____________________________________________________________________________
void GetRatE(double x,double xe, double y,double ye, double &rat, double &rate)
{
  rat = 0; rate = 0;
  if (TMath::Abs(y)<1e-16 || TMath::Abs(x)<1e-16) return;
  rat = x/y;
  rate = rat*TMath::Sqrt( xe*xe/(x*x) + ye*ye/(y*y));
}

//____________________________________________________________________________
void Integrate(TH1* hist, double xmn,double xmx, double &val, double& err)
{
  // integrate 1d histo within given limits
  TAxis* xax = hist->GetXaxis();
  int bmn = xax->FindBin(xmn+kEps); if (bmn<1) bmn = 0; // include 
  int bmx = xax->FindBin(xmx-kEps);
  val = hist->IntegralAndError(bmn,bmx,err);
  // is this histo with symmetric axis ? then integrate also negative half axis
  if (TMath::Abs( xax->GetXmin() + xax->GetXmax() )<1e-6) {
    bmn = xax->FindBin(-xmx+kEps); 
    bmx = xax->FindBin(-xmn-kEps); 
    double errn;
    val += hist->IntegralAndError(bmn,bmx,errn);
    err = TMath::Sqrt(err*err + errn*errn);
  }
}


//____________________________________________________________________________
const char* HName(const char* prefix,const char* htype)
{
  // compose the name of histo in the clist
  static TString strh;
  strh = "Tr"; strh += prefix; strh += "_"; strh += htype;
  return strh.Data();
}

//____________________________________________________________________________
Int_t CheckStat(const TList* lst, const char* dtType)
{
  // check if needed bg was generated
  TH1* hstat = (TH1*)FindObject(-1,kHStatName,lst);
  TString dts = dtType;
  if (dts=="Data") return int( hstat->GetBinContent(kEvProcData) );
  if (dts=="Mix")  return int( hstat->GetBinContent(kEvProcMix) );
  if (dts=="Inj")  return int( hstat->GetBinContent(kEvProcInj) );
  if (dts=="Rot")  return int( hstat->GetBinContent(kEvProcRot) );
  printf("Unknown process %s statistics is checked. Alowed: Data,Mix,Inj,Rot",dtType);
  return 0;
}


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