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"
//
//
#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 = 0.06;     // cut in dphi-bent used to extract the signal, extracted from stat histo
double kWDistSgCut = 1.5;        // 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};

// histograms to be used for bg nomalization for each of NormShapes used
const char* kNormShapeH[kNormShapes] = {
  "EtaDist",                // Weighted distance vs Eta
  "EtaDPhiS"                // Dphi-bent vs distance
}; 

const char* figDir = "fig161110";
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
Double_t useEtaCut    = 1.;                // cut on eta
Double_t useZvMin     = -5.;                // cut on Z vertex
Double_t useZvMax     =  5.;                // cut on Z vertex
Int_t    useBinGrEta  = -1;                // for bg fits group eta bins
Int_t    useBinGrZv   = -1;                // for bg fits group Zv bins

enum {kBitNormPerEvent=BIT(14)};
  // bins for saved parameters in the hStat histo
enum {kDummyBin,
      kEvTot,       // events read
      kEvProcData,  // events with data mult.object (ESD or reco)
      kEvProcInj,   // events Injected
      kEvProcRot,   // events Rotated
      kEvProcMix,   // events Mixed
      //
      kDPhi,        // dphi window
      kDTht,        // dtheta window
      kNStd,        // N.standard deviations to keep
      kPhiShift,    // bending shift
      kThtS2,       // is dtheta scaled by 1/sin^2
      kPhiOvl,      // overlap params
      kZEtaOvl,     // overlap params
      kNoOvl,       // flag that overlap are suppressed
      //
      kPhiRot,      // rotation phi
      kInjScl,      // injection scaling
      kEtaCut,      // eta cut
      kZVMin,       // min ZVertex to process
      kZVMax,       // max ZVertex to process
      kTrcMin,      // min mult to process
      kTrcMax,      // max mult to process
      //
      kOneUnit=49,  // just 1 to track mergings
      kNWorkers=50, // n workers
      kNStatBins
};


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

void    CorrectSpectra(const char* flNameData, const char* flNameMC,const char* unique="");
void    PrepareHistos(TList* lst, Bool_t isMC, TObjArray* outArray);
void    ProcessHistos(TObjArray* outArray);
TH1*    NormalizeBg(TH1* dataH, TH1* bgH, double &scl, double &scle);
TObject* FindObject(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 ProjDZE(THnSparseF* hrawd, THnSparseF* hgenb, THnSparseF* hmcComb, TObjArray* res, int bstep0=-1,int bstep1=-1);

void PlotResults();
void PlotDNDEta();
void PlotDist();
void PlotAlphaBeta();
void PlotSpecies();

TList *listDt=0, *listMC=0;
TObjArray resArr;
char outStr[1000];
char outTitle[1000];
TString uniqueName="";

void CorrectSpectra(const char* flNameData, const char* flNameMC, const char* uniqueNm)
{
  //
  uniqueName = uniqueNm;
  listDt = LoadList(flNameData,"dt_");
  listMC = LoadList(flNameMC,"mc_");
  //
  resArr.Clear();
  PrepareHistos(listMC, kTRUE,  &resArr);
  PrepareHistos(listDt, kFALSE, &resArr);
  //
  ProcessHistos(&resArr); 
  //
  sprintf(outStr,"CutEta%.1f_Zv%.1f_%.1f_bg%s_Shape_%s_mcLB%d_cutSig%.1f_cutBg%.1f",useEtaCut,useZvMin,useZvMax,useBgType.Data(),
	  useShapeType==kNormShapeDist ? "wdst":"dphi", 
	  useMCLB,
	  useShapeType==kNormShapeDist ? kWDistSgCut:kdPhiSgCut,
	  useShapeType==kNormShapeDist ? kWDistBgTailMin:kdPhiBgTailMin);
  sprintf(outTitle,"%s, |#eta|<%.1f, %.1f<Z_{V}<%.1f,  Bg.:%s, UseMCLB=%d, CutVar:%s, |sig|<%.2f, %.2f<|bg.nrm|<%.2f",
	  uniqueName.Data(),
	  useEtaCut,useZvMin,useZvMax,useBgType.Data(),
	  useMCLB,
	  useShapeType==kNormShapeDist ? "#Delta":"#Delta#varphi-#delta_{#varphi}",
	  useShapeType==kNormShapeDist ? kWDistSgCut:kdPhiSgCut,
	  useShapeType==kNormShapeDist ? kWDistBgTailMin : kdPhiBgTailMin,
	  useShapeType==kNormShapeDist ? kWDistBgTailMax : kdPhiBgTailMax	  
	  );
  PlotResults();
}

//_____________________________________________________________________
void PrepareHistos(TList* lst, Bool_t isMC, TObjArray* outArray)
{
  // params:
  //
  int shift = isMC ? kMCShift : 0;
  //
  const char* xxZvEta;
  if (useShapeType==kNormShapeDist) xxZvEta = "DistZvEta";
  else                              xxZvEta = "DistZvDPhiS";

  printf("PrepareBg  : (%4s) of type %s from %s with shape %d\n",isMC?" MC ":"Data",useBgType.Data(),lst->GetName(),useShapeType);
  if (!CheckStat(lst,useBgType.Data())) {printf("Bg of type %s is absent in list %s\n",useBgType.Data(),lst->GetName()); return;}
  //
  THnSparseF* hD = (THnSparseF*) FindObject(HName("Data",xxZvEta),lst);
  THnSparseF* hB = (THnSparseF*) FindObject(HName(useBgType.Data(),xxZvEta),lst);
  //
  // special feature: use MC Labels bg as a shape instead of generated bg
  if (useMCLB/* && !isMC*/) {
    TString nm  = hB->GetName();   nm  += "_MCLB";
    TString tit = hB->GetTitle();  tit += "_MCLB";
    THnSparseF* hBMCLB = (THnSparseF*) FindObject(HName("Comb",xxZvEta),listMC)->Clone(nm.Data());
    hBMCLB->SetTitle(tit.Data());
    hB = hBMCLB;
  }
  THnSparseF* hBmc = 0;
  if (isMC) hBmc = (THnSparseF*) FindObject(HName("Comb",xxZvEta),lst);
  //
  ProjDZE(hD,hB,hBmc, outArray, useBinGrEta, useBinGrZv);
  //
  if (!isMC) return;
  //
  // prepare MC primary signal histo
  TH2F* mcPrim = (TH2F*)FindObject( "zvEtaPrimMC", lst );
  mcPrim = (TH2F*) mcPrim->Clone("mcTrueSignal");
  CropHisto(mcPrim,-useEtaCut,useEtaCut,useZvMin,useZvMax);
  outArray->AddAtAndExpand(mcPrim, kMCPrim + shift);
  //
}

//_____________________________________________________________________
void ProcessHistos(TObjArray* outArray) 
{
  //
  // build alpha matrix
  TH2* halp = (TH2*)outArray->At(kMCShift + kMCPrim);
  halp = (TH2*) halp->Clone("Alpha");
  halp->SetTitle("#alpha");
  halp->Divide( (TH2*)outArray->At(kMCShift + k1MBeta) );
  halp->Divide( (TH2*)outArray->At(kMCShift + kRawDtCut) );
  halp->SetMinimum(1.5);
  halp->SetMaximum(4.);
  outArray->AddAtAndExpand(halp, kAlpha);
  //
  // build alpha matrix with MC labels bg
  TH2* halpMC = (TH2*)outArray->At(kMCShift + kMCPrim);
  halpMC = (TH2*) halpMC->Clone("AlphaMC");
  halpMC->SetTitle("#alpha MC labels");
  halpMC->Divide( (TH2*)outArray->At(kMCShift + k1MBetaMC) );
  halpMC->Divide( (TH2*)outArray->At(kMCShift + kRawDtCut) );
  halpMC->SetMinimum(1.5);
  halpMC->SetMaximum(4.);
  outArray->AddAtAndExpand(halpMC, kAlphaMC);
  //
  // build corrected signal
  TH2* hsigCorr = (TH2*)outArray->At(kSignalEst);
  hsigCorr = (TH2*) hsigCorr->Clone("SignalEstCorr");
  hsigCorr->SetTitle("Corrected Signal");
  hsigCorr->Multiply( halp );
  outArray->AddAtAndExpand(hsigCorr, kSigCorr);
  //
}

TCanvas *canvFin=0;
TCanvas *canvAlp=0;
TCanvas *canvBet=0;
TCanvas* canvDst=0;
TCanvas* canvSpec=0;

void PlotResults() 
{
  PlotDist();
  PlotAlphaBeta();
  PlotSpecies();
  PlotDNDEta();

}

void PlotDNDEta()
{
  //
  TObjArray *res = &resArr;
  char buff[1000];
  // eta range
  double plEta = useEtaCut*1.1;
  gStyle->SetOptFit(0);
  gStyle->SetOptStat(0);
  gStyle->SetOptTitle(0);
  double mn = 1e6,mx = -1e6;
  canvFin = new TCanvas("canvFin", "canvFin",0,50,700,550);
  canvFin->SetLeftMargin(0.15);
  //  canvFin->ToggleEventStatus();
  //
  // corrected data
  TH1* hsigCorr = ((TH2F*)res->At(kSigCorr))->ProjectionX("DataCorrSignal");
  SetHStyle(hsigCorr,kRed,20,1.0);
  hsigCorr->GetXaxis()->SetRangeUser(-plEta+kEps,plEta-kEps);
  hsigCorr->Scale(1./hsigCorr->GetBinWidth(1));
  hsigCorr->Draw();
  mx = TMath::Max(mx, hsigCorr->GetMaximum());
  mn = TMath::Min(mn, hsigCorr->GetMinimum());
  TF1* pl0 = new TF1("pl0","pol0");
  pl0->SetParameter(0,hsigCorr->GetMinimum());
  hsigCorr->Fit(pl0,"q0","",-0.5,.5);
  double fval = pl0->GetParameter(0);
  double ferr = pl0->GetParError(0);
  char ftres[1000];
  sprintf(ftres,"dN/d#eta_{|#eta|<0.5} = %d #pm %d",int(fval),int(ferr));
  printf("dN/d#eta_{|#eta|<0.5} = %.2f  %.2f\n",fval,ferr);
  TLatex *txfit = new TLatex(-0.2,hsigCorr->GetMinimum()*0.9, ftres);
  txfit->SetTextSize(0.04);
  txfit->Draw();
  //
  // raw data
  TH1* hraw = ((TH2F*)res->At(kRawDtCut))->ProjectionX("DataRaw");
  SetHStyle(hraw,kRed,21,1.0);
  hraw->GetXaxis()->SetRangeUser(-plEta,plEta);
  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(kSignalEst))->ProjectionX("DataRawSub");
  SetHStyle(hraws,kRed,23,1.0);
  hraws->GetXaxis()->SetRangeUser(-plEta,plEta);
  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(kBgEst))->ProjectionX("BgEst");
  SetHStyle(hbg,kMagenta,22,1.0);
  hbg->GetXaxis()->SetRangeUser(-plEta,plEta);
  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(kRawDtCut+kMCShift))->ProjectionX("DataRawMC");
  SetHStyle(hrawMC,kBlue,24,1.0);
  hrawMC->GetXaxis()->SetRangeUser(-plEta,plEta);
  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(kSignalEst+kMCShift))->ProjectionX("DataRawSubMC");
  SetHStyle(hrawsMC,kBlue,26,1.0);
  hrawsMC->GetXaxis()->SetRangeUser(-plEta,plEta);
  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(kSignalEstMC+kMCShift))->ProjectionX("DataRawSubMCLB");
  SetHStyle(hrawsMCLB,kGreen+2,30,1.0);
  hrawsMCLB->GetXaxis()->SetRangeUser(-plEta,plEta);
  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(kBgEst+kMCShift))->ProjectionX("BgEstMC");
  SetHStyle(hbgMCEst,kBlue,26,1.0);
  hbgMCEst->GetXaxis()->SetRangeUser(-plEta,plEta);
  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(kBgMC+kMCShift))->ProjectionX("BgMC");
  SetHStyle(hbgMC,kGreen+2,25,1.0);
  hbgMC->GetXaxis()->SetRangeUser(-plEta,plEta);
  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();
  canvFin->cd();
  AddLabel(outTitle,0.1,0.97, kBlack,0.025);
  sprintf(buff,"%s/%sdNdEta_%s",figDir,uniqueName.Data(),outStr);
  SaveCanvas(canvFin,buff,"cg");
  //
}
//
void PlotAlphaBeta() 
{
  char buff[1000];
  gStyle->SetOptFit(0);
  gStyle->SetOptStat(0);
  gStyle->SetOptTitle(0);
  TObjArray* res = &resArr;
  //------------------------------------------------------
  canvBet = new TCanvas("canvBet","canvBet",10,10,1000,400);
  canvBet->Divide(3,1,0.01,0.06);
  canvBet->cd(1);
  TH1* dtBet = (TH1*)res->At(k1MBeta);
  TH1* mcBet = (TH1*)res->At(k1MBeta+kMCShift);
  TH1* mcBetLB = (TH1*)res->At(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));
  //
  canvBet->cd(1);
  gPad->SetRightMargin(0.15);
  dtBet->Draw("colz");
  AddLabel("#beta Data",0.2,0.95,kBlack,0.05);
  gPad->Modified();
  dtBet->GetYaxis()->SetTitleOffset(1.4);
  TPaletteAxis *p = (TPaletteAxis*)dtBet->FindObject("palette");
  if (p) p->SetX1NDC(0.85);
  canvBet->cd(2);
  gPad->SetRightMargin(0.15);
  mcBet->Draw("colz");
  AddLabel("#beta MC (bckg.estimated)",0.2,0.95,kBlack,0.05);
  gPad->Modified();
  mcBet->GetYaxis()->SetTitleOffset(1.4);
  p = (TPaletteAxis*)mcBet->FindObject("palette");
  if (p) p->SetX1NDC(0.85);
  canvBet->cd(3);
  gPad->SetRightMargin(0.15);
  mcBetLB->Draw("colz");
  AddLabel("#beta MC (bckg.from MC labels)",0.2,0.95,kBlack,0.05);
  gPad->Modified();
  mcBetLB->GetYaxis()->SetTitleOffset(1.4);
  p = (TPaletteAxis*)mcBetLB->FindObject("palette");
  if (p) p->SetX1NDC(0.85);
  //
  canvBet->cd();
  AddLabel(outTitle,0.1,0.97, kBlack, 0.025);
  //
  sprintf(buff,"%s/%sBeta_%s",figDir,uniqueName.Data(),outStr);
  SaveCanvas(canvBet,buff,"cg");

  //------------------------------------------------------
  canvAlp = new TCanvas("canvAlp","canvAlp",10,10,900,400);
  canvAlp->Divide(2,1,0.01,0.06);
  canvAlp->cd(1);
  TH1* dtAlp = (TH1*)res->At(kAlpha);
  TH1* mcAlp = (TH1*)res->At(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));
  //
  canvAlp->cd(1);
  gPad->SetRightMargin(0.15);
  dtAlp->Draw("colz");
  AddLabel("#alpha (bckg.estimated)",0.2,0.95,kBlack,0.05);
  gPad->Modified();
  dtAlp->GetYaxis()->SetTitleOffset(1.4);
  TPaletteAxis *pa = (TPaletteAxis*)dtBet->FindObject("palette");
  if (pa) pa->SetX1NDC(0.85);
  canvAlp->cd(2);
  gPad->SetRightMargin(0.15);
  mcAlp->Draw("colz");
  AddLabel("#alpha (bckg.from MC labels)",0.2,0.95,kBlack,0.05);
  gPad->Modified();
  mcAlp->GetYaxis()->SetTitleOffset(1.4);
  pa = (TPaletteAxis*)mcBet->FindObject("palette");
  if (pa) pa->SetX1NDC(0.85);
  gPad->Modified();
  canvAlp->cd();
  AddLabel(outTitle,0.1,0.97, kBlack, 0.025);
  //
  sprintf(buff,"%s/%sAlpha_%s",figDir,uniqueName.Data(),outStr);
  SaveCanvas(canvAlp,buff,"cg");
  
}

void PlotSpecies() 
{
  char buff[1000];
  gStyle->SetOptFit(0);
  gStyle->SetOptStat(0);
  gStyle->SetOptTitle(0);
  //------------------------------------------------------
  TH2F* hSpecPrim  = (TH2F*)FindObject( "pdgPrim", listMC,kFALSE);
  TH2F* hSpecSec   = (TH2F*)FindObject( "pdgSec", listMC,kFALSE);
  TH2F* hSpecPrimP = (TH2F*)FindObject( "pdgPrimPar", listMC,kFALSE);
  TH2F* hSpecSecP  = (TH2F*)FindObject( "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);


  canvSpec = new TCanvas("canvSpec","canvSpec",10,10,1100,800);
  canvSpec->Divide(1,2,0.01,0.01);
  canvSpec->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();
  //
  canvSpec->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();
  //
  canvSpec->cd(1);
  AddLabel(outTitle,0.1,0.97, kBlack, 0.025);
  canvSpec->cd();
  //
  sprintf(buff,"%s/%sSpecies_%s",figDir,uniqueName.Data(),outStr);
  SaveCanvas(canvSpec,buff,"cg");
}

void PlotDist()
{
  TObjArray* res = &resArr;
  char buff[1000];
  canvDst = new TCanvas("canvDst","canvDst",10,10,700,500);
  TH1* mcdst = (TH1*)res->At(kDataDist+kMCShift);
  TH1* mcdstbg = (TH1*)res->At(kBgDist+kMCShift);
  TH1* mcdstbgLB = (TH1*)res->At(kBgMCDist+kMCShift);
  TH1* dtdst = (TH1*)res->At(kDataDist);
  TH1* dtdstbg = (TH1*)res->At(kBgDist);
  //
  TH2* mcDstZN     = (TH2*)FindObject(useShapeType==kNormShapeDist  ?  "TrData_ZvDist":"TrData_ZvDPhiS", listMC );
  TH2* mcDstZSec   = (TH2*)FindObject(useShapeType==kNormShapeDist  ?  "TrSec_ZvDist":"TrSec_ZvDPhiS", listMC );
  TH2* mcDstZCombU = (TH2*)FindObject(useShapeType==kNormShapeDist  ?  "TrCombU_ZvDist":"TrCombU_ZvDPhiS", listMC );
  TH2* mcDstZCombC = (TH2*)FindObject(useShapeType==kNormShapeDist  ?  "TrComb_ZvDist":"TrComb_ZvDPhiS", listMC );
  //
  mcDstZN->GetXaxis()->SetRangeUser(useZvMin+kEps,useZvMax-kEps);
  mcDstZSec->GetXaxis()->SetRangeUser(useZvMin+kEps,useZvMax-kEps);
  mcDstZCombU->GetXaxis()->SetRangeUser(useZvMin+kEps,useZvMax-kEps);
  mcDstZCombC->GetXaxis()->SetRangeUser(useZvMin+kEps,useZvMax-kEps);
  //
  TH1* mcDstN  = mcDstZN->ProjectionY("mcDstN");
  TH1* mcDstSec  = mcDstZSec->ProjectionY("mcDstSec");
  TH1* mcDstCombU = mcDstZCombU->ProjectionY("mcDstCombU");
  TH1* mcDstCombC = mcDstZCombC->ProjectionY("mcDstCombC");
  //
  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();
  //
  canvDst->cd();
  AddLabel(outTitle,0.1,0.97, kBlack, 0.025);
  //
  sprintf(buff,"%s/%sDst_%s",figDir,uniqueName.Data(),outStr);
  SaveCanvas(canvDst,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(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();
  TString nm;
  TObject *hst = 0;
  for (int i=nent;i--;) {
    nm = lst->At(i)->GetName();
    if (nm.EndsWith(nameH)) {hst = lst->At(i); break;}
  }
  if (!hst) {printf("FindObject: No %s histo in list %s\n",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(kHStatName,lst,kFALSE);
  double nrm = hstat->GetBinContent(kEvProcData);
  if (nrm<1) {printf("FindObject: Anomaluous %d number of events processed in list %p\n",int(nrm),lst); exit(1);}
  //
  // account for eventual cut in Z
  TH1* hzv = (TH1*)FindObject("zv",lst,kFALSE);
  int nbz = hzv->GetNbinsX();
  double zvTot = hzv->Integral(1,nbz);
  int zb0 = hzv->FindBin( useZvMin+kEps); if (zb0<1)   zb0 = 1;
  int zb1 = hzv->FindBin( useZvMax-kEps); if (zb1>nbz) zb1 = nbz;
  double zvSel = hzv->Integral(zb0,zb1);
  if (zvTot<1 || zvSel<1) {printf("No statistics: NzvTot: %.1f NzvSel:%.f\n",zvTot,zvSel); return 0;}
  else printf("%f fraction of selected events is used with current Zv cut %.1f:%.1f\n",zvSel/zvTot,useZvMin,useZvMax);
  nrm *= zvSel/zvTot;
  //
  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(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 ProjDZE(THnSparseF* hrawd, THnSparseF* hgenb, THnSparseF* hmcComb, TObjArray* res, int bStepEta,int bStepZv)
{
  // project 3d histo of Dist vs Zv vs Eta to Zv vs Eta with all cuts
  int shift = hmcComb ? kMCShift : 0; // is this mc?
  //
  // determine boundaries for zv and eta cuts
  //
  double cutDstMin,cutDstMax;
  double cutBgMin,cutBgMax;
  double cutSgMin,cutSgMax;
  if (useShapeType==kNormShapeDist) {
    cutDstMin = 0;
    cutDstMax = kWDistBgTailMax;
    //
    cutBgMin = kWDistBgTailMin;
    cutBgMax = kWDistBgTailMax;
    //
    cutSgMin = 0;
    cutSgMax = kWDistSgCut;
  }
  else {
    cutDstMin = -kdPhiBgTailMax;
    cutDstMax =  kdPhiBgTailMax;    
    //
    cutBgMin =  kdPhiBgTailMin;
    cutBgMax =  kdPhiBgTailMax;
    //
    cutSgMin =  0;
    cutSgMax =  kdPhiSgCut;
  }
  //
  int bn0[3] = {0}; // 1st bin to count
  int bn1[3] = {0}; // last bin to count
  // eta 
  TAxis* axEta = hrawd->GetAxis(0);
  bn0[0] = axEta->FindBin(-useEtaCut+kEps);
  bn1[0] = axEta->FindBin( useEtaCut-kEps);
  // Zv
  TAxis* axZv = hrawd->GetAxis(1);
  bn0[1] = axZv->FindBin( useZvMin+kEps);
  bn1[1] = axZv->FindBin( useZvMax-kEps);
  // W.dist
  TAxis* axDst = hrawd->GetAxis(2);
  bn0[2] = axDst->FindBin( cutDstMin + kEps);
  bn1[2] = axDst->FindBin( cutDstMax - kEps);
  //
  //
  int nb[3] = { bn1[0]-bn0[0]+1, bn1[1]-bn0[1]+1, bn1[2]-bn0[2]+1};  // number of bins to count
  int nbTot[3] = {axEta->GetNbins(), axZv->GetNbins(), axDst->GetNbins() }; // total bins
  //
  if (bStepEta<1 || bStepEta>nb[0]) bStepEta = nb[0];
  if (bStepZv<1  || bStepEta>nb[1]) bStepZv  = nb[1];
  //
  for (int i=3;i--;) { // set default axis range
    hrawd->GetAxis(i)->SetRange(1,nbTot[i]);
    hgenb->GetAxis(i)->SetRange(1,nbTot[i]);
    if (hmcComb) hmcComb->GetAxis(i)->SetRange(1,nbTot[i]);
  }
  //
  char grpTit[100];
  sprintf(grpTit,"grp_eta%d_zv%d",bStepEta,bStepZv);
  //
  TString pref = hmcComb ? "mc" : "dt";
  //
  // "Data" histo with cut on tails where we look for signal
  hrawd->GetAxis(2)->SetRangeUser(cutDstMin+kEps,cutDstMax-kEps);
  TH2* hRawDtCut = hrawd->Projection(1,0,"e");
  hrawd->GetAxis(2)->SetRange(bn0[2],bn1[2]);
  hRawDtCut->SetName(pref+"_RawWithCut");
  hRawDtCut->SetTitle(pref+" Raw with cut on tracklets");
  res->AddAtAndExpand(hRawDtCut, kRawDtCut+shift);
  //
  // "Data - Est.Bg" histo with cut on tails where we look for signal
  hrawd->GetAxis(2)->SetRangeUser(cutDstMin+kEps,cutDstMax-kEps);
  TH2* hSignalEst = hrawd->Projection(1,0,"e");
  hrawd->GetAxis(2)->SetRange(bn0[2],bn1[2]);
  hSignalEst->SetName(pref+"_SignalCut_"+grpTit);
  hSignalEst->SetTitle(pref+" Signal (raw-bg) with cut on tracklets "+grpTit);
  res->AddAtAndExpand(hSignalEst, kSignalEst+shift);
  //
  // "Data - MC.Bg" histo with cut on tails where we look for signal
  TH2* hSignalEstMC = 0;
  if (hmcComb) {
    hrawd->GetAxis(2)->SetRangeUser(cutDstMin+kEps,cutDstMax-kEps);
    hSignalEstMC  = hrawd->Projection(1,0,"e");
    hrawd->GetAxis(2)->SetRange(bn0[2],bn1[2]);
    hSignalEstMC->SetName(pref+"_SignalCut_bgMCLabels_"+grpTit);
    hSignalEstMC->SetTitle(pref+" Signal (raw-bg_MCLabels) with cut on tracklets "+grpTit);
    res->AddAtAndExpand(hSignalEstMC, kSignalEstMC+shift);
  }
  //
  // Estimated background in the cut range
  hgenb->GetAxis(2)->SetRangeUser(cutDstMin+kEps,cutDstMax-kEps);
  TH2* hBgEst = hgenb->Projection(1,0,"e");
  hgenb->GetAxis(2)->SetRange(bn0[2],bn1[2]);
  hBgEst->SetName(pref+"_BgEst_"+grpTit);
  hBgEst->SetTitle(pref+" Estimated Bg "+grpTit);
  res->AddAtAndExpand(hBgEst, kBgEst+shift);
  //
  // 1-beta for "data" = (Data_cut - Bg_cut) / Data_cut
  TH2* h1mBeta     = hrawd->Projection(1,0,"e"); 
  h1mBeta->Reset();
  h1mBeta->SetName(pref+"_h1mBeta_"+grpTit);
  h1mBeta->SetTitle(pref+" 1-#beta with gen.bg. "+grpTit);
  res->AddAtAndExpand(h1mBeta, k1MBeta+shift);
  //
  // If MC labels info is provided
  TH2* h1mBetaMC = 0;  // 1-beta for MC with bg from labels
  TH2* hBgMC = 0;      // bg from MC labels
  if (hmcComb) {
    hmcComb->GetAxis(2)->SetRangeUser(cutDstMin+kEps,cutDstMax-kEps);
    h1mBetaMC = hmcComb->Projection(1,0,"e");
    h1mBetaMC->SetName(pref+"_h1mBetaMC");
    h1mBetaMC->SetTitle(pref+" 1-#beta with bg. from MC labels");
    h1mBetaMC->Divide(hRawDtCut);
    res->AddAtAndExpand(h1mBetaMC, k1MBetaMC+shift);
    for (int ib0=1;ib0<=nbTot[0];ib0++) 
      for (int ib1=1;ib1<=nbTot[1];ib1++) 
	h1mBetaMC->SetBinContent(ib0,ib1, 1.- h1mBetaMC->GetBinContent(ib0,ib1)); 
    //
    hBgMC = hmcComb->Projection(1,0,"e");
    hBgMC->SetName(pref+"_Bg_MClab");
    hBgMC->SetTitle(pref+" Bg from MC labels");
    res->AddAtAndExpand(hBgMC, kBgMC+shift);
    //
    // finalize estimated signal with bg from MC labels
    hSignalEstMC->Add(hBgMC,-1);
    //
    hmcComb->GetAxis(2)->SetRange(bn0[2],bn1[2]);
  }
  // 
  // rescaling factors for generated bg 
  TH2* hBgRescFc  = hrawd->Projection(1,0,"e"); hBgRescFc->Reset();
  hBgRescFc->SetName(pref+"_hBgRescFactors_"+grpTit);
  hBgRescFc->SetTitle(pref+" Scale.factor for gen.bg. "+grpTit);
  res->AddAtAndExpand(hBgRescFc, kBgRescFc+shift);
  //
  int nbint = bStepEta*bStepZv;
  float nbinstsq = TMath::Sqrt(nbint);
  hrawd->GetAxis(0)->SetRange(bn0[0],bn1[0]);
  hrawd->GetAxis(1)->SetRange(bn0[1],bn1[1]);
  TH1* hDstDt = hrawd->Projection(2,"e");
  hrawd->GetAxis(0)->SetRange(1,nbTot[0]);
  hrawd->GetAxis(1)->SetRange(1,nbTot[1]);
  hDstDt->SetName(pref+"_DistRaw_"+grpTit);   // "Data" projection on tracklet quality (w.distance) axis to check the tails
  hDstDt->SetTitle(pref+" DistRaw "+grpTit); 
  double nrmDst,dumErr = 0;
  Integrate(hDstDt, cutBgMin,cutBgMax, nrmDst, dumErr);
  hDstDt->Scale(1./nrmDst);
  res->AddAtAndExpand(hDstDt, kDataDist+shift);
  //
  hgenb->GetAxis(0)->SetRange(bn0[0],bn1[0]);
  hgenb->GetAxis(1)->SetRange(bn0[1],bn1[1]);
  TH1* hDstBg = hgenb->Projection(2,"e");  hDstBg->Reset();  
  hgenb->GetAxis(0)->SetRange(1,nbTot[0]);
  hgenb->GetAxis(1)->SetRange(1,nbTot[1]);
  hDstBg->SetName(pref+"_DistBgNorm_"+grpTit);  // Gen.Bg projection on tracklet quality (w.distance) axis to check the tails
  hDstBg->SetTitle(pref+" DistBgNorm "+grpTit);  // Gen.Bg projection on tracklet quality (w.distance) axis to check the tails
  res->AddAtAndExpand(hDstBg, kBgDist+shift);
  TH1* hDstBgMC = 0;
  if (hmcComb) {
    hmcComb->GetAxis(0)->SetRange(bn0[0],bn1[0]);
    hmcComb->GetAxis(1)->SetRange(bn0[1],bn1[1]);
    hDstBgMC = hmcComb->Projection(2,"e");
    hmcComb->GetAxis(0)->SetRange(1,nbTot[0]);
    hmcComb->GetAxis(1)->SetRange(1,nbTot[1]);
    hDstBgMC->SetName(pref+"_DistBgMC");
    hDstBgMC->SetTitle(pref+" Bg. Distance from MC labels");
    hDstBgMC->Scale(1./nrmDst);
    res->AddAtAndExpand(hDstBgMC, kBgMCDist+shift);
  }
  //
  // fill 1-beta matrix
  for (int ib0=bn0[0];ib0<=bn1[0];ib0+=bStepEta) { // eta
    hrawd->GetAxis(0)->SetRange(ib0,ib0+bStepEta-1);
    hgenb->GetAxis(0)->SetRange(ib0,ib0+bStepEta-1);
    for (int ib1=bn0[1];ib1<=bn1[1];ib1+=bStepZv) { // zv
      hrawd->GetAxis(1)->SetRange(ib1,ib1+bStepZv-1);
      hgenb->GetAxis(1)->SetRange(ib1,ib1+bStepZv-1);
      //
      TH1D* dstD = hrawd->Projection(2,"e"); // data "qaulity" for given eta:zv bin
      TH1D* dstB = hgenb->Projection(2,"e"); // data "qaulity" for given eta:zv bin
      double scl,sclE;
      TH1* nrmB = NormalizeBg(dstD,dstB,scl,sclE);  // get rescaling factor for bg. from tails comparison
      double bgVal,bgErr;
      double dtVal,dtErr;
      // integral in the range where we look for signal
      Integrate(nrmB, cutSgMin, cutSgMax, bgVal, bgErr);
      Integrate(dstD, cutSgMin, cutSgMax, dtVal, dtErr);
      double beta,betaErr;
      GetRatE(bgVal,bgErr, dtVal, dtErr,beta,betaErr);
      //    betaErr*=nbinstsq; // ??? RS
      for (int i=ib0;i<ib0+bStepEta;i++) {
	for (int j=ib1;j<ib1+bStepZv;j++) {
	  hBgRescFc->SetBinContent(i,j, scl);
	  hBgRescFc->SetBinError(i,j, sclE);
	}
      }
      hDstBg->Add(nrmB);
      delete dstD;
      delete dstB;
      delete nrmB;
      //
    }
  }
  hDstBg->Scale(1./nrmDst);
  //
  // finalize estimated bg and signal matrices
  hBgEst->Multiply(hBgRescFc);
  hSignalEst->Add(hBgEst,-1);
  //
  // finalize 1-beta
  for (int ib0=bn0[0];ib0<=bn1[0];ib0++) { // eta
    for (int ib1=bn0[1];ib1<=bn1[1];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);
      //
    }
  }
  //
  // crop to needed range
  for (int i=shift;i<kNHistos+shift;i++) {
    TH2* hist = (TH2*)res->At(i);
    if (!hist || !hist->InheritsFrom(TH2::Class())) continue;
    CropHisto(hist, bn0[0],bn1[0], bn0[1],bn1[1]);
  }
  //
  h1mBeta->SetMinimum(0.6);
  h1mBeta->SetMaximum(0.85);
  if (hmcComb) {
    h1mBetaMC->SetMinimum(0.6);
    h1mBetaMC->SetMaximum(0.85);
  }
  //
  // restore
  for (int i=3;i--;) { // set default axis range
    hrawd->GetAxis(i)->SetRange(1,nbTot[i]);
    hgenb->GetAxis(i)->SetRange(1,nbTot[i]);
    if (hmcComb) hmcComb->GetAxis(i)->SetRange(1,nbTot[i]);
  }
  //
}


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