ROOT logo
#include <fstream>
#include <Riostream.h>
#include <TSystem.h>
#include <TMath.h>
#include <TH1F.h>
#include <TF1.h>
#include <TFile.h>
#include <TCanvas.h>
#include <TClonesArray.h>
#include <TStyle.h>
#include <TLegend.h>
#include <TGraphErrors.h>
#include <TGraph.h>
#include <TMultiGraph.h>
#include <TKey.h>
#include <TObjectTable.h>
#include <TDatabasePDG.h>
#include <TMath.h>
#include <TPaveText.h>
#include <TText.h>

#include <AliMultiDimVector.h>
#include "AliHFMassFitter.h"
#include <AliSignificanceCalculator.h>

#include <fstream>

//global variables
Double_t nsigma=3;
Int_t decCh=2;
Int_t fitbtype=5;
Int_t rebin=2;
Double_t sigma=0.0005;
Int_t pdg;
Double_t mass;

Double_t sigmaCut=0.035;//0.03;
Double_t errSgnCut=0.4;//0.35;
Double_t nSigmaMeanCut=4.;//3.;


ofstream outcheck;
ofstream outdetail;

Bool_t Data(TH1F* h,Double_t* rangefit,Bool_t writefit,Double_t& sgn, Double_t& errsgn, Double_t& bkg, Double_t& errbkg, Double_t& sgnf, Double_t& errsgnf, Double_t& sigmafit, Int_t& status);
Bool_t BinCounting(TH1F* h, Double_t* rangefit, Bool_t writefit, Double_t& sgn, Double_t& errsgn, Double_t& bkg, Double_t& errbkg, Double_t& sgnf, Double_t& errsgnf, Int_t& status);
Bool_t MC(TH1F* hs,TH1F* hb, Double_t& sgn, Double_t& errsgn, Double_t& bkg, Double_t& errbkg, Double_t& sgnf, Double_t& errsgnf, Double_t& sigmaused, Int_t& status);

//decCh:
//- 0 = kDplustoKpipi
//- 1 = kD0toKpi
//- 2 = kDStartoKpipi
//- 3 = kDstoKKpi
//- 4 = kD0toKpipipi
//- 5 = kLambdactopKpi

//Note: writefit=kTRUE writes the root files with the fit performed but it also draw all the canvas, so if your computer is not powerfull enough I suggest to run it in batch mode (root -b)

// Method using this code:
// root -b
// .L macros/LoadLibraries
// Loadlibraries()
// .L macros/CharmCutsOptimization
// charmCutsOptimization(/*options*/)

Bool_t charmCutsOptimization(Bool_t isData=kTRUE,TString part="both"/*"A" anti-particle, "P" particle*/,TString centr="no",Bool_t writefit=kTRUE,Int_t minentries=50,Double_t *rangefit=0x0, Bool_t useBinCounting=kTRUE){

  outcheck.open("output.dat",ios::out);
  outdetail.open("discarddetails.dat",ios::out);

  gStyle->SetFrameBorderMode(0);
  gStyle->SetCanvasColor(0);
  gStyle->SetFrameFillColor(0);
  gStyle->SetTitleFillColor(0);
  gStyle->SetStatColor(0);

  //~/Lavoro/PbPb/tagli/SIGAOD33/mar02/cent3070/
  TString filename="AnalysisResults.root",dirname="PWG3_D2H_Significance",listname="coutputSig",mdvlistname="coutputmv";

  TString hnamemass="hMass_",hnamesgn="hSig_",hnamebkg="hBkg_";


  switch (decCh) {
  case 0:
    listname+="Dplus";
    mdvlistname+="Dplus";
    pdg=411;
    break;
  case 1:
    listname+="D0";
    mdvlistname+="D0";
    pdg=421;
    break;
  case 2:
    listname+="Dstar0100";
    mdvlistname+="Dstar0100";
    pdg=413;
    break;
  case 3:
    listname+="Ds";
    mdvlistname+="Ds";
    pdg=431;
    break;
  case 4:
    listname+="D04";
    mdvlistname+="D04";
    pdg=421;
    break;
  case 5:
    listname+="Lc";
    mdvlistname+="Lc";
    pdg=4122;
    break;
  default:
    cout<<decCh<<" is not allowed as decay channel "<<endl;
    return kFALSE;
  }
  mass=TDatabasePDG::Instance()->GetParticle(pdg)->Mass();
  if (decCh==2) mass=(TDatabasePDG::Instance()->GetParticle(pdg)->Mass() - TDatabasePDG::Instance()->GetParticle(421)->Mass()); 

  if(part!="both"){
    listname.Append(part);
    mdvlistname.Append(part);
  }
  if(centr!="no"){
    listname.Append(centr);
    mdvlistname.Append(centr);
  }
  cout<<"Mass = "<<mass<<endl;
  
  Int_t countFitFail=0,countSgnfFail=0,countNoHist=0,countBkgOnly=0;

  outcheck<<"ptbin\tmdvGlobAddr\thistIndex\tSignif\tS\tB"<<endl;
  outdetail<<"ptbin\tmdvGlobAddr\thistIndex\trelErrS\t\tmean_F-mass (mass = "<<mass<<")"<<endl;
  TFile *fin=new TFile(filename.Data());
  if(!fin->IsOpen()){
    cout<<"File "<<filename.Data()<<" not found"<<endl;
    return kFALSE;
  }

  TDirectoryFile *dir=(TDirectoryFile*)fin->GetDirectory(dirname);
  if(!dir){
    cout<<"Directory "<<dirname<<" not found"<<endl;
    return kFALSE;
  }

  TList* histlist= (TList*)dir->Get(listname);
  if(!histlist) {
    cout<<listname<<" doesn't exist"<<endl;
    return kFALSE;
  }

  TList* listamdv= (TList*)dir->Get(mdvlistname);
  if(!listamdv) {
    cout<<mdvlistname<<" doesn't exist"<<endl;
    return kFALSE;
  }

  TH1F* hstat=(TH1F*)histlist->FindObject("fHistNEvents");
  TCanvas *cst=new TCanvas("hstat","Summary of statistics");
  if(hstat) {
    cst->cd();
    cst->SetGrid();
    hstat->Draw("htext0");
    cst->SaveAs("hstat.png");
  }else{
    cout<<"Warning! fHistNEvents not found in "<<listname.Data()<<endl;
  }

  Bool_t isMC=kFALSE;
  TH1F* htestIsMC=(TH1F*)histlist->FindObject("hSig_0");
  if(htestIsMC) isMC=kTRUE;

  Int_t nptbins=listamdv->GetEntries();
  Int_t nhist=(histlist->GetEntries()-1);//-1 because of fHistNevents
  if(isMC) nhist/=4; ///4 because hMass_, hSgn_,hBkg_,hRfl_
  Int_t count=0;
  Int_t *indexes= new Int_t[nhist];
  //initialize indexes[i] to -1
  for(Int_t i=0;i<nhist;i++){
    indexes[i]=-1;
  }

  TFile* fout=new TFile(Form("outputSignifMaxim.root"),"recreate");

  TH1F** hSigma=new TH1F*[nptbins];
  TH1F* hstatus=new TH1F("hstatus","Flag status",6,-0.5,5.5);
  hstatus->GetXaxis()->SetBinLabel(1,"fit fail");
  hstatus->GetXaxis()->SetBinLabel(2,"fit ok and good results");
  hstatus->GetXaxis()->SetBinLabel(3,"quality requirements not satisfied");
  hstatus->GetXaxis()->SetBinLabel(4,"only bkg fit ok");
  hstatus->GetXaxis()->SetBinLabel(5,"negative signif");
  hstatus->GetXaxis()->SetBinLabel(6,Form("< %d entries",minentries));

  //Check wheter histograms are filled
  if(isData){
    for(Int_t i=0;i<nhist;i++){
      TString name=Form("%s%d",hnamemass.Data(),i);
      TH1F* h=(TH1F*)histlist->FindObject(name.Data());

      if(!h){
	cout<<name<<" not found"<<endl;
	continue;
      }

      if(h->GetEntries()>minentries){
	//cout<<"Entries = "<<h->GetEntries()<<endl;
	if (h->Integral() > minentries){
	  cout<<i<<") Integral = "<<h->Integral()<<endl;
	  indexes[i]=i;
	  count++;
	}
      }
    }
  

    cout<<"There are "<<count<<" histogram with more than "<<minentries<<" entries"<<endl;
    if(count==0) {
      cout<<"No histogram to draw..."<<endl;
      return kFALSE;
    }
  }
  //create multidimvectors

  //for(Int_t i=0;i<1;i++){
  for(Int_t i=0;i<nptbins;i++){

    //multidimvectors for signal
    AliMultiDimVector *mdvS=(AliMultiDimVector*)listamdv->FindObject(Form("multiDimVectorPtBin%d",i));
    TString name=mdvS->GetName(),nameErr="err",setname="";
    
    setname=Form("S%s",name.Data());
    mdvS->SetName(setname.Data());
    outcheck<<"\n"<<mdvS->GetPtLimit(0)<<" < Pt <"<<mdvS->GetPtLimit(1)<<endl;

    AliMultiDimVector *mdvSerr=(AliMultiDimVector*)mdvS->Clone(setname.Data());
    setname=Form("%sS%s",nameErr.Data(),name.Data());
    mdvSerr->SetName(setname.Data());

    //multidimvectors for background
    setname=Form("B%s",name.Data());
    AliMultiDimVector *mdvB=(AliMultiDimVector*)mdvS->Clone(setname.Data());

    AliMultiDimVector *mdvBerr=(AliMultiDimVector*)mdvS->Clone(setname.Data());
    setname=Form("%sB%s",nameErr.Data(),name.Data());
    mdvBerr->SetName(setname.Data());

    //multidimvectors for significance
    setname=Form("Sgf%s",name.Data());
    AliMultiDimVector *mdvSgnf=(AliMultiDimVector*)mdvS->Clone(setname.Data());

    AliMultiDimVector *mdvSgnferr=(AliMultiDimVector*)mdvS->Clone(setname.Data());
    setname=Form("%sSgf%s",nameErr.Data(),name.Data());
    mdvSgnferr->SetName(setname.Data());

    hSigma[i]=new TH1F(Form("hSigmapt%d",i),Form("Sigma distribution pt bin %d (%.1f < pt < %.1f)",i,mdvSgnf->GetPtLimit(0),mdvSgnf->GetPtLimit(1)), 200,0.,0.05);

    Int_t nhistforptbin=mdvS->GetNTotCells();
    //Int_t nvarsopt=mdvS->GetNVariables();
 
    cout<<"nhistforptbin = "<<nhistforptbin<<endl;

    //loop on all histograms and do AliHFMassFitter
    //for(Int_t ih=0;ih<1;ih++){
    for(Int_t ih=0;ih<nhistforptbin;ih++){
      printf("Analyzing indexes[%d] = %d \n",ih+i*nhistforptbin,indexes[ih+i*nhistforptbin]);
      Int_t status=-1;
      if(isData && indexes[ih+i*nhistforptbin] == -1) {
	status=5;
	mdvSgnferr->SetElement(ih,0);
	mdvS->SetElement(ih,0);
	mdvSerr->SetElement(ih,0);
	mdvB->SetElement(ih,0);
	mdvBerr->SetElement(ih,0);

	continue;
      }
      outcheck<<i<<"\t\t "<<ih<<"\t\t"<<indexes[ih+i*nhistforptbin];
      TString name;
      TH1F* h=0x0;
      TH1F* g=0x0;
      Double_t signif=0, signal=0, background=0, errSignif=0, errSignal=0, errBackground=0,sigmafit=0;

      if(isData){
	name=Form("%s%d",hnamemass.Data(),indexes[ih+i*nhistforptbin]);
	h=(TH1F*)histlist->FindObject(name.Data());
	if(!h)continue;
	if(useBinCounting) {
	  if (h->GetEntries() >= minentries)
	    BinCounting(h,rangefit,writefit,signal,errSignal,background,errBackground,signif,errSignif,status);
	} else 
	  Data(h,rangefit,writefit,signal,errSignal,background,errBackground,signif,errSignif,sigmafit,status);
      }else{
	name=Form("%s%d",hnamesgn.Data(),ih+i*nhistforptbin);
	h=(TH1F*)histlist->FindObject(name.Data());
	if(!h){
	  cout<<name.Data()<<" not found"<<endl;
	  continue;
	}
	name=Form("%s%d",hnamebkg.Data(),ih+i*nhistforptbin);
	g=(TH1F*)histlist->FindObject(name.Data());
	if(!g){
	  cout<<name.Data()<<" not found"<<endl;
	  continue;
	}

	MC(h,g,signal,errSignal,background,errBackground,signif,errSignif,sigmafit,status);

      }

      hstatus->Fill(status);

      if(status==1){
	mdvSgnf->SetElement(ih,signif);
	mdvSgnferr->SetElement(ih,errSignif);
	mdvS->SetElement(ih,signal);
	mdvSerr->SetElement(ih,errSignal);
	mdvB->SetElement(ih,background);
	mdvBerr->SetElement(ih,errBackground);
	hSigma[i]->Fill(sigmafit);
      }else{
	mdvSgnf->SetElement(ih,0);
	mdvSgnferr->SetElement(ih,0);
	mdvS->SetElement(ih,0);
	mdvSerr->SetElement(ih,0);
	mdvB->SetElement(ih,0);
	mdvBerr->SetElement(ih,0);
	if(status==3){
	  mdvB->SetElement(ih,background);
	  mdvBerr->SetElement(ih,errBackground);
	}

      }

    }
  
    fout->cd();
    mdvS->Write();
    mdvB->Write();
    mdvSgnf->Write();
    mdvSerr->Write();
    mdvBerr->Write();
    mdvSgnferr->Write();
    hSigma[i]->Write();

  }
  

  TCanvas *cinfo=new TCanvas("cinfo","Status");
  cinfo->cd();
  cinfo->SetGrid();
  hstatus->Draw("htext0");
  fout->cd();
  hstatus->Write();
  fout->Close();
  outcheck<<"\nSummary:\n - Total number of histograms: "<<nhist<<"\n - "<<count<<" histograms with more than "<<minentries<<" entries; \n - Too few entries in histo "<<countNoHist<<" times;\n - Fit failed "<<countFitFail<<" times \n - no sense Signal/Background/Significance "<<countSgnfFail<<" times\n - only background "<<countBkgOnly<<" times"<<endl;
  outcheck.close();

cout << "test1\n";
  return kTRUE;
}


//this function fit the hMass histograms
//status = 0 -> fit fail
//         1 -> fit ok and good results
//         2 -> quality requirements not satisfied, try to fit with bkg only
//         3 -> only bkg fit ok
//         4 -> negative signif
//         5 -> not enough entries in the hisotgram
Bool_t Data(TH1F* h,Double_t* rangefit,Bool_t writefit, Double_t& sgn, Double_t& errsgn, Double_t& bkg, Double_t& errbkg, Double_t& sgnf, Double_t& errsgnf, Double_t& sigmafit, Int_t& status){
  Int_t nbin=h->GetNbinsX();
  Double_t min=h->GetBinLowEdge(7);
  Double_t max=h->GetBinLowEdge(nbin-5)+h->GetBinWidth(nbin-5);

  if(decCh != 2) min = h->GetBinLowEdge(1);
  else min = TDatabasePDG::Instance()->GetParticle(211)->Mass();
  max=h->GetBinLowEdge(nbin+1);

  if(rangefit) {
    min=rangefit[0];
    max=rangefit[1];
  }

  AliHFMassFitter fitter(h,min, max,rebin,fitbtype);
  fitter.SetInitialGaussianMean(mass);
  fitter.SetInitialGaussianSigma(sigma);

  //if(ih==0) fitter.InitNtuParam(Form("ntuPtbin%d",i));
  // fitter.SetHisto(h);
  // fitter.SetRangeFit(min,max);
  //fitter.SetRangeFit(1.68,2.05);

  //fitter.SetType(fitbtype,0);

  Bool_t ok=fitter.MassFitter(kFALSE);
  if(!ok){
    cout<<"FIT NOT OK!"<<endl;
    //countBkgOnly++;
    //outcheck<<i<<"\t\t "<<ih<<"\t\t"<<indexes[ih+i*nhistforptbin]<<"\t 0\t xxx"<<"\t bkgonly"<<endl;
    outcheck<<"\t 0\t xxx"<<"\t failed"<<endl;
    status=0;
    return kFALSE;
  }else{ //fit ok!

    if(writefit) fitter.WriteCanvas(h->GetName(),"./",nsigma);
    fitter.Signal(nsigma,sgn,errsgn);
    fitter.Background(nsigma,bkg,errbkg);
    Double_t meanfit=fitter.GetMean();
    sigmafit=fitter.GetSigma();
	  

    //if(ok==kTRUE && ( (sigmafit < 0.03) || (sigmafit < 0.04 && mdvS->GetPtLimit(0)>8.)) && sgn > 0 && bkg > 0){
    if(ok==kTRUE && ( (sigmafit < sigmaCut) ) && sgn > 0 && bkg > 0){
      Double_t errmeanfit=fitter.GetMassFunc()->GetParError(fitter.GetNFinalPars()-2);
      fitter.Significance(nsigma,sgnf,errsgnf);
      if(sgnf >0){
	      
	if(errsgn/sgn < errSgnCut && /*TMath::Abs(meanfit-mass)<0.015*/TMath::Abs(meanfit-mass)/errmeanfit < nSigmaMeanCut){
	  //outcheck<<i<<"\t\t "<<ih<<"\t\t"<<indexes[ih+i*nhistforptbin]<<"\t"<<signif<<" +- "<<errSignif<<"\t"<<sgn<<" +- "<<errsgn<<"\t"<<bkg<<" +- "<<errbkg<<endl;
	  outcheck<<"\t\t "<<sgnf<<" +- "<<errsgnf<<"\t"<<sgn<<" +- "<<errsgn<<"\t"<<bkg<<" +- "<<errbkg<<endl;
	  status=1;
	      
	}else{
	  status=2;
	  //outdetail<<i<<"\t\t "<<ih<<"\t\t"<<indexes[ih+i*nhistforptbin]<<"\t"<<errsgn/sgn<<"\t\t "<<(meanfit-mass)/errmeanfit<<endl;
	  outdetail<<"\t\t "<<errsgn/sgn<<"\t\t "<<(meanfit-mass)/errmeanfit<<endl;
	  ok=fitter.RefitWithBkgOnly(kFALSE);
	  if (ok){
	    status=3;
	    //countBkgOnly++;
	    Double_t bkg=0,errbkg=0.;
	    Double_t nsigmarange[2]={mass-nsigma*sigma,mass+nsigma*sigma};
	    fitter.Background(nsigmarange[0],nsigmarange[1],bkg,errbkg); 
	    //outcheck<<i<<"\t\t "<<ih<<"\t\t"<<indexes[ih+i*nhistforptbin]<<"\t 0\t "<<bkg <<"\t bkgonly"<<endl;
	    outcheck<<"\t\t  0\t "<<bkg <<"\t bkgonly"<<endl;
	  }else{
	    //outdetail<<i<<"\t\t "<<ih<<"\t\tnot able to refit with bkg obly"<<endl;
	    outdetail<<"\t\t \t\tnot able to refit with bkg obly"<<endl;
	    status=0;
	    return kFALSE;
	  }
	}//only bkg
      }//check signif>0
      else{ 
	status=4;
	//countSgnfFail++;
	cout<<"Setting to 0 (fitter results meaningless)"<<endl;
	outcheck<<"\t S || B || sgnf negative";

	return kFALSE;
      } 
    } //end fit ok!
  }
  outcheck<<endl;
  return kTRUE; 
}



//this function counts the entries in hSgn and hBgk
Bool_t MC(TH1F* hs,TH1F* hb, Double_t& sgn, Double_t& errsgn, Double_t& bkg, Double_t& errbkg, Double_t& sgnf, Double_t& errsgnf, Double_t& sigmaused, Int_t& status){

  //do we want to use a fixed sigma or take the standard deviation of the signal histogram?
  sigmaused=hs->GetRMS();
  //sigmaused=sigma;

  Double_t nsigmarange[2]={mass-nsigma*sigmaused,mass+nsigma*sigmaused}; 
  cout<<"from "<<nsigmarange[0]<<" to "<<nsigmarange[1]<<endl;

  Int_t binnsigmarange[2]={hs->FindBin(nsigmarange[0]),hs->FindBin(nsigmarange[1])};//for bkg histo it's the same
  cout<<"bins "<<binnsigmarange[0]<<" e "<<binnsigmarange[1]<<endl;

  sgn=hs->Integral(binnsigmarange[0],binnsigmarange[1]);
  errsgn=TMath::Sqrt(sgn);
  bkg=hb->Integral(binnsigmarange[0],binnsigmarange[1]);
  errbkg=TMath::Sqrt(bkg);
  if(sgn+bkg>0.) sgnf=sgn/TMath::Sqrt(sgn+bkg);
  else {
    status=2;
    return kFALSE;
  }
  errsgnf=TMath::Sqrt(sgnf*sgnf/(sgn+bkg)/(sgn+bkg)*(1/4.*errsgn*errsgn+errbkg*errbkg)+sgnf*sgnf/sgn/sgn*errsgn*errsgn);
  status=1;
  return kTRUE; 

}

//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
// par[0], par[1] expo params, par[2], par[3] exclusion range
Bool_t reject = true;
Double_t ExpoBkgWoPeak(Double_t *x, Double_t *par){

  if( reject && x[0]>par[2] && x[0]<par[3] ){
    TF1::RejectPoint();
    return 0;
  }
  return par[0] + TMath::Exp(par[1]*x[0]) ;

}

//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
// par[0], par[1] expo params, par[2], par[3] exclusion range

Double_t PowerBkgWoPeak(Double_t *x, Double_t *par){

  if( reject && x[0]>par[2] && x[0]<par[3] ){
    TF1::RejectPoint();
    return 0;
  }

  Double_t xminusmpi = x[0]-TDatabasePDG::Instance()->GetParticle(211)->Mass();
  return par[0]*TMath::Power(TMath::Abs(xminusmpi),par[1]) ;
}

//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
// par[0], par[1] expo params, par[2], par[3] exclusion range

Double_t PowerExpoBkgWoPeak(Double_t *x, Double_t *par){

  if( reject && x[0]>par[2] && x[0]<par[3] ){
    TF1::RejectPoint();
    return 0;
  }
  Double_t xminusmpi = x[0]-TDatabasePDG::Instance()->GetParticle(211)->Mass();
  return par[0]*TMath::Sqrt(xminusmpi)*TMath::Exp(-1.*par[1]*xminusmpi);
}


//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//this function fit the hMass histograms
//status = 0 -> fit fail
//         1 -> fit ok and good results
//         2 -> negative signif
Bool_t BinCounting(TH1F* h,Double_t* rangefit,Bool_t writefit, Double_t& sgn, Double_t& errsgn, Double_t& bkg, Double_t& errbkg, Double_t& sgnf, Double_t& errsgnf, Int_t& status){


  Double_t min, max;
  Int_t nbin=h->GetNbinsX();
  if(decCh != 2) min = h->GetBinLowEdge(1);
  else min = TDatabasePDG::Instance()->GetParticle(211)->Mass();
  max=h->GetBinLowEdge(nbin+1);

  if(rangefit) {
    min=rangefit[0];
    max=rangefit[1];
  }

  reject = true;
//Bkg fit : exponential = A*exp(B*x) 
  TF1 *fBkgFit;
  if(decCh != 2) fBkgFit = new TF1("fBkgFit",ExpoBkgWoPeak,min,max,4);         
  else {
   if (fitbtype == 5) fBkgFit = new TF1("fBkgFit",PowerExpoBkgWoPeak,min,max,4); //Bkg fit : PowerExpo = A*(x-mpi)^(1/2)*exp(-B*(x-mpi))
   else fBkgFit = new TF1("fBkgFit",PowerBkgWoPeak,min,max,4); //Bkg fit : Power = A*(x-mpi)^B
  }

  fBkgFit->FixParameter(2,mass-nsigma*sigma);
  fBkgFit->FixParameter(3,mass+nsigma*sigma);
  TFitResultPtr r = h->Fit(fBkgFit,"RS+");
  Int_t ok = r;

  if(ok==-1){
    cout<<"FIT NOT OK!"<<endl;
    cout<<"\t 0\t xxx"<<"\t failed"<<endl;
    status=0;
    return kFALSE;
  } 

  reject = false;
  TF1 *fBkgFct;
  if(decCh !=2) fBkgFct = new TF1("fBkgFct",ExpoBkgWoPeak,min,max,4); 
  else {
   if (fitbtype == 5) fBkgFct = new TF1("fBkgFct",PowerExpoBkgWoPeak,min,max,4); 
   else fBkgFct = new TF1("fBkgFct",PowerBkgWoPeak,min,max,4);
  }
  fBkgFct->SetLineStyle(2);
  for(Int_t i=0; i<4; i++) fBkgFct->SetParameter(i,fBkgFit->GetParameter(i));
  h->GetListOfFunctions()->Add(fBkgFct);
  TH1F * hBkgFct = (TH1F*)fBkgFct->GetHistogram();


  status = 1;    
  Double_t binStartCount = h->FindBin(mass-nsigma*sigma);
  Double_t binEndCount = h->FindBin(mass+nsigma*sigma);
  Double_t counts=0., bkgcounts=0., errcounts=0., errbkgcounts=0.;
  for (Int_t ibin = binStartCount; ibin<=binEndCount; ibin++) {
    counts += h->GetBinContent( ibin );
    errcounts += counts ;
    Double_t center =  h->GetBinCenter(ibin);
    bkgcounts += hBkgFct->GetBinContent( hBkgFct->FindBin(center) ); 
    
    errbkgcounts += bkgcounts ;
  }
  
  bkg = bkgcounts;
  errbkg = TMath::Sqrt( errbkgcounts );
  sgn = counts - bkg ;
  if(sgn<0) status = 2; // significance < 0
  errsgn = TMath::Sqrt( counts + errbkg*errbkg );
  sgnf = sgn / TMath::Sqrt( sgn + bkg );
  errsgnf = TMath::Sqrt( sgnf*sgnf/(sgn+bkg)/(sgn+bkg)*(1/4.*errsgn*errsgn+errbkg*errbkg) + sgnf*sgnf/sgn/sgn*errsgn*errsgn );
      cout << " Signal "<<sgn<<" +- "<<errsgn<<", bkg "<<bkg<<" +- "<<errbkg<<", significance "<<sgnf<<" +- "<<errsgnf<<endl;
  
  if(writefit) {

    TString filename = Form("%sMassFit.root",h->GetName());

    TFile* outputcv = new TFile(filename.Data(),"recreate");      

    TCanvas* c = new TCanvas();

    c->SetName(Form("%s",h->GetName()));

    h->Draw();

    TPaveText *pavetext=new TPaveText(0.4,0.7,0.85,0.9,"NDC");     
    pavetext->SetBorderSize(0);
    pavetext->SetFillStyle(0);
    pavetext->AddText(Form("Signal = %4.2e #pm %4.2e",sgn,errsgn));
    pavetext->AddText(Form("Bkg = %4.2e #pm %4.2e",bkg,errbkg));
    pavetext->AddText(Form("Signif = %3.2f #pm %3.2f",sgnf,errsgnf));
    c->cd();

    pavetext->DrawClone();

    outputcv->cd();

    c->Write();


    outputcv->Close();

    delete outputcv;

    delete c;
  }


  delete fBkgFit;

  delete fBkgFct;


  return kTRUE; 
}

//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

// which=0 plot significance
//      =1 plot signal
//      =2 plot background
//      =3 plot S/B
// maximize = kTRUE (default) if you want to fix the step of the variables not shown to the value that maximize the significance. Note that these values are saved in fixedvars.dat
// readfromfile = kTRUE (default is kFALSE) if you want to read the value fixed in a previous run of this function (e.g. significance or signal maximization)


void showMultiDimVector(Int_t n=2,Int_t which=0, Bool_t plotErrors=kFALSE,Bool_t readfromfile=kFALSE, Bool_t fixedrange=kFALSE, Bool_t fixedplane=kFALSE){

  gStyle->SetCanvasColor(0);
  gStyle->SetFrameFillColor(0);
  gStyle->SetTitleFillColor(0);
  gStyle->SetOptStat(0);
  //gStyle->SetOptTitle(0);
  gStyle->SetFrameBorderMode(0);

  TFile* fin=new TFile("outputSignifMaxim.root");
  if(!fin->IsOpen()){
    cout<<"outputSignifMaxim.root not found"<<endl;
    return;
  }

  if(n>2){
    cout<<"Error! cannot show "<<n+1<<" dimentions"<<endl;
    return;
  }

  TString name,title,namebis,shorttitle;
  switch (which){
  case 0:
    name="SgfmultiDimVectorPtBin";
    title="Significance";
    shorttitle="Sgnf";
    break;
  case 1:
    name="SmultiDimVectorPtBin";
    title="Signal";
    shorttitle="S";
    break;
  case 2:
    name="BmultiDimVectorPtBin";
    title="Background";
    shorttitle="B";
    break;
  case 3:
    name="SmultiDimVectorPtBin";
    namebis="BmultiDimVectorPtBin";
    title="Signal over Background ";
    shorttitle="SoB";
    break;
  // case 4:
  //   name="errBmultiDimVectorPtBin";
  //   title="Background (error)";
  //   break;
  }
 
  if(plotErrors && which!=3 && n==2){
    name.Prepend("err");
    title.Append(" Error") ;
    shorttitle.Append("Err");
  }

  Int_t nptbins=50;
  
  for(Int_t ip=0;ip<=nptbins;ip++){
    TString mdvname=Form("%s%d",name.Data(),ip);
    AliMultiDimVector* mdv=(AliMultiDimVector*)fin->Get(mdvname);
    if(!mdv){
      nptbins=ip;
      cout<<"Number of pt bins "<<ip<<endl;
      break;
    }
  }

  cout<<"Projecting "<<title.Data()<<" with respect to the maximization variable(s) [chose]"<<endl;
 
  Int_t variable[2]; //no more than 2D
  TString mdvname=Form("%s0",name.Data()), mdverrname="";//, mdvnamebis="", mdverrnamebis="";
  AliMultiDimVector* mdv=(AliMultiDimVector*)fin->Get(mdvname);
  AliMultiDimVector* mdverr=0x0;
  if(!mdv){
    cout<<mdvname.Data()<<" not found"<<endl;
    return;
  }
  
  Int_t nvarsopt=mdv->GetNVariables();
  //Int_t nfixed=nvarsopt-n;
 
  Int_t fixedvars[nvarsopt];
  Int_t allfixedvars[nvarsopt*nptbins];
 


  fstream writefixedvars;
  if(readfromfile) {
    //open file in read mode
    writefixedvars.open("fixedvars.dat",ios::in);
    Int_t longi=0;
    while(writefixedvars){
      writefixedvars>>allfixedvars[longi];
      longi++;
    }
  }
  else {
    //open file in write mode
    writefixedvars.open("fixedvars.dat",ios::out);
  }

  Bool_t freevars[nvarsopt];

  //ask variables for projection
  for(Int_t k=0;k<nvarsopt;k++){
    cout<<k<<" "<<mdv->GetAxisTitle(k)<<endl;
    freevars[k]=kTRUE;
  }
  cout<<"Choose "<<n<<" variable(s)"<<endl;
  for(Int_t j=0;j<n;j++){
    cout<<"var"<<j<<": ";
    cin>>variable[j];
    freevars[variable[j]]=kFALSE;
  }
  if(n==1) variable[1]=999;

  TCanvas* cvpj=new TCanvas(Form("proj%d",variable[0]),Form("%s wrt %s",title.Data(),(mdv->GetAxisTitle(variable[0])).Data()));

  TMultiGraph* mg=new TMultiGraph(Form("proj%d",variable[0]),Form("%s wrt %s;%s;%s",title.Data(),(mdv->GetAxisTitle(variable[0])).Data(),(mdv->GetAxisTitle(variable[0])).Data(),title.Data()));
  TLegend *leg=new TLegend(0.7,0.2,0.9,0.6,"Pt Bin");
  leg->SetBorderSize(0);
  leg->SetFillStyle(0);

  //set scale
  fstream writerange;
  Float_t axisrange[2*nptbins];
  if(fixedrange) {
    //open file in read mode
    writerange.open("rangehistos.dat",ios::in);
    Int_t longi=0;
    while(writerange){
      writerange>>axisrange[longi];
      longi++;
    }
  }
  else {
    //open file in write mode
    writerange.open("rangehistos.dat",ios::out);
  }

  for (Int_t i=0;i<nptbins;i++){   //loop on ptbins
    cout<<"\nPtBin = "<<i<<endl;

    //using AliSignificanceCalculator

    TString nameS,nameB,nameerrS,nameerrB;
    nameS.Form("SmultiDimVectorPtBin%d",i);
    nameerrS.Form("errSmultiDimVectorPtBin%d",i);
    nameB.Form("BmultiDimVectorPtBin%d",i);
    nameerrB.Form("errBmultiDimVectorPtBin%d",i);
 
    AliMultiDimVector* mdvS=(AliMultiDimVector*)fin->Get(nameS.Data());
    AliMultiDimVector* mdvB=(AliMultiDimVector*)fin->Get(nameB.Data());
    AliMultiDimVector* mdvBerr=(AliMultiDimVector*)fin->Get(nameerrS.Data());
    AliMultiDimVector* mdvSerr=(AliMultiDimVector*)fin->Get(nameerrB.Data());
    if(!(mdvS && mdvB && mdvSerr && mdvBerr)){
      cout<<"one of the multidimvector is not present"<<endl;
      return;
    }

    AliSignificanceCalculator *cal=new AliSignificanceCalculator(mdvS,mdvB,mdvSerr,mdvBerr,1.,1.);

    AliMultiDimVector* mvess=cal->GetSignificanceError();
    AliMultiDimVector* mvpur=cal->CalculatePurity();
    AliMultiDimVector* mvepur=cal->CalculatePurityError();

    Int_t ncuts=mdvS->GetNVariables();
    Int_t *maxInd=new Int_t[ncuts];
    Float_t *cutvalues=new Float_t[ncuts];
    //init
    // for(Int_t ind=0;ind<ncuts;ind++)maxInd[ind]=0;

    Float_t sigMax0=cal->GetMaxSignificance(maxInd,0); //look better into this!!

    for(Int_t ic=0;ic<ncuts;ic++){
      cutvalues[ic]=((AliMultiDimVector*)fin->Get(nameS.Data()))->GetCutValue(ic,maxInd[ic]);

      //setting step of fixed variables
      if(readfromfile){ //from file
	fixedvars[ic]=allfixedvars[i+ic];
      }

      if(!readfromfile) { //using the values which maximize the significance
       	fixedvars[ic]=maxInd[ic];
       	//write to output fixedvars.dat
       	writefixedvars<<fixedvars[ic]<<"\t";
      }
    }
    //output file: return after each pt bin
    if(!readfromfile) writefixedvars<<endl;

    printf("Maximum of significance for Ptbin %d found in bin:\n",i);
    for(Int_t ic=0;ic<ncuts;ic++)printf(" %d  ",maxInd[ic]);
    printf("\ncorresponding to cut:\n");
    for(Int_t ic=0;ic<ncuts;ic++)printf(" %f  ",cutvalues[ic]);
    
    printf("\nSignificance = %f +- %f\n",sigMax0,mvess->GetElement(maxInd,0));
    printf("Purity       = %f +- %f\n",mvpur->GetElement(maxInd,0),mvepur->GetElement(maxInd,i));
    
    if(which==3){
      //mdv=0x0;
      mdv=cal->CalculateSOverB();
      if(!mdv)cout<<mdv->GetName()<<" null"<<endl;
      //mdverr=0x0;
      mdverr=cal->CalculateSOverBError();
      if(!mdverr)cout<<mdverr->GetName()<<" null"<<endl;
    }else{

      //multidimvector
      mdvname=Form("%s%d",name.Data(),i);   
      mdv=(AliMultiDimVector*)fin->Get(mdvname);
      if(!mdv)cout<<mdvname.Data()<<" not found"<<endl;
      
      //multidimvector of errors
      mdverrname=Form("err%s%d",name.Data(),i);   
      mdverr=(AliMultiDimVector*)fin->Get(mdverrname);
      if(!mdverr)cout<<mdverrname.Data()<<" not found"<<endl;
    }
    printf("Global Address %d (%d)\n",(Int_t)mdv->GetGlobalAddressFromIndices(maxInd,0),(Int_t)mdv->GetNTotCells()*i+(Int_t)mdv->GetGlobalAddressFromIndices(maxInd,0));
    TString ptbinrange=Form("%.1f < p_{t} < %.1f GeV/c",mdv->GetPtLimit(0),mdv->GetPtLimit(1));

    Float_t maxval=0;

    if(n==2) {
      gStyle->SetPalette(1);
      Int_t steps[2];
      Int_t nstep[2]={mdv->GetNCutSteps(variable[0]),mdv->GetNCutSteps(variable[1])}; 
  
      TH2F* hproj=new TH2F(Form("hproj%d",i),Form("%s wrt %s vs %s (Ptbin%d %.1f<pt<%.1f);%s;%s",title.Data(),(mdv->GetAxisTitle(variable[0])).Data(),mdv->GetAxisTitle(variable[1]).Data(),i,mdv->GetPtLimit(0),mdv->GetPtLimit(1),(mdv->GetAxisTitle(variable[0])).Data(),mdv->GetAxisTitle(variable[1]).Data()),nstep[0],mdv->GetMinLimit(variable[0]),mdv->GetMaxLimit(variable[0]),nstep[1],mdv->GetMinLimit(variable[1]),mdv->GetMaxLimit(variable[1]));
      if(fixedplane){
	hproj=mdv->Project(variable[0],variable[1],fixedvars,0);
	hproj->SetTitle(Form("%s wrt %s vs %s (Ptbin%d %.1f<pt<%.1f);%s;%s",title.Data(),(mdv->GetAxisTitle(variable[0])).Data(),mdv->GetAxisTitle(variable[1]).Data(),i,mdv->GetPtLimit(0),mdv->GetPtLimit(1),(mdv->GetAxisTitle(variable[0])).Data(),mdv->GetAxisTitle(variable[1]).Data()));
      }else{
	for(Int_t ist1=0;ist1<nstep[0];ist1++){
	  steps[0]=ist1;
	  Int_t fillbin1=ist1+1;
	  if(mdv->GetCutValue(variable[0],0)>mdv->GetCutValue(variable[0],mdv->GetNCutSteps(variable[0])-1))fillbin1=nstep[0]-ist1;
	  for(Int_t ist2=0;ist2<nstep[1];ist2++){
	    steps[1]=ist2;
	    Int_t fillbin2=ist2+1;
	    if(mdv->GetCutValue(variable[1],0)>mdv->GetCutValue(variable[1],mdv->GetNCutSteps(variable[1])-1))fillbin2=nstep[1]-ist2;
	    Int_t* varmaxim=mdv->FindLocalMaximum(maxval,variable,steps,n,0);
	    hproj->SetBinContent(fillbin1,fillbin2,maxval);
	    delete varmaxim;
	  }
	}
      }
      if(fixedrange) {
	hproj->SetMinimum(axisrange[2*i]);
	hproj->SetMaximum(axisrange[2*i+1]);
      } else{
	writerange<<hproj->GetMinimum()<<"\t"<<hproj->GetMinimum()<<endl;
      }
      TCanvas* cvpj=new TCanvas(Form("proj%d%dpt%d",variable[0],variable[1],i),Form("%s wrt %s vs %s (Ptbin%d)",title.Data(),(mdv->GetAxisTitle(variable[0])).Data(),mdv->GetAxisTitle(variable[1]).Data(),i));
      cvpj->cd();
      hproj->DrawClone("COLZtext");
      cvpj->SaveAs(Form("%s%s.png",shorttitle.Data(),cvpj->GetName()));
      delete hproj;
    }

    if(n==1){

      Int_t nbins=mdv->GetNCutSteps(variable[0]);
 
      Double_t *x=new Double_t[nbins];
      Double_t *y=new Double_t[nbins];
      Double_t *errx=new Double_t[nbins];
      Double_t *erry=new Double_t[nbins];

      for(Int_t k=0;k<nbins;k++){ //loop on the steps (that is the bins of the graph)
	//init
	x[k]=0;y[k]=0;
	errx[k]=0;erry[k]=0;
	
	x[k]=mdv->GetCutValue(variable[0],k);
	errx[k]=mdv->GetCutStep(variable[0])/2.;
	Int_t onevariable[1]={variable[0]};
	Int_t onestep[1]={k};
	ULong64_t gladd;

	Float_t maxval;
	Int_t* varmaxim=mdv->FindLocalMaximum(maxval,onevariable,onestep,n,0);
	y[k]=maxval;
	gladd=mdv->GetGlobalAddressFromIndices(varmaxim,0);
	cout<<gladd<<endl;
	delete varmaxim;
      
	erry[k]=mdverr->GetElement(gladd);
	
	cout<<mdv->GetAxisTitle(variable[0])<<" step "<<k<<" = "<<x[k]<<":"<<" y = "<<y[k]<<endl;
      }
      
      cout<<"----------------------------------------------------------"<<endl;
      TGraphErrors* gr=new TGraphErrors(nbins,x,y,errx,erry);
      gr->SetMarkerStyle(20+i);
      gr->SetMarkerColor(i+1);
      gr->SetLineColor(i+1);
      if(i>=9){
	gr->SetMarkerColor(i+2);
	gr->SetLineColor(i+2);
      }
      gr->SetMinimum(0);

      gr->SetName(Form("g1%d",i));
      mg->Add(gr,"P");
      leg->AddEntry(gr,ptbinrange.Data(),"p");
    }
  }
   
  if(n==1){
    cvpj->cd();
    mg->Draw("A");
    leg->Draw();
    cvpj->SaveAs(Form("%s%s.png",shorttitle.Data(),cvpj->GetName()));
  } else delete cvpj;
}

//draw sigma as a function of cuts

void DrawSigmas(TH2F* h2cuts){
  TFile *fin=0x0;
  TString fittype="ExpFit";
  Int_t ntot=5;
  if(fittype=="Pol2Fit") ntot=6;
  Int_t ihfirst=0,ihlast=1; //change this (must think on it and remember what I wanted to do!)
  for(Int_t ih=ihfirst;ih<ihlast;ih++){
    fin=new TFile(Form("h%d%s.root",ih,fittype.Data()));
    if(!fin) continue;
    TCanvas *cv=(TCanvas*)fin->Get(Form("cv1%s%d",fittype.Data(),ih));
    TF1* func=(TF1*)cv->FindObject("funcmass");
    Int_t sigma=func->GetParameter(ntot-1);
    //h2cuts->SetBinContent();
    //to be finished
  }
}

//:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
// Some methods to get the index of the histogram corresponding to a set of cuts

// vct = the AliMultiDimVector correponding to ptbin: it can be from AnalysisResults.root or outputSignifMaxim.root
// ptbin = pt bin
// indices = array of the index of the cut variables (the dimension of the array must be equal to the number of variables maximized)

Int_t GetNHistFromIndices(AliMultiDimVector* vct,Int_t ptbin,Int_t* indices){
  cout<<"Calculating the index of the histogram corresponding to the following cut steps:"<<endl;
  for(Int_t i=0;i<vct->GetNVariables();i++){
    cout<<vct->GetAxisTitle(i)<<" --> "<<indices[i]<<endl;
  }
  cout<<"Pt bin "<<ptbin<<" from "<<vct->GetPtLimit(0)<<" to "<<vct->GetPtLimit(1)<<endl;
  cout<<"Info: total number of cells per multidim: "<<vct->GetNTotCells()<<endl;
  ULong64_t glindex=vct->GetGlobalAddressFromIndices(indices,0);
  cout<<"The histogram you want is:\t";
  return glindex+vct->GetNTotCells()*ptbin;
}

// vct = the AliMultiDimVector correponding to ptbin: it can be from AnalysisResults.root or outputSignifMaxim.root
// ptbin = pt bin
// values = array of the cut values (the dimension of the array must be equal to the number of variables maximized)

Int_t GetNHistFromValues(AliMultiDimVector* vct,Int_t ptbin,Float_t* values){
  cout<<"Calculating the index of the histogram corresponding to the following cut values:"<<endl;
  for(Int_t i=0;i<vct->GetNVariables();i++){
    cout<<vct->GetAxisTitle(i)<<" --> "<<values[i]<<endl;
  }
  cout<<"Pt bin "<<ptbin<<" from "<<vct->GetPtLimit(0)<<" to "<<vct->GetPtLimit(1)<<endl;
  cout<<"Info: total number of cells per multidim: "<<vct->GetNTotCells()<<endl;
  ULong64_t glindex=vct->GetGlobalAddressFromValues(values,0);
 
  cout<<"The histogram you want is:\t"<<glindex+vct->GetNTotCells()*ptbin<<endl;
  return glindex+vct->GetNTotCells()*ptbin;
}

// vct = the AliMultiDimVector correponding to ptbin: it can be from AnalysisResults.root or outputSignifMaxim.root
// ptbin = pt bin
// values = array of the cut values: the dimention can be <= number of variables maximized
// valsgiven = array of dimention = to the number of variables optimized. For each variable put kTRUE if the value is given (in values), kFALSE otherwise
// nhistinrange =  pass an integer which will contains the number of histogram returned (that is the dimention of the Int_t* returned)

//NB: Remember that the cut applied is the lower edge of the step where lower=looser

Int_t* GetRangeHistFromValues(AliMultiDimVector* vct,Int_t ptbin,Bool_t* valsgiven,Float_t* values,Int_t& nhistinrange){
  Int_t nvargiven=0;
  nhistinrange=1;

  Int_t nvar4opt=vct->GetNVariables();
  Float_t allvals[nvar4opt];
 
  for (Int_t i=0;i<nvar4opt;i++) {
    if(valsgiven[i]==kTRUE) {
      allvals[i]=values[nvargiven];
      nvargiven++;
    }
    else {
      nhistinrange+=vct->GetNCutSteps(i);
      allvals[i]=vct->GetCutValue(i,0);
      //allvals[i]=vct->GetCutValue(0,i); //ivar,icell
    }
  }
  cout<<nhistinrange<<" index will be returned"<<endl;
  Int_t *rangeofhistos=new Int_t[nhistinrange];

  if(nhistinrange==1){
    rangeofhistos[0]=GetNHistFromValues(vct,ptbin,allvals);
    cout<<"output"<<rangeofhistos[0]<<endl;
  }else{
    Int_t index[nvar4opt-nvargiven];
    Int_t k=0;
    for (Int_t i=0;i<nvar4opt;i++){
      if(valsgiven[i]==kFALSE) {
	//cout<<"kTRUE==>"<<i<<endl;
	index[k]=i;
	k++;
      }
    }

    for(Int_t i=0;i<nvar4opt-nvargiven;i++){ //loop on number of free variables
      cout<<"Info: incrementing "<<vct->GetAxisTitle(index[i])<<endl;
      for(Int_t j=0;j<vct->GetNCutSteps(i);j++){ //loop on steps of each free variable
	allvals[index[i]]=vct->GetCutValue(index[i],j);
	rangeofhistos[i*vct->GetNCutSteps(i)+j]=GetNHistFromValues(vct,ptbin,allvals);
      }
    }
  }
  return rangeofhistos;
}

// vct = the AliMultiDimVector correponding to ptbin: it can be from AnalysisResults.root or outputSignifMaxim.root
// ptbin = pt bin
// nhist = number of the histogram from which you want to have the cut values (returned)

Float_t* GetCutValuesFromNHist(AliMultiDimVector* vct,Int_t ptbin,Int_t nhist){
  ULong64_t totCells=vct->GetNTotCells();
  ULong64_t globadd=nhist-ptbin*totCells;
  const Int_t nvars=vct->GetNVariables();
  Float_t* cuts=new Float_t[nvars];
  Int_t ptinside;
  vct->GetCutValuesFromGlobalAddress(globadd,cuts,ptinside);
  return cuts;
}

// ptbin = pt bin
// values = array of the cut values: the dimention can be <= number of variables maximized
// valsgiven = array of dimention = to the number of variables optimized. For each variable put kTRUE if the value is given (in values), kFALSE otherwise
// 

void DrawPossibilities(Int_t ptbin,Bool_t* valsgiven,Float_t* values,TString path="./",Int_t decCh=2){
  gStyle->SetFrameBorderMode(0);
  gStyle->SetCanvasColor(0);
  gStyle->SetFrameFillColor(0);
  gStyle->SetOptStat(0);

  Int_t nhists;
  TString filename="AnalysisResults.root";
  TString dirname="PWG3_D2H_Significance",listname="coutputSig",mdvlistname="coutputmv";
  TString centr="020";

  TFile *fin=new TFile(Form("%s%s",path.Data(),filename.Data()));
  if(!fin){
    cout<<path.Data()<<filename.Data()<<" not found"<<endl;
    return;
  }
  TDirectoryFile *dir=(TDirectoryFile*)fin->GetDirectory(dirname);
  if(!dir){
    cout<<"Directory "<<dirname<<" not found"<<endl;
    return;
  }
  switch (decCh) {
  case 0:
    listname+="Dplus";
    mdvlistname+="Dplus";
    
    break;
  case 1:
    listname+="D0";
    mdvlistname+="D0";
    
    break;
  case 2:
    listname+="Dstar0100";
    mdvlistname+="Dstar0100";
    
    break;
  case 3:
    listname+="Ds";
    mdvlistname+="Ds";
    
    break;
  case 4:
    listname+="D04";
    mdvlistname+="D04";
    
    break;
  case 5:
    listname+="Lc";
    mdvlistname+="Lc";
    
    break;
  default:
    cout<<decCh<<" is not allowed as decay channel "<<endl;
    return;
  }
  mdvlistname+=centr;
  listname+=centr;

  TList* listamdv= (TList*)dir->Get(mdvlistname);
  if(!listamdv) {
    cout<<mdvlistname<<" doesn't exist"<<endl;
    return;
  }

  AliMultiDimVector* vct=(AliMultiDimVector*)listamdv->FindObject(Form("multiDimVectorPtBin%d",ptbin));

  TFile* fin2;
  TString filehistname="";
  Int_t* indexes=GetRangeHistFromValues(vct,ptbin,valsgiven,values,nhists);
  for(Int_t i=0;i<nhists;i++){

    fin2=new TFile(Form("%sh%dExpMassFit.root",path.Data(),indexes[i]));
    if(!fin2){
      cout<<"File "<<indexes[i]<<" not found!"<<endl;
      continue;
    }else{
      TCanvas *cv=(TCanvas*)fin2->Get(Form("c1h%dExp",indexes[i]));
      if(!cv){
	cout<<"Canvas c1h"<<indexes[i]<<"Exp not found among";
	fin2->ls();
	continue;
      }else{
	cv->Draw();
	cv->SaveAs(Form("h%dExpMassFit.png",indexes[i]));
	fin2=0x0;
      }
    }
  }
}

void Merge2Bins(Int_t b1, Int_t b2,TString pathin="./",Int_t decCh=2,TString part="both"/*"A" anti-particle, "P" particle*/){

  if(b2!=b1+1){
    printf("The bins to be merget must be consecutive. Check! [b1 = %d, b2= %d]\n",b1,b2);
    return;
  }

  TFile *fin=new TFile(Form("%sAnalysisResults.root",pathin.Data()));
  if (!fin){
    cout<<"Input file not found"<<endl;
    return;
  }

  TString dirname="PWG3_D2H_Significance",listname="coutputSig",mdvlistname="coutputmv";

  switch (decCh) {
  case 0:
    listname+="Dplus";
    mdvlistname+="Dplus";
    break;
  case 1:
    listname+="D0";
    mdvlistname+="D0";
    break;
  case 2:
    listname+="Dstar0100";
    mdvlistname+="Dstar0100";
    break;
  case 3:
    listname+="Ds";
    mdvlistname+="Ds";
    break;
  case 4:
    listname+="D04";
    mdvlistname+="D04";
    break;
  case 5:
    listname+="Lc";
    mdvlistname+="Lc";
    break;
  default:
    cout<<decCh<<" is not allowed as decay channel "<<endl;
    return;
  }

  if(part!="both"){
    listname.Append(part);
    mdvlistname.Append(part);
  }

  TDirectoryFile *dir=(TDirectoryFile*)fin->GetDirectory(dirname);
  if(!dir){
    cout<<"Directory "<<dirname<<" not found"<<endl;
    return;
  }

  TList* histlist= (TList*)dir->Get(listname);
  if(!histlist) {
    cout<<listname<<" doesn't exist"<<endl;
    return;
  }

  TList* listamdv= (TList*)dir->Get(mdvlistname);
  if(!listamdv) {
    cout<<mdvlistname<<" doesn't exist"<<endl;
    return;
  }
  if (!gSystem->AccessPathName(Form("merged%d%d",b1,b2))) gSystem->Exec(Form("mkdir merged%d%d",b1,b2));
  gSystem->Exec(Form("cd merged%d%d",b1,b2));

  TFile* fout=new TFile("mergeAnalysisResults.root","recreate");

  fout->mkdir(dirname);
  TList* listmdvout=new TList();
  listmdvout->SetName(listamdv->GetName());
  listmdvout->SetOwner();
  //listmdvout->SetTitle(listamdv->GetTitle());
  TList* histlistout=new TList();
  histlistout->SetName(histlist->GetName());
  histlistout->SetOwner();
  //histlistout->SetTitle(histlist->GetTitle());

  AliMultiDimVector* mdvin1=(AliMultiDimVector*)listamdv->FindObject(Form("multiDimVectorPtBin%d",b1));
  AliMultiDimVector* mdvin2=(AliMultiDimVector*)listamdv->FindObject(Form("multiDimVectorPtBin%d",b2));

  Int_t ntotHperbin = mdvin1->GetNTotCells();
  if(mdvin2->GetNTotCells() != ntotHperbin) {
    cout<<"Error! Number of histos in pt bin "<<b1<<" = "<<ntotHperbin<<" != Number of histos in pt bin "<<b2<<" = "<<mdvin2->GetNTotCells()<<endl;
    return;
  }
  Int_t nvar1=mdvin1->GetNVariables();
  if(nvar1 != mdvin2->GetNVariables()){
    cout<<"Error! Mismatch in number of variables"<<endl;
    return;
  }
  
  Float_t newptbins[2]={mdvin1->GetPtLimit(0),mdvin2->GetPtLimit(1)};
  Float_t loosercuts[nvar1], tightercuts[nvar1];
  TString axistitles[nvar1];
  Int_t ncells[nvar1];

  for (Int_t ivar=0;ivar<nvar1;ivar++){
    loosercuts[ivar]=mdvin1->GetCutValue(ivar,0);
    if(loosercuts[ivar] - mdvin2->GetCutValue(ivar,0) < 1e-8) printf("Warning! The loose cut %s is different between the 2: %f and %f\n",mdvin1->GetAxisTitle(ivar).Data(),loosercuts[ivar],mdvin2->GetCutValue(ivar,0));
    tightercuts[ivar]=mdvin1->GetCutValue(ivar,mdvin1->GetNCutSteps(ivar)-1);
    if(tightercuts[ivar] - mdvin2->GetCutValue(ivar,mdvin1->GetNCutSteps(ivar)-1) < 1e-8) printf("Warning! The tight cut %s is different between the 2: %f and %f\n",mdvin1->GetAxisTitle(ivar).Data(),tightercuts[ivar],mdvin2->GetCutValue(ivar,mdvin2->GetNCutSteps(ivar)));
    axistitles[ivar]=mdvin1->GetAxisTitle(ivar);
    cout<<axistitles[ivar]<<"\t";
    ncells[ivar]=mdvin1->GetNCutSteps(ivar);
  }

  AliMultiDimVector* mdvout= new AliMultiDimVector(Form("multiDimVectorPtBin%d",b1),"MultiDimVector",1,newptbins,mdvin1->GetNVariables(),ncells,loosercuts,tightercuts,axistitles);
  cout<<"Info: writing mdv"<<endl;
  listmdvout->Add(mdvout);

  Bool_t isMC=kFALSE;
  TH1F* htestIsMC=(TH1F*)histlist->FindObject("hSgn_0");
  if(htestIsMC) isMC=kTRUE;
  Int_t nptbins=listamdv->GetEntries();
  Int_t nhist=(histlist->GetEntries()-1);//-1 because of fHistNevents
  if(isMC) nhist/=4; ///4 because hMass_, hSgn_,hBkg_,hRfl_

 cout<<"Merging bin from "<<mdvin1->GetPtLimit(0)<<" to "<<mdvin1->GetPtLimit(1)<<" and from "<<mdvin2->GetPtLimit(0)<<" to "<<mdvin2->GetPtLimit(1)<<endl;
 Int_t firsth1=b1*ntotHperbin,firsth2=b2*ntotHperbin; //firsth2 = (b1+1)*ntotHperbin
 Int_t lasth1=firsth1+ntotHperbin-1,lasth2=firsth2+ntotHperbin-1;
 cout<<"Histograms from "<<firsth1<<" to "<<lasth1<<" and "<<firsth2<<" to "<<lasth2<<endl;

 //add the others mdv to the list
 Int_t cnt=0;
 for(Int_t i=0;i<nptbins;i++){
   if(i!=b1 && i!=b2){
     AliMultiDimVector* vcttmp=(AliMultiDimVector*)listamdv->FindObject(Form("multiDimVectorPtBin%d",i));
     if(i>b2) {
       vcttmp->SetName(Form("multiDimVectorPtBin%d",b2+cnt));
       cnt++;
     }
     listmdvout->Add(vcttmp);
   }
 }

 histlistout->Add((TH1F*)histlist->FindObject("fHistNEvents"));

 Int_t ih2=firsth2;

 for(Int_t ih1=firsth1;ih1<lasth1;ih1++){
   TH1F* h1=(TH1F*)histlist->FindObject(Form("hMass_%d",ih1));
   if(!h1){
     cout<<"hMass_"<<ih1<<" not found!"<<endl;
     continue;
   }
   TH1F* h2=(TH1F*)histlist->FindObject(Form("hMass_%d",ih2));
   if(!h2){
     cout<<"hMass_"<<ih2<<" not found!"<<endl;
     continue;
   }
   //h1->SetName(Form("hMass_%d",cnt));
   h1->Add(h2);
   histlistout->Add(h1);
   ih2++;
   //cnt++;
   h1=0x0;
 }

 cnt=0;
 for(Int_t j=0;j<ntotHperbin*nptbins;j++){
   if(!(j>=firsth1 && j<lasth2)){
     TH1F* htmp=(TH1F*)histlist->FindObject(Form("hMass_%d",j));
     if(j>=lasth2){
       //cout<<lasth1<<" + "<<cnt<<endl;
       htmp->SetName(Form("hMass_%d",lasth1+cnt));
       cnt++;
     }
     histlistout->Add(htmp);
   }
 }

 fout->cd();
 ((TDirectoryFile*)fout->Get(dirname))->cd();
 listmdvout->Write(mdvlistname.Data(),TObject::kSingleKey);
 histlistout->Write(listname.Data(),TObject::kSingleKey);
 fout->Close();
}

void SubtractBkg(Int_t nhisto){

  gStyle->SetFrameBorderMode(0);
  gStyle->SetCanvasColor(0);
  gStyle->SetFrameFillColor(0);
  gStyle->SetOptStat(0);

  TString fitType="Exp";
  TString filename=Form("h%d%sMassFit.root",nhisto,fitType.Data());

  TFile* fin=new TFile(filename.Data());
  if(!fin->IsOpen()){
    cout<<filename.Data()<<" not found, exit"<<endl;
    return;
  }

  TKey* key=((TKey*)((TList*)fin->GetListOfKeys())->At(fin->GetNkeys()-1));
  TCanvas* canvas=((TCanvas*)fin->Get(key->GetName()));
  if(!canvas){
    cout<<"Canvas not found"<<endl;
    return;
  }
  canvas->Draw();

  TH1F* hfit=(TH1F*)canvas->FindObject("fhistoInvMass");
  if(!hfit){
    canvas->ls();
    cout<<"Histogram not found"<<endl;
    return;
  }

  TF1* funcBkgRecalc=(TF1*)hfit->FindObject("funcbkgRecalc");
  if(!funcBkgRecalc){
    cout<<"Background fit function (final) not found"<<endl;
    return;
  }

  TF1* funcBkgFullRange=(TF1*)hfit->FindObject("funcbkgFullRange");
  if(!funcBkgFullRange){
    cout<<"Background fit function (side bands) not found"<<endl;
    return;
  }

  Int_t nbins=hfit->GetNbinsX();
  Double_t min=hfit->GetBinLowEdge(1), width=hfit->GetBinWidth(1);
  TH1F* hsubRecalc=(TH1F*)hfit->Clone("hsub");
  hsubRecalc->SetMarkerColor(kRed);
  hsubRecalc->SetLineColor(kRed);
  hsubRecalc->GetListOfFunctions()->Delete();
  TH1F* hsubFullRange=(TH1F*)hfit->Clone("hsub");
  hsubFullRange->SetMarkerColor(kGray+2);
  hsubFullRange->SetLineColor(kGray+2);
  hsubFullRange->GetListOfFunctions()->Delete();
  for(Int_t i=0;i<nbins;i++){
    //Double_t x=min+i*0.5*width;
    Double_t x1=min+i*width, x2=min+(i+1)*width;
    Double_t ycont=hfit->GetBinContent(i+1);
    Double_t y1=funcBkgRecalc->Integral(x1,x2) / width;//funcBkgRecalc->Eval(x);
    hsubRecalc->SetBinContent(i+1,ycont-y1);
    Double_t y2=funcBkgFullRange->Integral(x1,x2) / width;//funcBkgFullRange->Eval(x);
    hsubFullRange->SetBinContent(i+1,ycont-y2);
  }

  TCanvas* c=new TCanvas("c","subtraction");
  c->cd();
  hsubRecalc->DrawClone();
  hsubFullRange->DrawClone("sames");

  for(Int_t i=0;i<nbins;i++){
    if(hsubRecalc->GetBinContent(i+1)<0) hsubRecalc->SetBinContent(i+1,0);
    if(hsubFullRange->GetBinContent(i+1)<0) hsubFullRange->SetBinContent(i+1,0);
  }

  TCanvas *cvnewfits=new TCanvas("cvnewfits", "new Fits",1200,600);
  cvnewfits->Divide(2,1);

  AliHFMassFitter fitter1(hsubRecalc,min,min+nbins*width,1,1);
  fitter1.MassFitter(kFALSE);
  fitter1.DrawHere(cvnewfits->cd(1));

  AliHFMassFitter fitter2(hsubFullRange,min,min+nbins*width,1,1);
  fitter2.MassFitter(kFALSE);
  fitter2.DrawHere(cvnewfits->cd(2));

  canvas->SaveAs(Form("h%d%sMassFit.png",nhisto,fitType.Data()));
  c->SaveAs(Form("h%d%sSubtr.png",nhisto,fitType.Data()));
  cvnewfits->SaveAs(Form("h%d%sFitNew.png",nhisto,fitType.Data()));
}

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