void testMVATrainerAnalysis()
{
	using namespace PhysicsTools;

	setStyle();

	MVAComputer mva("testMVAComputerEvaluate.mva");

	Variable::Value values[3];
	values[0].setName("x");
	values[1].setName("y");

	TH2F *f = new TH2F("discr", "Discriminator", 200, -10, 10, 200, -10, 10);
	f->SetXTitle("x");
	f->SetYTitle("y");

	TH2F *g = new TH2F("dx", "dD/dx", 200, -10, 10, 200, -10, 10);
	g->SetXTitle("x");
	g->SetYTitle("y");

	TH2F *h = new TH2F("dy", "dD/dy", 200, -10, 10, 200, -10, 10);
	h->SetXTitle("x");
	h->SetYTitle("y");

	for(double x = -10 + 0.05; x < 10; x += 0.1)  {
		for(double y = -10 + 0.05; y < 10; y += 0.1) {
			values[0].setValue(x);
			values[1].setValue(y);
			double v = mva.deriv(values, values + 2);
			f->SetBinContent(f->FindBin(x, y), v);
			g->SetBinContent(g->FindBin(x, y), values[0].getValue());
			h->SetBinContent(h->FindBin(x, y), values[1].getValue());
		}
	}

	TCanvas *c1 = new TCanvas("c1");
	c1->Divide(2, 2);
	c1->cd(1);
	f->SetStats(0);
	f->SetContour(511);
	f->Draw("colz");
	c1->cd(3);
	g->SetStats(0);
	g->SetContour(511);
	g->Draw("colz");
	c1->cd(4);
	h->SetStats(0);
	h->SetContour(511);
	h->Draw("colz");
}
Exemple #2
0
void AliITSLegoPlot(Float_t nchtheta, Float_t nchphi, const char *inFile = "galice.root") {
// macro to visualize the lego plots generated by gAlive->RunLego
   
   gROOT->Reset();
   TFile *file = (TFile*)gROOT->GetListOfFiles()->FindObject(inFile);
   if (!file->IsOpen()) {
       cerr<<"Can't open "<<inFile<<" !" << endl;
       return 1;
   } // end if !file
    

   Float_t theta = 10;
   Float_t phi   = 170;
   Int_t ncont   = 50;

   TCanvas *cradl = new TCanvas("cradl","radl",10,10,800,600);
   cradl->SetTheta(theta);
   cradl->SetPhi(phi);
   TH2F *hradl = (TH2F*)file->Get("hradl");
   hradl->SetStats(kFALSE);
   hradl->GetXaxis()->SetTitle("Phi (degrees)");
   hradl->GetYaxis()->SetTitle("Theta (degrees)");
   hradl->SetFillColor(2);
   hradl->SetContour(ncont);
   hradl->Draw("colz");


   TCanvas *cradlx = new TCanvas("cradl1","radl",50,50,800,600);
   hradl->ProjectionX();
   hradl_px->SetStats(kFALSE);
//   hradl_px->SetOptLogY();
//   hradl_px->SetMinimum(0.001);   
//   hradl_px->SetMaximum(1);
   hradl_px->Scale(1./nchtheta);   
   hradl_px->GetXaxis()->SetTitle("Phi (degrees)");
   hradl_px->GetYaxis()->SetTitle("X/X0");
   hradl_px->Draw();
//   cout << "Average over Phi: " << hradl_px->GetSumOfWeights()/nchphi << " X/X0" << endl;
   
   
   TCanvas *cradly = new TCanvas("cradl2","radl",100,100,800,600);
   hradl->ProjectionY();
   hradl_py->SetStats(kFALSE);
//   hradl_py->SetOptLogY();
//   hradl_py->SetMinimum(0.001);   
//   hradl_py->SetMaximum(1);   
   hradl_py->Scale(1./nchphi);
   hradl_py->GetXaxis()->SetTitle("Theta (degrees)");
   hradl_py->GetYaxis()->SetTitle("X/X0");
   hradl_py->Draw();   
//   cout << "Average over Theta: " << hradl_py->GetSumOfWeights()/nchtheta << " X/X0" << endl;  
   cout << "Average: " << hradl_py->GetSumOfWeights()/nchtheta << " X/X0" << endl;     
}   
Exemple #3
0
void lego() {
// macro to visualize the lego plots generated by gAlive->RunLego
   
   gROOT->Reset();
   TFile *file = new TFile("galice.root");

   Float_t theta = 10;
   Float_t phi   = 170;
   Int_t ncont   = 50;

   TCanvas *cgcm2 = new TCanvas("cgcm2","gcm2",200,100,600,400);
   cgcm2->SetTheta(theta);
   cgcm2->SetPhi(phi);
   TH2F *hgcm2 = (TH2F*)file->Get("hgcm2");
   hgcm2->SetFillColor(2);
   hgcm2->SetMaximum(1);
   hgcm2->SetContour(ncont);
   hgcm2->SetMaximum(50);
   hgcm2->Draw("lego2sphe");

   TCanvas *cabso = new TCanvas("cabso","abso",100,50,600,400);
   cabso->SetTheta(theta);
   cabso->SetPhi(phi);
   TH2F *habso = (TH2F*)file->Get("habso");
   habso->SetFillColor(2);
   habso->SetMaximum(1);
   habso->SetContour(ncont);
   habso->SetMaximum(1);
   habso->Draw("lego2sphe");

   TCanvas *cradl = new TCanvas("cradl","radl",10,10,600,400);
   cradl->SetTheta(theta);
   cradl->SetPhi(phi);
   TH2F *hradl = (TH2F*)file->Get("hradl");
   hradl->SetFillColor(2);
   hradl->SetMaximum(1);
   hradl->SetContour(ncont);
   hradl->SetMaximum(5);
   hradl->Draw("lego2sphe");
}   
TGraph* ContourGraph( TH2F* hist,double xmin=16, double xmax=90) {

    //temporary canvas
    TCanvas* MOO = new TCanvas( TString::Format("dummy_canvas_%s", hist->GetName()), "A scan of m_{0} versus m_{12}", 0, 0, 650,640);
    MOO->cd();

    TGraph* gr0 = new TGraph();
    TH2F* h = (TH2F*)hist->Clone();
    TGraph* gr = (TGraph*)gr0->Clone(TString::Format("gr_%s", h->GetName()));

    cout << "==> Will dumb histogram: " << h->GetName() << " into a graph" <<endl;

    h->SetContour( 1 );
    //h->GetXaxis()->SetRangeUser(250,1200);
    h->GetXaxis()->SetRangeUser(xmin, xmax);
    //h->GetYaxis()->SetRangeUser(2,50);

    double pval = CombinationGlob::cl_percent[1];
    std::cout << pval << std::endl; 
    double signif = TMath::NormQuantile(1-pval);
    h->SetContourLevel( 0, signif );
    h->Draw("CONT LIST");
    h->SetDirectory(0);
    gPad->Update();

    TObjArray *contours = (TObjArray*) gROOT->GetListOfSpecials()->FindObject("contours");
    Int_t ncontours     = contours->GetSize();
    cout << "Found " << ncontours << " contours " << endl;

    TList *list = (TList*)contours->At(0);
    contours->Print("v");
    if(!list) return NULL;

    gr = (TGraph*)list->First();
    if(!gr) return NULL;

    gr->SetName(TString::Format("gr_%s", hist->GetName()));
    //gr->SetName(hist->GetName());
    int N = gr->GetN();
    double x0, y0;
    for(int j=0; j<N; j++) {
        gr->GetPoint(j,x0,y0);
        cout << j << " : " << x0 << " : "<<y0 << endl;
    }
    //  //  gr->SetMarkerSize(2.0);    
    //gr->Draw("ALP");

    delete MOO;

    cout << "Generated graph " << gr << " with name " << gr->GetName() << endl;
    return gr;
}
void DrawContourLine3sigma( TLegend *leg, TH2F* hist, const TString& text="", Int_t linecolor=1, Int_t linestyle=2, Int_t linewidth=2 )
{
   // contour plot
   TH2F* h = new TH2F( *hist );
   h->SetContour( 1 );
   double pval = (1.-0.9973)*0.5; // one-sided
   double signif = TMath::NormQuantile(1-pval);
   //cout <<"DrawContourLine3sigma: pval="<<pval<<", "<<signif<<"sigma for "<<text<<endl;
   h->SetContourLevel( 0, signif );

   h->SetLineColor( linecolor );
   h->SetLineWidth( linewidth );
   h->SetLineStyle( linestyle );
   h->Draw( "samecont3" );

   if (!text.IsNull()) leg->AddEntry(h,text.Data(),"l");
}     
void
DrawContourLine68( TLegend *leg, TH2F* hist, const TString& text="", Int_t linecolor=CombinationGlob::c_VDarkGray, Int_t linestyle=2 )
{
    // contour plot
    TH2F* h = new TH2F( *hist );
    h->SetContour( 1 );
    double pval = CombinationGlob::cl_percent[0];
    double signif = TMath::NormQuantile(1-pval);

    h->SetContourLevel( 0, signif );

    h->SetLineColor( linecolor );
    h->SetLineWidth( 2 );
    h->SetLineStyle( linestyle );
    h->Draw( "samecont3" );

    if (!text.IsNull()) leg->AddEntry(h,text.Data(),"l");
}
void DrawContourLine68( TLegend *leg, TH2F* hist, const TString& text="", Int_t linecolor=1, Int_t linestyle=2, Int_t linewidth=2 ) {
    // contour plot
    TH2F* h = new TH2F( *hist );
    h->SetContour( 1 );
    double pval = CombinationGlob::cl_percent[0];
    cout<< pval<<endl;
    double signif = TMath::NormQuantile(1-pval);
    cout << "signif: " <<signif << endl;
    h->SetContourLevel( 0, signif );

    h->SetLineColor( linecolor );
    h->SetLineWidth( linewidth );
    h->SetLineStyle( linestyle );
    h->Draw( "samecont3" );

    if (!text.IsNull() && leg) leg->AddEntry(h,text.Data(),"l"); 
    //return h;
}
    TGraph*
ContourGraph( TH2F* hist)
{
    TGraph* gr0 = new TGraph();
    TH2F* h = (TH2F*)hist->Clone();
    gr = (TGraph*)gr0->Clone(h->GetName());
    //  cout << "==> Will dumb histogram: " << h->GetName() << " into a graph" <<endl;
    h->SetContour( 1 );
    double pval = CombinationGlob::cl_percent[1];
    double signif = TMath::NormQuantile(1-pval);
    h->SetContourLevel( 0, signif );
    h->Draw("CONT LIST");
    h->SetDirectory(0);
    gPad->Update();
    TObjArray *contours = gROOT->GetListOfSpecials()->FindObject("contours");
    Int_t ncontours     = contours->GetSize();
    TList *list = (TList*)contours->At(0);
    Int_t number_of_lists = list->GetSize();
    gr = (TGraph*)list->At(0);
    TGraph* grTmp = new TGraph();
    for (int k = 0 ; k<number_of_lists ; k++){
        grTmp = (TGraph*)list->At(k);
        Int_t N = gr->GetN();
        Int_t N_tmp = grTmp->GetN();
        if(N < N_tmp) gr = grTmp;
        //    mg->Add((TGraph*)list->At(k));
    }

    gr->SetName(hist->GetName());
    int N = gr->GetN();
    double x0, y0;

    //  for(int j=0; j<N; j++) {
    //    gr->GetPoint(j,x0,y0);
    //    cout << j << " : " << x0 << " : "<<y0 << endl;
    //  }
    //  //  gr->SetMarkerSize(2.0);
    //  gr->SetMarkerSize(2.0);
    //  gr->SetMarkerStyle(21);
    //  gr->Draw("LP");
    //  cout << "Generated graph " << gr << " with name " << gr->GetName() << endl;
    return gr;
}
    void
DrawContourMassLine(TH2F* hist, Double_t mass, int color=14 )
{

    // contour plot
    TH2F* h = new TH2F( *hist );

    //  Double_t contours[5] = {500, 1000, 1500, 2000, 2500}
    h->SetContour( 1 );
    //h->SetContour( 5, contours )
    //  h->SetContourLevel( 0, contours );
    h->SetContourLevel( 0, mass );

    h->SetLineColor( color );
    h->SetLineStyle( 7 );
    h->SetLineWidth( 1 );
    h->Draw( "samecont3" );

}
Exemple #10
0
void makeCov::buildMatrix(){

  //setup mcmc trees
  double par[1000];
  double mean[1000];
  int npar;
  partree->SetBranchAddress("par",par);
  partree->SetBranchAddress("npars",&npar);
  partree->GetEntry(0); //fills npar
  cout<<"Total # of parameters: "<<npar<<endl;
  cout<<"Total # of steps: "<<partree->GetEntries()<<endl;
  cout<<"Burn-in: "<<nburn<<endl;

  //create matrix templates
  cov = new TH2F("cov","cov",npar,0.,(double)npar,npar,0.,(double)npar);
  cor = new TH2F("cor","cor",npar,0.,(double)npar,npar,0.,(double)npar);

  //set initial values to zero
  const int npartot = npar;
  double matrix[npartot][npartot];
  for (int i0=0;i0<npartot;i0++){
    mean[i0]=0.;
    for (int j0=0;j0<npartot;j0++){
      matrix[i0][j0] = 0.;
    }
  }

  //calc means
  int npts = partree->GetEntries()-nburn;
  double norm=1./(double)npts;
  cout<<"norm: "<<norm<<endl;
  for (int iev=nburn;iev<partree->GetEntries();iev++){
    partree->GetEntry(iev);
    for (int ipar=0;ipar<npartot;ipar++){
      mean[ipar]+= (par[ipar]*norm);
    }
  }
  for (int kk=0;kk<npartot;kk++){
      cout<<"mean: "<<kk<<" "<<mean[kk]<<endl;
  }

  //calc matrix
  norm = 1./((double)npts-1.);
  for (int jev=nburn;jev<partree->GetEntries();jev++){
    partree->GetEntry(jev);
    for (int i0=0;i0<npartot;i0++){
      for (int j0=0;j0<npartot;j0++){
        matrix[i0][j0] += ((norm)*( (par[i0]-mean[i0]) * (par[j0]-mean[j0]) ));
      }
    }
  }
  for (int kk=0;kk<npartot;kk++){
      cout<<"matrix: "<<kk<<" "<<matrix[kk][kk]<<endl;
  }

  //fill histogram of matrix values
  for (int j=0;j<npartot;j++){
    for (int k=0;k<npartot;k++){
      cov->SetBinContent(j+1,k+1,matrix[j][k]);
      cor->SetBinContent(j+1,k+1, ((matrix[j][k])/sqrt( (matrix[j][j]*matrix[k][k]) )));
    }
  }
  cor->SetContour(100);
  cor->Draw("colz");
  return;

}
void 
DrawContourLine95( TLegend *leg, TH2F* hist, const TString& text="", Int_t linecolor=CombinationGlob::c_VDarkGray, Int_t linestyle=2, Int_t linewidth=2 )
{
    // contour plot
    TH2F* h = new TH2F( *hist );
    h->SetContour( 1 );
    double pval = CombinationGlob::cl_percent[1];
    double signif = TMath::NormQuantile(1-pval);
    //cout << "signif: " <<signif << endl;
    h->SetContourLevel( 0, signif );

    h->SetLineColor( linecolor );
    h->SetLineWidth( linewidth );
    h->SetLineStyle( linestyle );
    h->Draw( "samecont3" );
    TString tmp = TString(text.Data());
    //   TString SR="SRA";
    //   TString meffcut="";
    //   TString momcut="";
    //   TString ismoriond="";
    // //     if (tmp.Contains("ombined") ) SR="Combined"
    //   if (tmp.Contains("SRA") ) SR="SRA";
    //   if (tmp.Contains("SRB") ) SR="SRB";
    //   if (tmp.Contains("SRC") ) SR="SRC";
    //   if (tmp.Contains("SRD") ) SR="SRD";
    //   if (tmp.Contains("SRE") ) SR="SRE";
    //   if (tmp.Contains("meff750") ) meffcut="750";
    //   if (tmp.Contains("meff800") ) meffcut="800";
    //   if (tmp.Contains("meff950") ) meffcut="950";
    //   if (tmp.Contains("meff900") ) meffcut="900";
    //   if (tmp.Contains("meff1000") ) meffcut="1000";
    //   if (tmp.Contains("meff1100") ) meffcut="1100";
    //   if (tmp.Contains("meff1250") ) meffcut="1250";
    //   if (tmp.Contains("meff1350") ) meffcut="1350";
    //   if (tmp.Contains("meff1200") ) meffcut="1200";
    //   if (tmp.Contains("meff1300") ) meffcut="1300";
    //   if (tmp.Contains("meff1400") ) meffcut="1400";
    //   if (tmp.Contains("meff1500") ) meffcut="1500";
    //   if (tmp.Contains("meff1600") ) meffcut="1600";
    //   if (tmp.Contains("meff1700") ) meffcut="1700";
    //   if (tmp.Contains("meff1800") ) meffcut="1800";
    //   if (tmp.Contains("metomeff0.15") ) momcut="0.15";
    //   if (tmp.Contains("metomeff0.2") ) momcut="0.2";
    //   if (tmp.Contains("metomeff0.25") ) momcut="0.25";
    //   if (tmp.Contains("metomeff0.3") ) momcut="0.3";
    //   if (tmp.Contains("metomeff0.35") ) momcut="0.35";
    //   if (tmp.Contains("metomeff0.4") ) momcut="0.4";
    //   if (tmp.Contains("metomeff0.45") ) momcut="0.45";
    //   if (tmp.Contains("metomeff0.5") ) momcut="0.5";
    //   if (tmp.Contains("metomeff0.275") ) momcut="0.275";
    //   else if (tmp.Contains("metomeff0.175") ) momcut="0.175";
    //   else if (tmp.Contains("metomeff0.375") ) momcut="0.375";
    //   else if (tmp.Contains("metomeff0.225") ) momcut="0.225";
    //   else if (tmp.Contains("metomeff0.325") ) momcut="0.325";
    //   else if (tmp.Contains("metomeff0.425") ) momcut="0.425";
    //   if (tmp.Contains("medium") ) meffcut="Medium";
    //   if (tmp.Contains("loose") ) meffcut="Loose";
    //   if (tmp.Contains("tight") ) meffcut="Tight";
    //   if (tmp.Contains("moriond") ) ismoriond=" : MORIOND CUTS";

    //  if (!tmp.Contains("ombined") ) { 
    //     //   cout << " meff cut = " << meffcut << " MET/meff  cut = " << momcut << " for tmp = " << tmp << endl;
    //     // if (tmp.Contains("loose") ||tmp.Contains("medium") ||tmp.Contains("tight") )  { if (!text.IsNull()) leg->AddEntry(h,SR+": "+meffcut+ismoriond,"l"); };
    // //     //  else if (tmp.Contains("ombined") ){ if (!text.IsNull()) leg->AddEntry(h,"Combined"+ismoriond,"l"); }
    // //     else { if (!text.IsNull()) leg->AddEntry(h,SR+": Meff > "+meffcut+" , MET/Meff > "+momcut,"l"); };
    //   }


    if (&text.Contains("Observed")) leg->AddEntry(h,text.Data(),"l");

    //if (!text.IsNull()) leg->AddEntry(h,text.Data(),"l"); 

}
void BinCovarianceHggRazor()
{
//=========Macro generated from canvas: c1/c1
//=========  (Thu Mar 16 13:20:44 2017) by ROOT version6.08/00
   TCanvas *c1 = new TCanvas("c1", "c1",624,156,1045,740);
   c1->Range(-2.904762,-4.218216,21.92857,21.55977);
   c1->SetFillColor(0);
   c1->SetBorderMode(0);
   c1->SetBorderSize(2);
   c1->SetLeftMargin(0.1169703);
   c1->SetRightMargin(0.117929);
   c1->SetBottomMargin(0.1636364);
   c1->SetFrameBorderMode(0);
   c1->SetFrameBorderMode(0);
   
   TH2F *corr = new TH2F("corr","Background Covariance Matrix",19,0,19,19,0,19);
   corr->SetBinContent(22,7.200001);
   corr->SetBinContent(23,0.2672915);
   corr->SetBinContent(24,0.001625223);
   corr->SetBinContent(25,3.449828);
   corr->SetBinContent(26,2.003306);
   corr->SetBinContent(27,-0.1299037);
   corr->SetBinContent(28,1.094266);
   corr->SetBinContent(29,0.6026603);
   corr->SetBinContent(30,0.3772124);
   corr->SetBinContent(31,4.398799);
   corr->SetBinContent(32,0.5182461);
   corr->SetBinContent(33,0.4639761);
   corr->SetBinContent(34,-1.045344);
   corr->SetBinContent(35,-0.1582571);
   corr->SetBinContent(36,3.917425);
   corr->SetBinContent(37,0.3293888);
   corr->SetBinContent(38,0.5363065);
   corr->SetBinContent(39,0.112652);
   corr->SetBinContent(40,-0.4577291);
   corr->SetBinContent(43,0.2672915);
   corr->SetBinContent(44,7.06);
   corr->SetBinContent(45,0.02738067);
   corr->SetBinContent(46,10.20474);
   corr->SetBinContent(47,1.258074);
   corr->SetBinContent(48,0.2655874);
   corr->SetBinContent(49,0.05856049);
   corr->SetBinContent(50,0.1689017);
   corr->SetBinContent(51,-0.203687);
   corr->SetBinContent(52,-1.356623);
   corr->SetBinContent(53,-0.1403674);
   corr->SetBinContent(54,0.1150756);
   corr->SetBinContent(55,-1.715165);
   corr->SetBinContent(56,0.3716204);
   corr->SetBinContent(57,1.576942);
   corr->SetBinContent(58,0.4120814);
   corr->SetBinContent(59,-0.5644981);
   corr->SetBinContent(60,2.312829);
   corr->SetBinContent(61,-0.1745173);
   corr->SetBinContent(64,0.001625223);
   corr->SetBinContent(65,0.02738067);
   corr->SetBinContent(66,6.85);
   corr->SetBinContent(67,2.261283);
   corr->SetBinContent(68,1.963802);
   corr->SetBinContent(69,0.0992774);
   corr->SetBinContent(70,0.2134901);
   corr->SetBinContent(71,0.4936861);
   corr->SetBinContent(72,0.09001485);
   corr->SetBinContent(73,3.081846);
   corr->SetBinContent(74,-0.03320625);
   corr->SetBinContent(75,0.02650541);
   corr->SetBinContent(76,0.5989376);
   corr->SetBinContent(77,0.2271089);
   corr->SetBinContent(78,1.603218);
   corr->SetBinContent(79,0.2573114);
   corr->SetBinContent(80,-0.2396841);
   corr->SetBinContent(81,-0.8127553);
   corr->SetBinContent(82,0.8586979);
   corr->SetBinContent(85,3.456811);
   corr->SetBinContent(86,10.22542);
   corr->SetBinContent(87,2.265859);
   corr->SetBinContent(88,1809.14);
   corr->SetBinContent(89,-1.012275);
   corr->SetBinContent(90,6.697715);
   corr->SetBinContent(91,9.605417);
   corr->SetBinContent(92,-0.8592414);
   corr->SetBinContent(93,4.409427);
   corr->SetBinContent(94,54.40217);
   corr->SetBinContent(95,-1.380551);
   corr->SetBinContent(96,1.818917);
   corr->SetBinContent(97,40.60707);
   corr->SetBinContent(98,-3.56902);
   corr->SetBinContent(99,106.0525);
   corr->SetBinContent(100,-2.953686);
   corr->SetBinContent(101,2.048589);
   corr->SetBinContent(102,-36.2908);
   corr->SetBinContent(103,4.93098);
   corr->SetBinContent(106,2.007359);
   corr->SetBinContent(107,1.260622);
   corr->SetBinContent(108,1.967779);
   corr->SetBinContent(109,-1.012275);
   corr->SetBinContent(110,256.49);
   corr->SetBinContent(111,1.281127);
   corr->SetBinContent(112,2.073658);
   corr->SetBinContent(113,2.264486);
   corr->SetBinContent(114,-1.336645);
   corr->SetBinContent(115,38.93255);
   corr->SetBinContent(116,1.86029);
   corr->SetBinContent(117,0.04544767);
   corr->SetBinContent(118,28.44881);
   corr->SetBinContent(119,-2.154541);
   corr->SetBinContent(120,39.41811);
   corr->SetBinContent(121,0.8762429);
   corr->SetBinContent(122,5.192766);
   corr->SetBinContent(123,6.060677);
   corr->SetBinContent(124,2.462171);
   corr->SetBinContent(127,-0.1299037);
   corr->SetBinContent(128,0.2655874);
   corr->SetBinContent(129,0.0992774);
   corr->SetBinContent(130,6.68419);
   corr->SetBinContent(131,1.278538);
   corr->SetBinContent(132,7.25);
   corr->SetBinContent(133,1.210454);
   corr->SetBinContent(134,-0.2097035);
   corr->SetBinContent(135,-8.765232e-05);
   corr->SetBinContent(136,3.902545);
   corr->SetBinContent(137,-0.3170787);
   corr->SetBinContent(138,-0.5794553);
   corr->SetBinContent(139,4.478106);
   corr->SetBinContent(140,-0.4768105);
   corr->SetBinContent(141,1.30636);
   corr->SetBinContent(142,0.3664042);
   corr->SetBinContent(143,-0.3664501);
   corr->SetBinContent(144,1.077817);
   corr->SetBinContent(145,-0.4731456);
   corr->SetBinContent(148,1.073224);
   corr->SetBinContent(149,0.05743426);
   corr->SetBinContent(150,0.2093844);
   corr->SetBinContent(151,9.40167);
   corr->SetBinContent(152,2.029672);
   corr->SetBinContent(153,1.187176);
   corr->SetBinContent(154,24.93);
   corr->SetBinContent(155,0.9106724);
   corr->SetBinContent(156,0.005313865);
   corr->SetBinContent(157,3.027986);
   corr->SetBinContent(158,0.08652855);
   corr->SetBinContent(159,0.1306128);
   corr->SetBinContent(160,5.661592);
   corr->SetBinContent(161,0.4646386);
   corr->SetBinContent(162,-5.217519);
   corr->SetBinContent(163,0.1571939);
   corr->SetBinContent(164,1.094535);
   corr->SetBinContent(165,2.11375);
   corr->SetBinContent(166,0.776071);
   corr->SetBinContent(169,0.6026603);
   corr->SetBinContent(170,0.1689017);
   corr->SetBinContent(171,0.4936861);
   corr->SetBinContent(172,-0.8575042);
   corr->SetBinContent(173,2.259912);
   corr->SetBinContent(174,-0.2097035);
   corr->SetBinContent(175,0.9285287);
   corr->SetBinContent(176,12.01);
   corr->SetBinContent(177,-0.4210026);
   corr->SetBinContent(178,-7.775839);
   corr->SetBinContent(179,-0.4606768);
   corr->SetBinContent(180,0.2147063);
   corr->SetBinContent(181,-1.253046);
   corr->SetBinContent(182,0.3347198);
   corr->SetBinContent(183,1.034227);
   corr->SetBinContent(184,0.01147097);
   corr->SetBinContent(185,0.09434997);
   corr->SetBinContent(186,-0.4641604);
   corr->SetBinContent(187,1.080481);
   corr->SetBinContent(190,0.3772124);
   corr->SetBinContent(191,-0.203687);
   corr->SetBinContent(192,0.09001485);
   corr->SetBinContent(193,4.40052);
   corr->SetBinContent(194,-1.333945);
   corr->SetBinContent(195,-8.765232e-05);
   corr->SetBinContent(196,0.005417521);
   corr->SetBinContent(197,-0.4210026);
   corr->SetBinContent(198,9.769999);
   corr->SetBinContent(199,-6.455331);
   corr->SetBinContent(200,0.05779311);
   corr->SetBinContent(201,-0.1471536);
   corr->SetBinContent(202,-0.3639791);
   corr->SetBinContent(203,-0.06047838);
   corr->SetBinContent(204,-3.252086);
   corr->SetBinContent(205,0.1885649);
   corr->SetBinContent(206,0.6627039);
   corr->SetBinContent(207,0.2928204);
   corr->SetBinContent(208,-1.060261);
   corr->SetBinContent(211,4.407704);
   corr->SetBinContent(212,-1.35937);
   corr->SetBinContent(213,3.088085);
   corr->SetBinContent(214,54.40217);
   corr->SetBinContent(215,38.93255);
   corr->SetBinContent(216,3.910446);
   corr->SetBinContent(217,3.093611);
   corr->SetBinContent(218,-7.791583);
   corr->SetBinContent(219,-6.468398);
   corr->SetBinContent(220,857.89);
   corr->SetBinContent(221,-0.5174752);
   corr->SetBinContent(222,5.507917);
   corr->SetBinContent(223,42.01412);
   corr->SetBinContent(224,4.45688);
   corr->SetBinContent(225,44.79397);
   corr->SetBinContent(226,-4.060115);
   corr->SetBinContent(227,-13.04204);
   corr->SetBinContent(228,-29.73159);
   corr->SetBinContent(229,-2.903305);
   corr->SetBinContent(232,0.5182461);
   corr->SetBinContent(233,-0.1403674);
   corr->SetBinContent(234,-0.03320625);
   corr->SetBinContent(235,-1.377762);
   corr->SetBinContent(236,1.856531);
   corr->SetBinContent(237,-0.3170787);
   corr->SetBinContent(238,0.08822516);
   corr->SetBinContent(239,-0.4606768);
   corr->SetBinContent(240,0.05779311);
   corr->SetBinContent(241,-0.5164298);
   corr->SetBinContent(242,7.650001);
   corr->SetBinContent(243,-0.1925722);
   corr->SetBinContent(244,0.5093402);
   corr->SetBinContent(245,-0.2442501);
   corr->SetBinContent(246,-1.347253);
   corr->SetBinContent(247,0.1364561);
   corr->SetBinContent(248,-0.875925);
   corr->SetBinContent(249,-2.778971);
   corr->SetBinContent(250,-0.1065624);
   corr->SetBinContent(253,0.4639761);
   corr->SetBinContent(254,0.1150756);
   corr->SetBinContent(255,0.02650541);
   corr->SetBinContent(256,1.815242);
   corr->SetBinContent(257,0.04535576);
   corr->SetBinContent(258,-0.5794553);
   corr->SetBinContent(259,0.1331737);
   corr->SetBinContent(260,0.2147063);
   corr->SetBinContent(261,-0.1471536);
   corr->SetBinContent(262,5.496789);
   corr->SetBinContent(263,-0.1925722);
   corr->SetBinContent(264,21.32);
   corr->SetBinContent(265,2.282518);
   corr->SetBinContent(266,2.157221);
   corr->SetBinContent(267,4.829895);
   corr->SetBinContent(268,1.112747);
   corr->SetBinContent(269,0.2784669);
   corr->SetBinContent(270,3.753212);
   corr->SetBinContent(271,1.591138);
   corr->SetBinContent(274,-1.047459);
   corr->SetBinContent(275,-1.718638);
   corr->SetBinContent(276,0.6001508);
   corr->SetBinContent(277,40.60707);
   corr->SetBinContent(278,28.44881);
   corr->SetBinContent(279,4.48717);
   corr->SetBinContent(280,5.784283);
   corr->SetBinContent(281,-1.255583);
   corr->SetBinContent(282,-0.3647164);
   corr->SetBinContent(283,42.01412);
   corr->SetBinContent(284,0.510371);
   corr->SetBinContent(285,2.287134);
   corr->SetBinContent(286,641.45);
   corr->SetBinContent(287,15.21948);
   corr->SetBinContent(288,21.97221);
   corr->SetBinContent(289,-1.498767);
   corr->SetBinContent(290,-0.6768517);
   corr->SetBinContent(291,20.97092);
   corr->SetBinContent(292,-0.8102957);
   corr->SetBinContent(295,-0.1582571);
   corr->SetBinContent(296,0.3716204);
   corr->SetBinContent(297,0.2271089);
   corr->SetBinContent(298,-3.561811);
   corr->SetBinContent(299,-2.150187);
   corr->SetBinContent(300,-0.4768105);
   corr->SetBinContent(301,0.473749);
   corr->SetBinContent(302,0.3347198);
   corr->SetBinContent(303,-0.06047838);
   corr->SetBinContent(304,4.447877);
   corr->SetBinContent(305,-0.2442501);
   corr->SetBinContent(306,2.157221);
   corr->SetBinContent(307,15.18873);
   corr->SetBinContent(308,30.77);
   corr->SetBinContent(309,2.766883);
   corr->SetBinContent(310,-0.04555257);
   corr->SetBinContent(311,-2.424916);
   corr->SetBinContent(312,-3.012514);
   corr->SetBinContent(313,2.505161);
   corr->SetBinContent(316,3.925359);
   corr->SetBinContent(317,1.580133);
   corr->SetBinContent(318,1.606464);
   corr->SetBinContent(319,106.0525);
   corr->SetBinContent(320,39.41811);
   corr->SetBinContent(321,1.309003);
   corr->SetBinContent(322,-5.330599);
   corr->SetBinContent(323,1.036319);
   corr->SetBinContent(324,-3.25867);
   corr->SetBinContent(325,44.79397);
   corr->SetBinContent(326,-1.34998);
   corr->SetBinContent(327,4.839672);
   corr->SetBinContent(328,21.97221);
   corr->SetBinContent(329,2.772484);
   corr->SetBinContent(330,1073.14);
   corr->SetBinContent(331,3.813272);
   corr->SetBinContent(332,-6.864117);
   corr->SetBinContent(333,25.17929);
   corr->SetBinContent(334,8.678784);
   corr->SetBinContent(337,0.3293888);
   corr->SetBinContent(338,0.4120814);
   corr->SetBinContent(339,0.2573114);
   corr->SetBinContent(340,-2.947719);
   corr->SetBinContent(341,0.8744726);
   corr->SetBinContent(342,0.3664042);
   corr->SetBinContent(343,0.1602762);
   corr->SetBinContent(344,0.01147097);
   corr->SetBinContent(345,0.1885649);
   corr->SetBinContent(346,-4.051914);
   corr->SetBinContent(347,0.1364561);
   corr->SetBinContent(348,1.112747);
   corr->SetBinContent(349,-1.495737);
   corr->SetBinContent(350,-0.04555257);
   corr->SetBinContent(351,3.805569);
   corr->SetBinContent(352,9.09);
   corr->SetBinContent(353,0.1903553);
   corr->SetBinContent(354,0.5499064);
   corr->SetBinContent(355,0.5727072);
   corr->SetBinContent(358,0.5373924);
   corr->SetBinContent(359,-0.5656406);
   corr->SetBinContent(360,-0.2401691);
   corr->SetBinContent(361,2.048589);
   corr->SetBinContent(362,5.192766);
   corr->SetBinContent(363,-0.367192);
   corr->SetBinContent(364,1.118255);
   corr->SetBinContent(365,0.09454096);
   corr->SetBinContent(366,0.6640464);
   corr->SetBinContent(367,-13.04204);
   corr->SetBinContent(368,-0.8776976);
   corr->SetBinContent(369,0.27903);
   corr->SetBinContent(370,-0.6768517);
   corr->SetBinContent(371,-2.429823);
   corr->SetBinContent(372,-6.864117);
   corr->SetBinContent(373,0.1907412);
   corr->SetBinContent(374,109.6);
   corr->SetBinContent(375,7.16569);
   corr->SetBinContent(376,-1.180023);
   corr->SetBinContent(379,0.1128808);
   corr->SetBinContent(380,2.31751);
   corr->SetBinContent(381,-0.814401);
   corr->SetBinContent(382,-36.2908);
   corr->SetBinContent(383,6.060677);
   corr->SetBinContent(384,1.079998);
   corr->SetBinContent(385,2.159559);
   corr->SetBinContent(386,-0.4650993);
   corr->SetBinContent(387,0.2934131);
   corr->SetBinContent(388,-29.73159);
   corr->SetBinContent(389,-2.784595);
   corr->SetBinContent(390,3.760808);
   corr->SetBinContent(391,20.97092);
   corr->SetBinContent(392,-3.018612);
   corr->SetBinContent(393,25.17929);
   corr->SetBinContent(394,0.5510197);
   corr->SetBinContent(395,7.16569);
   corr->SetBinContent(396,254.5);
   corr->SetBinContent(397,-1.087226);
   corr->SetBinContent(400,-0.4577291);
   corr->SetBinContent(401,-0.1745173);
   corr->SetBinContent(402,0.8586979);
   corr->SetBinContent(403,4.921021);
   corr->SetBinContent(404,2.457195);
   corr->SetBinContent(405,-0.4731456);
   corr->SetBinContent(406,0.7912881);
   corr->SetBinContent(407,1.080481);
   corr->SetBinContent(408,-1.060261);
   corr->SetBinContent(409,-2.89744);
   corr->SetBinContent(410,-0.1065624);
   corr->SetBinContent(411,1.591138);
   corr->SetBinContent(412,-0.8086588);
   corr->SetBinContent(413,2.505161);
   corr->SetBinContent(414,8.661255);
   corr->SetBinContent(415,0.5727072);
   corr->SetBinContent(416,-1.17764);
   corr->SetBinContent(417,-1.085029);
   corr->SetBinContent(418,30.42);
   corr->SetMinimum(-4000);
   corr->SetMaximum(4000);
   corr->SetEntries(361);
   corr->SetStats(0);
   corr->SetContour(20);
   corr->SetContourLevel(0,-4000);
   corr->SetContourLevel(1,-3600);
   corr->SetContourLevel(2,-3200);
   corr->SetContourLevel(3,-2800);
   corr->SetContourLevel(4,-2400);
   corr->SetContourLevel(5,-2000);
   corr->SetContourLevel(6,-1600);
   corr->SetContourLevel(7,-1200);
   corr->SetContourLevel(8,-800);
   corr->SetContourLevel(9,-400);
   corr->SetContourLevel(10,0);
   corr->SetContourLevel(11,400);
   corr->SetContourLevel(12,800);
   corr->SetContourLevel(13,1200);
   corr->SetContourLevel(14,1600);
   corr->SetContourLevel(15,2000);
   corr->SetContourLevel(16,2400);
   corr->SetContourLevel(17,2800);
   corr->SetContourLevel(18,3200);
   corr->SetContourLevel(19,3600);
   
   TPaletteAxis *palette = new TPaletteAxis(19.11905,-0.7931685,20.2619,19.82922,corr);
palette->SetLabelColor(1);
palette->SetLabelFont(42);
palette->SetLabelOffset(0.005);
palette->SetLabelSize(0.035);
palette->SetTitleOffset(1);
palette->SetTitleSize(0.035);

   Int_t ci;      // for color index setting
   TColor *color; // for color definition with alpha
   ci = TColor::GetColor("#f9f90e");
   palette->SetFillColor(ci);
   palette->SetFillStyle(1001);
   corr->GetListOfFunctions()->Add(palette,"br");

   ci = TColor::GetColor("#000099");
   corr->SetLineColor(ci);
   corr->GetXaxis()->SetBinLabel(1,"Bin 0");
   corr->GetXaxis()->SetBinLabel(2,"Bin 1");
   corr->GetXaxis()->SetBinLabel(3,"Bin 2");
   corr->GetXaxis()->SetBinLabel(4,"Bin 3");
   corr->GetXaxis()->SetBinLabel(5,"Bin 4");
   corr->GetXaxis()->SetBinLabel(6,"Bin 5");
   corr->GetXaxis()->SetBinLabel(7,"Bin 6");
   corr->GetXaxis()->SetBinLabel(8,"Bin 7");
   corr->GetXaxis()->SetBinLabel(9,"Bin 8");
   corr->GetXaxis()->SetBinLabel(10,"Bin 9 HighRes");
   corr->GetXaxis()->SetBinLabel(11,"Bin 10 HighRes");
   corr->GetXaxis()->SetBinLabel(12,"Bin 11 HighRes");
   corr->GetXaxis()->SetBinLabel(13,"Bin 12 HighRes");
   corr->GetXaxis()->SetBinLabel(14,"Bin 13 HighRes");
   corr->GetXaxis()->SetBinLabel(15,"Bin 9 LowRes");
   corr->GetXaxis()->SetBinLabel(16,"Bin 10 LowRes");
   corr->GetXaxis()->SetBinLabel(17,"Bin 11 LowRes");
   corr->GetXaxis()->SetBinLabel(18,"Bin 12 LowRes");
   corr->GetXaxis()->SetBinLabel(19,"Bin 13 LowRes");
   corr->GetXaxis()->SetBit(TAxis::kLabelsVert);
   corr->GetXaxis()->SetLabelFont(42);
   corr->GetXaxis()->SetLabelSize(0.035);
   corr->GetXaxis()->SetTitleSize(0.035);
   corr->GetXaxis()->SetTitleFont(42);
   corr->GetYaxis()->SetBinLabel(1,"Bin 0");
   corr->GetYaxis()->SetBinLabel(2,"Bin 1");
   corr->GetYaxis()->SetBinLabel(3,"Bin 2");
   corr->GetYaxis()->SetBinLabel(4,"Bin 3");
   corr->GetYaxis()->SetBinLabel(5,"Bin 4");
   corr->GetYaxis()->SetBinLabel(6,"Bin 5");
   corr->GetYaxis()->SetBinLabel(7,"Bin 6");
   corr->GetYaxis()->SetBinLabel(8,"Bin 7");
   corr->GetYaxis()->SetBinLabel(9,"Bin 8");
   corr->GetYaxis()->SetBinLabel(10,"Bin 9 HighRes");
   corr->GetYaxis()->SetBinLabel(11,"Bin 10 HighRes");
   corr->GetYaxis()->SetBinLabel(12,"Bin 11 HighRes");
   corr->GetYaxis()->SetBinLabel(13,"Bin 12 HighRes");
   corr->GetYaxis()->SetBinLabel(14,"Bin 13 HighRes");
   corr->GetYaxis()->SetBinLabel(15,"Bin 9 LowRes");
   corr->GetYaxis()->SetBinLabel(16,"Bin 10 LowRes");
   corr->GetYaxis()->SetBinLabel(17,"Bin 11 LowRes");
   corr->GetYaxis()->SetBinLabel(18,"Bin 12 LowRes");
   corr->GetYaxis()->SetBinLabel(19,"Bin 13 LowRes");
   corr->GetYaxis()->SetLabelFont(42);
   corr->GetYaxis()->SetLabelSize(0.035);
   corr->GetYaxis()->SetTitleSize(0.035);
   corr->GetYaxis()->SetTitleFont(42);
   corr->GetZaxis()->SetLabelFont(42);
   corr->GetZaxis()->SetLabelSize(0.035);
   corr->GetZaxis()->SetTitleSize(0.035);
   corr->GetZaxis()->SetTitleFont(42);
   corr->Draw("colz+text");
   
   TPaveText *pt = new TPaveText(0.2371347,0.9343684,0.7628653,0.995,"blNDC");
   pt->SetName("title");
   pt->SetBorderSize(0);
   pt->SetFillColor(0);
   pt->SetFillStyle(0);
   pt->SetTextFont(42);
   TText *AText = pt->AddText("Background Covariance Matrix");
   pt->Draw();
   c1->Modified();
   c1->cd();
   c1->SetSelected(c1);
}
    void 
DrawContourSameColor( TLegend *leg, TH2F* hist, Int_t nsigma, TString color, Bool_t second=kFALSE, TH2F* inverse=0, Bool_t linesOnly=kFALSE, Bool_t isnobs=kFALSE )
{
    if (nsigma < 1 || nsigma > 3) {
        cout << "*** Error in CombinationGlob::DrawContour: nsigma out of range: " << nsigma 
            << "==> abort" << endl;
        exit(1);
    }
    nsigma--; // used as array index

    Int_t lcol_sigma;
    Int_t fcol_sigma[3];
    Int_t lstyle = 1;
    if( color == "pink" ){
        lcol_sigma    = CombinationGlob::c_VDarkPink;
        fcol_sigma[0] = CombinationGlob::c_LightPink;
        fcol_sigma[1] = CombinationGlob::c_LightPink;
        fcol_sigma[2] = CombinationGlob::c_LightPink;
    }
    else if( color == "green" ){ // HF
        lcol_sigma    = CombinationGlob::c_VDarkGreen;
        fcol_sigma[0] = CombinationGlob::c_DarkGreen;
        fcol_sigma[1] = CombinationGlob::c_LightGreen;
        fcol_sigma[2] = CombinationGlob::c_VLightGreen;
    } 
    else if( color == "yellow" ){
        lcol_sigma    = CombinationGlob::c_VDarkYellow;
        fcol_sigma[0] = CombinationGlob::c_DarkYellow;
        fcol_sigma[1] = CombinationGlob::c_DarkYellow;
        fcol_sigma[2] = CombinationGlob::c_White; //c_DarkYellow;
        lstyle = 2;
    }
    else if( color == "orange" ){
        lcol_sigma    = CombinationGlob::c_VDarkOrange;
        fcol_sigma[0] = CombinationGlob::c_DarkOrange;
        fcol_sigma[1] = CombinationGlob::c_LightOrange; // c_DarkOrange
        fcol_sigma[2] = CombinationGlob::c_VLightOrange;
    }
    else if( color == "gray" ){
        lcol_sigma    = CombinationGlob::c_VDarkGray;
        fcol_sigma[0] = CombinationGlob::c_LightGray;
        fcol_sigma[1] = CombinationGlob::c_LightGray;
        fcol_sigma[2] = CombinationGlob::c_LightGray;
    }
    else if( color == "blue" ){
        lcol_sigma    = CombinationGlob::c_DarkBlueT1;
        fcol_sigma[0] = CombinationGlob::c_BlueT5;
        fcol_sigma[1] = CombinationGlob::c_BlueT3;
        fcol_sigma[2] = CombinationGlob::c_White;  //CombinationGlob::c_BlueT2;

    }

    // contour plot
    TH2F* h = new TH2F( *hist );
    h->SetContour( 1 );
    double pval = CombinationGlob::cl_percent[1];
    double signif = TMath::NormQuantile(1-pval);
    double dnsigma = double(nsigma)-1.;
    double dsignif = signif + dnsigma;
    h->SetContourLevel( 0, dsignif );

    if( !second ){
        h->SetFillColor( fcol_sigma[nsigma] );

        if (!linesOnly) h->Draw( "samecont0" );
    }

    h->SetLineColor( nsigma==1? 1 : lcol_sigma );
    if (isnobs)h->SetLineColor( nsigma==1? 2 : lcol_sigma );
    //h->SetLineStyle( 4 );
    h->SetLineWidth( 2 );
    h->SetLineStyle( lstyle );
    h->Draw( "samecont3" );

    if (linesOnly&&!isnobs)
        if(nsigma==1){ leg->AddEntry(h,"exp. 95% CL limit","l");}
    if (isnobs)
        if(nsigma==1){ leg->AddEntry(h,"obs. 95% CL limit","l");}  
    if (!linesOnly) {
        if(nsigma==0){ leg->AddEntry(h,"- 1 #sigma expectation","l"); }
        if(nsigma==2){ leg->AddEntry(h,"+ 1 #sigma expectation","l");}
    } 
}
Exemple #14
0
void rulevisHists( TDirectory *rfdir, TDirectory *vardir, TDirectory *corrdir, TMVAGlob::TypeOfPlot type) {
   //
   if (rfdir==0)   return;
   if (vardir==0)  return;
   if (corrdir==0) return;
   //
   const TString rfName    = rfdir->GetName();
   const TString maintitle = rfName + " : Rule Importance";
   const TString rfNameOpt = "_RF2D_";
   const TString outfname[TMVAGlob::kNumOfMethods] = { "rulevisHists",
                                                       "rulevisHists_decorr",
                                                       "rulevisCorr_pca",
                                                       "rulevisCorr_gaussdecorr" };

   const TString outputName = outfname[type]+"_"+rfdir->GetName();
   //
   TIter rfnext(rfdir->GetListOfKeys());
   TKey *rfkey;
   Double_t rfmax;
   Double_t rfmin;
   Bool_t allEmpty=kTRUE;
   Bool_t first=kTRUE;
   while ((rfkey = (TKey*)rfnext())) {
      // make sure, that we only look at histograms
      TClass *cl = gROOT->GetClass(rfkey->GetClassName());
      if (!cl->InheritsFrom("TH2F")) continue;
      TH2F *hrf = (TH2F*)rfkey->ReadObj();
      TString hname= hrf->GetName();
      if (hname.Contains("__RF_")){ // found a new RF plot
         Double_t valmin = hrf->GetMinimum();
         Double_t valmax = hrf->GetMaximum();
         if (first) {
            rfmin=valmin;
            rfmax=valmax;
            first = kFALSE;
         } else {
            if (valmax>rfmax) rfmax=valmax;
            if (valmin<rfmin) rfmin=valmin;
         }
         if (hrf->GetEntries()>0) allEmpty=kFALSE;
      }
   }
   if (first) {
      cout << "ERROR: no RF plots found..." << endl;
      return;
   }

   const Int_t nContours = 100;
   Double_t contourLevels[nContours];
   Double_t dcl = (rfmax-rfmin)/Double_t(nContours-1);
   //
   for (Int_t i=0; i<nContours; i++) {
      contourLevels[i] = rfmin+dcl*Double_t(i);
   }

   ///////////////////////////
   vardir->cd();
 
   // how many plots are in the directory?
   Int_t noPlots = ((vardir->GetListOfKeys())->GetEntries()) / 2;
 
   // define Canvas layout here!
   // default setting
   Int_t xPad;  // no of plots in x
   Int_t yPad;  // no of plots in y
   Int_t width; // size of canvas
   Int_t height;
   switch (noPlots) {
   case 1:
      xPad = 1; yPad = 1; width = 500; height = 0.7*width; break;
   case 2:
      xPad = 2; yPad = 1; width = 600; height = 0.7*width; break;
   case 3:
      xPad = 3; yPad = 1; width = 900; height = 0.4*width; break;
   case 4:
      xPad = 2; yPad = 2; width = 600; height = width; break;
   default:
      xPad = 3; yPad = 2; width = 800; height = 0.7*width; break;
   }
   Int_t noPad = xPad * yPad ;   

   // this defines how many canvases we need
   const Int_t noCanvas = 1 + (Int_t)((noPlots - 0.001)/noPad);
   TCanvas **c = new TCanvas*[noCanvas];
   for (Int_t ic=0; ic<noCanvas; ic++) c[ic] = 0;

   // counter variables
   Int_t countCanvas = 0;
   Int_t countPad    = 1;

   // loop over all objects in directory
   TIter next(vardir->GetListOfKeys());
   TKey *key;
   TH1F *sigCpy=0;
   TH1F *bgdCpy=0;
   //
   Bool_t first = kTRUE;

   while ((key = (TKey*)next())) {

      // make sure, that we only look at histograms
      TClass *cl = gROOT->GetClass(key->GetClassName());
      if (!cl->InheritsFrom("TH1")) continue;
      sig = (TH1F*)key->ReadObj();
      TString hname= sig->GetName();

      // check for all signal histograms
      if (hname.Contains("__S")){ // found a new signal plot
         //         sigCpy = new TH1F(*sig);
         // create new canvas
         if ((c[countCanvas]==NULL) || (countPad>noPad)) {
            char cn[20];
            sprintf( cn, "rulehist%d_", countCanvas+1 );
            TString cname(cn);
            cname += rfdir->GetName();
            c[countCanvas] = new TCanvas( cname, maintitle,
                                          countCanvas*50+200, countCanvas*20, width, height ); 
            // style
            c[countCanvas]->Divide(xPad,yPad);
            countPad = 1;
         }       

         // save canvas to file
         TPad *cPad = (TPad *)(c[countCanvas]->GetPad(countPad));
         c[countCanvas]->cd(countPad);
         countPad++;

         // find the corredponding background histo
         TString bgname = hname;
         bgname.ReplaceAll("__S","__B");
         hkey = vardir->GetKey(bgname);
         bgd = (TH1F*)hkey->ReadObj();
         if (bgd == NULL) {
            cout << "ERROR!!! couldn't find backgroung histo for" << hname << endl;
            exit;
         }

         TString rfname = hname;
         rfname.ReplaceAll("__S","__RF");
         TKey *hrfkey = rfdir->GetKey(rfname);
         TH2F *hrf = (TH2F*)hrfkey->ReadObj();
         Double_t wv = hrf->GetMaximum();
         //         if (rfmax>0.0)
         //            hrf->Scale(1.0/rfmax);
         hrf->SetMinimum(rfmin); // make sure it's zero  -> for palette axis
         hrf->SetMaximum(rfmax); // make sure max is 1.0 -> idem
         hrf->SetContour(nContours,&contourLevels[0]);

         // this is set but not stored during plot creation in MVA_Factory
         //         TMVAGlob::SetSignalAndBackgroundStyle( sigK, bgd );
         sig->SetFillStyle(3002);
         sig->SetFillColor(1);
         sig->SetLineColor(1);
         sig->SetLineWidth(2);

         bgd->SetFillStyle(3554);
         bgd->SetFillColor(1);
         bgd->SetLineColor(1);
         bgd->SetLineWidth(2);

         // chop off "signal" 
         TString title(hrf->GetTitle());
         title.ReplaceAll("signal","");

         // finally plot and overlay       
         Float_t sc = 1.1;
         if (countPad==2) sc = 1.3;
         sig->SetMaximum( TMath::Max( sig->GetMaximum(), bgd->GetMaximum() )*sc );
         Double_t smax = sig->GetMaximum();

         if (first) {
            hrf->SetTitle( maintitle );
            first = kFALSE;
         } else {
            hrf->SetTitle( "" );
         }
         hrf->Draw("colz ah");
         TMVAGlob::SetFrameStyle( hrf, 1.2 );

         sig->Draw("same ah");
         bgd->Draw("same ah");
         // draw axis using range [0,smax]
         hrf->GetXaxis()->SetTitle( title );
         hrf->GetYaxis()->SetTitleOffset( 1.30 );
         hrf->GetYaxis()->SetTitle("Events");
         hrf->GetYaxis()->SetLimits(0,smax);
         hrf->Draw("same axis");

         cPad->SetRightMargin(0.13);
         cPad->Update();

         // Draw legend
         if (countPad==2){
            TLegend *legend= new TLegend( cPad->GetLeftMargin(), 
                                          1-cPad->GetTopMargin()-.18, 
                                          cPad->GetLeftMargin()+.4, 
                                          1-cPad->GetTopMargin() );
            legend->AddEntry(sig,"Signal","F");
            legend->AddEntry(bgd,"Background","F");
            legend->Draw("same");
            legend->SetBorderSize(1);
            legend->SetMargin( 0.3 );
            legend->SetFillColor(19);
            legend->SetFillStyle(1);
         } 

         // save canvas to file
         if (countPad > noPad) {
            c[countCanvas]->Update();
            TString fname = Form( "plots/%s_c%i", outputName.Data(), countCanvas+1 );
            TMVAGlob::imgconv( c[countCanvas], fname );
            //        TMVAGlob::plot_logo(); // don't understand why this doesn't work ... :-(
            countCanvas++;
         }
      }
   }

   if (countPad <= noPad) {
      c[countCanvas]->Update();
      TString fname = Form( "plots/%s_c%i", outputName.Data(), countCanvas+1 );
      TMVAGlob::imgconv( c[countCanvas], fname );
   }
}
void makeValidationPlots(TTree* tree, sel_t type,bool isMC) {

  SelectionStrings strings;

  TString tag="";

  TString lowString="",midString="",highString="";

  switch(type) {
  case kReal:
    tag = "_realselection";
    break;
  case kShift:
    tag = "_side";
    break;
  case kSingleIso:
    tag = "_singleIso";
    break;
  }
  if(isMC) {
    tag+="__DiPhotonJets";
  }
  Double_t Red[] = {0.00, 0.70, 0.90, 1.00, 1.00, 1.00, 1.00};
  Double_t Green[] ={0.00, 0.70, 0.90, 1.00, 0.90, 0.70, 0.00};
  Double_t Blue[] = {1.00, 1.00, 1.00, 1.00, 0.90, 0.70, 0.00};
  Double_t Length[] =  {0.00, 0.20, 0.35, 0.50, 0.65, 0.8, 1.00};

  TCanvas cv;

  std::vector<TH2F*> nSigs;
  std::vector<TH2F*> nSigs_gauss;

  cv.SetLogx();
  for(int iBox=0; iBox<SigRegionBinning::nBoxes; iBox++) {
    TString boxName = SigRegionBinning::getRegionName(static_cast<SigRegionBinning::BinningRegion>(iBox));
    switch(type) {
    case kReal:
      lowString = strings.baseSelection+" && mgg>103 && mgg<120";
      midString = strings.baseSelection+" && "+strings.mggSigRegion[iBox];
      highString = strings.baseSelection+" && mgg>131 && mgg<160";
      break;
    case kShift:
      lowString = strings.baseSelection+" && mgg>130 && mgg<140";
      midString = strings.baseSelection+" && mgg>140 && mgg<150";
      highString = strings.baseSelection+" && mgg>150 && mgg<160";
      break;
    case kSingleIso:
      lowString = TString("(pho1_pt>40 && pho2_pt>25 && abs(pho1_eta)<1.48 && abs(pho2_eta)<1.48 && (pho1_pass_iso || pho2_pass_iso) && !(pho1_pass_iso && pho2_pass_iso))")+" && mgg>103 && mgg<120";
      midString = TString("(pho1_pt>40 && pho2_pt>25 && abs(pho1_eta)<1.48 && abs(pho2_eta)<1.48 && (pho1_pass_iso || pho2_pass_iso) && !(pho1_pass_iso && pho2_pass_iso))")+" && "+strings.mggSigRegion[iBox];
      highString = TString("(pho1_pt>40 && pho2_pt>25 && abs(pho1_eta)<1.48 && abs(pho2_eta)<1.48 && (pho1_pass_iso || pho2_pass_iso) && !(pho1_pass_iso && pho2_pass_iso))")+" && mgg>131 && mgg<160";      
      break;
    }


    TH2F* low = SigRegionBinning::makeHistogram(static_cast<SigRegionBinning::BinningRegion>(iBox),"low");
    TH2F* mid = SigRegionBinning::makeHistogram(static_cast<SigRegionBinning::BinningRegion>(iBox),"mid");
    TH2F* high = SigRegionBinning::makeHistogram(static_cast<SigRegionBinning::BinningRegion>(iBox),"high");
  
    TH2F* nsig = SigRegionBinning::makeHistogram(static_cast<SigRegionBinning::BinningRegion>(iBox),"nsig_"+boxName);
    TH2F* nsig_gauss = SigRegionBinning::makeHistogram(static_cast<SigRegionBinning::BinningRegion>(iBox),"nsig_gauss_"+boxName);

    low->SetMinimum(0.1);
    mid->SetMinimum(0.1);
    high->SetMinimum(0.1);

    tree->Project("low","Rsq:MR",lowString+" && "+strings.boxDefs[iBox]);
    tree->Project("mid","Rsq:MR",midString+" && "+strings.boxDefs[iBox]);
    tree->Project("high","Rsq:MR",highString+" && "+strings.boxDefs[iBox]);

    //SigRegionBinning::formatSigRegionPlot(low);
    //SigRegionBinning::formatSigRegionPlot(mid);
    //SigRegionBinning::formatSigRegionPlot(high);

    //get the difference in the prediction
    TH2F* low_norm = (TH2F*)low->Clone("low_norm");
    TH2F* high_norm = (TH2F*)high->Clone("high_norm");

    low_norm->Scale(1./low_norm->Integral());
    high_norm->Scale(1./high_norm->Integral());

    TH2F* pred_diff = (TH2F*)high_norm->Clone("pred_diff");
    pred_diff->Add(low_norm,-1);

    TH2F* norm_av = (TH2F*)low_norm->Clone("norm_av");
    norm_av->Add(high_norm);
    norm_av->Scale(0.5);

    TH2F* pred_per_diff = (TH2F*)pred_diff->Clone("pred_per_diff");
    pred_per_diff->Divide(norm_av);
    cv.SetLogx(1);
    cv.SetLogy(0);
    pred_per_diff->Draw("COLZ TEXT");
    cv.SaveAs("RsqMR_high_minus_low_div_av_"+boxName+tag+".png");
    cv.SetLogx(1);
    cv.SetLogy(0);

    TH1D* low_1D = SigRegionBinning::make1DProj(low);
    TH1D* high_1D = SigRegionBinning::make1DProj(high);
    
    pred_per_diff->SetYTitle("high - low / (high+low/2)");
    TH1D* pred_per_diff_1D = SigRegionBinning::make1DProj(pred_per_diff);
    cv.SetLogx(0);
    cv.SetLogy(0);
    pred_per_diff_1D->Draw();
    cv.SaveAs("RsqMR_1D_high_minus_low_div_av_"+boxName+tag+".png");
    cv.SetLogx(1);
    cv.SetLogy(0);
    
    TFile out("RsqMR_1D_high_minus_low_div_av_"+boxName+tag+".root","RECREATE");
    low->Write();
    high->Write();
    low_1D->Write();
    high_1D->Write();
    pred_per_diff_1D->Write();
    pred_per_diff->Write();
    out.Close();



    TH2F* sideband_tot = (TH2F*)low->Clone("sideband_tot");
    sideband_tot->Add(high);


    sideband_tot->Draw("COLZ TEXT");
    cv.SetLogz();
    cv.SaveAs("RsqMR_low_plus_high_"+boxName+tag+".png");
    cv.SetLogz(0);

    float sf = mid->Integral()/sideband_tot->Integral();
    std::cout << "sf: " << sf << std::endl;
    TH2F* sideband_pred = (TH2F*)sideband_tot->Clone("sideband_pred");

    sideband_pred->Scale(sf);

    sideband_pred->Draw("COLZ TEXT");
    cv.SetLogz();
    cv.SaveAs("RsqMR_sideband_pred_"+boxName+tag+".png");
    cv.SetLogz(0);

    mid->Draw("COLZ TEXT");
    cv.SetLogz();
    cv.SaveAs("RsqMR_mid_"+boxName+tag+".png");
    cv.SetLogz(0);

    TH1D* pred_1D = SigRegionBinning::make1DProj(sideband_pred,true,sf);
    TH1D* mid_1D  = SigRegionBinning::make1DProj(mid);
    cv.SetLogx(0);
    cv.SetLogy();
    mid_1D->SetMarkerStyle(20);
    mid_1D->SetMarkerColor(kBlack);
    mid_1D->SetMarkerSize(1.4);

    pred_1D->SetFillColor(kRed);
    pred_1D->SetFillStyle(3001);
    pred_1D->SetLineColor(kRed);
    pred_1D->SetLineWidth(2);
    pred_1D->SetMarkerSize(0);
    pred_1D->Draw("L E2");
    pred_1D->Draw("LSAME");
    mid_1D->Draw("PSAME");
    cv.SaveAs("RsqMR_1D_obs_sideband_pred_"+boxName+tag+".png");    
    cv.SetLogx(1);
    cv.SetLogy(0);


    TH2F* perdiff = (TH2F*)mid->Clone("perdiff");
    perdiff->Add(sideband_pred,-1);
    perdiff->Divide(perdiff);
    perdiff->Draw("COLZ TEXT");

    cv.SaveAs("RsqMR_percentDiff_"+boxName+tag+".png");
    

    for(int iXbin=1; iXbin<=sideband_pred->GetNbinsX(); iXbin++) {
      for(int iYbin=1; iYbin<=sideband_pred->GetNbinsY(); iYbin++) {
	float obs = mid->GetBinContent(iXbin,iYbin);
	float exp = sideband_pred->GetBinContent(iXbin,iYbin);
	float err = TMath::Sqrt(sideband_tot->GetBinContent(iXbin,iYbin))*sf;
	float ns = fabs(TMath::NormQuantile(SigRegionBinning::pValue(obs,exp,err/exp)/2));
	if(obs<exp) ns*=-1;

	nsig->SetBinContent(iXbin,iYbin,ns);
	std::cout << "\t" << iXbin << "  " << iYbin << "  " << nsig->GetBinContent(iXbin,iYbin) << std::endl;

	float gauss_err = TMath::Sqrt(TMath::Power(err,2)+exp);
	if(gauss_err==0) gauss_err=1;
	nsig_gauss->SetBinContent(iXbin,iYbin,(obs-exp)/gauss_err);

      }
    }
    
    SigRegionBinning::formatSigRegionPlot(nsig); 
    SigRegionBinning::formatSigRegionPlot(nsig_gauss); 
    //cv.SetLogx();

    nSigs.push_back(nsig);
    nSigs_gauss.push_back(nsig_gauss);
    

    delete low;
    delete mid;
    delete high;
    delete sideband_tot;
    delete sideband_pred;

  }

  for(int iBox=0; iBox<SigRegionBinning::nBoxes; iBox++) {
    TString boxName = SigRegionBinning::getRegionName(static_cast<SigRegionBinning::BinningRegion>(iBox));
    TColor::CreateGradientColorTable(7,Length,Red,Green,Blue,999);
    TH2F* nsig = nSigs.at(iBox);

    nsig->SetMaximum(5.1);
    nsig->SetMinimum(-5.1);
    nsig->SetContour(999);


    nsig->Draw("COLZ TEXT0");
    cv.SaveAs("RsqMR_low_plus_high_RAWSUM_NSIGMA_"+boxName+tag+".png");
    
    TH2F* nsig_gauss = nSigs_gauss.at(iBox);
    nsig_gauss->SetMaximum(5.1);
    nsig_gauss->SetMinimum(-5.1);
    nsig_gauss->SetContour(999);

    nsig_gauss->Draw("COLZ");
    cv.SaveAs("RsqMR_low_plus_high_RAWSUM_NSIGMAGAUSS_"+boxName+tag+".png");
    

    TH1D* nsig_gauss_1D = SigRegionBinning::make1DProj(nsig_gauss);

    nsig_gauss_1D->SetLineColor(kBlack);
    nsig_gauss_1D->SetLineWidth(1.5);
    nsig_gauss_1D->SetMinimum(-5.1);
    nsig_gauss_1D->SetMaximum(5.1);
    nsig_gauss_1D->SetYTitle("Number of Sigma");
    cv.SetLogx(0);
    cv.SetLogy(0);
    nsig_gauss_1D->Draw();
    cv.SaveAs("RsqMR_low_plus_high_1D_RAWSUM_NSIGMAGAUSS_"+boxName+tag+".png");
    cv.SetLogx(1);
  }
}
void makeMuVMassPlot(bool iUseWWType = false) { 
  SetStyle();
  TCanvas *lCan = new TCanvas("A","A",600,600);
  // lCan->SetGridx(1);
  //lCan->SetGridy(1);
  lCan->SetRightMargin(0.14);

  double *lTX1 = new double[2];
  double *lTX2 = new double[2];
  double lMinNLL = 1000;
  double lVMin = 0;
  double *lMin = new double[36];     
  if(!iUseWWType) for(int i0 = 0; i0 < 36; i0++) { lMin[i0] = getMinNLL(110+i0*1.); if(lMin[i0] < lVMin) {lVMin = lMin[i0]; lTX1[0] = 110+i0*1.;}}
  //lMin[17] = (lMin[16]+lMin[18])/2.;
  //lMin[21] = (lMin[20]+lMin[22])/2.;
  //lMin[29] = (lMin[28]+lMin[30])/2.;
  //lMin[34] = (lMin[33]+lMin[35])/2.;

  TFile *lFile = new TFile("/afs/cern.ch/user/p/pharris/public/massscan/cmb+.root");
  TTree *lTree = lFile->FindObjectAny("limit");
  TH2F *lH = new TH2F("2D","2D",36,109.5,145.5,50,-2.,3.);
  float  lNLL  = 0; lTree->SetBranchAddress("nll"     ,&lNLL);
  float  lMNLL = 0; lTree->SetBranchAddress("deltaNLL",&lMNLL);
  double lMH   = 0; lTree->SetBranchAddress("mh"      ,&lMH);
  float  lR    = 0; lTree->SetBranchAddress("r"       ,&lR);
  
  if(iUseWWType) { 
    for(int i0 = 0; i0 < lTree->GetEntries(); i0++) { 
      lTree->GetEntry(i0);
      if(lR < 0.1 && lR > 0)  lMin[int(lMH-110)] = -lMNLL;
    }
    lVMin = 10000;
    for(int i0 = 0; i0 < lTree->GetEntries(); i0++) { 
      lTree->GetEntry(i0);
      double pMin =  lMin[int(lMH-110)] + lMNLL;
      if(pMin < lVMin) lVMin = pMin;
    }
  }
  for(int i0 = 0; i0 < lTree->GetEntries(); i0++) { 
    lTree->GetEntry(i0);
    //if(lMH == 125) continue;
    lNLL = 0.; //lMin  = 0.;
    lH->SetBinContent(lH->GetXaxis()->FindBin(lMH),lH->GetYaxis()->FindBin(lR),(lMNLL+lMin[lH->GetXaxis()->FindBin(lMH)-1]-lVMin)); 
    if(lMH == lTX1[0] && lMNLL < lMinNLL) {lMinNLL = lMNLL; lTX2[0] = lR;}
  }
  TH2F* lHC = lH->Clone("2D_v2");
  double lCont[3];
  lCont[0] = 1.17; 
  lCont[1] = 3.0;
  lCont[2] = 9.0;
  lHC->SetContour(2,lCont);
  //lCan->SetLogz();
  lHC->Draw("cont z list");
  lCan->Update();
  lHC->Draw("colz");

  TObjArray *lContours = (TObjArray*)gROOT->GetListOfSpecials()->FindObject("contours");
  int lTotalConts = lContours->GetSize();
  double *lTX = new double[2]; lTX[0] = 110;  lTX[1] = 145; 
  double *lTY = new double[2]; lTY[0] = -0.5; lTY[1] = 2.5;
  TGraph *lFirst = new TGraph(2,lTX,lTY); lFirst->SetLineColor(kWhite);
  lFirst->GetXaxis()->SetRangeUser(110,148);
  lFirst->Draw("al"); lFirst->SetTitle("");
  lH->GetYaxis()->SetRangeUser(-0.5,2.5);
  lFirst->GetXaxis()->SetTitle("m_{H}[GeV]");
  lFirst->GetXaxis()->SetTitleOffset(1.0);
  lFirst->GetYaxis()->SetTitle("#mu_{best-fit}");
  lFirst->GetYaxis()->SetTitleOffset(1.2);

  lH->GetXaxis()->SetTitle("m_{H}[GeV]");
  lH->GetXaxis()->SetTitleOffset(1.0);
  lH->GetYaxis()->SetTitle("#mu_{best-fit}");
  lH->GetYaxis()->SetTitleOffset(1.2);

  lTX1[1] = lTX1[0]; lTX2[1] = lTX2[1]+0.001;
  TGraph *lSecond = new TGraph(1,lTX1,lTX2); lSecond->SetMarkerStyle(34); lSecond->SetMarkerSize(3.5);
  //lSecond->Draw("p");
  
  TLegend *lL = new TLegend(0.65,0.15,0.85,0.35); lL->SetBorderSize(0); lL->SetFillColor(0); lL->SetFillStyle(0); 
  for(i0 = 0; i0 < lTotalConts; i0++){
    pContLevel = (TList*)lContours->At(lTotalConts-1.-i0);
    // Get first graph from list on curves on this level
    std::vector<double> lX; 
    std::vector<double> lY; 
    pCurv = (TGraph*)pContLevel->First();
    for(int i1 = 0; i1 < pContLevel->GetSize(); i1++){
      for(int i2  = 0; i2 < pCurv->GetN(); i2++) {lX.push_back(pCurv->GetX()[i2]); lY.push_back(pCurv->GetY()[i2]);}
      //pCurv->GetPoint(0, x0, y0);
      pCurv->SetLineColor(kBlack);//kGreen+i0);
      pCCurv = (TGraph*)pCurv->Clone();
      if(i0 == 0) pCCurv->SetFillColor(0);
      if(i0 == 1) pCCurv->SetFillColor(0);
      //if(i0 == 1) pCCurv->SetLineStyle(kDashed);
      pCCurv->SetLineWidth(3);
      pCCurv->GetXaxis()->SetRangeUser(0,3.0);
      //if(i0 == 0) pCCurv->Draw("AL");
      //if(i0 != -10) pCCurv->Draw("LC");
      //l.DrawLatex(x0,y0,val);
      pCurv = (TGraph*)pContLevel->After(pCurv); // Get Next graph
    }
    TGraph *lTotal = new TGraph(lX.size(),&lX[0],&lY[0]);
    lTotal->SetLineWidth(3);
    lTotal->SetFillColor(kGreen+i0*2);
    lTotal->SetFillStyle(3001);
    //lTotal->Draw("lf");
    
    //if(i0 == 0) lTotal->Draw("alf");
    //if(i0 == 0) lTotal->Draw("alf");
    //for(int iX = 0; iX < lTotal->GetN(); iX++) cout << "===> " << lTotal->GetX()[iX] << " -- " << lTotal->GetY()[iX] << endl;
    //if(i0 != -10) lTotal->Draw("lfC");
    bool pSwitch = false;
    int  pSign   = -1.;   if(lTotal->GetX()[0] > lTotal->GetX()[1]) pSign = 1;
    double pXOld = lTotal->GetX()[lTotal->GetN()-1];
    std::vector<double> pXLeft;
    std::vector<double> pXRight;
    std::vector<double> pYLeft;
    std::vector<double> pYRight;
    for(int iX = 0; iX < lTotal->GetN(); iX++) { 
      double pX = lTotal->GetX()[iX];
      if(pSign*pX > pSign*pXOld ) {pSwitch = !pSwitch; pSign *= -1;}
      if(!pSwitch) {pXLeft.push_back(lTotal->GetX()[iX]); pYLeft.push_back(lTotal->GetY()[iX]); }
      if(pSwitch) {pXRight.push_back(lTotal->GetX()[iX]); pYRight.push_back(lTotal->GetY()[iX]); }
      pXOld = pX;
    }
    TGraph *lLeftTotal  = new TGraph(pXLeft.size() ,&pXLeft[0],&pYLeft[0]);
    TGraph *lRightTotal = new TGraph(pXRight.size(),&pXRight[0],&pYRight[0]);
    lLeftTotal->SetLineColor(kRed);
    lRightTotal->SetLineColor(kBlue);
    lLeftTotal->SetLineStyle(kDashed);
    lRightTotal->SetLineStyle(kDashed);
    //lLeftTotal->Draw("l");
    //lRightTotal->Draw("l");
    
    TGraphSmooth *lGS0 = new TGraphSmooth("normal");
    TGraphSmooth *lGS1 = new TGraphSmooth("normal");
    TGraph *lSmooth0 = lGS0->SmoothSuper(lRightTotal,"",0.,0.);
    TGraph *lSmooth1 = lGS1->SmoothSuper(lLeftTotal,"",0.,0.) ;
    lSmooth0->Draw("l");
    lSmooth1->Draw("l");
    std::vector<double> pXSmooth;
    std::vector<double> pYSmooth;
    std::vector<double> pXSmooth1;
    std::vector<double> pYSmooth1;
    cout << "==" << lSmooth0->GetN() << " -- " <<lSmooth1->GetN() << endl;
    for(int iX = 0; iX < lSmooth0->GetN(); iX++) {pXSmooth.push_back(lSmooth0->GetX()[iX]);                    pYSmooth.push_back(lSmooth0->GetY()[iX]);}
    for(int iX = 0; iX < lSmooth1->GetN(); iX++) {pXSmooth.push_back(lSmooth1->GetX()[lSmooth1->GetN()-iX-1]); pYSmooth.push_back(lSmooth1->GetY()[lSmooth1->GetN()-iX-1]);}

    for(int iX = 0; iX < lSmooth0->GetN(); iX++) {pXSmooth1.push_back(lSmooth0->GetX()[iX]);                    pYSmooth1.push_back(lSmooth0->GetY()[iX]);}
    for(int iX = 0; iX < lSmooth1->GetN(); iX++) {pXSmooth1.push_back(lSmooth1->GetX()[lSmooth1->GetN()-iX-1]); pYSmooth1.push_back(lSmooth1->GetY()[lSmooth1->GetN()-iX-1]);}
    //if(i0 == 1) {pXSmooth1.push_back(lSmooth1->GetX()[0]); pYSmooth1.push_back(lSmooth1->GetY()[0]);}
    TGraph *pSmoothShape  = new TGraph(pXSmooth.size() ,&pXSmooth [0],&pYSmooth [0]);
    TGraph *pSmoothShape1 = new TGraph(pXSmooth1.size(),&pXSmooth1[0],&pYSmooth1[0]);
    if(i0 == 1) {TLine  *lLine = new TLine(pXSmooth1[0],pYSmooth1[0],pXSmooth1[pXSmooth1.size()-1],pYSmooth1[pYSmooth1.size()-1]); lLine->Draw();}
    pSmoothShape1->SetLineColor(kBlack);
    pSmoothShape1->SetLineWidth(2);
    pSmoothShape->SetFillColor(kGreen+i0*2);
    pSmoothShape->SetFillStyle(3001);
    pSmoothShape->Draw("lf");
    pSmoothShape1->Draw("l");
    if(i0 == 0) lL->AddEntry(lTotal,"95% CL","lf");
    if(i0 == 1) lL->AddEntry(lTotal,"68% CL","lf");
  }
  lL->AddEntry(lSecond,"BestFit","p");
  lSecond->Draw("lp");
  lL->Draw();
  
  std::string masslabel = "m_{H}"; double mass = 125;
  TString label = TString::Format("%s = 135 GeV", masslabel.c_str());//, 125.);
  TPaveText* textlabel = new TPaveText(0.18, 0.81, 0.50, 0.90, "NDC");
  textlabel->SetBorderSize(   0 );
  textlabel->SetFillStyle (   0 );
  textlabel->SetTextAlign (  12 );
  textlabel->SetTextSize  (0.04 );
  textlabel->SetTextColor (   1 );
  textlabel->SetTextFont  (  62 );
  textlabel->AddText(label);
  //textlabel->Draw();
  CMSPrelim("Preliminary, H#rightarrow#tau#tau,L = 24.3 fb^{-1}", "", 0.145, 0.835);
  gPad->RedrawAxis();
  lCan->Update();

  lCan->SaveAs("cmb+_muvmass.png");
  lCan->SaveAs("cmb+_muvmass.pdf");
  lCan->SaveAs("cmb+_muvmass.eps");
}
    void 
DrawContourSameColorDisc( TLegend *leg, TH2F* hist, Double_t nsigma, TString color, Bool_t second=kFALSE, TH2F* inverse=0, Bool_t linesOnly=kFALSE )
{
    if (nsigma < 0.5 || nsigma > 10.5 ) {
        cout << "*** Error in CombinationGlob::DrawContour: nsigma out of range: " << nsigma 
            << "==> abort" << endl;
        exit(1);
    }

    Int_t lcol_sigma;
    Int_t fcol_sigma[3];

    if( color == "pink" ){
        lcol_sigma    = CombinationGlob::c_VDarkPink;
        fcol_sigma[0] = CombinationGlob::c_LightPink;
        fcol_sigma[1] = CombinationGlob::c_LightPink;
        fcol_sigma[2] = CombinationGlob::c_LightPink;
    }
    else if( color == "green" ){ // HF
        lcol_sigma    = CombinationGlob::c_VDarkGreen;
        fcol_sigma[0] = CombinationGlob::c_DarkGreen;
        fcol_sigma[1] = CombinationGlob::c_LightGreen;
        fcol_sigma[2] = CombinationGlob::c_VLightGreen;
    } 
    else if( color == "yellow" ){
        lcol_sigma    = CombinationGlob::c_VDarkYellow;
        fcol_sigma[0] = CombinationGlob::c_DarkYellow;
        fcol_sigma[1] = CombinationGlob::c_DarkYellow;
        fcol_sigma[2] = CombinationGlob::c_White; //c_DarkYellow;
    }
    else if( color == "orange" ){
        lcol_sigma    = CombinationGlob::c_VDarkOrange;
        fcol_sigma[0] = CombinationGlob::c_DarkOrange;
        fcol_sigma[1] = CombinationGlob::c_LightOrange; // c_DarkOrange
        fcol_sigma[2] = CombinationGlob::c_VLightOrange;
    }
    else if( color == "gray" ){
        lcol_sigma    = CombinationGlob::c_VDarkGray;
        fcol_sigma[0] = CombinationGlob::c_LightGray;
        fcol_sigma[1] = CombinationGlob::c_LightGray;
        fcol_sigma[2] = CombinationGlob::c_LightGray;
    }
    else if( color == "blue" ){
        lcol_sigma    = CombinationGlob::c_DarkBlueT1;
        fcol_sigma[0] = CombinationGlob::c_BlueT5;
        fcol_sigma[1] = CombinationGlob::c_BlueT3;
        fcol_sigma[2] = CombinationGlob::c_BlueT2;
    }

    // contour plot
    TH2F* h = new TH2F( *hist );
    h->SetContour( 1 );
    double dsignif = double (nsigma);
    h->SetContourLevel( 0, dsignif );

    Int_t mycolor = (nsigma==5   ? 0 : 2);
    Int_t mycolor = (nsigma==2.5 ? 1 : 2);

    if( !second ){
        h->SetFillColor( fcol_sigma[mycolor] );
        if (!linesOnly) h->Draw( "samecont0" );
    }

    h->SetLineColor( (nsigma==2.5) ? 2 : lcol_sigma );

    h->SetLineStyle( nsigma==5 || nsigma==2.5 ? 1 : 2 );
    h->SetLineWidth( nsigma==5 || nsigma==2.5 ? 2 : 1 );

    h->Draw( "samecont3" );

    if(nsigma==5)   { leg->AddEntry(h,"5 #sigma discovery","l"); }
    if(nsigma==6)   { leg->AddEntry(h,"N (int) #sigma discovery","l"); }
    if(nsigma==2.5) { leg->AddEntry(h,"2.5 #sigma discovery","l"); }
}