#include "my_analysis/MyPartonSelector.hpp" #include "caf_mc_util/CafUtilsMC.hpp" #include "cafe/Config.hpp" #include "cafe/Collection.hpp" #include "tmb_tree/TMBJet.hpp" #include "tmb_tree/TMBMCpart.hpp" #include "tmb_tree/TMBVector3.hpp" #include "caf_util/METSelector.hpp" #include "kinem_util/AnglesUtil.hpp" #include "tmb_tree/TMBJet.hpp" #include "my_analysis/MyMuons.hpp" #include "my_analysis/MyJets.hpp" #include #include #include #include #include #include #include using namespace std ; using namespace cafe ; namespace{ bool moreThan(const TMBMCpart& a, const TMBMCpart& b) { return a.Pt() > b.Pt(); } } namespace my_analysis { MyPartonSelector::MyPartonSelector(const char *name) : cafe::Processor(name), _nselected(0), _vars("_nchunks"),_varsglob("_runno") { }; void MyPartonSelector::begin() { TDirectory *dir = getDirectory(); dir->cd(); // get parameters from the configuration file cafe::Config config(name()); _pTmin = config.get("pT", 0.0); _pTmax = config.get("LooseMuon_Pt",700.0); _eta = config.get("LooseMuon_Eta", 2.0); _sort = config.get("Sort", 0); _the_muon_branch = config.get("MuonBranch", "Muons"); _jetbranch = config.get("jetbranch","JCCB"); _objectsBranches = config.getVString("ObjectsBranches", " ,") ; // _npartons = config.get("nPartons", 0); // _npartonsmax = config.get("nPartonsMax", -1); _nTotalSelected = 0; outfile = new TFile("cool.root", "RECREATE"); outfile->cd(); tree = new TTree("my_tree","MY_TREE"); selected_muons = new TClonesArray("MyMuons"); jet = new TClonesArray("MyJets"); tree->Branch("nj", &nj, "nj/I"); tree->Branch("event_weights", &event_weight, "event_weight/D"); tree->Branch("My_Muons", &selected_muons); tree->Branch("My_Jets", &jet); out() << "\nOBJECT SELECTION:\n"; if (_pTmin > 0) out() <<" pT >= "<<_pTmin<::const_iterator it = _objectsBranches.begin() ; it != _objectsBranches.end(); it++) out() << "[" << *it << "]" ; out() << endl ; if (_sort) out() << " Output parton branch will be sorted in pT" << endl; else out() << " Output parton branch will NOT be sorted in pT" << endl; } bool MyPartonSelector::processEvent(cafe::Event &event) { _event = &event ; _isMC = event.isMC() ; _nselected = 0 ; //get pointer to statistics collector event.get("StatPointer", _stat) ; //clear branches selected_muons->Clear(); jet->Clear(); //get muons and jets event_muons = event.getCollection(_the_muon_branch.c_str(), cafe::detail::empty); event_jets = event.getCollection(_jetbranch.c_str()); generated_particles = event.getCollection("MCpart"); //get event weights StatPointer stat; event.get("StatPointer", stat); Stat* statptr = stat.pointer(); double global_weight = 1.0; double lumi_weight = 1.0; Collection event_weights = statptr->ListEventWeights(); global_weight = event_weights[0].Weight(); lumi_weight = event_weights[1].Weight(); event_weight = global_weight; nj = event_jets.size(); //Fill muon and jet branches for(int n = 0; n < event_muons.size(); n++) { muonbranch(event_muons[n]); cout << "muon pt = " << event_muons[n].Pt() << endl; } for(int m = 0; m < event_jets.size(); m++) { jetbranch(event_jets[m]); } //Fill tree tree->Fill(); return true ; }; void MyPartonSelector::jetbranch(const TMBJet &jets) { for(int i = 0; i < event_muons.size(); i++) { if(event_muons[i].DeltaR(jets) < 0.5) tmp_jet.match = 1; } tmp_jet.pt = jets.Pt(); tmp_jet.eta = jets.Eta(); tmp_jet.phi = jets.Phi(); tmp_jet.detEta = jets.detEta(); tmp_jet.flavor = jets.mc_flavor(); TClonesArray &jet_arrayref = *jet; new(jet_arrayref[jet_arrayref.GetEntries()]) MyJets(tmp_jet); }; void MyPartonSelector::muonbranch(const TMBMuon &muon) { /* double deltar_min = 9999.0; int deltar_index = -1; for(int j = 0; j < event_jets.size(); j++) { if(muon.DeltaR(event_jets[j]) < deltar_min) { deltar_index = j; } } */ tmp_muon.pt_reco = muon.Pt(); tmp_muon.eta_reco = muon.Eta(); tmp_muon.phi_reco = muon.Phi(); // tmp_muon.ptrel_reco = muon.Perp(event_jets[deltar_index]); // tmp_muon.dr_reco = muon.DeltaR(event_jets[deltar_index]); // tmp_muon.dphi_reco = muon.DeltaPhi(event_jets[deltar_index]); /* for(int i = 0; i < generated_particles.size(); i++) { if(isSame(muon, generated_particles[i], 0.5)) { tmp_muon.matched = 1; } else { tmp_muon.matched = 0; } if(isaB(generated_particles[i]) == 5) tmp_muon.id = 5; if(isaB(generated_particles[i]) == 4) tmp_muon.id = 4; if(isaB(generated_particles[i]) == 0) tmp_muon.id = 0; tmp_muon.pt_gen = generated_particles[i].Pt(); tmp_muon.eta_gen = generated_particles[i].Eta(); tmp_muon.phi_gen = generated_particles[i].Phi(); tmp_muon.ptrel_gen = generated_particles[i].Perp(event_jets[deltar_index]); tmp_muon.dr_gen = generated_particles[i].DeltaR(event_jets[deltar_index]); tmp_muon.dphi_gen = generated_particles[i].DeltaPhi(event_jets[deltar_index]); } */ TClonesArray &selected_muons_arrayref = *selected_muons; new(selected_muons_arrayref[selected_muons_arrayref.GetEntries()]) MyMuons(tmp_muon); }; int MyPartonSelector::isaB(const TMBMCpart &parton) { if(parton.abspdgid() != 13) return false; const TMBMCpart *my_parent = GetParent(parton); const TMBMCpart *my_Gparent = GetGrandPa(parton); const TMBMCpart *my_GGparent = GetGreatGrandPa(parton); const TMBMCpart *my_GGGparent = GetGGGrandPa(parton); const TMBMCpart *my_GGGGparent = GetGGGGrandPa(parton); const TMBMCpart *my_GGGGGparent = GetGGGGGrandPa(parton); const TMBMCpart *my_GGGGGGparent = GetGGGGGGrandPa(parton); const TMBMCpart *my_GGGGGGGparent = GetGGGGGGGrandPa(parton); const TMBMCpart *my_GGGGGGGGparent = GetGGGGGGGGrandPa(parton); const TMBMCpart *my_GGGGGGGGGparent = GetGGGGGGGGGrandPa(parton); const TMBMCpart *my_GGGGGGGGGGparent = GetGGGGGGGGGGrandPa(parton); const TMBMCpart *original_parton; bool isB = false; bool isC = false; bool isLight = false; original_parton = 0x0; if(my_parent != 0x0) { // cout << " Parent pdgid: " << my_parent->abspdgid() << endl; if(my_parent->abspdgid() < 22) { original_parton = my_parent; } if(my_parent->abspdgid() == 5) { isB = true; } if(my_parent->abspdgid() == 4) { isC = true; } if(my_parent->abspdgid() == 21) { isLight = true; } if(my_parent->abspdgid() < 4 && my_parent->abspdgid() > 0) { isLight = true; } } if(my_Gparent != 0x0) { // cout << " Grandpa pdgid: " << my_Gparent->abspdgid() << endl; if(my_GGparent == 0x0 && my_Gparent->abspdgid() < 22) { original_parton = my_Gparent; } if(my_Gparent->abspdgid() == 5) { isB = true; } if(my_Gparent->abspdgid() == 4) { isC = true; } if(my_Gparent->abspdgid() == 21) { isLight = true; } if(my_Gparent->abspdgid() < 4 && my_Gparent->abspdgid() > 0) { isLight = true; } } if(my_GGparent != 0x0) { // cout << " GreatGrandpa pdgid: " << my_GGparent->abspdgid() << endl; if(my_GGGparent == 0x0 && my_GGparent->abspdgid() < 22) { original_parton = my_GGparent; } if(my_GGparent->abspdgid() == 5) { isB = true; } if(my_GGparent->abspdgid() == 4) { isC = true; } if(my_GGparent->abspdgid() == 21) { isLight = true; } if(my_GGparent->abspdgid() < 4 && my_GGparent->abspdgid() > 0) { isLight = true; } } if(my_GGGparent != 0x0) { // cout << " GreatGreatGrandpa pdgid: " << my_GGGparent->abspdgid() << endl; if(my_GGGGparent == 0x0 && my_GGGparent->abspdgid() < 22) { original_parton = my_GGGparent; } if(my_GGGparent->abspdgid() == 5) { isB = true; } if(my_GGGparent->abspdgid() == 4) { isC = true; } if(my_GGGparent->abspdgid() == 21) { isLight = true; } if(my_GGGparent->abspdgid() < 4 && my_GGGparent->abspdgid() > 0) { isLight = true; } } if(my_GGGGparent != 0x0) { // cout << " GreatGreatGreatGrandpa pdgid: " << my_GGGGparent->abspdgid() << endl; if(my_GGGGGparent == 0x0 && my_GGGGparent->abspdgid() < 22) { original_parton = my_GGGGparent; } if(my_GGGGparent->abspdgid() == 5) { isB = true; } if(my_GGGGparent->abspdgid() == 4) { isC = true; } if(my_GGGGparent->abspdgid() == 21) { isLight = true; } if(my_GGGGparent->abspdgid() < 4 && my_GGGGparent->abspdgid() > 0) { isLight = true; } } if(my_GGGGGparent != 0x0) { // cout << " GreatGreatGreatGreatGrandpa pdgid: " << my_GGGGGparent->abspdgid() << endl; if(my_GGGGGGparent == 0x0 && my_GGGGGparent->abspdgid() < 22) { original_parton = my_GGGGGparent; } if(my_GGGGGparent->abspdgid() == 5) { isB = true; } if(my_GGGGGparent->abspdgid() == 4) { isC = true; } if(my_GGGGGparent->abspdgid() == 21) { isLight = true; } if(my_GGGGGparent->abspdgid() < 4 && my_GGGGGparent->abspdgid() > 0) { isLight = true; } } if(my_GGGGGGparent != 0x0) { // cout << " GreatGreatGreatGreatGreatGrandpa pdgid: " << my_GGGGGGparent->abspdgid() << endl; if(my_GGGGGGGparent == 0x0 && my_GGGGGGparent->abspdgid() < 22) { original_parton = my_GGGGGGparent; } if(my_GGGGGGparent->abspdgid() == 5) { isB = true; } if(my_GGGGGGparent->abspdgid() == 4) { isC = true; } if(my_GGGGGGparent->abspdgid() == 21) { isLight = true; } if(my_GGGGGGparent->abspdgid() < 4 && my_GGGGGGparent->abspdgid() > 0) { isLight = true; } } if(my_GGGGGGGparent != 0x0) { // cout << " GreatGreatGreatGreatGreatGreatGrandpa pdgid: " << my_GGGGGGGparent->abspdgid() << endl; if(my_GGGGGGGGparent == 0x0 && my_GGGGGGGparent->abspdgid() < 22) { original_parton = my_GGGGGGGparent; } if(my_GGGGGGGparent->abspdgid() == 5) { isB = true; } if(my_GGGGGGGparent->abspdgid() == 4) { isC = true; } if(my_GGGGGGGparent->abspdgid() == 21) { isLight = true; } if(my_GGGGGGGparent->abspdgid() < 4 && my_GGGGGGGparent->abspdgid() > 0) { isLight = true; } } if(my_GGGGGGGGparent != 0x0) { // cout << " GreatGreatGreatGreatGreatGreatGreatGrandpa pdgid: " << my_GGGGGGGGparent->abspdgid() << endl; if(my_GGGGGGGGGparent == 0x0 && my_GGGGGGGGparent->abspdgid() < 22) { original_parton = my_GGGGGGGGparent; } if(my_GGGGGGGGparent->abspdgid() == 5) { isB = true; } if(my_GGGGGGGGparent->abspdgid() == 4) { isC = true; } if(my_GGGGGGGGparent->abspdgid() == 21) { isLight = true; } if(my_GGGGGGGGparent->abspdgid() < 4 && my_GGGGGGGGparent->abspdgid() > 0) { isLight = true; } } if(my_GGGGGGGGGparent != 0x0) { // cout << " GreatGreatGreatGreatGreatGreatGreatGreatGrandpa pdgid: " << my_GGGGGGGGGparent->abspdgid() << endl; if(my_GGGGGGGGGGparent == 0x0 && my_GGGGGGGGGparent->abspdgid() < 22) { original_parton = my_GGGGGGGGparent; } if(my_GGGGGGGGGparent->abspdgid() == 5) { isB = true; } if(my_GGGGGGGGGparent->abspdgid() == 4) { isC = true; } if(my_GGGGGGGGGparent->abspdgid() == 21) { isLight = true; } if(my_GGGGGGGGGparent->abspdgid() < 4 && my_GGGGGGGGGparent->abspdgid() > 0) { isLight = true; } } if(my_GGGGGGGGGGparent != 0x0) { // cout << " GreatGreatGreatGreatGreatGreatGreatGreatGreatGrandpa pdgid: " << my_GGGGGGGGGGparent->abspdgid() << endl; // cout << "Evan, you need to find the next ancestor" << endl; if(my_GGGGGGGGGGparent->abspdgid() == 5) { isB = true; } if(my_GGGGGGGGGGparent->abspdgid() == 4) { isC = true; } if(my_GGGGGGGGGGparent->abspdgid() == 21) { isLight = true; } if(my_GGGGGGGGGGparent->abspdgid() < 4 && my_GGGGGGGGGGparent->abspdgid() > 0) { isLight = true; } } if(isB == true) { return 5; } if(isB == false && isC == true) { return 4; } if(isB == false && isC == false && isLight == true) { return 0; } if(isB == false && isC == false && isLight == false) { return -1; } else { return -1; } }; bool MyPartonSelector::isSame(const TLorentzVector &first, const TLorentzVector &second, Double_t delta = 0.5) { if(first.DeltaR(second) <= delta) return true; return false; } void MyPartonSelector::finish() { tree->Write(); tree->Print(); outfile->Write(); outfile->Close(); printf("============================================\n"); printf(" MyPartonSelector[ %s ] SUMMARY\n\n",name().c_str()); printf(" I found %li partons\n", _nTotalSelected); printf("============================================\n"); } } ClassImp(my_analysis::MyPartonSelector);