1 | #include "SampleAnalyzer/User/Analyzer/cms_exo_17_015.h"
|
---|
2 | using namespace MA5;
|
---|
3 |
|
---|
4 | // -----------------------------------------------------------------------------
|
---|
5 | // Initialize
|
---|
6 | // function called one time at the beginning of the analysis
|
---|
7 | // -----------------------------------------------------------------------------
|
---|
8 | bool cms_exo_17_015::Initialize(const MA5::Configuration& cfg, const std::map<std::string,std::string>& parameters)
|
---|
9 | {
|
---|
10 | // General information
|
---|
11 | INFO << " <><><><><><><><><><><><><><><><><><><><><><><><>" << endmsg;
|
---|
12 | INFO << " <> Analysis: CMS-EXO-17-015 <>" << endmsg;
|
---|
13 | INFO << " <> arXiv:1811.10151 <>" << endmsg;
|
---|
14 | INFO << " <> (1 muon + >= 1 jet + MET) <>" << endmsg;
|
---|
15 | INFO << " <> Recasted by: B. Fuks and A. Jueid <>" << endmsg;
|
---|
16 | INFO << " <> Contacts: fuks@lpthe.jussieu.fr <>" << endmsg;
|
---|
17 | INFO << " <> adil.hep@gmail.com <>" << endmsg;
|
---|
18 | INFO << " <> Based on MadAnalysis 5 v1.8 <>" << endmsg;
|
---|
19 | INFO << " <><><><><><><><><><><><><><><><><><><><><><><><>" << endmsg;
|
---|
20 |
|
---|
21 | // Definition of the signal region
|
---|
22 | Manager()->AddRegionSelection("SR");
|
---|
23 |
|
---|
24 | // cuts
|
---|
25 | Manager()->AddCut("SignalMuon");
|
---|
26 | Manager()->AddCut("SignalJet");
|
---|
27 | Manager()->AddCut("bTagVeto");
|
---|
28 | Manager()->AddCut("TauVeto");
|
---|
29 | Manager()->AddCut("ElectronVeto");
|
---|
30 | Manager()->AddCut("ZmassVeto");
|
---|
31 | Manager()->AddCut("Etmiss > 100 GeV");
|
---|
32 | Manager()->AddCut("DPhijetMET > 0.5");
|
---|
33 | Manager()->AddCut("DPhimuMET > 0.5");
|
---|
34 | Manager()->AddCut("MT > 500 GeV");
|
---|
35 |
|
---|
36 | // Histograms
|
---|
37 | Manager()->AddHisto("Mmuj", 20, 0.0, 2000.0);
|
---|
38 | return true;
|
---|
39 | }
|
---|
40 |
|
---|
41 | // -----------------------------------------------------------------------------
|
---|
42 | // Finalize
|
---|
43 | // function called one time at the end of the analysis
|
---|
44 | // -----------------------------------------------------------------------------
|
---|
45 | void cms_exo_17_015::Finalize(const SampleFormat& summary, const std::vector<SampleFormat>& files)
|
---|
46 | {
|
---|
47 | }
|
---|
48 |
|
---|
49 | // -----------------------------------------------------------------------------
|
---|
50 | // Execute
|
---|
51 | // function called each time one event is read
|
---|
52 | // -----------------------------------------------------------------------------
|
---|
53 | bool cms_exo_17_015::Execute(SampleFormat& sample, const EventFormat& event)
|
---|
54 | {
|
---|
55 | // Event weight
|
---|
56 | double myWeight;
|
---|
57 | if(Configuration().IsNoEventWeight()) myWeight=1.;
|
---|
58 | else if(event.mc()->weight()!=0.) myWeight=event.mc()->weight();
|
---|
59 | else { return false; } // Event with a 0 weight -> can be skipped
|
---|
60 | Manager()->InitializeForNewEvent(myWeight);
|
---|
61 |
|
---|
62 | // Security for empty events
|
---|
63 | if (event.rec()==0) return true;
|
---|
64 |
|
---|
65 | // Jets
|
---|
66 | std::vector<const RecJetFormat*> SignalJets;
|
---|
67 | unsigned int nb=0;
|
---|
68 | for(unsigned int ii=0; ii<event.rec()->jets().size(); ii++)
|
---|
69 | {
|
---|
70 | const RecJetFormat *CurrentJet = &(event.rec()->jets()[ii]);
|
---|
71 | // Pseudorapidity acceptance
|
---|
72 | if (CurrentJet->abseta() < 2.4) //continue;
|
---|
73 | // Signal jets
|
---|
74 | SignalJets.push_back(CurrentJet);
|
---|
75 | // b-tagged jets (we will veto those jets to reduce ttbar background)
|
---|
76 | if ( CurrentJet->pt()>30. && CurrentJet->btag()) nb++;
|
---|
77 | }
|
---|
78 |
|
---|
79 | // Electrons with pt > 15 and |eta| < 2.5
|
---|
80 | // unsigned int ne=0;
|
---|
81 | std::vector<const RecLeptonFormat*> LooseElectrons;
|
---|
82 | for(unsigned int ie=0; ie<event.rec()->electrons().size(); ie++)
|
---|
83 | {
|
---|
84 | const RecLeptonFormat* CurrentElectron = &(event.rec()->electrons()[ie]);
|
---|
85 | double pt = CurrentElectron->pt();
|
---|
86 | double iso = (PHYSICS->Isol->eflow->sumIsolation(CurrentElectron,event.rec(),0.4,0.,IsolationEFlow::ALL_COMPONENTS))/pt;
|
---|
87 | // Pseudorapidity, pt and isolation basic cuts
|
---|
88 | if( CurrentElectron->eta()<2.5 && pt>15. && iso<0.4 ) LooseElectrons.push_back(CurrentElectron);
|
---|
89 | }
|
---|
90 |
|
---|
91 | // Loose Muons with pt > 10 GeV and |eta| < 2.4
|
---|
92 | // Signal Muons with pt > 60 GeV and iso < 0.15
|
---|
93 | std::vector<const RecLeptonFormat*> LooseMuons;
|
---|
94 | std::vector<const RecLeptonFormat*> SignalMuons;
|
---|
95 | for(unsigned int im=0; im<event.rec()->muons().size(); im++)
|
---|
96 | {
|
---|
97 | const RecLeptonFormat* CurrentMuon = &(event.rec()->muons()[im]);
|
---|
98 | double pt = CurrentMuon->pt();
|
---|
99 | double iso = (PHYSICS->Isol->eflow->sumIsolation(CurrentMuon,event.rec(),0.4,0.,IsolationEFlow::ALL_COMPONENTS))/pt;
|
---|
100 | if ( CurrentMuon->abseta() >= 2.4 ) continue;
|
---|
101 | if ( pt > 10. && iso < 0.25 ) LooseMuons.push_back(CurrentMuon);
|
---|
102 | if ( pt > 60. && iso < 0.15 ) SignalMuons.push_back(CurrentMuon);
|
---|
103 | }
|
---|
104 |
|
---|
105 | bool LeadingMuon = false;
|
---|
106 | if ( SignalMuons.size() > 0 ) LeadingMuon=true;
|
---|
107 |
|
---|
108 | // hadronic taus with pT > 20 GeV and |eta| < 2.3
|
---|
109 | unsigned int ntau = 0;
|
---|
110 | for (unsigned int it=0; it < event.rec()->taus().size(); it++)
|
---|
111 | {
|
---|
112 | const RecTauFormat *CurrentTau = &(event.rec()->taus()[it]);
|
---|
113 | // Pseudorapidity and pt basic cuts
|
---|
114 | if ( CurrentTau->pt() > 20.0 && CurrentTau->abseta()< 2.3 ) ntau++;
|
---|
115 | }
|
---|
116 |
|
---|
117 | if ( !Manager()->ApplyCut(LeadingMuon, "SignalMuon")) return true;
|
---|
118 |
|
---|
119 | // Leading jet requirements
|
---|
120 | SignalJets = PHYSICS->Isol->JetCleaning(SignalJets, LooseElectrons, 0.2);
|
---|
121 | SignalJets = PHYSICS->Isol->JetCleaning(SignalJets, SignalMuons, 0.2);
|
---|
122 |
|
---|
123 | bool dR_jet_muon = false;
|
---|
124 | int jm(-1);
|
---|
125 | for ( unsigned int ii = 0; ii < SignalMuons.size(); ii++ ) {
|
---|
126 | if ( SignalJets.size() == 0 ) continue;
|
---|
127 | if ( SignalJets[0]->dr(SignalMuons[ii]) < 0.5 ) continue;
|
---|
128 | jm=ii;
|
---|
129 | dR_jet_muon = true;
|
---|
130 | }
|
---|
131 |
|
---|
132 | bool SignalJet = false;
|
---|
133 | if ( SignalJets.size() > 0 ) {
|
---|
134 | if ( SignalJets[0]->pt() > 100. && dR_jet_muon ) SignalJet = true;
|
---|
135 | }
|
---|
136 |
|
---|
137 | if ( !Manager()->ApplyCut(SignalJet, "SignalJet")) return true;
|
---|
138 | if ( !Manager()->ApplyCut(nb==0, "bTagVeto") ) return true;
|
---|
139 | if ( !Manager()->ApplyCut(ntau==0, "TauVeto") ) return true;
|
---|
140 | if ( !Manager()->ApplyCut(LooseElectrons.size()==0, "ElectronVeto") ) return true;
|
---|
141 |
|
---|
142 |
|
---|
143 | // Off-Z
|
---|
144 | bool ZMassWindow = true;
|
---|
145 | for (unsigned int ii=1; ii<LooseMuons.size(); ii++ )
|
---|
146 | {
|
---|
147 | if(SignalMuons[jm]->charge()*LooseMuons[ii]->charge() < 0)
|
---|
148 | {
|
---|
149 | double mmumu = (SignalMuons[0]->momentum() + LooseMuons[ii]->momentum()).M();
|
---|
150 | if(std::abs(mmumu - 91.1876) < 10.) {ZMassWindow=false; break;}
|
---|
151 | }
|
---|
152 | }
|
---|
153 | if ( !Manager()->ApplyCut(ZMassWindow, "ZmassVeto") ) return true;
|
---|
154 |
|
---|
155 | // Cut on MET
|
---|
156 | MALorentzVector pMET = event.rec()->MET().momentum();
|
---|
157 | double MET = pMET.Pt();
|
---|
158 | if ( !Manager()->ApplyCut((MET > 100.0), "Etmiss > 100 GeV")) return true;
|
---|
159 |
|
---|
160 | // MET isolation
|
---|
161 | double dphi1 = SignalJets[0]->dphi_0_pi(pMET);
|
---|
162 | double dphi2 = SignalMuons[jm]->dphi_0_pi(pMET);
|
---|
163 | if ( !Manager()->ApplyCut(dphi1 > 0.5, "DPhijetMET > 0.5") ) return true;
|
---|
164 | if ( !Manager()->ApplyCut(dphi2 > 0.5, "DPhimuMET > 0.5") ) return true;
|
---|
165 |
|
---|
166 | // Now requiring that mT(leading muon, MET) > 500 GeV
|
---|
167 | double mT = SignalMuons[jm]->mt_met(pMET);
|
---|
168 | if ( !Manager()->ApplyCut(mT > 500., "MT > 500 GeV") ) return true;
|
---|
169 |
|
---|
170 | // Now fill Histogram corresponding to Fig. 3 of the CMS paper
|
---|
171 | double mLQ = ( SignalMuons[0]->momentum() + SignalJets[0]->momentum() ).M();
|
---|
172 | Manager()->FillHisto("Mmuj", mLQ);
|
---|
173 |
|
---|
174 | return true;
|
---|
175 | }
|
---|
176 |
|
---|