1 |
#include <iostream>
|
2 |
#include <assert.h>
|
3 |
#include <stdio.h>
|
4 |
#include <stdlib.h>
|
5 |
#include <getopt.h>
|
6 |
#include <string.h>
|
7 |
#include <utility>
|
8 |
#include <map>
|
9 |
// #include <boost/regex.hpp>
|
10 |
|
11 |
#include "TFile.h"
|
12 |
#include "TChain.h"
|
13 |
#include "TList.h"
|
14 |
#include "TRegexp.h"
|
15 |
#include "TTree.h"
|
16 |
#include "TBranch.h"
|
17 |
|
18 |
#include "ZZMatrixElement/MELA/interface/Mela.h"
|
19 |
#include "ZZMatrixElement/MELA/interface/PseudoMELA.h"
|
20 |
|
21 |
//#include "ZZMatrixElement/MELA/src/computeAngles.h"
|
22 |
|
23 |
|
24 |
#include "MitPhysics/Mods/interface/PwhgWrapper.h"
|
25 |
|
26 |
#include "TMVA/Reader.h"
|
27 |
#include "TMVA/Tools.h"
|
28 |
#include "TMVA/Config.h"
|
29 |
#include "TMVA/MethodBDT.h"
|
30 |
|
31 |
#include "KinematicsStruct.h"
|
32 |
#include "AngleTuple.h"
|
33 |
#include "TH1F.h"
|
34 |
#include "filestuff.h"
|
35 |
#include "Angles.h"
|
36 |
#include "WeightStruct.h"
|
37 |
#include "GenInfoStruct.h"
|
38 |
#include "SampleWeight.h"
|
39 |
#include "varkeepter.h"
|
40 |
|
41 |
#ifndef CMSSW_BASE
|
42 |
#define CMSSW_BASE "../../"
|
43 |
#endif
|
44 |
|
45 |
using namespace std;
|
46 |
|
47 |
pwhegwrapper *wrap;
|
48 |
|
49 |
class CtrlFlags
|
50 |
{
|
51 |
public :
|
52 |
CtrlFlags():inputfile(""),
|
53 |
inputtree("zznt"),
|
54 |
weightfile(""),
|
55 |
output("test.root"),
|
56 |
mH_lo(-1),
|
57 |
mH_hi(-1),
|
58 |
wL(0),
|
59 |
wH(0),
|
60 |
varstring(""),
|
61 |
makeMela(false),
|
62 |
multiclass(false),
|
63 |
flattree(false),
|
64 |
multisigs(false),
|
65 |
era(-1),
|
66 |
withPtY(false),
|
67 |
mH(0),
|
68 |
hwidth(0)
|
69 |
{ };
|
70 |
~CtrlFlags() {};
|
71 |
void dump();
|
72 |
|
73 |
string inputfile;
|
74 |
string inputtree;
|
75 |
string weightfile;
|
76 |
string output;
|
77 |
float mH_lo,mH_hi;
|
78 |
float wL,wH;
|
79 |
TString varstring;
|
80 |
bool makeMela;
|
81 |
bool multiclass;
|
82 |
bool flattree;
|
83 |
bool multisigs;
|
84 |
int era;
|
85 |
bool withPtY;
|
86 |
float mH;
|
87 |
float hwidth;
|
88 |
};
|
89 |
void CtrlFlags::dump()
|
90 |
{
|
91 |
cout << "mH : " << mH << endl;
|
92 |
cout << "inputfile : " << inputfile << endl;
|
93 |
cout << "inputtree : " << inputtree << endl;
|
94 |
cout << "weightfile : " << weightfile << endl;
|
95 |
cout << "output : " << output << endl;
|
96 |
cout << "mH_lo : " << mH_lo << endl;
|
97 |
cout << "mH_hi : " << mH_hi << endl;
|
98 |
cout << "wL : " << wL << endl;
|
99 |
cout << "wH : " << wH << endl;
|
100 |
cout << "varstring : " << varstring << endl;
|
101 |
cout << "makeMela : " << makeMela << endl;
|
102 |
cout << "multiclass : " << multiclass << endl;
|
103 |
cout << "flattree : " << flattree << endl;
|
104 |
cout << "multisigs : " << multisigs << endl;
|
105 |
cout << "withPtY : " << withPtY << endl;
|
106 |
cout << "hwidth : " << hwidth << endl;
|
107 |
assert(era==2011 || era==2012);
|
108 |
cout << "era : " << era << endl;
|
109 |
}
|
110 |
PseudoMELA *psMela;
|
111 |
void parse_args( int, char**, CtrlFlags & );
|
112 |
void setFracs(float mH, float mH_lo, float mH_hi, float &wgt_lo, float &wgt_hi);
|
113 |
void setZzntVals(CtrlFlags &flags, varkeepter *flatoutput, filestuff *fs, TString cls, TMVA::Reader *reader=0, Mela *mela=0, TMVA::Reader *spinReader=0);
|
114 |
|
115 |
//**AP: added this:
|
116 |
//void setInterferenceWeight(Bool_t isHiggs, varkeepter *flatoutput, filestuff *fs, Mela *mela=0);
|
117 |
//Bool_t isHiggs = kTRUE;
|
118 |
// ***
|
119 |
|
120 |
double getWeight(TH1F *hist, float val);
|
121 |
void setPtWgtHists(TString cls, TString fname, Long_t mH, TFile *wgtFile);
|
122 |
//----------------------------------------------------------------------------------------
|
123 |
map<TString,TH1F*> wgtHists;
|
124 |
|
125 |
//------------------------------------------------------------
|
126 |
int main(int argc, char ** argv)
|
127 |
//------------------------------------------------------------
|
128 |
{
|
129 |
CtrlFlags flags;
|
130 |
parse_args( argc, argv, flags);
|
131 |
flags.dump();
|
132 |
assert(flags.varstring!="");
|
133 |
assert(fopen(flags.weightfile.c_str(), "r") || flags.makeMela);
|
134 |
|
135 |
TFile *pt4lWgts = TFile::Open("data/pt4l/pt4l_weights.root");
|
136 |
wrap = new pwhegwrapper;
|
137 |
|
138 |
TString cmsswpath(CMSSW_BASE + TString("/src"));
|
139 |
string xspath = (string(cmsswpath)+"/MitPhysics/data/xs.dat");
|
140 |
SimpleTable xstab(xspath.c_str());
|
141 |
|
142 |
//
|
143 |
// setup input
|
144 |
//
|
145 |
|
146 |
cout << "flags: ----------------------------------------------------------------------------------------" << endl;
|
147 |
cout << "inputfile: " << flags.inputfile << endl;
|
148 |
cout << "output: " << flags.output << endl;
|
149 |
|
150 |
TString spinWeightFile("");//ntupledir;
|
151 |
vector<TString> classes,fileNames;
|
152 |
vector<double> fileFracs,fileMasses;
|
153 |
vector<TFile*> inFiles;
|
154 |
vector<TTree*> inTrees;
|
155 |
ifstream ifs(flags.inputfile.c_str());
|
156 |
assert(ifs.is_open());
|
157 |
string line;
|
158 |
while(getline(ifs,line)) {
|
159 |
if(line[0]=='#') continue;
|
160 |
stringstream ss(line);
|
161 |
if(line[0]=='^') {
|
162 |
TString dummy;
|
163 |
// if(TString(line).Contains("^ntupledir")) ss >> dummy >> ntupledir;
|
164 |
if(TString(line).Contains("^spinWeightFile")) { ss >> dummy >> spinWeightFile; cout << "spinWeightFile: " << spinWeightFile << endl; }
|
165 |
continue;
|
166 |
}
|
167 |
|
168 |
TString cls,fname,type;
|
169 |
double frac,fileMass;
|
170 |
ss >> cls >> type >> frac >> fname >> fileMass;
|
171 |
assert(cls=="gfH" || cls=="vbfH" || cls=="vttH" || cls=="qqH" || cls=="qqZZ" || cls=="ggZZ" || cls=="lljj" || cls=="data");
|
172 |
classes.push_back(cls);
|
173 |
fileNames.push_back(/*ntupledir+"/"+*/fname);
|
174 |
fileFracs.push_back(frac);
|
175 |
fileMasses.push_back(fileMass);
|
176 |
inFiles.push_back(TFile::Open(fname));
|
177 |
assert(inFiles.back()->IsOpen());
|
178 |
inTrees.push_back((TTree*)inFiles.back()->Get(flags.inputtree.c_str()));
|
179 |
assert(inTrees.back());
|
180 |
cout << " pushing back: " << cls << " " << setw(12) << frac << " " << fname << " " << fileMass << endl;
|
181 |
}
|
182 |
ifs.close();
|
183 |
|
184 |
// mass cut based on weightfile name ...
|
185 |
float mH = flags.mH;
|
186 |
// boost::regex expression2(".*_mH(.*)_.*");
|
187 |
// boost::cmatch match2;
|
188 |
// if(boost::regex_match(flags.weightfile.c_str(), match2, expression2))
|
189 |
// mH = std::strtof(match2[1].first,NULL);
|
190 |
|
191 |
// assert(flags.wL>=0 && flags.wL < 1000 && flags.wH >= 0 && flags.wH < 1000);
|
192 |
char cutstr[512];
|
193 |
sprintf(cutstr, "m4l>%.3f&&m4l<%.3f", flags.wL, flags.wH);
|
194 |
cout << "mH: " << setw(8) << mH
|
195 |
<< " wL: " << setw(8) << flags.wL
|
196 |
<< " wH: " << setw(8) << flags.wH
|
197 |
<< " mH_lo: " << setw(8) << flags.mH_lo
|
198 |
<< " mH_hi: " << setw(8) << flags.mH_hi
|
199 |
<< endl;
|
200 |
|
201 |
float frac_lo=1,frac_hi=1;
|
202 |
map<double,double> mH_fracs;
|
203 |
mH_fracs[-1] = 1; // this means zz
|
204 |
if(flags.mH_lo != 0) {
|
205 |
setFracs(mH, flags.mH_lo, flags.mH_hi, frac_lo, frac_hi);
|
206 |
mH_fracs[flags.mH_lo] = frac_lo;
|
207 |
mH_fracs[flags.mH_hi] = frac_hi;
|
208 |
}
|
209 |
mH_fracs[mH] = 1;
|
210 |
|
211 |
unsigned nMin=9999999;
|
212 |
vector<double> passFracs;
|
213 |
for(unsigned ifile=0; ifile<fileNames.size(); ifile++) {
|
214 |
cout << classes[ifile] << ": "
|
215 |
<< setw(8) << inTrees[ifile]->GetEntries(cutstr) << " / " << setw(8) << inTrees[ifile]->GetEntries() << " events pass cut in file: " << fileNames[ifile] << endl;
|
216 |
int nEntriesWithCut = inTrees[ifile]->GetEntries(cutstr);
|
217 |
if(nEntriesWithCut < nMin) nMin = nEntriesWithCut;
|
218 |
passFracs.push_back( double(nEntriesWithCut)/inTrees[ifile]->GetEntries() );
|
219 |
}
|
220 |
|
221 |
cout << "twice the min number of entries over all the files, 2*nMin: " << 2*nMin << endl;
|
222 |
|
223 |
TString tmpfname(flags.output);
|
224 |
tmpfname.ReplaceAll("/","-");
|
225 |
tmpfname = "/tmp/"+tmpfname+"-tmpfile.root";
|
226 |
TFile tmpfile(tmpfname,"recreate");
|
227 |
vector<TTree*> TreeCopies; // copies of the input trees, but with only the number of events we want
|
228 |
TList *treeList = new TList;
|
229 |
vector<long> nActuallyAdded,nActuallyAddedCumulative;
|
230 |
cout << "making tree copies: " << endl;
|
231 |
for(unsigned ifile=0; ifile<fileNames.size(); ifile++) {
|
232 |
if(mH_fracs.find(fileMasses[ifile]) == mH_fracs.end())
|
233 |
cout << "ERROR: filemasses[ifile]: " << fileMasses[ifile] << endl;
|
234 |
assert(mH_fracs.find(fileMasses[ifile]) != mH_fracs.end());
|
235 |
double fracThisFile,nTarget;
|
236 |
long nToRequest;
|
237 |
if(fileFracs[ifile] == 1) { // use all of this sample (eg for background)
|
238 |
fracThisFile = 1;
|
239 |
nTarget = passFracs[ifile]*inTrees[ifile]->GetEntries();
|
240 |
nToRequest = 1000000000; // use default value for TTree::CopyTree(): all of 'em
|
241 |
} else {
|
242 |
if(fileFracs[ifile] == -1)
|
243 |
fracThisFile = mH_fracs[fileMasses[ifile]]; // get fraction for this sample from function
|
244 |
else
|
245 |
fracThisFile = fileFracs[ifile]; // get fraction for this sample from txt file
|
246 |
nTarget = 2*fracThisFile*nMin;
|
247 |
nToRequest = nTarget / passFracs[ifile];
|
248 |
}
|
249 |
cout << " adding " << setw(12) << nTarget << " from file " << fileNames[ifile]
|
250 |
<< ", which means asking for: " << nToRequest << endl;
|
251 |
TreeCopies.push_back(inTrees[ifile]->CopyTree(cutstr,"",nToRequest));
|
252 |
|
253 |
long nCumulative=0;
|
254 |
for(unsigned j=0; j<nActuallyAdded.size(); j++) nCumulative += nActuallyAdded[j];
|
255 |
nActuallyAddedCumulative.push_back(nCumulative);
|
256 |
nActuallyAdded.push_back(long(TreeCopies.back()->GetEntries()));
|
257 |
cout << "actually added : " << nActuallyAdded.back() << ", cumulative: " << nActuallyAddedCumulative.back() << endl;
|
258 |
|
259 |
treeList->Add(TreeCopies.back());
|
260 |
}
|
261 |
|
262 |
TTree * t_tmp = TTree::MergeTrees(treeList);
|
263 |
tmpfile.Write();
|
264 |
tmpfile.Close();
|
265 |
|
266 |
//
|
267 |
// setup output
|
268 |
//
|
269 |
filestuff fs(tmpfname,tmpfname,"",classes[0]=="data");
|
270 |
float f_bdt;
|
271 |
TBranch *br_bdt=0;
|
272 |
varkeepter *flatoutput=0;
|
273 |
TString varfname("zzntvars");
|
274 |
if(flags.multisigs) varfname += "-multisigs";
|
275 |
flatoutput = new varkeepter("Angles/data/"+varfname+".txt","w",flags.output.c_str(),42,"zznt");
|
276 |
|
277 |
//
|
278 |
// setup TMVA
|
279 |
//
|
280 |
float reduced_mZ1, reduced_mZ2;
|
281 |
float reduced_zzdotz1, reduced_zzdotz2;
|
282 |
float reduced_ZZpt, reduced_Z1pt, reduced_Z2pt;
|
283 |
|
284 |
map<string,bool> varmap;
|
285 |
char * dovar = strtok(const_cast<char *>(flags.varstring.Data()), ":");
|
286 |
if( dovar != NULL ) varmap[string(dovar)]=true;
|
287 |
while( (dovar = strtok(NULL, ":")) != NULL ) {
|
288 |
varmap[string(dovar)]=true;
|
289 |
}
|
290 |
|
291 |
int run,lumi,evt;
|
292 |
TMVA::Reader *reader=0,*spinReader=0;
|
293 |
Mela *mela=0;
|
294 |
psMela=0;
|
295 |
if(!flags.makeMela) {
|
296 |
reader = new TMVA::Reader( "V" );
|
297 |
if(varmap[string("costheta1")]) reader->AddVariable( "costheta1", &fs.angles->costheta1);
|
298 |
if(varmap[string("costheta2")]) reader->AddVariable( "costheta2", &fs.angles->costheta2);
|
299 |
if(varmap[string("costhetastar")]) reader->AddVariable( "costhetastar", &fs.angles->costhetastar);
|
300 |
if(varmap[string("Phi")]) reader->AddVariable( "Phi", &fs.angles->Phi);
|
301 |
if(varmap[string("Phi1")]) reader->AddVariable( "Phi1", &fs.angles->Phi1);
|
302 |
if(varmap[string("mZ1")]) reader->AddVariable( "mZ1", &reduced_mZ1);
|
303 |
if(varmap[string("mZ2")]) reader->AddVariable( "mZ2", &reduced_mZ2);
|
304 |
if(varmap[string("pt4l")]) reader->AddVariable( "ZZpt/m4l", &reduced_ZZpt);
|
305 |
if(varmap[string("zzdotz1")]) reader->AddVariable( "ZZdotZ1/(m4l*mZ1)", &reduced_zzdotz1 );
|
306 |
if(varmap[string("zzdotz2")]) reader->AddVariable( "ZZdotZ2/(m4l*mZ2)", &reduced_zzdotz2 );
|
307 |
if(varmap[string("dphi1")]) reader->AddVariable( "ZZptCosDphiZ1pt", &fs.kine->ZZptZ1ptCosDphi );
|
308 |
if(varmap[string("dphi2")]) reader->AddVariable( "ZZptCosDphiZ2pt", &fs.kine->ZZptZ2ptCosDphi );
|
309 |
if(varmap[string("Z1pt")]) reader->AddVariable( "Z1pt/m4l", &reduced_Z1pt );
|
310 |
if(varmap[string("Z2pt")]) reader->AddVariable( "Z2pt/m4l", &reduced_Z2pt );
|
311 |
if(varmap[string("y4l")]) reader->AddVariable( "ZZy", &fs.kine->ZZy);
|
312 |
if(varmap[string("m4l")]) reader->AddVariable( "m4l", &fs.kine->m4l);
|
313 |
else reader->AddSpectator("m4l", &fs.kine->m4l);
|
314 |
reader->BookMVA("BDTG", flags.weightfile.c_str());
|
315 |
if(spinWeightFile != "") {
|
316 |
spinReader = new TMVA::Reader( "V" );
|
317 |
if(varmap[string("costheta1")]) spinReader->AddVariable( "costheta1", &fs.angles->costheta1);
|
318 |
if(varmap[string("costheta2")]) spinReader->AddVariable( "costheta2", &fs.angles->costheta2);
|
319 |
if(varmap[string("costhetastar")]) spinReader->AddVariable( "costhetastar", &fs.angles->costhetastar);
|
320 |
if(varmap[string("Phi")]) spinReader->AddVariable( "Phi", &fs.angles->Phi);
|
321 |
if(varmap[string("Phi1")]) spinReader->AddVariable( "Phi1", &fs.angles->Phi1);
|
322 |
if(varmap[string("mZ1")]) spinReader->AddVariable( "mZ1", &reduced_mZ1);
|
323 |
if(varmap[string("mZ2")]) spinReader->AddVariable( "mZ2", &reduced_mZ2);
|
324 |
// if(varmap[string("pt4l")]) spinReader->AddVariable( "ZZpt/m4l", &reduced_ZZpt);
|
325 |
// if(varmap[string("zzdotz1")]) spinReader->AddVariable( "ZZdotZ1/(m4l*mZ1)", &reduced_zzdotz1 );
|
326 |
// if(varmap[string("zzdotz2")]) spinReader->AddVariable( "ZZdotZ2/(m4l*mZ2)", &reduced_zzdotz2 );
|
327 |
// if(varmap[string("dphi1")]) spinReader->AddVariable( "ZZptCosDphiZ1pt", &fs.kine->ZZptZ1ptCosDphi );
|
328 |
// if(varmap[string("dphi2")]) spinReader->AddVariable( "ZZptCosDphiZ2pt", &fs.kine->ZZptZ2ptCosDphi );
|
329 |
// if(varmap[string("Z1pt")]) spinReader->AddVariable( "Z1pt/m4l", &reduced_Z1pt );
|
330 |
// if(varmap[string("Z2pt")]) spinReader->AddVariable( "Z2pt/m4l", &reduced_Z2pt );
|
331 |
// if(varmap[string("y4l")]) spinReader->AddVariable( "ZZy", &fs.kine->ZZy);
|
332 |
if(varmap[string("m4l")]) spinReader->AddVariable( "m4l", &fs.kine->m4l);
|
333 |
else spinReader->AddSpectator("m4l", &fs.kine->m4l);
|
334 |
spinReader->AddSpectator("run", &run);
|
335 |
spinReader->AddSpectator("lumi", &lumi);
|
336 |
spinReader->AddSpectator("evt", &evt);
|
337 |
spinReader->BookMVA("BDTG", spinWeightFile);
|
338 |
}
|
339 |
} else {
|
340 |
// mela = new Mela::Mela(bool usePowhegTemplate=false, int LHCsqrts=8);
|
341 |
mela = new Mela(false, flags.era==2011 ? 7 : 8);
|
342 |
if(flags.multisigs)
|
343 |
psMela = new PseudoMELA();
|
344 |
}
|
345 |
|
346 |
//
|
347 |
// evaluate
|
348 |
//
|
349 |
vector<unsigned> runv,evtv; // for removing duplicate events
|
350 |
int ifile=-1;
|
351 |
int nent=fs.get_zz_chain()->GetEntries();
|
352 |
cout << "beginning tree from mass " << mH << "(" << flags.wL << "," << flags.wH << ") with " << nent << " entries" << endl;
|
353 |
for( int i=0; i<nent; i++ ) {
|
354 |
if( !(i%5000) ) cerr << "processed: " << i << "/" << nent << endl;
|
355 |
fs.getentry(i,"","zznt");
|
356 |
|
357 |
if(classes[0]=="data") { // the rest of the classes better be data as well...
|
358 |
bool isDuplic=false;
|
359 |
for(unsigned ievt=0; ievt<evtv.size(); ievt++) {
|
360 |
if((fs.info->run == runv[ievt]) && (fs.info->evt == evtv[ievt])) {
|
361 |
isDuplic = true;
|
362 |
break;
|
363 |
}
|
364 |
}
|
365 |
if(isDuplic) {
|
366 |
cout << " skipping duplicate event: " << fs.info->run << " " << fs.info->evt << endl;
|
367 |
continue;
|
368 |
}
|
369 |
}
|
370 |
runv.push_back(fs.info->run);
|
371 |
evtv.push_back(fs.info->evt);
|
372 |
|
373 |
if(ifile+1 < (int)nActuallyAddedCumulative.size() && i >= nActuallyAddedCumulative[ifile+1]) {
|
374 |
ifile++;
|
375 |
cout << " ientry: " << i << ", switching file to (" << classes[ifile] << "): " << fileMasses[ifile]
|
376 |
<< " so weight multiplies by: " << ((classes[ifile]=="gfH" || classes[ifile]=="vbfH" || classes[ifile]=="qqH") ? mH_fracs[fileMasses[ifile]] : 1) << endl;
|
377 |
if(classes[ifile]=="gfH" || classes[ifile]=="qqZZ")
|
378 |
setPtWgtHists(classes[ifile],fileNames[ifile],mH,pt4lWgts);
|
379 |
}
|
380 |
|
381 |
if( fs.kine->m4l>flags.wH || fs.kine->m4l<flags.wL ) { cout << "ERROR! shouldn't be here (already applied the cut): " << fs.kine->m4l << endl; continue; }
|
382 |
|
383 |
reduced_mZ1 = fs.kine->mZ1;
|
384 |
reduced_mZ2 = fs.kine->mZ2;
|
385 |
reduced_ZZpt = fs.kine->ZZpt/fs.kine->m4l;
|
386 |
reduced_Z1pt = fs.kine->Z1pt/fs.kine->m4l;
|
387 |
reduced_Z2pt = fs.kine->Z2pt/fs.kine->m4l;
|
388 |
reduced_zzdotz1 = fs.kine->ZZdotZ1/(fs.kine->m4l*fs.kine->mZ1);
|
389 |
reduced_zzdotz2 = fs.kine->ZZdotZ2/(fs.kine->m4l*fs.kine->mZ2);
|
390 |
|
391 |
if(classes[ifile]=="gfH" || classes[ifile]=="vbfH" || classes[ifile]=="qqH")
|
392 |
fs.weights->w *= mH_fracs[fileMasses[ifile]];
|
393 |
|
394 |
if(!flags.makeMela && !flags.flattree) { // shouldn't ever use this at the point
|
395 |
assert(0);
|
396 |
fs.outtuple->Fill();
|
397 |
} else {
|
398 |
|
399 |
//AP: Here, right?:
|
400 |
//setInterferenceWeight(isHiggs, flatoutput, &fs, mela);
|
401 |
// **
|
402 |
|
403 |
setZzntVals(flags, flatoutput, &fs, classes[ifile], reader, mela, spinReader);
|
404 |
flatoutput->fill();
|
405 |
}
|
406 |
}
|
407 |
|
408 |
if(!flags.makeMela && !flags.flattree) {
|
409 |
fs.outtuple->getTree()->Print();
|
410 |
fs.outtuple->WriteClose();
|
411 |
} else {
|
412 |
flatoutput->gettree()->Print();
|
413 |
flatoutput->writeclose();
|
414 |
}
|
415 |
}
|
416 |
//----------------------------------------------------------
|
417 |
void parse_args( int argc, char** argv, CtrlFlags &flags )
|
418 |
//----------------------------------------------------------
|
419 |
{
|
420 |
int c;
|
421 |
int digit_optind = 0;
|
422 |
|
423 |
while (1) {
|
424 |
int this_option_optind = optind ? optind : 1;
|
425 |
int option_index = 0;
|
426 |
static struct option long_options[] = {
|
427 |
{"inputfile", 1, 0, 'a'},
|
428 |
{"inputtree", 1, 0, 'b'},
|
429 |
{"weightfile", 1, 0, 'c'},
|
430 |
{"output", 1, 0, 'd'},
|
431 |
{"mH_lo", 1, 0, 'e'},
|
432 |
{"mH_hi", 1, 0, 'f'},
|
433 |
{"wL", 1, 0, 'g'},
|
434 |
{"wH", 1, 0, 'h'},
|
435 |
{"varstring", 1, 0, 'i'},
|
436 |
{"makeMela", 0, 0, 'j'},
|
437 |
{"multiclass", 0, 0, 'k'},
|
438 |
{"flattree", 0, 0, 'l'},
|
439 |
{"multisigs", 0, 0, 'm'},
|
440 |
{"era", 1, 0, 'n'},
|
441 |
{"withPtY", 0, 0, 'o'},
|
442 |
{"mH", 1, 0, 'p'},
|
443 |
{"hwidth", 1, 0, 'q'},
|
444 |
{0, 0, 0, 0}
|
445 |
};
|
446 |
|
447 |
c = getopt_long (argc, argv, "a:e",
|
448 |
long_options, &option_index);
|
449 |
if (c == -1)
|
450 |
break;
|
451 |
|
452 |
switch (c) {
|
453 |
case 0:
|
454 |
printf ("option %s", long_options[option_index].name);
|
455 |
if (optarg)
|
456 |
printf (" with arg %s", optarg);
|
457 |
printf ("\n");
|
458 |
break;
|
459 |
|
460 |
case 'a':
|
461 |
flags.inputfile = std::string(optarg);
|
462 |
break;
|
463 |
case 'b':
|
464 |
flags.inputtree = std::string(optarg);
|
465 |
break;
|
466 |
case 'c':
|
467 |
flags.weightfile = std::string(optarg);
|
468 |
break;
|
469 |
case 'd':
|
470 |
flags.output = std::string(optarg);
|
471 |
break;
|
472 |
case 'e':
|
473 |
flags.mH_lo = strtof(optarg,NULL);
|
474 |
break;
|
475 |
case 'f':
|
476 |
flags.mH_hi = strtof(optarg,NULL);
|
477 |
break;
|
478 |
case 'g':
|
479 |
flags.wL = strtof(optarg,NULL);
|
480 |
break;
|
481 |
case 'h':
|
482 |
flags.wH = strtof(optarg,NULL);
|
483 |
break;
|
484 |
case 'i':
|
485 |
flags.varstring = TString(optarg);
|
486 |
break;
|
487 |
case 'j':
|
488 |
flags.makeMela = true;
|
489 |
break;
|
490 |
case 'k':
|
491 |
flags.multiclass = true;
|
492 |
break;
|
493 |
case 'l':
|
494 |
flags.flattree = true;
|
495 |
break;
|
496 |
case 'm':
|
497 |
flags.multisigs = true;
|
498 |
break;
|
499 |
case 'n':
|
500 |
flags.era = atoi(optarg);
|
501 |
assert(flags.era==2011 || flags.era==2012);
|
502 |
break;
|
503 |
case 'o':
|
504 |
flags.withPtY = true;
|
505 |
break;
|
506 |
case 'p':
|
507 |
flags.mH = strtof(optarg,NULL);
|
508 |
break;
|
509 |
case 'q':
|
510 |
flags.hwidth = strtof(optarg,NULL);
|
511 |
break;
|
512 |
case '2':
|
513 |
if (digit_optind != 0 && digit_optind != this_option_optind)
|
514 |
printf ("digits occur in two different argv-elements.\n");
|
515 |
digit_optind = this_option_optind;
|
516 |
printf ("option %c\n", c);
|
517 |
break;
|
518 |
|
519 |
case '?':
|
520 |
break;
|
521 |
|
522 |
default:
|
523 |
printf ("?? getopt returned character code 0%o ??\n", c);
|
524 |
}
|
525 |
}
|
526 |
|
527 |
if( flags.inputfile.empty() ) {
|
528 |
cerr << "please specify an inputfile with --inputfile " << endl;
|
529 |
exit(1);
|
530 |
}
|
531 |
|
532 |
if (optind < argc) {
|
533 |
printf ("non-option ARGV-elements: ");
|
534 |
while (optind < argc)
|
535 |
printf ("%s ", argv[optind++]);
|
536 |
printf ("\n");
|
537 |
}
|
538 |
}
|
539 |
//----------------------------------------------------------------------------------------
|
540 |
void setFracs(float mH, float mH_lo, float mH_hi, float &frac_lo, float &frac_hi)
|
541 |
{
|
542 |
assert(mH_lo<=mH && mH_hi>=mH && mH_lo>0 && mH_hi>0);
|
543 |
double delta = mH_hi - mH_lo;
|
544 |
frac_lo = (mH_hi - mH)/delta;
|
545 |
frac_hi = (mH - mH_lo)/delta;
|
546 |
}
|
547 |
//----------------------------------------------------------------------------------------
|
548 |
void setZzntVals(CtrlFlags &flags, varkeepter *flatoutput, filestuff *fs, TString cls, TMVA::Reader *reader, Mela *mela, TMVA::Reader *spinReader)
|
549 |
{
|
550 |
flatoutput->setval("run", (UInt_t)fs->info->run);
|
551 |
flatoutput->setval("evt", (UInt_t)fs->info->evt);
|
552 |
flatoutput->setval("channel", (UInt_t)fs->kine->channel);
|
553 |
flatoutput->setval("ZZpt", (Double_t)fs->kine->ZZpt);
|
554 |
flatoutput->setval("m4l", (Double_t)fs->kine->m4l);
|
555 |
flatoutput->setval("w", (Double_t)fs->weights->w);
|
556 |
flatoutput->setval("won", (Double_t)fs->weights->won);
|
557 |
flatoutput->setval("woff", (Double_t)fs->weights->woff);
|
558 |
flatoutput->setval("npuw", (Double_t)fs->weights->npuw);
|
559 |
|
560 |
// set pt4l up/down weights
|
561 |
Double_t pt4lDown(1),pt4lUp(1),pt4lPdfDown(1),pt4lPdfUp(1),pt4lHresDown(1),pt4lHresUp(1);
|
562 |
if(cls=="qqZZ" || (cls=="gfH" && !fs->fname_.Contains(TRegexp("[02][mp]")))) {
|
563 |
assert(fs->get_zz_chain()->FindBranch("geninfo"));
|
564 |
assert(wgtHists["renfac_Lo"]);
|
565 |
assert(wgtHists["renfac_Hi"]);
|
566 |
assert(wgtHists["pdf_Lo"]);
|
567 |
assert(wgtHists["pdf_Hi"]);
|
568 |
pt4lDown = getWeight(wgtHists["renfac_Lo"], fs->gen->pt_zz);
|
569 |
pt4lUp = getWeight(wgtHists["renfac_Hi"], fs->gen->pt_zz);
|
570 |
pt4lPdfDown = getWeight(wgtHists["pdf_Lo"], fs->gen->pt_zz);
|
571 |
pt4lPdfUp = getWeight(wgtHists["pdf_Hi"], fs->gen->pt_zz);
|
572 |
// cout << "pt4l: " << fs->gen->pt_zz << " renfac: " << pt4lDown << " " << pt4lUp << " pdf: " << pt4lPdfDown << " " << pt4lUp;
|
573 |
if(cls != "qqZZ" ) {
|
574 |
assert(wgtHists["hres_Lo"]);
|
575 |
assert(wgtHists["hres_Hi"]);
|
576 |
pt4lHresDown = getWeight(wgtHists["hres_Lo"], fs->gen->pt_zz);
|
577 |
pt4lHresUp = getWeight(wgtHists["hres_Hi"], fs->gen->pt_zz);
|
578 |
// cout << " hres: " << pt4lHresDown << " " << pt4lHresUp;
|
579 |
}
|
580 |
// cout << endl;
|
581 |
}
|
582 |
flatoutput->setval("pt4lDown", (Double_t)pt4lDown);
|
583 |
flatoutput->setval("pt4lUp", (Double_t)pt4lUp);
|
584 |
flatoutput->setval("pt4lPdfDown", (Double_t)pt4lPdfDown);
|
585 |
flatoutput->setval("pt4lPdfUp", (Double_t)pt4lPdfUp);
|
586 |
flatoutput->setval("pt4lHresDown", (Double_t)pt4lHresDown);
|
587 |
flatoutput->setval("pt4lHresUp", (Double_t)pt4lHresUp);
|
588 |
|
589 |
// set mH weights
|
590 |
Double_t wmH(1);
|
591 |
if((cls=="gfH" && !fs->fname_.Contains(TRegexp("[02][mp]"))) || cls=="vbfH") {
|
592 |
assert(fs->get_zz_chain()->FindBranch("geninfo"));
|
593 |
GenInfoStruct gen(*fs->gen);
|
594 |
TLorentzVector genZ1,genZ2;
|
595 |
genZ1.SetPtEtaPhiM( gen.vpt_a, gen.veta_a, gen.vphi_a, gen.vmass_a);
|
596 |
genZ2.SetPtEtaPhiM( gen.vpt_b, gen.veta_b, gen.vphi_b, gen.vmass_b);
|
597 |
double genM4l = (genZ1 + genZ2).M();
|
598 |
wmH = wrap->getweight(flags.mH, flags.hwidth, 172.5, genM4l, 1);
|
599 |
// cout << "m4l weights: " << genM4l << " " << flatoutput->getval("wmH") << endl;
|
600 |
}
|
601 |
flatoutput->setval("wmH", (Double_t)wmH);
|
602 |
|
603 |
if(flags.makeMela) {
|
604 |
assert(mela);
|
605 |
TLorentzVector Z1_lept1, Z1_lept2, Z2_lept1, Z2_lept2;
|
606 |
KinematicsStruct kine(*(fs->kine));
|
607 |
|
608 |
Z1_lept1.SetPtEtaPhiM( kine.l1pt, kine.l1eta, kine.l1phi, abs(kine.l1type)==13 ? 105.658369e-3 : 0.51099892e-3);
|
609 |
Z1_lept2.SetPtEtaPhiM( kine.l2pt, kine.l2eta, kine.l2phi, abs(kine.l2type)==13 ? 105.658369e-3 : 0.51099892e-3);
|
610 |
Z2_lept1.SetPtEtaPhiM( kine.l3pt, kine.l3eta, kine.l3phi, abs(kine.l3type)==13 ? 105.658369e-3 : 0.51099892e-3);
|
611 |
Z2_lept2.SetPtEtaPhiM( kine.l4pt, kine.l4eta, kine.l4phi, abs(kine.l4type)==13 ? 105.658369e-3 : 0.51099892e-3);
|
612 |
|
613 |
// NOTE: it's p.d.g. ID, so opposite sign to the charge
|
614 |
int Z1_lept1Id(-1*kine.l1q*kine.l1type),Z1_lept2Id(-1*kine.l2q*kine.l2type),Z2_lept1Id(-1*kine.l3q*kine.l3type),Z2_lept2Id(-1*kine.l4q*kine.l4type);
|
615 |
float costhetastar,costheta1,costheta2,phi,phistar1,kd,psig,pbkg,spinKd;
|
616 |
mela->computeKD(Z1_lept1, Z1_lept1Id, Z1_lept2, Z1_lept2Id, Z2_lept1, Z2_lept1Id, Z2_lept2, Z2_lept2Id,
|
617 |
costhetastar, costheta1, costheta2, phi, phistar1, kd, psig, pbkg, flags.withPtY, flags.withPtY);
|
618 |
|
619 |
flatoutput->setval("melaLD", (Float_t)kd);
|
620 |
|
621 |
if(flags.multisigs) {
|
622 |
assert(psMela);
|
623 |
psMela->computeKD(Z1_lept1, Z1_lept1Id, Z1_lept2, Z1_lept2Id, Z2_lept1, Z2_lept1Id, Z2_lept2, Z2_lept2Id,
|
624 |
spinKd, psig, pbkg);
|
625 |
flatoutput->setval("SpinBDT", (Float_t)spinKd);
|
626 |
}
|
627 |
} else {
|
628 |
assert(reader);
|
629 |
if(flags.multiclass) {
|
630 |
flatoutput->setval("BDT", (Float_t)((reader->EvaluateMulticlass("BDTG"))[0])); // signal component
|
631 |
flatoutput->setval("bkgBDT", (Float_t)((reader->EvaluateMulticlass("BDTG"))[1])); // bkg (ZZ) component
|
632 |
flatoutput->setval("bkg2BDT", (Float_t)((reader->EvaluateMulticlass("BDTG"))[2])); // bkg2 (Z+jets) component
|
633 |
} else {
|
634 |
flatoutput->setval("BDT", (Float_t)(reader->EvaluateMVA("BDTG")));
|
635 |
}
|
636 |
if(flags.multisigs) {
|
637 |
assert(spinReader);
|
638 |
flatoutput->setval("SpinBDT", (Float_t)spinReader->EvaluateMVA("BDTG"));
|
639 |
}
|
640 |
}
|
641 |
}
|
642 |
//----------------------------------------------------------------------------------------
|
643 |
double getWeight(TH1F *hist, float val)
|
644 |
{
|
645 |
int bin = hist->FindBin(val);
|
646 |
// return 1 for out-of-bounds
|
647 |
if(bin<1 || bin>hist->GetNbinsX())
|
648 |
return 1;
|
649 |
return hist->GetBinContent(bin);
|
650 |
}
|
651 |
//----------------------------------------------------------------------------------------
|
652 |
TString findClosestPtWgts(TFile *wgtFile, int mH, TString scaleType) // scaleType is renfac, pdf, or hres
|
653 |
{
|
654 |
Long_t closestMass(-1);
|
655 |
TString closestMassStr;
|
656 |
TList *keys = wgtFile->GetListOfKeys();
|
657 |
for(unsigned ikey=0; ikey<keys->GetEntries(); ikey++) {
|
658 |
TString name(keys->At(ikey)->GetName());
|
659 |
TString tmpName(name(TRegexp("h[0-9][0-9]*zz4l_"+scaleType)));
|
660 |
TString massStr(tmpName(TRegexp("[0-9][0-9]*")));
|
661 |
int mass = atoi(massStr);
|
662 |
if(mass<100 || mass > 1200) continue;
|
663 |
if(abs(mass - mH) < abs(closestMass - mH)) {
|
664 |
closestMass = mass;
|
665 |
closestMassStr = massStr;
|
666 |
}
|
667 |
}
|
668 |
|
669 |
cout << " using closest mass of: " << closestMassStr << endl;
|
670 |
return closestMassStr;
|
671 |
}
|
672 |
//----------------------------------------------------------------------------------------
|
673 |
void findHist(TString cls, Long_t mH, TString fname, TFile *wgtFile, TString scaleType, TString hiLo)
|
674 |
{
|
675 |
assert(hiLo=="Lo" || hiLo=="Hi");
|
676 |
TString procStr;
|
677 |
if(cls=="gfH") {
|
678 |
procStr = TString("h")+mH+"zz4l";
|
679 |
} else if(cls=="qqZZ") {
|
680 |
if(fname.Contains("zz4e")) procStr = "zz4e";
|
681 |
if(fname.Contains("zz4m")) procStr = "zz4m";
|
682 |
if(fname.Contains("zz2e2m")) procStr = "zz2e2m";
|
683 |
} else assert(0);
|
684 |
assert(procStr!="");
|
685 |
|
686 |
TString histName(hiLo+"Wgts_"+procStr+"_"+scaleType);
|
687 |
TH1F *htest = (TH1F*)wgtFile->Get(histName);
|
688 |
TString closestMass;
|
689 |
if(!htest) {
|
690 |
cout << " hist name " << histName << " not found" << endl;
|
691 |
if(cls=="gfH") {
|
692 |
closestMass = findClosestPtWgts(wgtFile, mH, scaleType);
|
693 |
histName.ReplaceAll(TString("")+mH, closestMass);
|
694 |
} else {
|
695 |
histName.ReplaceAll("zz4e","zz2e2m"); // only made 2e2m for a few of them
|
696 |
histName.ReplaceAll("zz4m","zz2e2m");
|
697 |
}
|
698 |
cout << " trying with " << histName << endl;
|
699 |
}
|
700 |
|
701 |
wgtHists[scaleType+"_"+hiLo] = (TH1F*)wgtFile->Get(histName); assert(wgtHists[scaleType+"_"+hiLo]);
|
702 |
}
|
703 |
//----------------------------------------------------------------------------------------
|
704 |
void setPtWgtHists(TString cls, TString fname, Long_t mH, TFile *wgtFile)
|
705 |
{
|
706 |
assert(wgtFile->IsOpen());
|
707 |
|
708 |
findHist(cls, mH, fname, wgtFile, "renfac", "Lo");
|
709 |
findHist(cls, mH, fname, wgtFile, "renfac", "Hi");
|
710 |
findHist(cls, mH, fname, wgtFile, "pdf", "Lo");
|
711 |
findHist(cls, mH, fname, wgtFile, "pdf", "Hi");
|
712 |
if(cls=="gfH") {
|
713 |
findHist(cls, mH, fname, wgtFile, "hres", "Lo");
|
714 |
findHist(cls, mH, fname, wgtFile, "hres", "Hi");
|
715 |
}
|
716 |
}
|
717 |
|
718 |
|
719 |
|
720 |
|
721 |
|
722 |
/* AP /// Adding interference weights using Mela's functionality.
|
723 |
I don't know if it's actually work in here, couldn't compile it.
|
724 |
Note: in order for this to work, one needs:
|
725 |
1) Mela's compteAngles.h and Mela.h
|
726 |
2) mcfm library linked
|
727 |
3) There maight be a problem with name 'mela'.
|
728 |
-- computeAngles() is defined in a namespace 'mela::'
|
729 |
-- The object of class Mela is also called 'mela'. If there is a problem - I'd rename it to 'mela1'
|
730 |
*/
|
731 |
/*
|
732 |
void setInterferenceWeight(Bool_t isHiggs, varkeepter *flatoutput, filestuff *fs, Mela *mela1)
|
733 |
{
|
734 |
|
735 |
float w_interference = 1;
|
736 |
|
737 |
if (!isHiggs)
|
738 |
{
|
739 |
// If the sample we're running is not higgs - set this weight to 1 and exit
|
740 |
flatoutput->setval("w_interference",(Double_t)w_interference);
|
741 |
return kTRUE;
|
742 |
}
|
743 |
|
744 |
//Otherwise continue.
|
745 |
|
746 |
|
747 |
TLorentzVector lep1,lep2,lep3,lep4;
|
748 |
lep1.SetPtEtaPhiM(fs.gen->pt_1_a, fs.gen->eta_1_a, fs.gen->phi_1_a, 0.0); //Note: masses are set to 0, must not be important
|
749 |
lep2.SetPtEtaPhiM(fs.gen->pt_2_a, fs.gen->eta_2_a, fs.gen->phi_2_a, 0.0);
|
750 |
lep3.SetPtEtaPhiM(fs.gen->pt_1_b, fs.gen->eta_1_b, fs.gen->phi_1_b, 0.0);
|
751 |
lep4.SetPtEtaPhiM(fs.gen->pt_2_b, fs.gen->eta_2_b, fs.gen->phi_2_b, 0.0);
|
752 |
|
753 |
|
754 |
Float_t gen_costhetastar, gen_costheta1,gen_costheta2, gen_Phi, gen_Phi1;
|
755 |
Float_t gen_Z1Mass, gen_Z2Mass, gen_ZZMass;
|
756 |
|
757 |
TLorentzVector vec_zz, vec_a, vec_b;
|
758 |
vec_a.SetPtEtaPhiM(fs.gen->vpt_a, fs.gen->veta_a, fs.gen->vphi_a, fs.gen->vmass_a);
|
759 |
vec_b.SetPtEtaPhiM(fs.gen->vpt_b, fs.gen->veta_b, fs.gen->vphi_b, fs.gen->vmass_b);
|
760 |
vec_zz = vec_a+vec_b;
|
761 |
|
762 |
gen_Z1Mass = fs.gen->vmass_a;
|
763 |
gen_Z2Mass = fs.gen->vmass_b;
|
764 |
gen_ZZMass = vec_zz.M();
|
765 |
|
766 |
if (abs(fs.gen->id_1_a) == abs(fs.gen->id_1_b)) //Only make the weights for 4mu and 4e channels, not for 2e2mu
|
767 |
{
|
768 |
if (abs(fs.gen->id_2_a) != abs(fs.gen->id_1_a))
|
769 |
cout<<" *** Something is wrong - IDs don't match! "<<endl;
|
770 |
|
771 |
|
772 |
//First need to compute the angles in Mela's Framework using gen particles:
|
773 |
mela::computeAngles(lep1, fs.gen->id_1_a, lep2, fs.gen->id_2_a, lep3, fs.gen->id_1_b, lep4, fs.gen->id_2_b, gen_costhetastar, gen_costheta1, gen_costheta2, gen_Phi, gen_Phi1);
|
774 |
|
775 |
//cout<<"gen mass zz = "<<vec_zz.M()<<" gen mass a = "<<fs.gen->vmass_a<<" gen mass b = "<<fs.gen->vmass_b<<endl;
|
776 |
|
777 |
//Now we can determine the weight:
|
778 |
mela1.computeWeight(gen_ZZMass, fs.gen->vmass_a, fs.gen->vmass_b, gen_costhetastar,gen_costheta1,gen_costheta2,gen_Phi,gen_Phi1, w_interference);
|
779 |
}
|
780 |
|
781 |
//Fill the weight into the ntuple:
|
782 |
flatoutput->setval("w_interference",(Double_t)w_interference);
|
783 |
|
784 |
}
|
785 |
*/
|