// ----------------------------------------------------------------------------- // FillEventParticleLine // ----------------------------------------------------------------------------- void DelfesTreeReader::FillEvent(EventFormat& myEvent, SampleFormat& mySample) { // Fill electrons if (branchElectron_!=0) for (unsigned int i=0;i<static_cast<UInt_t>(branchElectron_->GetEntries());i++) { Electron* part = dynamic_cast<Electron*>(branchElectron_->At(i)); RecLeptonFormat * electron = myEvent.rec()->GetNewElectron(); electron->momentum_.SetPtEtaPhiM(part->PT,part->Eta,part->Phi,0.0); if (part->Charge>0) electron->charge_=true; else electron->charge_=false; electron->HEoverEE_ = part->EhadOverEem; IsolationConeType* isolcone05 = electron->GetNewIsolCone(); isolcone05->sumPT_ = part->sumPT05; isolcone05->sumET_ = part->sumET05; isolcone05->ntracks_ = part->nTrack05; isolcone05->deltaR_ = 0.5; IsolationConeType* isolcone04 = electron->GetNewIsolCone(); isolcone04->sumPT_ = part->sumPT04; isolcone04->sumET_ = part->sumET04; isolcone04->ntracks_ = part->nTrack04; isolcone04->deltaR_ = 0.4; IsolationConeType* isolcone03 = electron->GetNewIsolCone(); isolcone03->sumPT_ = part->sumPT03; isolcone03->sumET_ = part->sumET03; isolcone03->ntracks_ = part->nTrack03; isolcone03->deltaR_ = 0.3; IsolationConeType* isolcone02 = electron->GetNewIsolCone(); isolcone02->sumPT_ = part->sumPT02; isolcone02->sumET_ = part->sumET02; isolcone02->ntracks_ = part->nTrack02; isolcone02->deltaR_ = 0.2; } // Fill photons if (branchPhoton_!=0) for (unsigned int i=0;i<static_cast<UInt_t>(branchPhoton_->GetEntries());i++) { Photon* part = dynamic_cast<Photon*>(branchPhoton_->At(i)); RecPhotonFormat * photon = myEvent.rec()->GetNewPhoton(); photon->momentum_.SetPtEtaPhiM(part->PT,part->Eta,part->Phi,0.0); photon->HEoverEE_ = part->EhadOverEem; IsolationConeType* isolcone05 = photon->GetNewIsolCone(); isolcone05->sumPT_ = part->sumPT05; isolcone05->sumET_ = part->sumET05; isolcone05->ntracks_ = part->nTrack05; isolcone05->deltaR_ = 0.5; IsolationConeType* isolcone04 = photon->GetNewIsolCone(); isolcone04->sumPT_ = part->sumPT04; isolcone04->sumET_ = part->sumET04; isolcone04->ntracks_ = part->nTrack04; isolcone04->deltaR_ = 0.4; IsolationConeType* isolcone03 = photon->GetNewIsolCone(); isolcone03->sumPT_ = part->sumPT03; isolcone03->sumET_ = part->sumET03; isolcone03->ntracks_ = part->nTrack03; isolcone03->deltaR_ = 0.3; IsolationConeType* isolcone02 = photon->GetNewIsolCone(); isolcone02->sumPT_ = part->sumPT02; isolcone02->sumET_ = part->sumET02; isolcone02->ntracks_ = part->nTrack02; isolcone02->deltaR_ = 0.2; } // Fill muons if (branchMuon_!=0) for (unsigned int i=0;i<static_cast<UInt_t>(branchMuon_->GetEntries());i++) { Muon* part = dynamic_cast<Muon*>(branchMuon_->At(i)); RecLeptonFormat * muon = myEvent.rec()->GetNewMuon(); muon->momentum_.SetPtEtaPhiM(part->PT,part->Eta,part->Phi,0.0); if (part->Charge>0) muon->charge_=true; else muon->charge_=false; IsolationConeType* isolcone05 = muon->GetNewIsolCone(); isolcone05->sumPT_ = part->sumPT05; isolcone05->sumET_ = part->sumET05; isolcone05->ntracks_ = part->nTrack05; isolcone05->deltaR_ = 0.5; IsolationConeType* isolcone04 = muon->GetNewIsolCone(); isolcone04->sumPT_ = part->sumPT04; isolcone04->sumET_ = part->sumET04; isolcone04->ntracks_ = part->nTrack04; isolcone04->deltaR_ = 0.4; IsolationConeType* isolcone03 = muon->GetNewIsolCone(); isolcone03->sumPT_ = part->sumPT03; isolcone03->sumET_ = part->sumET03; isolcone03->ntracks_ = part->nTrack03; isolcone03->deltaR_ = 0.3; IsolationConeType* isolcone02 = muon->GetNewIsolCone(); isolcone02->sumPT_ = part->sumPT02; isolcone02->sumET_ = part->sumET02; isolcone02->ntracks_ = part->nTrack02; isolcone02->deltaR_ = 0.2; } // Fill jets and taus if (branchJet_!=0) for (unsigned int i=0;i<static_cast<UInt_t>(branchJet_->GetEntries());i++) { Jet* part = dynamic_cast<Jet*>(branchJet_->At(i)); if(part->TauTag==1) { RecTauFormat * tau = myEvent.rec()->GetNewTau(); tau->momentum_.SetPtEtaPhiM(part->PT,part->Eta,part->Phi,0.0); tau->ntracks_ = 0; // To fix later if (part->Charge>0) tau->charge_=true; else tau->charge_=false; tau->HEoverEE_ = part->EhadOverEem; } else { RecJetFormat * jet = myEvent.rec()->GetNewJet(); jet->momentum_.SetPtEtaPhiM(part->PT,part->Eta,part->Phi,0.0); jet->ntracks_ = 0; // To fix later jet->btag_ = part->BTag; jet->HEoverEE_ = part->EhadOverEem; } } // MET if (branchMissingET_!=0) if (branchMissingET_->GetEntries()>0) { MissingET* part = dynamic_cast<MissingET*>(branchMissingET_->At(0)); myEvent.rec()->MET_.momentum_.SetPx(part->MET*cos(part->Phi)); myEvent.rec()->MET_.momentum_.SetPy(part->MET*sin(part->Phi)); myEvent.rec()->MET_.momentum_.SetE(part->MET); } // THT if (branchScalarHT_!=0) if (branchScalarHT_->GetEntries()>0) { ScalarHT* part = dynamic_cast<ScalarHT*>(branchScalarHT_->At(0)); myEvent.rec()->THT_=part->HT; } // GenParticle collection if (branchGenParticle_!=0) for (unsigned int i=0;i<static_cast<UInt_t>(branchGenParticle_->GetEntries());i++) { GenParticle* part = dynamic_cast<GenParticle*>(branchGenParticle_->At(i)); MCParticleFormat * gen = myEvent.mc()->GetNewParticle(); gen->pdgid_ = part->PID; gen->statuscode_ = part->Status; gen->mothup1_ = part->M1; gen->mothup2_ = part->M2; gen->momentum_.SetPxPyPzE(part->Px,part->Py, part->Pz, part->E); } // Track collection if (branchTrack_!=0) for (unsigned int i=0;i<static_cast<UInt_t>(branchTrack_->GetEntries());i++) { Track* ref = dynamic_cast<Track*>(branchTrack_->At(i)); RecTrackFormat * track = myEvent.rec()->GetNewTrack(); track->pdgid_ = ref->PID; if (ref->Charge>0) track->charge_=true; else track->charge_=false; track->momentum_.SetPtEtaPhiE(ref->PT,ref->Eta,ref->Phi,ref->PT); track->etaOuter_ = ref->EtaOuter; track->phiOuter_ = ref->PhiOuter; IsolationConeType* isolcone05 = track->GetNewIsolCone(); isolcone05->sumPT_ = ref->sumPT05; isolcone05->sumET_ = ref->sumET05; isolcone05->ntracks_ = ref->nTrack05; isolcone05->deltaR_ = 0.5; IsolationConeType* isolcone04 = track->GetNewIsolCone(); isolcone04->sumPT_ = ref->sumPT04; isolcone04->sumET_ = ref->sumET04; isolcone04->ntracks_ = ref->nTrack04; isolcone04->deltaR_ = 0.4; IsolationConeType* isolcone03 = track->GetNewIsolCone(); isolcone03->sumPT_ = ref->sumPT03; isolcone03->sumET_ = ref->sumET03; isolcone03->ntracks_ = ref->nTrack03; isolcone03->deltaR_ = 0.3; IsolationConeType* isolcone02 = track->GetNewIsolCone(); isolcone02->sumPT_ = ref->sumPT02; isolcone02->sumET_ = ref->sumET02; isolcone02->ntracks_ = ref->nTrack02; isolcone02->deltaR_ = 0.2; } }
// ----------------------------------------------------------------------------- // Execute // function called each time one event is read // ----------------------------------------------------------------------------- bool cms_b2g_15_004::Execute(SampleFormat& sample, const EventFormat& event) { if(event.rec()!= 0){ double myEventWeight; if(Configuration().IsNoEventWeight()) myEventWeight=1.; else if(event.mc()->weight()!=0.) myEventWeight=event.mc()->weight(); else{ WARNING << "Found one event with a zero weight. Skipping..." << endmsg; return false; } Manager()->InitializeForNewEvent(myEventWeight); Manager()->SetCurrentEventWeight(myEventWeight); //Declare empty containers vector<const RecJetFormat*> myJets; vector<const RecLeptonFormat*> myElectrons; vector<const RecLeptonFormat*> myMuons; if(!Manager()->ApplyCut(event.rec()->electrons().size()+ event.rec()->muons().size()>= 1,"1+ candidate lepton")) return true; if(!Manager()->ApplyCut(event.rec()->jets().size()>1, "2+ candidate jets")) return true; for(unsigned int i= 0; i< event.rec()->electrons().size(); i++){ bool good= true; const RecLeptonFormat *CurrentElectron= &(event.rec()->electrons()[i]); for(unsigned int j= 0; j< event.rec()->jets().size(); j++){ const RecJetFormat *CurrentJet= &(event.rec()->jets()[j]); double deltaR= CurrentElectron->dr(CurrentJet); double angle= CurrentElectron->angle(CurrentJet); double relapt= CurrentElectron->momentum().Pt()*sin(angle); if(!(deltaR> 0.4 || relapt> 60.)) good= false; } double pt= CurrentElectron->momentum().Pt(); double eta= CurrentElectron->momentum().Eta(); if(pt> 180. && fabs(eta)< 2.5 && good) myElectrons.push_back(CurrentElectron); } for(unsigned int i= 0; i< event.rec()->muons().size(); i++){ bool good= true; const RecLeptonFormat *CurrentMuon= &(event.rec()->muons()[i]); for(unsigned int j= 0; j< event.rec()->jets().size(); j++){ const RecJetFormat *CurrentJet= &(event.rec()->jets()[j]); double deltaR= CurrentMuon->dr(CurrentJet); double angle= CurrentMuon->angle(CurrentJet); double relapt= CurrentMuon->momentum().Pt()*sin(angle); if(!(deltaR> 0.4 || relapt> 50.)) good= false; } double pt= CurrentMuon->momentum().Pt(); double eta= CurrentMuon->momentum().Eta(); if(pt> 180. && fabs(eta)< 2.1 && good) myMuons.push_back(CurrentMuon); } for(unsigned int j= 0; j< event.rec()->jets().size(); j++){ const RecJetFormat *CurrentJet= &(event.rec()->jets()[j]); myJets.push_back(CurrentJet); } SORTER->sort(myJets); if(!Manager()->ApplyCut(myElectrons.size()>=1, "1+ electrons")) return true; if(!Manager()->ApplyCut(myJets[0]->momentum().Pt()> 350, "pt leading jet> 350 GeV")) return true; if(!Manager()->ApplyCut(myJets[1]->momentum().Pt()> 30., "pt subleading jet> 30 GeV")) return true; if(!Manager()->ApplyCut((myJets[0]->btag() || myJets[1]->btag()), "b-tagging electron")) return true; if(!Manager()->ApplyCut(event.rec()->MET().et()> 120., "missing ET> 120 GeV")) return true; if(myElectrons.size()>=1){ double phi= event.rec()->MET().phi()- myElectrons[0]->phi(); if(!Manager()->ApplyCut(fabs(phi)< 2.,"delta phi (missing ET, electron)< 2 rad")) return true; } if(!Manager()->ApplyCut(myMuons.size()>=1, "1+ muons")) return true; if(!Manager()->ApplyCut(myJets[0]->momentum().Pt()> 450., "pt leading jet> 450 GeV")) return true; if(!Manager()->ApplyCut(myJets[1]->momentum().Pt()> 30., "pt subleading jet> 30 GeV")) return true; if(!Manager()->ApplyCut((myJets[0]->btag() || myJets[1]->btag()), "b-tagging muon")) return true; if(!Manager()->ApplyCut(event.rec()->MET().et()> 50., "missing ET> 50 GeV")) return true; if(myElectrons.size()>=1){ double Wmass= (myElectrons[0]->momentum()+event.rec()->MET().momentum()).M(); double test= sqrt(2*myElectrons[0]->pt()*event.rec()->MET().pt()*(cosh(myElectrons[0]->eta() -event.rec()->MET().eta())- cos(myElectrons[0]->phi() - event.rec()->MET().phi()))); if(pow((myElectrons[0]->px()*event.rec()->MET().px() + myElectrons[0]->py()*event.rec()->MET().py() + (80.4*80.4)/2),2)- event.rec()->MET().et()*event.rec()->MET().et()* (myElectrons[0]->e()*myElectrons[0]->e() - myElectrons[0]->pz()*myElectrons[0]->pz())>0){ double pzneutri1= (myElectrons[0]->pz()*(myElectrons[0]->px()*event.rec()->MET().px() + myElectrons[0]->py()*event.rec()->MET().py() + (80.4*80.4)/2) + myElectrons[0]->e()* sqrt(pow((myElectrons[0]->px()*event.rec()->MET().px() + myElectrons[0]->py()*event.rec()->MET().py() + (80.4*80.4)/2),2)- event.rec()->MET().et()*event.rec()->MET().et()* (myElectrons[0]->e()*myElectrons[0]->e() - myElectrons[0]->pz()*myElectrons[0]->pz())))/(myElectrons[0]->e()*myElectrons[0]->e()- myElectrons[0]->pz()*myElectrons[0]->pz()); double pzneutri2= (myElectrons[0]->pz()*(myElectrons[0]->px()*event.rec()->MET().px() + myElectrons[0]->py()*event.rec()->MET().py() + (80.4*80.4)/2) - myElectrons[0]->e()* sqrt(pow((myElectrons[0]->px()*event.rec()->MET().px() + myElectrons[0]->py()*event.rec()->MET().py() + (80.4*80.4)/2),2)- event.rec()->MET().et()*event.rec()->MET().et()* (myElectrons[0]->e()*myElectrons[0]->e() - myElectrons[0]->pz()*myElectrons[0]->pz())))/(myElectrons[0]->e()*myElectrons[0]->e()- myElectrons[0]->pz()*myElectrons[0]->pz()); cout<<"pz1: "<< pzneutri1 << endl; cout<<"pz2: "<< pzneutri2 << endl; double nrjneut1= sqrt(event.rec()->MET().px()*event.rec()->MET().px() + event.rec()->MET().py()*event.rec()->MET().py() + pzneutri1*pzneutri1); double nrjneut2= sqrt(event.rec()->MET().px()*event.rec()->MET().px() + event.rec()->MET().py()*event.rec()->MET().py() + pzneutri2*pzneutri2); cout<<"e neut1: "<< nrjneut1 << endl; cout<<"e neut2: "<< nrjneut2 << endl; double lachose= sqrt(2*(nrjneut1*myElectrons[0]->e()-myElectrons[0]->px()*event.rec()->MET().px()-myElectrons[0]->py()*event.rec()->MET().py()-myElectrons[0]->pz()*pzneutri1)); cout<<"la masse: "<< lachose << endl; } //cout<<"W: "<< Wmass << endl; //cout<<"E neutri: "<< event.rec()->MET().e() << endl; //cout<<"pt: "<< event.rec()->MET().pt() << endl; //cout<<"px: "<< event.rec()->MET().px() << endl; //cout<<"py: "<< event.rec()->MET().py() << endl; //cout<<"pz: "<< event.rec()->MET().pz() << endl; //cout<<"truc: "<< sqrt(event.rec()->MET().px()*event.rec()->MET().px()+event.rec()->MET().py()*event.rec()->MET().py()) << endl; //cout<<"test: "<< test << endl; } } return true; }
// ----------------------------------------------------------------------------- // FinalizeEvent // ----------------------------------------------------------------------------- bool DelfesTreeReader::FinalizeEvent(SampleFormat& mySample, EventFormat& myEvent) { // MHT & THT for (unsigned int i=0; i<myEvent.rec()->jets_.size();i++) { myEvent.rec()->MHT_ -= myEvent.rec()->jets_[i].momentum(); if (branchScalarHT_==0) myEvent.rec()->THT_ += myEvent.rec()->jets_[i].pt(); myEvent.rec()->TET_ += myEvent.rec()->jets_[i].pt(); } // TET for (unsigned int i=0; i<myEvent.rec()->muons_.size();i++) { myEvent.rec()->TET_ += myEvent.rec()->muons_[i].pt(); } for (unsigned int i=0; i<myEvent.rec()->electrons_.size();i++) { myEvent.rec()->TET_ += myEvent.rec()->electrons_[i].pt(); } for (unsigned int i=0; i<myEvent.rec()->taus_.size();i++) { myEvent.rec()->TET_ += myEvent.rec()->taus_[i].pt(); } for (unsigned int i=0; i<myEvent.rec()->photons_.size();i++) { myEvent.rec()->TET_ += myEvent.rec()->photons_[i].pt(); } // Finalize MHT myEvent.rec()->MHT_.momentum().SetPz(0.); myEvent.rec()->MHT_.momentum().SetE(myEvent.rec()->MHT_.momentum().Pt()); // Mother pointer assignment for (unsigned int i=0; i<myEvent.mc()->particles_.size();i++) { MCParticleFormat& part = myEvent.mc()->particles_[i]; // MET, MHT, TET, THT if (part.statuscode()==1 && !PHYSICS->Id->IsInvisible(part)) { myEvent.mc()->MET_ -= part.momentum(); myEvent.mc()->TET_ += part.pt(); if (PHYSICS->Id->IsHadronic(part)) { myEvent.mc()->MHT_ -= part.momentum(); myEvent.mc()->THT_ += part.pt(); } } /* unsigned int index1=myEvent.mc()->particles_[i].mothup1_; unsigned int index2=myEvent.mc()->particles_[i].mothup2_; if (index1!=0 && index2!=0) { if (index1>=myEvent.mc()->particles_.size() || index2>=myEvent.mc()->particles_.size()) { WARNING << "mother index is greater to nb of particles" << endmsg; WARNING << " - index1 = " << index1 << endmsg; WARNING << " - index2 = " << index2 << endmsg; WARNING << " - particles.size() " << myEvent.mc()->particles_.size() << endmsg; WARNING << "This event is skipped." << endmsg; return false; } myEvent.mc()->particles_[i].mother1_ = &myEvent.mc()->particles_[index1-1]; myEvent.mc()->particles_[index1-1].daughters_.push_back(&myEvent.mc()->particles_[i]); myEvent.mc()->particles_[i].mother2_ = &myEvent.mc()->particles_[index2-1]; myEvent.mc()->particles_[index2-1].daughters_.push_back(&myEvent.mc()->particles_[i]); } */ } // Finalize event myEvent.mc()->MET_.momentum().SetPz(0.); myEvent.mc()->MET_.momentum().SetE(myEvent.mc()->MET_.momentum().Pt()); myEvent.mc()->MHT_.momentum().SetPz(0.); myEvent.mc()->MHT_.momentum().SetE(myEvent.mc()->MHT_.momentum().Pt()); // Normal end return true; }
// ----------------------------------------------------------------------------- // Initialize // ----------------------------------------------------------------------------- void AnalysisHelper::Initialize(SampleFormat& sample, const EventFormat& event) { // Reset partons_.clear(); matchedjets_.clear(); // Safety: no MC information if (event.mc()==0) return; // Storing b and c quarks for (unsigned int i=0;i<event.mc()->particles().size();i++) { const MCParticleFormat& part = event.mc()->particles()[i]; // particle from MadGraph if (part.statuscode()!=3) continue; // keeping only partons unsigned int pid = std::abs(part.pdgid()); if (pid==21) pid=0; if (pid>=6) continue; // Removing partons from initial state if (i<4) continue; if (part.pt()<5) continue; // Safety: this particle must have a mother if (part.mother1()==0) continue; // Taking into account radiation // -> taking parton before radiation // Case of gluon ???? if (part.mother1()->pdgid()==part.pdgid()) continue; // Saving parton partons_.push_back(&part); } // Ordering partons by PT order for (unsigned int i=0;i<partons_.size();i++) for (unsigned int j=i+1;j<partons_.size();j++) { if (partons_[i]->pt()<partons_[j]->pt()) { const MCParticleFormat* tmp=partons_[i]; partons_[i]=partons_[j]; partons_[j]=tmp; } } // Prepare collection of jets matchedjets_.resize(partons_.size(),0); // Skip ? if (partons_.size()==0) return; // Mask : only one jet for each parton std::vector<bool> mask(partons_.size(),false); // Ordering jets by PT order std::vector<const RecJetFormat*> jets; for (unsigned int i=0;i<event.rec()->jets().size();i++) { jets.push_back(&event.rec()->jets()[i]); } for (unsigned int i=0;i<jets.size();i++) for (unsigned int j=i+1;j<jets.size();j++) { if (jets[i]->pt()<jets[j]->pt()) { const RecJetFormat* tmp=jets[i]; jets[i]=jets[j]; jets[j]=tmp; } } // Matching jets for (unsigned int i=0;i<jets.size();i++) { const RecJetFormat* jet = jets[i]; // cut on the PT if (jet->pt()<1.e-6) continue; int bestcandidate = -1; double deltaRmin = 0; // loop over particles for (unsigned int j=0;j<partons_.size();j++) { // is the parton already used? if (mask[j]) continue; // computing DR const MCParticleFormat* part = partons_[j]; double dr=jet->dr(*part); // does the parton match the jet ? if (dr<0.5) { if (bestcandidate==-1 || deltaRmin<dr) { deltaRmin=dr; bestcandidate=j; } } } // final matching if (bestcandidate!=-1) { matchedjets_[bestcandidate]=jet; mask[bestcandidate]=true; } } }