| 1 | #include "SampleAnalyzer/User/Analyzer/atlas_susy_2018_06.h"
|
|---|
| 2 | using namespace MA5;
|
|---|
| 3 | using namespace std;
|
|---|
| 4 |
|
|---|
| 5 | namespace atlas_susy_2018_06_func
|
|---|
| 6 | {
|
|---|
| 7 | template<typename T1,typename T2> std::vector<const T1*>
|
|---|
| 8 | Removal(std::vector<const T1*> &v1, std::vector<const T2*> &v2, const MAdouble64 &drmin);
|
|---|
| 9 |
|
|---|
| 10 | template<typename T1,typename T2> std::vector<const T1*>
|
|---|
| 11 | RemovalLeptons(std::vector<const T1*> &v1, std::vector<const T2*> &v2);
|
|---|
| 12 |
|
|---|
| 13 | vector<int> LeptonPick(vector<const RecLeptonFormat*> leptons);
|
|---|
| 14 | MAdouble64 GetHBoost(vector<const RecLeptonFormat*> leptons,const RecParticleFormat* missing);
|
|---|
| 15 | }
|
|---|
| 16 |
|
|---|
| 17 |
|
|---|
| 18 |
|
|---|
| 19 | // -----------------------------------------------------------------------------
|
|---|
| 20 | // Initialize
|
|---|
| 21 | // function called one time at the beginning of the analysis
|
|---|
| 22 | // -----------------------------------------------------------------------------
|
|---|
| 23 | bool atlas_susy_2018_06::Initialize(const MA5::Configuration& cfg, const std::map<std::string,std::string>& parameters)
|
|---|
| 24 | {
|
|---|
| 25 | INFO << " <><><><><><><><><><><><><><><><><><><><><><><><><><><><>" << endmsg;
|
|---|
| 26 | INFO << " <> Analysis: ATLAS-SUSY-2018-06 <>" << endmsg;
|
|---|
| 27 | INFO << " <> arXiv:1912.08479 <>" << endmsg;
|
|---|
| 28 | INFO << " <> (chargino-neutralino) <>" << endmsg;
|
|---|
| 29 | INFO << " <> Recasters: J.W.Kim & J.H.Kim & H.Jang & T.G.Lee <>" << endmsg;
|
|---|
| 30 | INFO << " <> Contact: adg9334@naver.com <>" << endmsg;
|
|---|
| 31 | INFO << " <> Based on MadAnalysis 5 v1.7 <>" << endmsg;
|
|---|
| 32 | INFO << " <> For more information, see <>" << endmsg;
|
|---|
| 33 | INFO << " <> http://madanalysis.irmp.ucl.ac.be/wiki/ <>" << endmsg;
|
|---|
| 34 | INFO << " <> /PhysicsAnalysisDatabase <>" << endmsg;
|
|---|
| 35 | INFO << " <><><><><><><><><><><><><><><><><><><><><><><><><><><><>" << endmsg;
|
|---|
| 36 |
|
|---|
| 37 |
|
|---|
| 38 | //Add Signal Region
|
|---|
| 39 |
|
|---|
| 40 |
|
|---|
| 41 | //Signal Region for Cutflows
|
|---|
| 42 | Manager()->AddRegionSelection("SR_low");
|
|---|
| 43 | Manager()->AddRegionSelection("SR_ISR");
|
|---|
| 44 |
|
|---|
| 45 | Manager()->AddCut("3Leptons"); // Exact three leptons
|
|---|
| 46 | Manager()->AddCut("SFOS"); // Same flavor, opposite-charge pair
|
|---|
| 47 | //Manager()->AddCut("Dilepton Trigger");
|
|---|
| 48 | Manager()->AddCut("B-veto"); // b-jet veto
|
|---|
| 49 | Manager()->AddCut("Three Lepton Mass"); // Invariant mass of three leptons system
|
|---|
| 50 | Manager()->AddCut("low-LeptonPT > 60, 40, 30","SR_low");
|
|---|
| 51 | Manager()->AddCut("ISR-LeptonPT > 25, 25, 20","SR_ISR");
|
|---|
| 52 | Manager()->AddCut("Dilepton InvMass"); // Invariant mass of SFOS pair
|
|---|
| 53 |
|
|---|
| 54 | Manager()->AddCut("low-Jet-veto","SR_low");
|
|---|
| 55 | Manager()->AddCut("low-HBoost","SR_low");
|
|---|
| 56 | Manager()->AddCut("low-PTsoft/(PTsoft+Meff)","SR_low");
|
|---|
| 57 | Manager()->AddCut("low-Meff/HBoost","SR_low");
|
|---|
| 58 |
|
|---|
| 59 | Manager()->AddCut("ISR-Njet > 0","SR_ISR");
|
|---|
| 60 | Manager()->AddCut("ISR-Njet < 4","SR_ISR");
|
|---|
| 61 | Manager()->AddCut("ISR-DeltaPhi(MET,Jets) > 2.0","SR_ISR");
|
|---|
| 62 | Manager()->AddCut("ISR-R(MET,Jets)","SR_ISR");
|
|---|
| 63 | Manager()->AddCut("ISR-JetsPT > 100","SR_ISR");
|
|---|
| 64 | Manager()->AddCut("ISR-MET > 80","SR_ISR");
|
|---|
| 65 | Manager()->AddCut("Transverse Mass");
|
|---|
| 66 | Manager()->AddCut("ISR-PTsoft < 25","SR_ISR");
|
|---|
| 67 |
|
|---|
| 68 | //For diagrams. If you want to draw diagrams, uncomment the paragraph below and the last part of Execute and comment the paragraph above.
|
|---|
| 69 | /*
|
|---|
| 70 | //Signal Region for diagrams
|
|---|
| 71 | Manager()->AddRegionSelection("SR_low");
|
|---|
| 72 | Manager()->AddRegionSelection("SR_ISR");
|
|---|
| 73 | Manager()->AddRegionSelection("SR-low-MT");
|
|---|
| 74 | Manager()->AddRegionSelection("SR-low-HBoost");
|
|---|
| 75 | Manager()->AddRegionSelection("SR-low-R(Meff,HBoost)");
|
|---|
| 76 | Manager()->AddRegionSelection("SR-low-R(PTsoft,(PTsoft+Meff))");
|
|---|
| 77 |
|
|---|
| 78 | Manager()->AddRegionSelection("SR-ISR-MT");
|
|---|
| 79 | Manager()->AddRegionSelection("SR-ISR-R(MET,Jets)");
|
|---|
| 80 | Manager()->AddRegionSelection("SR-ISR-PTsoft");
|
|---|
| 81 | Manager()->AddRegionSelection("SR-ISR-PTjets");
|
|---|
| 82 |
|
|---|
| 83 | std::string SR_low[] = {"SR_low","SR-low-MT","SR-low-HBoost","SR-low-R(Meff,HBoost)","SR-low-R(PTsoft,(PTsoft+Meff))"};
|
|---|
| 84 | std::string SR_low_HBoost[] = {"SR_low","SR-low-MT","SR-low-R(Meff,HBoost)","SR-low-R(PTsoft,(PTsoft+Meff))"};
|
|---|
| 85 | std::string SR_low_R_Meff_HBoost[] = {"SR_low","SR-low-MT","SR-low-HBoost","SR-low-R(PTsoft,(PTsoft+Meff))"};
|
|---|
| 86 | std::string SR_low_R_PTsoft_Meff[] = {"SR_low","SR-low-MT","SR-low-HBoost","SR-low-R(Meff,HBoost)"};
|
|---|
| 87 |
|
|---|
| 88 | std::string SR_ISR[] = {"SR_ISR","SR-ISR-MT","SR-ISR-R(MET,Jets)","SR-ISR-PTsoft","SR-ISR-PTjets"};
|
|---|
| 89 | std::string SR_ISR_R_MET_Jets[] = {"SR_ISR","SR-ISR-MT","SR-ISR-PTsoft","SR-ISR-PTjets"};
|
|---|
| 90 | std::string SR_ISR_PTsoft[] = {"SR_ISR","SR-ISR-MT","SR-ISR-R(MET,Jets)","SR-ISR-PTjets"};
|
|---|
| 91 | std::string SR_ISR_PTjets[] = {"SR_ISR","SR-ISR-MT","SR-ISR-R(MET,Jets)","SR-ISR-PTsoft"};
|
|---|
| 92 |
|
|---|
| 93 | std::string SR_MT[] = {"SR_low","SR-low-HBoost","SR-low-R(Meff,HBoost)","SR-low-R(PTsoft,(PTsoft+Meff))"
|
|---|
| 94 | ,"SR_ISR","SR-ISR-R(MET,Jets)","SR-ISR-PTsoft","SR-ISR-PTjets"};
|
|---|
| 95 |
|
|---|
| 96 |
|
|---|
| 97 | Manager()->AddCut("3Leptons"); // Exact three leptons
|
|---|
| 98 | Manager()->AddCut("SFOS"); // Same flavor, opposite-charge pair
|
|---|
| 99 | //Manager()->AddCut("Dilepton Trigger");
|
|---|
| 100 | Manager()->AddCut("B-veto"); // b-jet veto
|
|---|
| 101 | Manager()->AddCut("Three Lepton Mass"); // Invariant mass of three leptons system
|
|---|
| 102 | Manager()->AddCut("low-LeptonPT > 60, 40, 30",SR_low);
|
|---|
| 103 | Manager()->AddCut("ISR-LeptonPT > 25, 25, 20",SR_ISR);
|
|---|
| 104 | Manager()->AddCut("Dilepton InvMass"); // Invariant mass of SFOS pair
|
|---|
| 105 |
|
|---|
| 106 | Manager()->AddCut("low-Jet-veto",SR_low);
|
|---|
| 107 | Manager()->AddCut("low-HBoost",SR_low_HBoost);
|
|---|
| 108 | Manager()->AddCut("low-PTsoft/(PTsoft+Meff)",SR_low_R_PTsoft_Meff);
|
|---|
| 109 | Manager()->AddCut("low-Meff/HBoost",SR_low_R_Meff_HBoost);
|
|---|
| 110 |
|
|---|
| 111 | Manager()->AddCut("ISR-Njet > 0",SR_ISR);
|
|---|
| 112 | Manager()->AddCut("ISR-Njet < 4",SR_ISR);
|
|---|
| 113 | Manager()->AddCut("ISR-DeltaPhi(MET,Jets) > 2.0",SR_ISR);
|
|---|
| 114 | Manager()->AddCut("ISR-R(MET,Jets)",SR_ISR_R_MET_Jets);
|
|---|
| 115 | Manager()->AddCut("ISR-JetsPT > 100",SR_ISR_PTjets);
|
|---|
| 116 | Manager()->AddCut("ISR-MET > 80",SR_ISR);
|
|---|
| 117 | Manager()->AddCut("Transverse Mass",SR_MT);
|
|---|
| 118 | Manager()->AddCut("ISR-PTsoft < 25",SR_ISR_PTsoft);
|
|---|
| 119 |
|
|---|
| 120 |
|
|---|
| 121 | Manager()->AddHisto("SR-low-MT",20,0,500,"SR-low-MT");
|
|---|
| 122 | Manager()->AddHisto("SR-low-HBoost",20,200,700,"SR-low-HBoost");
|
|---|
| 123 | Manager()->AddHisto("SR-low-R(Meff,HBoost)",15,0.3,1.05,"SR-low-R(Meff,HBoost)");
|
|---|
| 124 | Manager()->AddHisto("SR-low-R(PTsoft,(PTsoft+Meff))",15,0,0.15,"SR-low-R(PTsoft,(PTsoft+Meff))");
|
|---|
| 125 |
|
|---|
| 126 | Manager()->AddHisto("SR-ISR-MT",50,0,500,"SR-ISR-MT");
|
|---|
| 127 | Manager()->AddHisto("SR-ISR-R(MET,Jets)",18,0.1,1,"SR-ISR-R(MET,Jets)");
|
|---|
| 128 | Manager()->AddHisto("SR-ISR-PTsoft",20,0,100,"SR-ISR-PTsoft");
|
|---|
| 129 | Manager()->AddHisto("SR-ISR-PTjets",18,0,500,"SR-ISR-PTjets");
|
|---|
| 130 |
|
|---|
| 131 | //Auxiliery figure
|
|---|
| 132 | Manager()->AddHisto("SR-low-PTlep1",17,60,400,"SR_low");
|
|---|
| 133 | Manager()->AddHisto("SR-low-PTlep2",13,40,300,"SR_low");
|
|---|
| 134 | Manager()->AddHisto("SR-low-PTlep3",12,30,150,"SR_low");
|
|---|
| 135 | Manager()->AddHisto("SR-low-MET",20,0,500,"SR_low");
|
|---|
| 136 | Manager()->AddHisto("SR-ISR-PTlep1",10,25,225,"SR_ISR");
|
|---|
| 137 | Manager()->AddHisto("SR-ISR-PTlep2",15,25,175,"SR_ISR");
|
|---|
| 138 | Manager()->AddHisto("SR-ISR-PTlep3",8,20,100,"SR_ISR");
|
|---|
| 139 | */
|
|---|
| 140 | return true;
|
|---|
| 141 | }
|
|---|
| 142 |
|
|---|
| 143 | // -----------------------------------------------------------------------------
|
|---|
| 144 | // Finalize
|
|---|
| 145 | // function called one time at the end of the analysis
|
|---|
| 146 | // -----------------------------------------------------------------------------
|
|---|
| 147 | void atlas_susy_2018_06::Finalize(const SampleFormat& summary, const std::vector<SampleFormat>& files)
|
|---|
| 148 | {
|
|---|
| 149 | }
|
|---|
| 150 |
|
|---|
| 151 | // -----------------------------------------------------------------------------
|
|---|
| 152 | // Execute
|
|---|
| 153 | // function called each time one event is read
|
|---|
| 154 | // -----------------------------------------------------------------------------
|
|---|
| 155 | bool atlas_susy_2018_06::Execute(SampleFormat& sample, const EventFormat& event)
|
|---|
| 156 | {
|
|---|
| 157 | //Check Weight
|
|---|
| 158 | double myWeight;
|
|---|
| 159 | if(Configuration().IsNoEventWeight()) myWeight=1. ;
|
|---|
| 160 | else if(event.mc()->weight()!=0.) myWeight=event.mc()->weight();
|
|---|
| 161 | else { return false; }
|
|---|
| 162 | Manager()->InitializeForNewEvent(myWeight);
|
|---|
| 163 |
|
|---|
| 164 | if(event.rec()==0) return true;
|
|---|
| 165 | //Objects Isolation
|
|---|
| 166 | //Signal Electrons
|
|---|
| 167 | vector<const RecLeptonFormat*> SignalElectrons;
|
|---|
| 168 | for(unsigned int i=0; i<event.rec()->electrons().size();i++)
|
|---|
| 169 | {
|
|---|
| 170 | const RecLeptonFormat *Lep = &(event.rec()->electrons()[i]);
|
|---|
| 171 |
|
|---|
| 172 | //Kinamatics
|
|---|
| 173 | double eta = Lep->abseta();
|
|---|
| 174 | double pt = Lep->pt();
|
|---|
| 175 |
|
|---|
| 176 | double iso_dR = 0.2;
|
|---|
| 177 | double iso_tracks = PHYSICS->Isol->eflow->relIsolation(Lep,event.rec(),iso_dR,0,IsolationEFlow::TRACK_COMPONENT);
|
|---|
| 178 | double iso_all = PHYSICS->Isol->eflow->relIsolation(Lep,event.rec(),iso_dR,0,IsolationEFlow::ALL_COMPONENTS);
|
|---|
| 179 | bool iso = (iso_tracks<0.06 && iso_all<0.06);
|
|---|
| 180 | if(eta<2.47 && pt>10. && iso) { SignalElectrons.push_back(Lep);}
|
|---|
| 181 | }
|
|---|
| 182 | //Signal Muon
|
|---|
| 183 | vector<const RecLeptonFormat*> SignalMuons;
|
|---|
| 184 | for(unsigned int i=0; i<event.rec()->muons().size();i++)
|
|---|
| 185 | {
|
|---|
| 186 | const RecLeptonFormat *Lep = &(event.rec()->muons()[i]);
|
|---|
| 187 |
|
|---|
| 188 | //Kinamatics
|
|---|
| 189 | double eta = Lep->abseta();
|
|---|
| 190 | double pt = Lep->pt();
|
|---|
| 191 |
|
|---|
| 192 | double iso_dR = 0.2;
|
|---|
| 193 | if(pt<=33) {iso_dR=0.3;}
|
|---|
| 194 | else if(pt<50) {iso_dR=-0.0059*pt + 0.4941;}
|
|---|
| 195 |
|
|---|
| 196 | double iso_tracks = PHYSICS->Isol->eflow->relIsolation(Lep,event.rec(),iso_dR,0,IsolationEFlow::TRACK_COMPONENT);
|
|---|
| 197 | double iso_all = PHYSICS->Isol->eflow->relIsolation(Lep,event.rec(),0.2,0,IsolationEFlow::ALL_COMPONENTS);
|
|---|
| 198 | bool iso = (iso_tracks<0.04 && iso_all<0.15);
|
|---|
| 199 |
|
|---|
| 200 | if(eta<2.4 && pt>10. && iso){SignalMuons.push_back(Lep);}
|
|---|
| 201 | }
|
|---|
| 202 | //Signal Jet
|
|---|
| 203 | vector<const RecJetFormat*> Jets;
|
|---|
| 204 | for(unsigned int i=0; i<event.rec()->jets().size();i++)
|
|---|
| 205 | {
|
|---|
| 206 | const RecJetFormat *Jet = &(event.rec()->jets()[i]);
|
|---|
| 207 | double eta = Jet->abseta();
|
|---|
| 208 | double pt = Jet->pt();
|
|---|
| 209 | if(pt>20 && eta<2.4) {Jets.push_back(Jet);}
|
|---|
| 210 | }
|
|---|
| 211 |
|
|---|
| 212 | // Overlap removal
|
|---|
| 213 | SignalElectrons = atlas_susy_2018_06_func::Removal(SignalElectrons, SignalMuons,0.2);
|
|---|
| 214 | Jets = PHYSICS->Isol->JetCleaning(Jets,SignalElectrons,0.2);
|
|---|
| 215 | Jets = PHYSICS->Isol->JetCleaning(Jets,SignalMuons,0.2);
|
|---|
| 216 | SignalElectrons = atlas_susy_2018_06_func::RemovalLeptons(SignalElectrons,Jets);
|
|---|
| 217 | SignalMuons = atlas_susy_2018_06_func::RemovalLeptons(SignalMuons,Jets);
|
|---|
| 218 |
|
|---|
| 219 |
|
|---|
| 220 |
|
|---|
| 221 | vector<const RecLeptonFormat*> SignalLeptons;
|
|---|
| 222 | for(unsigned int i=0; i<SignalMuons.size();i++)
|
|---|
| 223 | {SignalLeptons.push_back(SignalMuons[i]);}
|
|---|
| 224 | for(unsigned int i=0; i<SignalElectrons.size();i++)
|
|---|
| 225 | {SignalLeptons.push_back(SignalElectrons[i]);}
|
|---|
| 226 | SORTER->sort(SignalLeptons,PTordering);
|
|---|
| 227 |
|
|---|
| 228 | //Missing Vector
|
|---|
| 229 | const RecParticleFormat *MET = &(event.rec()->MET());
|
|---|
| 230 |
|
|---|
| 231 | //////////////////////////////////////////////////////////////////////
|
|---|
| 232 | //Cut
|
|---|
| 233 | //////////////////////////////////////////////////////////////////////
|
|---|
| 234 |
|
|---|
| 235 | // Nleptons = 3
|
|---|
| 236 | bool Nlepton = (SignalLeptons.size()==3);
|
|---|
| 237 | if(!Manager()->ApplyCut(Nlepton,"3Leptons")) return true;
|
|---|
| 238 |
|
|---|
| 239 | //SFOS
|
|---|
| 240 | vector<int> PairLeptons = atlas_susy_2018_06_func::LeptonPick(SignalLeptons);
|
|---|
| 241 | bool SFOS = (SignalLeptons[PairLeptons[0]]->isMuon()==SignalLeptons[PairLeptons[1]]->isMuon());
|
|---|
| 242 | SFOS = SFOS && (SignalLeptons[PairLeptons[0]]->charge()!=SignalLeptons[PairLeptons[1]]->charge());
|
|---|
| 243 | if(!Manager()->ApplyCut(SFOS,"SFOS")) return true;
|
|---|
| 244 |
|
|---|
| 245 | //if(!Manager()->ApplyCut("Dilepton Trigger")); // Not Applied
|
|---|
| 246 |
|
|---|
| 247 | //B-veto
|
|---|
| 248 | bool Bveto = true;
|
|---|
| 249 | for(unsigned int i=0;i<Jets.size();i++)
|
|---|
| 250 | if(Jets[i]->btag()) {Bveto = false; break;}
|
|---|
| 251 | if(!Manager()->ApplyCut(Bveto,"B-veto")) return true;
|
|---|
| 252 |
|
|---|
| 253 | // Mlll
|
|---|
| 254 | MALorentzVector ThreeLeptonsSystem;
|
|---|
| 255 | ThreeLeptonsSystem = SignalLeptons[0]->momentum()+SignalLeptons[1]->momentum()+SignalLeptons[2]->momentum();
|
|---|
| 256 | MAdouble64 mlll = ThreeLeptonsSystem.M();
|
|---|
| 257 | if(!Manager()->ApplyCut(mlll>105.,"Three Lepton Mass")) return true;
|
|---|
| 258 |
|
|---|
| 259 | //Leptons PT
|
|---|
| 260 | bool LowLeptonsPT = SignalLeptons[0]->pt()>60. && SignalLeptons[1]->pt()>40. && SignalLeptons[2]->pt()>30.;
|
|---|
| 261 | bool ISRLeptonsPT = SignalLeptons[0]->pt()>25. && SignalLeptons[1]->pt()>25. && SignalLeptons[2]->pt()>20.;
|
|---|
| 262 | if(!Manager()->ApplyCut(LowLeptonsPT,"low-LeptonPT > 60, 40, 30")) return true;
|
|---|
| 263 | if(!Manager()->ApplyCut(ISRLeptonsPT,"ISR-LeptonPT > 25, 25, 20")) return true;
|
|---|
| 264 |
|
|---|
| 265 | //Mll
|
|---|
| 266 | MAdouble64 mll = (SignalLeptons[PairLeptons[0]]->momentum()+SignalLeptons[PairLeptons[1]]->momentum()).M();
|
|---|
| 267 | if(!Manager()->ApplyCut(75. <= mll && mll <= 105.,"Dilepton InvMass")) return true;
|
|---|
| 268 |
|
|---|
| 269 |
|
|---|
| 270 | /////// LOW-region ///////
|
|---|
| 271 |
|
|---|
| 272 | //Number of jets
|
|---|
| 273 | int Jet_size = Jets.size();
|
|---|
| 274 | if(!Manager()->ApplyCut(Jet_size==0,"low-Jet-veto")) return true;
|
|---|
| 275 |
|
|---|
| 276 | //low HBoost
|
|---|
| 277 | MAdouble64 HBoost = atlas_susy_2018_06_func::GetHBoost(SignalLeptons,MET);
|
|---|
| 278 |
|
|---|
| 279 | if(!Manager()->ApplyCut(HBoost>250.,"low-HBoost")) return true;
|
|---|
| 280 |
|
|---|
| 281 | //low - PT soft
|
|---|
| 282 | MAdouble64 low_PTsoft = (ThreeLeptonsSystem+MET->momentum()).Pt();
|
|---|
| 283 | MAdouble64 meff = SignalLeptons[0]->pt()+SignalLeptons[1]->pt()+SignalLeptons[2]->pt()+MET->pt();
|
|---|
| 284 | MAdouble64 R_PTsoft = low_PTsoft/(low_PTsoft+meff);
|
|---|
| 285 | if(!Manager()->ApplyCut(R_PTsoft < 0.05,"low-PTsoft/(PTsoft+Meff)")) return true;
|
|---|
| 286 | if(!Manager()->ApplyCut(meff/HBoost > 0.9,"low-Meff/HBoost")) return true;
|
|---|
| 287 |
|
|---|
| 288 |
|
|---|
| 289 | /////// ISR-region ///////
|
|---|
| 290 |
|
|---|
| 291 | //Number of jets
|
|---|
| 292 | if(!Manager()->ApplyCut(Jet_size>0,"ISR-Njet > 0")) return true;
|
|---|
| 293 | if(!Manager()->ApplyCut(Jet_size<4,"ISR-Njet < 4")) return true;
|
|---|
| 294 |
|
|---|
| 295 | //ISR Delta Phi between MET and Jets
|
|---|
| 296 | MALorentzVector Jets_momentum;
|
|---|
| 297 | for(int i=0;i<Jet_size;i++)
|
|---|
| 298 | {Jets_momentum += Jets[i]->momentum();}
|
|---|
| 299 | double DeltaPhi_MET_Jets = abs((MET->momentum()).DeltaPhi(Jets_momentum));
|
|---|
| 300 | if(!Manager()->ApplyCut(DeltaPhi_MET_Jets >= 2.0,"ISR-DeltaPhi(MET,Jets) > 2.0")) return true;
|
|---|
| 301 |
|
|---|
| 302 | //ISR Ratio PT betwwen MET and Jets
|
|---|
| 303 | double R_MET_Jets;
|
|---|
| 304 | double R_MET_Jets_x = MET->momentum().Px()*Jets_momentum.Px();
|
|---|
| 305 | double R_MET_Jets_y = MET->momentum().Py()*Jets_momentum.Py();
|
|---|
| 306 | R_MET_Jets = abs(R_MET_Jets_x+R_MET_Jets_y)/pow(Jets_momentum.Pt(),2);
|
|---|
| 307 |
|
|---|
| 308 | if(!Manager()->ApplyCut(0.55<=R_MET_Jets && R_MET_Jets <= 1.,"ISR-R(MET,Jets)")) return true;
|
|---|
| 309 |
|
|---|
| 310 | //PT jet
|
|---|
| 311 | bool ISR_JetPT = (Jets_momentum.Pt() > 100.);
|
|---|
| 312 | if(!Manager()->ApplyCut(ISR_JetPT,"ISR-JetsPT > 100")) return true;
|
|---|
| 313 |
|
|---|
| 314 | //MET PT
|
|---|
| 315 | if(!Manager()->ApplyCut(MET->pt()>=80.,"ISR-MET > 80")) return true;
|
|---|
| 316 |
|
|---|
| 317 |
|
|---|
| 318 | // MT
|
|---|
| 319 | const RecLeptonFormat* thirdlepton = SignalLeptons[PairLeptons[2]];
|
|---|
| 320 | double MT = sqrt(2*thirdlepton->pt()*MET->pt()*(1-cos(thirdlepton->dphi_0_2pi(MET->momentum()))));
|
|---|
| 321 |
|
|---|
| 322 | if(!Manager()->ApplyCut(MT>100.,"Transverse Mass")) return true;
|
|---|
| 323 |
|
|---|
| 324 | //ISR PT soft
|
|---|
| 325 | MAdouble64 ISR_PTsoft = (ThreeLeptonsSystem+Jets_momentum+MET->momentum()).Pt();
|
|---|
| 326 |
|
|---|
| 327 | if(!Manager()->ApplyCut(ISR_PTsoft<25.,"ISR-PTsoft < 25")) return true;
|
|---|
| 328 |
|
|---|
| 329 | //For diagrams, If you want to draw, uncomment the paragraph below
|
|---|
| 330 |
|
|---|
| 331 | //Fill Histogram
|
|---|
| 332 | /*
|
|---|
| 333 | Manager()->FillHisto("SR-low-MT",MT);
|
|---|
| 334 | Manager()->FillHisto("SR-low-HBoost",HBoost);
|
|---|
| 335 | Manager()->FillHisto("SR-low-R(Meff,HBoost)",(meff/HBoost));
|
|---|
| 336 | Manager()->FillHisto("SR-low-R(PTsoft,(PTsoft+Meff))",R_PTsoft);
|
|---|
| 337 |
|
|---|
| 338 | Manager()->FillHisto("SR-ISR-MT",MT);
|
|---|
| 339 | Manager()->FillHisto("SR-ISR-R(MET,Jets)",R_MET_Jets);
|
|---|
| 340 | Manager()->FillHisto("SR-ISR-PTsoft",ISR_PTsoft);
|
|---|
| 341 | Manager()->FillHisto("SR-ISR-PTjets",Jets_momentum.Pt());
|
|---|
| 342 |
|
|---|
| 343 |
|
|---|
| 344 | Manager()->FillHisto("SR-low-PTlep1",SignalLeptons[0]->pt());
|
|---|
| 345 | Manager()->FillHisto("SR-low-PTlep2",SignalLeptons[1]->pt());
|
|---|
| 346 | Manager()->FillHisto("SR-low-PTlep3",SignalLeptons[2]->pt());
|
|---|
| 347 | Manager()->FillHisto("SR-low-MET",MET->pt());
|
|---|
| 348 | Manager()->FillHisto("SR-ISR-PTlep1",SignalLeptons[0]->pt());
|
|---|
| 349 | Manager()->FillHisto("SR-ISR-PTlep2",SignalLeptons[1]->pt());
|
|---|
| 350 | Manager()->FillHisto("SR-ISR-PTlep3",SignalLeptons[2]->pt());
|
|---|
| 351 | */
|
|---|
| 352 |
|
|---|
| 353 | return true; // end of anlaysis
|
|---|
| 354 | }
|
|---|
| 355 |
|
|---|
| 356 |
|
|---|
| 357 | ////////////////////////////////////////////////////////
|
|---|
| 358 | //
|
|---|
| 359 | // Function Define
|
|---|
| 360 | //
|
|---|
| 361 | ////////////////////////////////////////////////////////
|
|---|
| 362 | template<typename T1,typename T2> std::vector<const T1*>
|
|---|
| 363 | atlas_susy_2018_06_func::Removal(std::vector<const T1*> &v1, std::vector<const T2*> &v2, const MAdouble64 &drmin)
|
|---|
| 364 | {
|
|---|
| 365 | std::vector<bool> mask(v1.size(),false);
|
|---|
| 366 | for(MAuint32 j=0;j<v1.size();j++)
|
|---|
| 367 | {for(MAuint32 i=0;i<v2.size();i++)
|
|---|
| 368 | if(v2[i]->dr(v1[j]) < drmin)
|
|---|
| 369 | {
|
|---|
| 370 | mask[j]=true;
|
|---|
| 371 | break;
|
|---|
| 372 | }
|
|---|
| 373 | }
|
|---|
| 374 | std::vector<const T1*> cleaned_v1;
|
|---|
| 375 | for(MAuint32 i=0;i<v1.size();i++)
|
|---|
| 376 | {if(!mask[i]) cleaned_v1.push_back(v1[i]);}
|
|---|
| 377 |
|
|---|
| 378 | return cleaned_v1;
|
|---|
| 379 | }
|
|---|
| 380 |
|
|---|
| 381 |
|
|---|
| 382 | template<typename T1,typename T2> std::vector<const T1*>
|
|---|
| 383 | atlas_susy_2018_06_func::RemovalLeptons(std::vector<const T1*> &v1, std::vector<const T2*> &v2)
|
|---|
| 384 | {
|
|---|
| 385 | std::vector<bool> mask(v1.size(),false);
|
|---|
| 386 | for(MAuint32 j=0;j<v1.size();j++)
|
|---|
| 387 | {
|
|---|
| 388 | double pt = v1[j]->pt();
|
|---|
| 389 | double drmin = 0.2;
|
|---|
| 390 | if(pt <= 25) drmin = 0.4;
|
|---|
| 391 | else if(pt <= 50) drmin = -0.008*pt+0.6 ;
|
|---|
| 392 | else continue;
|
|---|
| 393 |
|
|---|
| 394 | for(MAuint32 i=0;i<v2.size();i++)
|
|---|
| 395 | if(v2[i]->dr(v1[j]) < drmin)
|
|---|
| 396 | {
|
|---|
| 397 | mask[j]=true;
|
|---|
| 398 | break;
|
|---|
| 399 | }
|
|---|
| 400 | }
|
|---|
| 401 |
|
|---|
| 402 | std::vector<const T1*> cleaned_v1;
|
|---|
| 403 | for(MAuint32 i=0;i<v1.size();i++)
|
|---|
| 404 | if(!mask[i]) cleaned_v1.push_back(v1[i]);
|
|---|
| 405 |
|
|---|
| 406 | return cleaned_v1;
|
|---|
| 407 | }
|
|---|
| 408 |
|
|---|
| 409 | vector<int> atlas_susy_2018_06_func::LeptonPick(vector<const RecLeptonFormat*> leptons)
|
|---|
| 410 | {
|
|---|
| 411 | int size = leptons.size();
|
|---|
| 412 | vector<int> pair(2);
|
|---|
| 413 | double Zmass=91.1876;
|
|---|
| 414 | double Invmass;
|
|---|
| 415 | double deltaMass = 1000000;
|
|---|
| 416 | for(int i=0;i<size-1;i++)
|
|---|
| 417 | for(int j=i+1;j<size;j++)
|
|---|
| 418 | {
|
|---|
| 419 | if(leptons[i]->isMuon()==leptons[j]->isMuon())
|
|---|
| 420 | if(leptons[i]->charge()!=leptons[j]->charge())
|
|---|
| 421 | {
|
|---|
| 422 | double temp_invmass = (leptons[i]->momentum()+leptons[j]->momentum()).M();
|
|---|
| 423 | if(abs(Zmass-temp_invmass)<deltaMass)
|
|---|
| 424 | {
|
|---|
| 425 | Invmass = temp_invmass;
|
|---|
| 426 | deltaMass = abs(Zmass-Invmass);
|
|---|
| 427 | pair[0]=i;
|
|---|
| 428 | pair[1]=j;
|
|---|
| 429 | }
|
|---|
| 430 |
|
|---|
| 431 | }
|
|---|
| 432 | }
|
|---|
| 433 |
|
|---|
| 434 | for(int i=0;i<size;i++)
|
|---|
| 435 | if(i!=pair[0] && i!=pair[1]) pair.push_back(i);
|
|---|
| 436 |
|
|---|
| 437 | return pair;
|
|---|
| 438 | }
|
|---|
| 439 |
|
|---|
| 440 | MAdouble64 atlas_susy_2018_06_func::GetHBoost(vector<const RecLeptonFormat*> leptons,const RecParticleFormat* missing)
|
|---|
| 441 | {
|
|---|
| 442 | MAdouble64 HBoost=0;
|
|---|
| 443 |
|
|---|
| 444 | MALorentzVector LeptonsMomentum = leptons[0]->momentum()+leptons[1]->momentum()+leptons[2]->momentum();
|
|---|
| 445 | MAdouble64 Missing_Pz = (LeptonsMomentum.Pz()*missing->pt())/sqrt(pow(LeptonsMomentum.Pt(),2)+pow(LeptonsMomentum.M(),2));
|
|---|
| 446 |
|
|---|
| 447 | MAdouble64 Missing_E = sqrt(pow(missing->pt(),2)+pow(Missing_Pz,2));
|
|---|
| 448 | MALorentzVector MissingMomentum(missing->px(),missing->py(),Missing_Pz,Missing_E);
|
|---|
| 449 | //cout<<MissingMomentum.M()<<endl;
|
|---|
| 450 | MAdouble64 ETotal = LeptonsMomentum.E()+MissingMomentum.P();
|
|---|
| 451 |
|
|---|
| 452 | MAdouble64 Boost_x = (LeptonsMomentum.Px()+MissingMomentum.Px())/ETotal;
|
|---|
| 453 | MAdouble64 Boost_y = (LeptonsMomentum.Py()+MissingMomentum.Py())/ETotal;
|
|---|
| 454 | MAdouble64 Boost_z = (LeptonsMomentum.Pz()+MissingMomentum.Pz())/ETotal;
|
|---|
| 455 |
|
|---|
| 456 | MABoost Boost(-Boost_x,-Boost_y,-Boost_z);
|
|---|
| 457 |
|
|---|
| 458 | for(unsigned int i=0;i<leptons.size();i++)
|
|---|
| 459 | {
|
|---|
| 460 | MALorentzVector temp_mom = leptons[i]->momentum();
|
|---|
| 461 | Boost.boost(temp_mom);
|
|---|
| 462 | //HBoost +=(Boost*leptons[i]->momentum()).P();
|
|---|
| 463 | HBoost += temp_mom.P();
|
|---|
| 464 | }
|
|---|
| 465 | HBoost += (Boost*MissingMomentum).P();
|
|---|
| 466 |
|
|---|
| 467 | return HBoost;
|
|---|
| 468 | }
|
|---|