コード例 #1
0
ファイル: fitfull.C プロジェクト: dgonzal/toyfit
int main(){

  RooRealVar zero("zero","",0,0,150); 

  //input parameters for the distribution
  double alpha_double = 2.38;
  double beta_double = 0.092;
  double lambda_double = 2.21;
  double theta_double = 1.12;
  double c_frac = 0.5;
  //RooRealVar fsig("fsig","signal fraction",0.3) ;

  string epsname = "plots/gamma_pion20";

  
  hit_info multi_shower("fullsim/example_pi20Gev.root");
  //hit_info multi_shower("fullsim/example_ele_20GeV.root");
  
 
  double beta_gflash_factor = 1.49;
  double theta_gflash_factor = 16.42;

  beta_double = beta_double/beta_gflash_factor;
  theta_double = theta_double/theta_gflash_factor;
  
  // --- Observable --- 
  RooRealVar depth("depth","depth [cm]",0,800); 
  depth.removeMax(); // set infinite range
  // --- Weight ---
  RooRealVar* weight = new RooRealVar("weight","1/E dE/dr", 0.0, 1.0);
 
  // --- Gamma pdf --- 
  //if one of the Values is set to const you can not ask for it in RooFitModel, otherwise the program will crash
  //RooRealVar alpha("alpha","alpha",alpha_double,0.0,4);
  RooRealVar alpha("alpha","alpha",0.0,20.);
  //alpha.removeMax(); // set infinite range
  //RooRealVar beta("beta","beta",1./beta_double,0.0,100.);
  RooRealVar beta("beta","beta",0.1,.1,3.5);
  //beta.removeMax(); // set infinite range

  RooRealVar mu("mu","mu",0); // no ranges means variable is fixed in fit
  RooRealVar nu("nu","nu",0); // no ranges means variable is fixed in fit
  
  //RooRealVar lambda("lambda","lambda",lambda_double,0.0,6.);
  RooRealVar lambda("lambda","lambda",0.0,40.);
  //lambda.removeMax(); // set infinite range
  //RooRealVar theta("theta","theta",1./theta_double,0.0,100.) ;  
  RooRealVar theta("theta","theta",1.,47) ;  
  //theta.removeMax(); // set infinite range

  RooGamma gamma_one("gamma_one","gamma_one pdf",depth,alpha,beta,mu) ; 
  RooGamma gamma_two("gamma_two","gamma_two pdf",depth,lambda,theta,nu) ; 

  RooRealVar fsig("fsig","signal fraction",c_frac,0.0,1.);
  //RooRealVar fsig("fsig","signal fraction",c_frac);

  RooAddPdf model("model","model",RooArgList(gamma_two,gamma_one),fsig) ;
   
  RooDataSet mean("mean","mean",RooArgSet(depth,weight),"weight"); 
  TH1F* mean_fithist = new TH1F("mean_fithist"," mean fit hist",50,0,150);


  TH1F* log_alpha1 = new TH1F("log_alpha1"," log(#alpha_{1})",20,-1,3);
  TH1F* log_beta1  = new TH1F("log_beta1"," log(#beta_{1})",20,-1,3);
  TH2F* log_corr1  = new TH2F("log_corr1"," correlation #alpha_{1} #beta_{1}",20,-1,3,20,-1,3);
  TH1F* log_alpha2 = new TH1F("log_alpha2"," log(#alpha_{2})",20,-1,3);
  TH1F* log_beta2  = new TH1F("log_beta2"," log(#beta_{2})",20,-1,3);
  TH2F* log_corr2  = new TH2F("log_corr2"," correlation #alpha_{2} #beta_{2}",20,-1,3,20,-1,3);

  TH2F* mean_hist = new TH2F("mean_hist"," mean hist",100,0,150,100.,0.,.0015);
  
  TCanvas * can = new TCanvas("can", "can", 600, 500); 
  can->cd();
  set_style();
  
  
  //can->Print(epsname+"[");

  double c_tot =0;

  unsigned int n_part =100;

  for(unsigned int p = 0; p<n_part ; ++p){

    TLegend * legend = new TLegend(0.5,0.65,.88,0.88);
    legend->SetTextFont(72);
    legend->SetTextSize(0.04);
    legend->SetFillColor(kWhite);
    legend->SetBorderSize(0);

    one_shower shower =  multi_shower.all_shower.at(p); 
   
    //DataSet I am looking at
    RooDataSet full_sim_data("full_sim_data","full_sim_data",RooArgSet(depth,weight),"weight");
    TH1F* datahisto = new TH1F("datahist","datahist",15,0,120);

    double sumHCAL=0;

    double deltar =-1; 
    for(unsigned int i = 0; i < shower.mytype.size(); ++i){	
      sumHCAL += shower.myenergy.at(i);
      double x_val = shower.myz.at(i);
      double y_val = shower.myy.at(i);
      double z_val = shower.myz.at(i);
      
      z_val = z_val - shower.interactPoint; 
      double distance=-1;
      if(sqrt(x_val*x_val+y_val*y_val+z_val*z_val)/10 < 200) distance = sqrt(x_val*x_val+y_val*y_val+z_val*z_val)/10;

      if(deltar < distance) deltar = z_val;
    }

    deltar=deltar/shower.mytype.size();
    
    c_tot += shower.ePi0first_energy/n_part;
    fsig.setVal(shower.ePi0first_energy);
    fsig.setRange(shower.ePi0first_energy-0.05 > 0 ? shower.ePi0first_energy-0.05: 0,shower.ePi0first_energy+0.05<1?shower.ePi0first_energy+0.05:1);
    //fsig.setRange(1-shower.ePi0first_energy-0.05 > 0 ? 1-shower.ePi0first_energy-0.05: 0,1-shower.ePi0first_energy+0.05<1 ? 1-shower.ePi0first_energy+0.05:1);

    for(unsigned int i = 0; i < shower.mytype.size(); ++i){	
      double x_val = shower.myx.at(i);
      double y_val = shower.myy.at(i);
      double z_val = shower.myz.at(i);

      // if(shower.mytype.at(i) !=2)continue;
     
      z_val = z_val - shower.interactPoint; 
      //if(z_val<=0) continue;
      depth.setVal(sqrt(x_val*x_val+y_val*y_val+z_val*z_val)/10);
      //depth.setVal(z_val);
      //cout <<depth.getVal()<<endl;
      datahisto->Fill(depth.getVal(),shower.myenergy.at(i)/sumHCAL/deltar);
      mean_fithist->Fill(depth.getVal(),shower.myenergy.at(i)/sumHCAL/deltar/n_part);
      mean_hist->Fill(depth.getVal(),shower.myenergy.at(i)/sumHCAL/deltar);
      full_sim_data.add(depth,shower.myenergy.at(i)/sumHCAL/deltar,0);
      mean.add(depth,shower.myenergy.at(i)/sumHCAL/deltar,0);
    }
  

    RooDataHist roodatahist("roodatahist","roodatahist",depth,Import(*datahisto)) ;

    //model.fitTo(roodatahist, Strategy(2) );
    model.fitTo(full_sim_data);
      
    RooDataHist* full_sim_binned = full_sim_data.binnedClone("full_sim_binned","full sim binned");
    //prepare to plot fits
    
    RooPlot * depthFrame = depth.frame(0,120,100);
    depthFrame->SetTitle("");
    depthFrame->SetTitleOffset(1.2,"Y");
    depthFrame->SetLabelSize(0.02,"Y");
    depthFrame->SetYTitle("1/E dE/dr");
    //zero.plotOn(depthFrame,LineStyle(kDashed),LineColor(kBlack));
    //full_sim_data.plotOn(depthFrame);
    roodatahist.plotOn(depthFrame);
    //full_sim_binned->plotOn(depthFrame);
    
    model.plotOn(depthFrame,Components(gamma_one),LineStyle(kDashed),LineColor(kGreen),Name("gamma_one"));
    model.plotOn(depthFrame,Components(gamma_two),LineStyle(kDashed),LineColor(kRed),Name("gamma_two"));
    model.plotOn(depthFrame,Name("model"));
    
    stringstream gamma_one_text;
    gamma_one_text.precision(3);
    gamma_one_text << "#Gamma_{1} ("<<alpha.getVal()<<","<<(1/beta.getVal()*beta_gflash_factor)<<")"<<endl;
    stringstream gamma_two_text; 
    gamma_two_text.precision(3);
    gamma_two_text << "#Gamma_{2} (" <<lambda.getVal()<<","<<(1/theta.getVal()*theta_gflash_factor)<< ")"<<endl;
    
    stringstream gamma_text; 
    gamma_text.precision(2);
    gamma_text << "#Gamma_{1/2} c=" <<fsig.getVal() <<"("<<shower.ePi0first_energy<<")"<<endl;
    
    stringstream  chi2; 
    chi2.precision(2);
    chi2 << "#chi^{2} prob. = " << TMath::Prob(depthFrame->chiSquare(),14) <<endl;

    legend->AddEntry(depthFrame->findObject("gamma_one"),gamma_one_text.str().c_str(),"L");
    legend->AddEntry(depthFrame->findObject("gamma_two"),gamma_two_text.str().c_str(),"L");
    legend->AddEntry(depthFrame->findObject("model"),gamma_text.str().c_str(),"L");
    legend->AddEntry((TObject*)0, chi2.str().c_str(), "");
    cout << "alpha,  beta "<< alpha.getVal() << " " << 1/beta.getVal()*beta_gflash_factor << std::endl;
    cout << "lambda, theta "<<lambda.getVal() << " " << 1/theta.getVal()*theta_gflash_factor << std::endl;
    cout <<"c, chi2 "<< fsig.getVal() << " "<<depthFrame->chiSquare()<< std::endl;
    cout <<"starting , interacting Points "<<shower.startingPoint<<" "<<shower.interactPoint <<endl;
    cout<< "pi0first, pi0tot "<<shower.ePi0first_energy <<" "<<shower.ePi0tot_energy<<endl;
    
    /*
    log_alpha1->Fill(log10(alpha.getVal()));
    log_alpha2->Fill(log10(lambda.getVal()));
    //cout<<log(1/beta.getVal()*beta_gflash_factor)<<endl;
    log_beta1 ->Fill(log10(1/beta.getVal()*beta_gflash_factor));
    log_beta2 ->Fill(log10(1/theta.getVal()*theta_gflash_factor));
    log_corr1 ->Fill(log10(alpha.getVal()),log10(1/beta.getVal()*beta_gflash_factor));
    log_corr2 ->Fill(log10(lambda.getVal()),log10(1/theta.getVal()*theta_gflash_factor));
    */
    
    if(fsig.getVal()>0.1)log_alpha1->Fill(log(alpha.getVal()));
    if(fsig.getVal()<0.9)log_alpha2->Fill(log(lambda.getVal()));
    //cout<<log(1/beta.getVal()*beta_gflash_factor)<<endl;
    if(fsig.getVal()>0.1)log_beta1 ->Fill(log(1/beta.getVal()*beta_gflash_factor));
    if(fsig.getVal()<0.9)log_beta2 ->Fill(log(1/theta.getVal()*theta_gflash_factor));
    if(fsig.getVal()>0.1)log_corr1 ->Fill(log(alpha.getVal()),log(1/beta.getVal()*beta_gflash_factor));
    if(fsig.getVal()<0.9)log_corr2 ->Fill(log(lambda.getVal()),log(1/theta.getVal()*theta_gflash_factor));
    

    //prepare to dump all the plots in the ps file
    
    
    // one data sample and its fit is drawn
    /*
    datahisto->Draw();
    datahisto0->SetLineColor(kRed);
    datahisto0->Draw("same");
    datahisto1->SetLineColor(kGreen);
    datahisto1->Draw("same");
    datahisto2->SetLineColor(kBlue);
    datahisto2->Draw("same");
    can->Print(epsname);
    */
    //if(depthFrame->chiSquare()>5) continue;
    depthFrame->Draw("HIST p");
    legend->Draw();

    stringstream  particle_number; 
    particle_number.precision(1);
    particle_number << p <<endl;
    
    can->Print((epsname+"_"+particle_number.str()+".pdf").c_str());
  }

  RooDataHist roomeandatahist("roomeandatahist","roomeandatahist",depth,Import(*mean_fithist)) ;


  fsig.setVal(c_tot);
  alpha.removeMax(); // set infinite range
  beta.removeMax(); // set infinite range
  lambda.removeMax(); // set infinite range
  theta.removeMax(); // set infinite range

  //model.fitTo(roomeandatahist);
  //model.fitTo(mean,SumW2Error(kTRUE));

  TLegend * mean_legend = new TLegend(0.5,0.65,.9,0.9);
  mean_legend->SetTextFont(72);
  mean_legend->SetTextSize(0.04);
  mean_legend->SetFillColor(kWhite);
  mean_legend->SetBorderSize(0);

  stringstream  mean_gamma_one_text;
  mean_gamma_one_text.precision(3);
  mean_gamma_one_text << "#Gamma_{1} ("<<alpha.getVal()<<","<<(1/beta.getVal()*beta_gflash_factor)<<")"<<endl;
  stringstream mean_gamma_two_text; 
  mean_gamma_two_text.precision(3);
  mean_gamma_two_text << "#Gamma_{2} (" <<lambda.getVal()<<","<<(1/theta.getVal()*theta_gflash_factor)<< ")"<<endl;
  
  stringstream  mean_gamma_text; 
  mean_gamma_text.precision(2);
  mean_gamma_text << "#Gamma_{1/2} c=" <<fsig.getVal() <<"("<< c_tot<<")"<<endl;
  
  stringstream  mean_chi2; 
  mean_chi2.precision(2);
  //mean_chi2 << "#chi^{2} " <<depthFrame->chiSquare() <<endl;
  
  RooPlot * meanFrame = depth.frame(0,120,200);
  //meanFrame->SetMaximum(1);
  meanFrame->SetTitle("Mean Fit");
  meanFrame->SetYTitle("1/E dE/dr");
  model.plotOn(meanFrame,Components(gamma_one),LineStyle(kDashed),LineColor(kGreen),Name("gamma_one"));
  model.plotOn(meanFrame,Components(gamma_two),LineStyle(kDashed),LineColor(kRed),Name("gamma_two"));
  model.plotOn(meanFrame,Name("model"));
  //mean.plotOn(meanFrame);
  //roomeandatahist.plotOn(meanFrame);

  mean_legend->AddEntry(meanFrame->findObject("gamma_one"),mean_gamma_one_text.str().c_str(),"L");
  mean_legend->AddEntry(meanFrame->findObject("gamma_two"),mean_gamma_two_text.str().c_str(),"L");
  mean_legend->AddEntry(meanFrame->findObject("model"),mean_gamma_text.str().c_str(),"L");
  
  meanFrame->Draw();
  mean_legend->Draw();
  //datahisto->Draw();
  //can->Print(epsname);

  //mean_hist->Draw("box");
  //can->Print(epsname);
 
  can->Print((epsname+"_mean.pdf").c_str());
  log_alpha1->Draw();
  can->Print((epsname+"_alpha1_log.pdf").c_str());
  log_beta1->Draw();
  can->Print((epsname+"_beta1_log.pdf").c_str());
  log_corr1->Draw("colz");
  can->Print((epsname+"corr1_log.pdf").c_str());
  log_alpha2->Draw();
  can->Print((epsname+"apha2_log.pdf").c_str());
  log_beta2->Draw();
  can->Print((epsname+"beta2_log.pdf").c_str());
  log_corr2->Draw("colz");
  can->Print((epsname+"corr2_log.pdf").c_str());

  ///can->Print(epsname+"]");
  return 0;
}