示例#1
0
void FillHists(rt::TH1Container& hc, TChain& chain, const std::string& sample_name, long num_events = std::numeric_limits<long>::max())
{
    // number of events
    num_events = (chain.GetEntries() < num_events ? chain.GetEntries() : num_events);
    std::cout << "Beginning " << sample_name << " on " << num_events << " of " << chain.GetEntries() << " events..." << std::endl; 

     // scale the # of events
    const float nevts_aod   = chain.GetMaximum("evt_nEvts"); // # files in AOD
    const float nevts_file  = chain.GetEntries();            // # files in this sample
    const float nevts_scale = nevts_aod/nevts_file;          // scale factor to "fix" evt_scale1fb since we are using a subset of the data 

    // lumi
    static const float lumi = 0.082; //fb^-1

    // efficiency scale
    float eff_scale = 1.0;
    if (sample_name == "data"   ) {eff_scale = s_SDEfficiency[ 0];}
    if (sample_name == "dyll"   ) {eff_scale = s_SDEfficiency[ 1];}
    if (sample_name == "wjets"  ) {eff_scale = s_SDEfficiency[ 2];}
    if (sample_name == "ttdil"  ) {eff_scale = s_SDEfficiency[ 3];}
    if (sample_name == "ttslq"  ) {eff_scale = s_SDEfficiency[ 4];}
    if (sample_name == "tthad"  ) {eff_scale = s_SDEfficiency[ 5];}
    if (sample_name == "qcd"    ) {eff_scale = s_SDEfficiency[ 6];}
    if (sample_name == "ww"     ) {eff_scale = s_SDEfficiency[ 7];}
    if (sample_name == "wz2l2q" ) {eff_scale = s_SDEfficiency[ 8];}
    if (sample_name == "wz3l"   ) {eff_scale = s_SDEfficiency[ 9];}
    if (sample_name == "zz2l2q" ) {eff_scale = s_SDEfficiency[10];}
    if (sample_name == "zz2l2nu") {eff_scale = s_SDEfficiency[11];}
    if (sample_name == "zz4l"   ) {eff_scale = s_SDEfficiency[12];}

    // overall scale
    const float scale = lumi * eff_scale * nevts_scale; 
    std::cout << "scale factor = " << Form("%f * %f * %f = %f", lumi, eff_scale, nevts_scale, scale) << std::endl;

    // book hists
    hc.Add(new TH1F(Form("h_count_mm_%s", sample_name.c_str()), Form("Event ee count (%s)"                               , sample_name.c_str()), 3 , -0.5, 2.5));
    hc.Add(new TH1F(Form("h_count_ee_%s", sample_name.c_str()), Form("Event #mu#mu count (%s)"                           , sample_name.c_str()), 3 , -0.5, 2.5));
    hc.Add(new TH1F(Form("h_mee_%s"     , sample_name.c_str()), Form("Dimuon Electron (%s);m_{ee}(GeV);# Events Expected", sample_name.c_str()), 60,   60, 120));
    hc.Add(new TH1F(Form("h_mmm_%s"     , sample_name.c_str()), Form("Dimuon Mass (%s);m_{#mu#mu}(GeV);# Events Expected", sample_name.c_str()), 60,   60, 120));
    hc.Sumw2();

    // alias for dilepton mass
    chain.SetAlias("mass_mm_px", "Sum$(abs(genps_id)==13 && genps_status==3 ? genps_p4.Px() : 0.0)");
    chain.SetAlias("mass_mm_py", "Sum$(abs(genps_id)==13 && genps_status==3 ? genps_p4.Py() : 0.0)");
    chain.SetAlias("mass_mm_pz", "Sum$(abs(genps_id)==13 && genps_status==3 ? genps_p4.Pz() : 0.0)");
    chain.SetAlias("mass_mm_e" , "Sum$(abs(genps_id)==13 && genps_status==3 ? genps_p4.E()  : 0.0)");
    chain.SetAlias("mass_mm"   , "sqrt(mass_mm_e*mass_mm_e - mass_mm_px*mass_mm_px - mass_mm_py*mass_mm_py - mass_mm_pz*mass_mm_pz)");

    chain.SetAlias("mass_ee_px", "Sum$(abs(genps_id)==11 && genps_status==3 ? genps_p4.Px() : 0.0)");
    chain.SetAlias("mass_ee_py", "Sum$(abs(genps_id)==11 && genps_status==3 ? genps_p4.Py() : 0.0)");
    chain.SetAlias("mass_ee_pz", "Sum$(abs(genps_id)==11 && genps_status==3 ? genps_p4.Pz() : 0.0)");
    chain.SetAlias("mass_ee_e" , "Sum$(abs(genps_id)==11 && genps_status==3 ? genps_p4.E()  : 0.0)");
    chain.SetAlias("mass_ee"   , "sqrt(mass_ee_e*mass_ee_e - mass_ee_px*mass_ee_px - mass_ee_py*mass_ee_py - mass_ee_pz*mass_ee_pz)");

    // fill hist
    hc.SetDirectory(gDirectory);
    const TCut selection_ee = Form("%1.4f*evt_scale1fb*(Sum$(genps_status==3 && genps_id==11)>=1 && Sum$(genps_status==3 && genps_id==-11)>=1)", scale);
    chain.Draw(">>event_list_ee", selection_ee, "goff", num_events);
    TEventList * const event_list_ee = dynamic_cast<TEventList*>(gDirectory->Get("event_list_ee"));
    chain.SetEventList(event_list_ee);
    std::cout << "filling ee hists..." << std::endl;
    chain.Draw(Form("1>>h_count_ee_%s" , sample_name.c_str()), selection_ee, "goff", num_events);
    chain.Draw(Form("mass_ee>>h_mee_%s", sample_name.c_str()), selection_ee, "goff", num_events);

    const TCut selection_mm = Form("%1.4f*evt_scale1fb*(Sum$(genps_status==3 && genps_id==13)>=1 && Sum$(genps_status==3 && genps_id==-13)>=1)", scale);
    chain.SetEventList(NULL);
    chain.Draw(">>event_list_mm", selection_mm, "goff", num_events);
    TEventList * const event_list_mm = dynamic_cast<TEventList*>(gDirectory->Get("event_list_mm"));
    chain.SetEventList(event_list_mm);
    std::cout << "filling mm hists..." << std::endl;
    chain.Draw(Form("1>>h_count_mm_%s" , sample_name.c_str()), selection_mm, "goff", num_events);
    chain.Draw(Form("mass_mm>>h_mmm_%s", sample_name.c_str()), selection_mm, "goff", num_events);
    hc.SetDirectory(NULL);

    std::cout << "Complete " << sample_name  << ":  ";
    std::cout << "mm count = " << rt::Integral(hc["h_count_mm_"+sample_name]) << " (" << hc["h_count_mm_"+sample_name]->GetEntries() << ") : "; 
    std::cout << "ee count = " << rt::Integral(hc["h_count_ee_"+sample_name]) << " (" << hc["h_count_ee_"+sample_name]->GetEntries() << ")\n" << std::endl; 
   
    // done
    return;
}