ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitPhysics/SelMods/src/WBFExampleAnalysisMod.cc
Revision: 1.1
Committed: Wed Dec 22 13:40:30 2010 UTC (14 years, 4 months ago) by ceballos
Content type: text/plain
Branch: MAIN
Log Message:
new module

File Contents

# Content
1 // $Id $
2
3 #include "MitPhysics/SelMods/interface/WBFExampleAnalysisMod.h"
4 #include <TH1D.h>
5 #include <TH2D.h>
6 #include <TParameter.h>
7 #include "MitAna/DataUtil/interface/Debug.h"
8 #include "MitAna/DataTree/interface/Names.h"
9 #include "MitPhysics/Init/interface/ModNames.h"
10 #include "MitAna/DataCont/interface/ObjArray.h"
11 #include "MitCommon/MathTools/interface/MathUtils.h"
12 #include "MitAna/DataTree/interface/ParticleCol.h"
13 #include "TFile.h"
14 #include "TTree.h"
15
16 using namespace mithep;
17 ClassImp(mithep::WBFExampleAnalysisMod)
18
19 //--------------------------------------------------------------------------------------------------
20 WBFExampleAnalysisMod::WBFExampleAnalysisMod(const char *name, const char *title) :
21 BaseMod(name,title),
22 fMetName("NoDefaultNameSet"),
23 fCleanJetsName("NoDefaultNameSet"),
24 fVertexName(ModNames::gkGoodVertexesName),
25 fMet(0),
26 fVertices(0),
27 fJetPtMax(30),
28 fJetPtMin(30),
29 fDeltaEtaMin(4),
30 fDiJetMassMin(600)
31 {
32 // Constructor.
33 }
34
35 //--------------------------------------------------------------------------------------------------
36 void WBFExampleAnalysisMod::Begin()
37 {
38 // Run startup code on the client machine. For this module, we dont do
39 // anything here.
40 }
41
42 //--------------------------------------------------------------------------------------------------
43 void WBFExampleAnalysisMod::SlaveBegin()
44 {
45 // Run startup code on the computer (slave) doing the actual analysis. Here,
46 // we typically initialize histograms and other analysis objects and request
47 // branches. For this module, we request a branch of the MitTree.
48
49 //Create your histograms here
50
51 //*************************************************************************************************
52 // Selection Histograms
53 //*************************************************************************************************
54 AddTH1(fWBFSelection,"fWBFSelection", ";Cut Number;Number of Events", 6, -1.5, 4.5);
55
56 //***********************************************************************************************
57 // N-1 Histograms
58 //***********************************************************************************************
59 //All events
60 AddTH1(fWBFPtJetMax_NMinusOne, "fWBFPtJetMax_NMinusOne", ";Pt Jet Max;Number of Events",400,0.,400.);
61 AddTH1(fWBFPtJetMin_NMinusOne, "fWBFPtJetMin_NMinusOne", ";Pt Jet Min;Number of Events",400,0.,400.);
62 AddTH1(fWBFdeltaEta_NMinusOne, "fWBFdeltaEta_NMinusOne", ";Delta Eta;Number of Events",100,0.,10.);
63 AddTH1(fWBFdijetMass_NMinusOne,"fWBFdijetMass_NMinusOne",";DiJet Mass;Number of Events",400,0.,4000.);
64
65 //***********************************************************************************************
66 // After all cuts Histograms
67 //***********************************************************************************************
68 AddTH1(fWBFSSMass_afterCuts,"fWBFSSMass_afterCuts",";SS dilepton Mass;Number of Events",200,0.,400);
69 AddTH1(fWBFSSDeltaPhi_afterCuts,"fWBFOSDeltaPhi_afterCuts",";SS DeltaPhi 2l;Number of Events",90,0.,180);
70 AddTH1(fWBFOSMass_afterCuts,"fWBFSSMass_afterCuts",";OS dilepton Mass;Number of Events",200,0.,400);
71 AddTH1(fWBFSSDeltaPhi_afterCuts,"fWBFOSDeltaPhi_afterCuts",";OS DeltaPhi 2l;Number of Events",90,0.,180);
72 AddTH1(fWBFDiPhotonMass_afterCuts,"fWBFDiPhotonMass_afterCuts",";DiPhoton Mass;Number of Events",400,0.,400);
73
74 }
75
76 //--------------------------------------------------------------------------------------------------
77 void WBFExampleAnalysisMod::Process()
78 {
79 //Obtain all the good objects from the event cleaning module
80 fVertices = GetObjThisEvt<VertexOArr>(fVertexName);
81 ParticleOArr *CleanLeptons = dynamic_cast<mithep::ParticleOArr*>
82 (FindObjThisEvt(ModNames::gkMergedLeptonsName));
83 PhotonOArr *CleanPhotons = GetObjThisEvt<PhotonOArr>(ModNames::gkMCPhotonsName);
84 ObjArray<Jet> *CleanJets = dynamic_cast<ObjArray<Jet>* >
85 (FindObjThisEvt(fCleanJetsName.Data()));
86 TParameter<Double_t> *NNLOWeight = GetObjThisEvt<TParameter<Double_t> >("NNLOWeight");
87
88 MetCol *met = dynamic_cast<ObjArray<Met>* >(FindObjThisEvt(fMetName));
89 const Met *caloMet = 0;
90 if (met) {
91 caloMet = met->At(0);
92 } else {
93 cout << "Error: Met Collection " << fMetName << " could not be loaded.\n";
94 return;
95 }
96
97 if(CleanJets->GetEntries() < 2) return;
98
99 //*********************************************************************************************
100 //Define Cuts
101 //*********************************************************************************************
102 const int nCuts = 7;
103 bool passCut[nCuts] = {false, false, false, false, false};
104
105 // ptjet max cut
106 if(CleanJets->At(0)->Pt() > fJetPtMax) passCut[0] = true;
107
108 // ptjet min cut
109 if(CleanJets->At(1)->Pt() > fJetPtMin) passCut[1] = true;
110
111 // this cut is always applied
112 if(CleanJets->At(0)->Eta()*CleanJets->At(1)->Eta() < 0) passCut[2] = true;
113
114 // deltaEta cut
115 double deltaEta = TMath::Abs(CleanJets->At(0)->Eta()-CleanJets->At(1)->Eta());
116 if(deltaEta > fDeltaEtaMin) passCut[3] = true;
117
118 // dijet mass cut
119 CompositeParticle dijet;
120 dijet.AddDaughter(CleanJets->At(0));
121 dijet.AddDaughter(CleanJets->At(1));
122 if(dijet.Mass() > fDiJetMassMin) passCut[4] = true;
123
124 //*********************************************************************************************
125 //Make Selection Histograms. Number of events passing each level of cut
126 //*********************************************************************************************
127 bool passAllCuts = true;
128 for(int c=0; c<nCuts; c++) passAllCuts = passAllCuts & passCut[c];
129
130 //Cut Selection Histograms
131 fWBFSelection->Fill(-1,NNLOWeight->GetVal());
132 for (int k=0;k<nCuts;k++) {
133 bool pass = true;
134 bool passPreviousCut = true;
135 for (int p=0;p<=k;p++) {
136 pass = (pass && passCut[p]);
137 if (p<k)
138 passPreviousCut = (passPreviousCut&& passCut[p]);
139 }
140
141 if (pass) {
142 fWBFSelection->Fill(k,NNLOWeight->GetVal());
143 }
144 }
145
146 //*********************************************************************************************
147 // N-1 Histograms
148 //*********************************************************************************************
149 // N-1 ptjet max
150 bool pass = true;
151 for (int k=0;k<nCuts;k++) {
152 if (k != 0) {
153 pass = (pass && passCut[k]);
154 }
155 }
156 if (pass) {
157 fWBFPtJetMax_NMinusOne->Fill(TMath::Min(CleanJets->At(0)->Pt(),399.999),NNLOWeight->GetVal());
158 }
159
160 // N-1 ptjet min
161 pass = true;
162 for (int k=0;k<nCuts;k++) {
163 if (k != 1) {
164 pass = (pass && passCut[k]);
165 }
166 }
167 if (pass) {
168 fWBFPtJetMin_NMinusOne->Fill(TMath::Min(CleanJets->At(1)->Pt(),399.999),NNLOWeight->GetVal());
169 }
170
171 // N-1 deltaEta
172 pass = true;
173 for (int k=0;k<nCuts;k++) {
174 if (k != 3) {
175 pass = (pass && passCut[k]);
176 }
177 }
178 if (pass) {
179 fWBFdeltaEta_NMinusOne->Fill(TMath::Min(deltaEta,9.999),NNLOWeight->GetVal());
180 }
181
182 // N-1 dijet mass
183 pass = true;
184 for (int k=0;k<nCuts;k++) {
185 if (k != 4) {
186 pass = (pass && passCut[k]);
187 }
188 }
189 if (pass) {
190 fWBFdijetMass_NMinusOne->Fill(TMath::Min(dijet.Mass(),3999.999),NNLOWeight->GetVal());
191 }
192
193 //*********************************************************************************************
194 //Plots after all Cuts
195 //*********************************************************************************************
196 if (passAllCuts) {
197 // Distributions for dileptons events
198 if (CleanLeptons->GetEntries() >= 2 &&
199 CleanLeptons->At(0)->Pt() > 20 && CleanLeptons->At(1)->Pt() > 10){
200
201 CompositeParticle dilepton;
202 dilepton.AddDaughter(CleanLeptons->At(0));
203 dilepton.AddDaughter(CleanLeptons->At(1));
204 double deltaPhiLeptons = MathUtils::DeltaPhi(CleanLeptons->At(0)->Phi(),
205 CleanLeptons->At(1)->Phi())* 180.0 / TMath::Pi();
206
207 if(CleanLeptons->At(0)->Charge() * CleanLeptons->At(1)->Charge() > 0){
208 fWBFSSMass_afterCuts->Fill(TMath::Min(dilepton.Mass(),399.999),NNLOWeight->GetVal());
209 fWBFSSDeltaPhi_afterCuts->Fill(deltaPhiLeptons,NNLOWeight->GetVal());
210 }
211 else {
212 fWBFOSMass_afterCuts->Fill(TMath::Min(dilepton.Mass(),399.999),NNLOWeight->GetVal());
213 fWBFOSDeltaPhi_afterCuts->Fill(deltaPhiLeptons,NNLOWeight->GetVal());
214 }
215 }
216
217 // Distributions for diphotons events
218 if(CleanPhotons->GetEntries() >= 2 &&
219 CleanPhotons->At(0)->Pt() > 30 && CleanPhotons->At(1)->Pt() > 30){
220 CompositeParticle diphoton;
221 diphoton.AddDaughter(CleanPhotons->At(0));
222 diphoton.AddDaughter(CleanPhotons->At(1));
223 fWBFDiPhotonMass_afterCuts->Fill(TMath::Min(diphoton.Mass(),399.999),NNLOWeight->GetVal());
224 }
225 }
226
227 return;
228 }
229
230 //--------------------------------------------------------------------------------------------------
231 void WBFExampleAnalysisMod::SlaveTerminate()
232 {
233
234 // Run finishing code on the computer (slave) that did the analysis. For this
235 // module, we dont do anything here.
236
237 }
238 //--------------------------------------------------------------------------------------------------
239 void WBFExampleAnalysisMod::Terminate()
240 {
241 // Run finishing code on the client computer. For this module, we dont do
242 // anything here.
243
244 }