ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitHzz4l/NonMCBackground/src/plotSignalFakes.cc
(Generate patch)

Comparing UserCode/MitHzz4l/NonMCBackground/src/plotSignalFakes.cc (file contents):
Revision 1.2 by dkralph, Thu Jul 19 11:15:32 2012 UTC vs.
Revision 1.6 by dkralph, Tue Oct 23 11:22:41 2012 UTC

# Line 3 | Line 3
3   #include <iomanip>
4   // #include <pair.h>
5  
6 #include "RooHistPdf.h"
7 #include "RooGlobalFunc.h"
8 #include "RooPlot.h"
9 #include "RooRealVar.h"
10 #include "RooDataHist.h"
11 #include "RooGenericPdf.h"
12 #include "RooDataSet.h"
13 #include "RooAddPdf.h"
14 #include "RooFormulaVar.h"
15 #include "RooFitResult.h"
16 #include "RooCurve.h"
17 #include "RooBinning.h"
18 #include "RooExponential.h"
19 #include "RooExtendPdf.h"
20
6   #include "TCanvas.h"
7   #include "TChain.h"
8   #include "TString.h"
9   #include "TStyle.h"
10   #include "TH1D.h"
11 + #include "TNtuple.h"
12 + #include "TROOT.h"
13  
14   #include "CPlot.h"
15   #include "FOArgs.h"
# Line 31 | Line 18
18   #include "Various.h"
19   #include "CommonDefs.h"
20   #include "PlotHeaders.h"
21 + #include "TriggerUtils.h"
22 + #include "JetDefs.h"
23 + #include "JetInfoStruct.h"
24 + #include "FR_struct.h"
25 + #include "SelectionFuncs.h"
26 + #include "SampleWeight.h"
27 + #include "MitStyleRemix.h"
28 +
29 + #include "TMVA/Reader.h"
30 + #include "TMVA/Tools.h"
31 + #include "TMVA/Config.h"
32 + #include "TMVA/MethodBDT.h"
33  
34   #ifndef CMSSW_BASE
35   #define CMSSW_BASE "../../"
# Line 40 | Line 39 | using namespace std;
39   using namespace RooFit;
40   using namespace mithep;
41  
42 + // TH1D* hpu_2011;
43 + // TH1D* hpu_2012;
44 + // TH1D* hpu_2011_me;
45 + // TH1D* hpu_2012_me;
46 + //----------------------------------------------------------------------------------------
47   TCanvas *can;
48  
49 + TString dummy_integral_str(TH1D *hist, int nDecPlaces) { return TString(""); };
50 + bool findGoodJets(vector<SimpleLepton> &goodJets, filestuff *fs,
51 +                  SimpleLepton lep1, SimpleLepton lep2, SimpleLepton lep3, SimpleLepton lep4);
52   void fillHist(CSample *cs, TString channel, TString type, TString var, double val, double wgt, double wgt_lo=0, double wgt_hi=0);
53 < void makeHTML(FOFlags &ctrl, TString type, TString plotLabel);
53 > void fillAllHists(FOFlags ctrl, CSample *cs, TString channel, TString type, filestuff *fs, KinematicsStruct kine, Angles angles,
54 >                  SimpleLepton lep1, SimpleLepton lep2, SimpleLepton lep3, SimpleLepton lep4,
55 >                  double wgt, double wgt_lo=0, double wgt_hi=0);
56 > void fillAllJetHists(FOFlags ctrl,  CSample *cs, TString channel, TString type, filestuff *fs, KinematicsStruct kine,
57 >                      SimpleLepton lep1, SimpleLepton lep2, SimpleLepton lep3, SimpleLepton lep4,
58 >                      FusionMva &fusion, vector<SimpleLepton> &goodJets, JetInfoStruct ji,
59 >                      double wgt, double wgt_lo=0, double wgt_hi=0);
60 > void makeHTML(FOFlags &ctrl, TString type, TString plotLabel, TString fullOutDir);
61   map<TString,map<TString,TH1D*>* > init_hists(FOFlags &ctrl, TString str="");
62 <
62 > bool passHlt(FOFlags &ctrl, TrigInfo ti, InfoStruct *info, unsigned lep1matchBits,
63 >             unsigned lep2matchBits, unsigned lep3matchBits,
64 >             unsigned lep4matchBits);
65 > void init_cuts(vector<TString> &cutstrs, map<TString,int> &cutvec);
66 > void resetCutVect(map<TString,int> &cutvec) {
67 >  for(map<TString,int>::iterator it=cutvec.begin(); it!=cutvec.end(); it++)
68 >    cutvec[(*it).first] = 0;
69 > }
70 > map<TString,TH1D*> setHistSet(CSample *cs, TString type, TString var);
71 > void fillFakeTuple(CSample *cs, filestuff *fs, EventData evtdata, unsigned ientry, double fillweight);
72 > void incrementSsofCounters(FOFlags &ctrl, filestuff *fs, double minMz2,
73 >                           pair<int,int> *best_z_indices, double wgt);
74 > map<TString,double> init_counter(TString fname="");
75 > map<TString,double> initSsofRatios(vector<CSample*> &samplev);
76 > double getSsofWgt(TString channel, map<TString,double> &ssofRatios);
77   //----------------------------------------------------------------------------------------
78   int main(int argc, char** argv)
79   {
80 <  double lumi = 5000;//10093;
80 >  SetStyle();
81 >  initPUWeights();
82 >  ControlFlags dummyCtrl;
83 >  // TFile * puf_me;
84 >  // puf_me = new TFile("data/pileup/PUWeights_S12To2012_190456-199011.root");
85 >  // hpu_2012_me = (TH1D*)(puf_me->Get("puWeights"));
86 >  // hpu_2012_me->SetDirectory(0);
87 >  // puf_me->Close();
88 >  // puf_me = new TFile("data/pileup/PUWeights_F11To2011.root");
89 >  // hpu_2011_me = (TH1D*)(puf_me->Get("puWeights"));
90 >  // hpu_2011_me->SetDirectory(0);
91 >  // puf_me->Close();
92 >
93 >  vector<TString> cutstrs;
94 >  map<TString,int> cutvec;
95 >  init_cuts(cutstrs, cutvec);
96  
97 +  // arguments...
98    FOFlags ctrl;
99    parse_foargs( argc, argv, ctrl );
100    ctrl.dump();
101 +  FusionMva fusion(ctrl.uncert);//"./weights/againstZZ-fusion_BDTG.weights.xml");
102 +  bool makeJetTuple=false; // jet tuple for vbf mva training
103 +  assert(ctrl.faketype=="SR"   || // plot events in signal region, if requested including ntuples of the extrapolation from 2P2F and 3P1F regions
104 +         ctrl.faketype=="2P2F" || // plot 2P2F region, and if requested write out ntuple which gives extrapolation to SR (ntuple would then be read by "SR", above)
105 +         ctrl.faketype=="3P1F");  // plot 3P1F region (including the extrapolation to there from the 2P2F region), and if requested write out ntuple with SR prediction
106 +  if(ctrl.heavyFlavor) assert(ctrl.faketype=="2P2F");
107 +  if(ctrl.ssof) assert(ctrl.faketype=="2P2F");
108  
109 <  can = new TCanvas("can","can");
109 >  can = new TCanvas("can","can",700,500);
110  
111 <  FR_struct fr2011 = initFRs(ctrl.mufakefile2011,ctrl.elefakefile2011);
112 <  FR_struct fr2012 = initFRs(ctrl.mufakefile2012,ctrl.elefakefile2012);
111 >  FR_struct fr2011(ctrl.mufakefile2011,ctrl.elefakefile2011);
112 >  FR_struct fr2012(ctrl.mufakefile2012,ctrl.elefakefile2012);
113  
114    TString cmsswpath(CMSSW_BASE + TString("/src"));
115    string xspath = (string(cmsswpath)+"/MitPhysics/data/xs.dat");
116    SimpleTable xstab(xspath.c_str());
117  
118 +  TrigInfo ti;
119 +  initAnalysisTriggers(ti);
120 +
121    vector<CSample*> samplev;
122    TString ntupledir(""),label(""),plotLabel(""),jsonFile("");
123    int puTarget;
124    readConfigFile(ctrl.config, ntupledir, label, plotLabel, jsonFile, puTarget, samplev, &ctrl, init_hists);
125 +  map<TString,double> ssofRatios;
126 +  if(ctrl.ssof && !ctrl.writessofratio && !ctrl.plotWholeSample) ssofRatios = initSsofRatios(samplev);
127 +
128 +  Angles angles; // NOTE: this is not the same as fs->angles -- the one in fs is filled with whichever choice of leptons was made in applyZPlusX
129 +  KinematicsStruct kine; // NOTE: this is not the same as fs->kine -- the one in fs is filled with whichever choice of leptons was made in applyZPlusX
130 +  JetInfoStruct ji;
131  
72  vector<pair<unsigned,unsigned> > runEvtv; // vector to veto duplicate events
132    UInt_t minRun=999999999,maxRun=0;
133    for(unsigned ics=0; ics<samplev.size(); ics++) {
134      CSample *cs = samplev[ics];
135      cout << cs->name << endl;
136 +
137 +    // output for vbf mva training
138 +    unsigned evtVar;
139 +    AngleTuple *jettuple;
140 +    if(makeJetTuple) {
141 +      jettuple = new AngleTuple( (const char*)(TString(cs->name)+"_pass.root").Data(), (const char*)"zznt");
142 +      jettuple->makeAngleBranch(angles);
143 +      jettuple->makeKinematicsBranch(kine);
144 +      jettuple->makeJetInfoBranch(ji);
145 +      const char *str1 = "evt";
146 +      const char *str2 = "evt/i";
147 +      jettuple->makeBranch(str1,(void *)(&evtVar),str2);
148 +    }
149 +
150 +    vector<pair<unsigned,unsigned> > runEvtv; // vector to veto duplicate events
151 +    resetCutVect(cutvec);
152      for(unsigned ifs=0; ifs<(cs->fsv).size(); ifs++) {
153        filestuff *fs = (cs->fsv)[ifs];
154 <      cout << "\t" << fs->fname_ << endl;
155 <      FR_struct *fr = (fs->era_==2011) ? &fr2011 : &fr2012;
154 >      if(ctrl.makeFakeTuples && fs->dataset_!="fakes") { // write a copy of the input trees for events that will be used for the SR fake prediction
155 >        TString fakefilename(fs->fname_);
156 >        fakefilename.ReplaceAll(".root","-fakes.root");
157 >        if(ctrl.hiStatFakes) fakefilename.ReplaceAll("-fakes.root","-fakes-histat.root");
158 >        fs->makeOutputFile(fakefilename);
159 >      }
160 >      cout << "\t" << fs->fname_; cout.flush();
161        unsigned nDuplSkipped=0;
162        for(unsigned ientry=0; ientry<fs->getentries("FOtree"); ientry++) {
163 <        fs->getentry(ientry,"","FOtree");
163 >        fs->getentry(ientry,"FOs","FOtree");
164 >        fs->getentry(ientry,"Zleptons","FOtree");
165          fs->getentry(ientry,"info","zznt");
166  
167 <        if(fs->isdata_) {
167 >        cutvec["start"] = fs->total_entries_;
168 >        if(fs->isdata_) {// && !(fs->dataset_=="fakes")) {
169 >          // WARNING: when I write the fakeTuple from here, I fill an event *twice* if it has two fake z2 candidates, so event numbers are duplicated.
170 >          // in plotH4l I *don't* want to remove these, but here I *do*, because in this file I again loop over all z2 candidates
171            setMinMaxRun(fs->info->run, minRun, maxRun);
172            bool dupl = takeCareOfDuplicateEvents(fs->info->run, fs->info->evt, runEvtv, nDuplSkipped);
173            if(dupl) continue;
174 <          pair<unsigned,unsigned> rl(fs->info->run, fs->info->lumi);
91 <          if(!fs->rlrm_.HasRunLumi(rl)) continue;
174 >          if(!fs->rlrm_.HasRunLumi(pair<unsigned,unsigned> (fs->info->run, fs->info->lumi))) continue;
175          }
176 +        cutvec["rlrmAndDupl"] += 1;
177  
178          double wgt=1;
179          if(!fs->isdata_) {
180 <          double xsWgt = lumi*xstab.Get(fs->dataset_)/fs->total_entries_;
181 <          // double puWgt = weightTrue2012(fs->info->npu);
182 <          wgt = xsWgt;//*puWgt;
180 >          double xsWgt = fs->lumi_*xstab.Get(fs->dataset_)/fs->total_entries_;
181 >          cout << "WARNING: check the pu weihgs funciton here" << endl;
182 >          double puWgt = getPUWeight(fs->era_, "/029/", fs->info->npu);
183 >          // if(fs->era_==2012)
184 >          //   puWgt = hpu_2012_me->GetBinContent(hpu_2012_me->FindBin(fs->info->npu));
185 >          // else if(fs->era_==2011)
186 >          //   puWgt = hpu_2011_me->GetBinContent(hpu_2011_me->FindBin(fs->info->npu));
187 >          // else assert(0);
188 >          wgt = xsWgt*puWgt;
189 >          if(wgt!=wgt) cout << "xsWgt: " << xsWgt << " puWgt: " << puWgt << endl;
190 >        }
191 >        if(fs->dataset_=="fakes") { // if we're reading in the fake ntuple that we wrote out earlier, use the event weight that was stored (this should be the same as what we'd get if we calculated it below)
192 >          fs->getentry(ientry,"weights","zznt");
193 >          wgt = fs->weights->w;
194          }
195  
196          unsigned npass = fs->passingL->size();
197          unsigned nfail = fs->failingL->size();
198  
199 +        // look for a z1
200          pair<int,int> best_z_indices;
201 <        findZ1(fs->passingL,best_z_indices,40);
201 >        double best_mz1 = findZ1(fs->passingL,best_z_indices,40);
202 >        if(best_mz1<=0) {
203 >          cout << "WARNING: best z1 mass: " << best_mz1 << endl;
204 >        }
205 >        if(ctrl.heavyFlavor && best_mz1<60) continue;
206          EventData evtdata;
207          evtdata.Z1leptons.push_back((*fs->passingL)[best_z_indices.first]);
208          evtdata.Z1leptons.push_back((*fs->passingL)[best_z_indices.second]);
# Line 110 | Line 210 | int main(int argc, char** argv)
210          // Look for a z2
211          vector<pair<SimpleLepton,SimpleLepton> > z2cands;
212          vector<TString> types;
213 <        findZ2Candidates(fs->failingL, z2cands, types, true);
214 <        
213 >        TString signFlavor;
214 >        if(ctrl.heavyFlavor)            signFlavor = "";
215 >        else if(ctrl.ssof)              signFlavor = "SS-SF";
216 >        else if(ctrl.hiStatFakes)       signFlavor = "signalExclude";
217 >        else                            signFlavor = "OS-SF";
218 >        double minMz2 = ctrl.heavyFlavor ? 0 : 12;
219 >        int hiPtPassingZ2 = findZ2CandidatesPassFail(fs->passingL, z2cands, types, signFlavor, minMz2, "pass",&best_z_indices); // signal region
220 >        int hiPtFailingZ2 = findZ2CandidatesPassFail(fs->failingL, z2cands, types, signFlavor, minMz2, "fail"); // 2P+2F
221 >        int hiPtPfZ2      = findZ2CandidatesPassFail(fs->passingL, z2cands, types, signFlavor, minMz2, "PF", &best_z_indices, fs->failingL); // 3P+1F
222 >
223 >        if(ctrl.writessofratio) incrementSsofCounters(ctrl, fs, minMz2, &best_z_indices, wgt);
224 >
225          for(unsigned iz2=0; iz2<z2cands.size(); iz2++) {
226            SimpleLepton lep1 = evtdata.Z1leptons[0];
227            SimpleLepton lep2 = evtdata.Z1leptons[1];
228            SimpleLepton lep3 = z2cands[iz2].first;
229            SimpleLepton lep4 = z2cands[iz2].second;
120            
121          TString channel = getChannel(lep1,lep2,lep3,lep4);
230            evtdata.Z2leptons.clear();
231            evtdata.Z2leptons.push_back(lep3);
232            evtdata.Z2leptons.push_back(lep4);
233 <          KinematicsStruct kine;
233 >          fillAngles(evtdata,angles);
234            fillKinematics(evtdata,kine);
235 +          lepFrs fwgts;
236 +          fillLeptonFakeWeights(fwgts, (fs->era_==2011) ? &fr2011 : &fr2012, lep3, lep4);
237 +          TString channel = getChannel(lep1,lep2,lep3,lep4);
238 +          // bool hltPass = fs->isdata_ ? passHlt(ctrl,ti,fs->info,lep1.scID,lep2.scID,lep3.scID,lep4.scID) : true;
239  
240 <          if(fabs(lep3.ip3dSig) >= 4 || fabs(lep4.ip3dSig) >= 4)        continue; // |sip| < 4 is applied in ZPlusX to lep1, lep2
240 >          if(ctrl.heavyFlavor) {
241 >            if(fabs(lep1.dz) > 0.01 || fabs(lep2.dz) > 0.01)            continue;
242 >            if( !(fabs(lep3.ip3dSig) > 2 && fabs(lep4.ip3dSig) > 8) &&
243 >                !(fabs(lep4.ip3dSig) > 2 && fabs(lep3.ip3dSig) > 8)  )  continue;
244 >            if( !(fabs(lep3.d0) > .002 && fabs(lep4.d0) > .01) &&
245 >                !(fabs(lep4.d0) > .002 && fabs(lep3.d0) > .01)  )       continue;
246 >            if(fabs(lep3.d0) > 0.1 || fabs(lep4.d0) > 0.1)              continue;
247 >            if(fabs(lep3.dz) > 0.2 || fabs(lep4.dz) > 0.2)              continue;
248 >          } else {
249 >            if(fabs(lep3.ip3dSig) >= 4 || fabs(lep4.ip3dSig) >= 4)      continue; // |sip| < 4 is applied to lep1, lep2 in ZPlusX
250 >            if(!leptonDrReqs(lep1,lep2,lep3,lep4))                      continue;
251 >            if(kine.m4l < 100)                                          continue;
252 >            if(!resonanceKilling(lep1,lep2,lep3,lep4))                  continue;
253 >          }
254            if(!finalLeptonPtReqs(lep1,lep2,lep3,lep4))                   continue;
255 <          if(!leptonDrReqs(lep1,lep2,lep3,lep4))                        continue;
256 <          if(!resonanceKilling(lep1,lep2,lep3,lep4))                    continue;
257 <          if(kine.m4l < 100)                                            continue;
258 <
259 <          if(types[iz2]=="pass") {
260 <            fillHist( cs, channel, "obs", "run"      , fs->info->run  , wgt);
261 <            fillHist( cs, channel, "obs", "mZ1"      , kine.mZ1  ,      wgt);                
262 <            fillHist( cs, channel, "obs", "mZ2"      , kine.mZ2  ,      wgt);                
263 <            fillHist( cs, channel, "obs", "mZ2_lo"   , kine.mZ2  ,      wgt);                
264 <            fillHist( cs, channel, "obs", "m4l"      , kine.m4l  ,      wgt);                
265 <            fillHist( cs, channel, "obs", "Z1pt"     , kine.Z1pt ,      wgt);                
266 <            fillHist( cs, channel, "obs", "ZZpt"     , kine.ZZpt ,      wgt);                
267 <            fillHist( cs, channel, "obs", "ip3ds_l1" , lep1.ip3dSig ,   wgt);
268 <            fillHist( cs, channel, "obs", "ip3ds_l2" , lep2.ip3dSig ,   wgt);
269 <            fillHist( cs, channel, "obs", "ip3ds_l3" , lep3.ip3dSig ,   wgt);
270 <            fillHist( cs, channel, "obs", "ip3ds_l4" , lep4.ip3dSig ,   wgt);
271 <            fillHist( cs, channel, "obs", "pt_l1"    , lep1.vec.Pt() ,  wgt);
272 <            fillHist( cs, channel, "obs", "pt_l2"    , lep2.vec.Pt() ,  wgt);
273 <            fillHist( cs, channel, "obs", "pt_l3"    , lep3.vec.Pt() ,  wgt);
274 <            fillHist( cs, channel, "obs", "pt_l4"    , lep4.vec.Pt() ,  wgt);
275 <            fillHist( cs, channel, "obs", "eta_l1"   , lep1.vec.Eta() , wgt);
276 <            fillHist( cs, channel, "obs", "eta_l2"   , lep2.vec.Eta() , wgt);
277 <            fillHist( cs, channel, "obs", "eta_l3"   , lep3.vec.Eta() , wgt);
278 <            fillHist( cs, channel, "obs", "eta_l4"   , lep4.vec.Eta() , wgt);
279 <            fillHist( cs, channel, "obs", "dR_l3l4_lo",dr(lep3,lep4),   wgt);
280 <            fillHist( cs, channel, "obs", "dR_l3l4",   dr(lep3,lep4),   wgt);
281 <          } else if(types[iz2]=="fail") {
282 <            double fwgt_1    = get_fake_weight("",lep3,*fr);
283 <            double fwgt_lo_1 = get_fake_weight("lo",lep3,*fr);
284 <            double fwgt_hi_1 = get_fake_weight("hi",lep3,*fr);
285 <            double fwgt_2    = get_fake_weight("",lep4,*fr);
286 <            double fwgt_lo_2 = get_fake_weight("lo",lep4,*fr);
287 <            double fwgt_hi_2 = get_fake_weight("hi",lep4,*fr);
288 <
289 <            double centr = wgt*fwgt_1*fwgt_2;
290 <            double lo    = wgt*fwgt_lo_1*fwgt_lo_2;
291 <            double hi    = wgt*fwgt_hi_1*fwgt_hi_2;
292 <            fillHist( cs, channel, "pred", "run",       fs->info->run,  centr, lo, hi);
293 <            fillHist( cs, channel, "pred", "mZ1",       kine.mZ1,       centr, lo, hi);
294 <            fillHist( cs, channel, "pred", "mZ2",       kine.mZ2,       centr, lo, hi);
295 <            fillHist( cs, channel, "pred", "mZ2_lo",    kine.mZ2,       centr, lo, hi);
296 <            fillHist( cs, channel, "pred", "m4l",       kine.m4l,       centr, lo, hi);
297 <            fillHist( cs, channel, "pred", "Z1pt",      kine.Z1pt,      centr, lo, hi);
298 <            fillHist( cs, channel, "pred", "ZZpt",      kine.ZZpt,      centr, lo, hi);
299 <            fillHist( cs, channel, "pred", "ip3ds_l1",  lep1.ip3dSig,   centr, lo, hi);
300 <            fillHist( cs, channel, "pred", "ip3ds_l2",  lep2.ip3dSig,   centr, lo, hi);
301 <            fillHist( cs, channel, "pred", "ip3ds_l3",  lep3.ip3dSig,   centr, lo, hi);
302 <            fillHist( cs, channel, "pred", "ip3ds_l4",  lep4.ip3dSig,   centr, lo, hi);
303 <            fillHist( cs, channel, "pred", "pt_l1",     lep1.vec.Pt(),  centr, lo, hi);
304 <            fillHist( cs, channel, "pred", "pt_l2",     lep2.vec.Pt(),  centr, lo, hi);
305 <            fillHist( cs, channel, "pred", "pt_l3",     lep3.vec.Pt(),  centr, lo, hi);
306 <            fillHist( cs, channel, "pred", "pt_l4",     lep4.vec.Pt(),  centr, lo, hi);
307 <            fillHist( cs, channel, "pred", "eta_l1",    lep1.vec.Eta(), centr, lo, hi);
308 <            fillHist( cs, channel, "pred", "eta_l2",    lep2.vec.Eta(), centr, lo, hi);
309 <            fillHist( cs, channel, "pred", "eta_l3",    lep3.vec.Eta(), centr, lo, hi);
310 <            fillHist( cs, channel, "pred", "eta_l4",    lep4.vec.Eta(), centr, lo, hi);
311 <            fillHist( cs, channel, "pred", "dR_l3l4_lo",dr(lep3,lep4),  centr, lo, hi);
312 <            fillHist( cs, channel, "pred", "dR_l3l4",   dr(lep3,lep4),  centr, lo, hi);
255 >
256 >          cutvec["4lsele"] += 1;
257 >
258 >          //
259 >          // jets!
260 >          //
261 >          bool doJets=false;
262 >          vector<SimpleLepton> goodJets;
263 >          if(doJets) {
264 >            fs->getentry(ientry,"jets","FOtree");
265 >            if(fs->jets->size() > 1) cutvec["twoJets"] += 1;
266 >            bool hazJetz = findGoodJets(goodJets, fs, lep1, lep2, lep3, lep4);
267 >            if(goodJets.size() > 1) cutvec["twoJetsAfter"] += 1;
268 >            if(!hazJetz) continue;
269 >            ControlFlags ctrlTmp;
270 >            fillJetInfo(goodJets,ji,ctrlTmp);
271 >            if(makeJetTuple) {
272 >              evtVar = fs->info->evt;
273 >              jettuple->Fill();
274 >            }
275 >            fusion.setValues(ji,kine);
276 >          }
277 >          
278 >          cutvec["filling"] += 1;
279 >
280 >          if(types[iz2]=="pass" || ((fs->dataset_=="fakes") && (types[iz2]=="fail"))) { // for the fakes ntuple, we plot the "failing" z2s as passing ones, i.e. put them in hObs, but with the proper weight
281 >            // llll events
282 >            if((fs->dataset_!="fakes") && (iz2!=hiPtPassingZ2)) continue; // for non-fakes, we only want the  highest-pt "passing" z2 (for the fakes these are by design failing z2s, and we want all of 'em)
283 >            cutvec["fillPass"] += 1;
284 >            fillAllHists( ctrl, cs, channel, "obs", fs, kine, angles, lep1, lep2, lep3, lep4, wgt);
285 >            if(doJets) fillAllJetHists( ctrl, cs, channel, "obs", fs, kine, lep1, lep2, lep3, lep4, fusion, goodJets, ji, wgt);
286 >
287 >          } else if(types[iz2]=="fail") { // lljj events
288 >            if(iz2!=hiPtFailingZ2 && ctrl.plotWholeSample) continue;
289 >            double centr=0,lo=0,hi=0;
290 >            if(ctrl.faketype=="2P2F") {
291 >              if(ctrl.plotWholeSample) { // make plots without weighting with the FR
292 >                centr = wgt;
293 >              } else {
294 >                centr = wgt*fwgts.fwgt_3*fwgts.fwgt_4;
295 >                lo    = wgt*fwgts.fwgt_lo_3*fwgts.fwgt_lo_4;
296 >                hi    = wgt*fwgts.fwgt_hi_3*fwgts.fwgt_hi_4;
297 >                if(ctrl.ssof && !ctrl.writessofratio && !ctrl.plotWholeSample) {
298 >                  double ssof_wgt = getSsofWgt(channel,ssofRatios);
299 >                  centr *= ssof_wgt;
300 >                  lo    *= ssof_wgt;
301 >                  hi    *= ssof_wgt;
302 >                }
303 >              }
304 >            } else if(ctrl.faketype=="3P1F") { // apply the weights for extrapolation from 2P2F region to 3P1F region
305 >              centr = wgt*(fwgts.fwgt_3    + fwgts.fwgt_4);
306 >              lo    = wgt*(fwgts.fwgt_lo_3 + fwgts.fwgt_lo_4);
307 >              hi    = wgt*(fwgts.fwgt_hi_3 + fwgts.fwgt_hi_4);
308 >            }
309 >
310 >            if(ctrl.makeFakeTuples && fs->dataset_!="fakes") {
311 >              double fillwgt;
312 >              bool dofill=true;
313 >              if(ctrl.faketype=="2P2F") {
314 >                assert(fs->isdata_);
315 >                fillwgt = centr;
316 >              } else if(ctrl.faketype=="3P1F") {
317 >                fillwgt = - wgt*(fwgts.fwgt_3*fwgts.fwgt_4 + fwgts.fwgt_4*fwgts.fwgt_3);
318 >                dofill = (cs->name=="data" || cs->name=="2012" || cs->name=="2011");
319 >              } else assert(0);
320 >              fillFakeTuple(cs,fs,evtdata,ientry,fillwgt);
321 >            }
322 >            cutvec["fillFail"] += 1;
323 >            fillAllHists( ctrl, cs, channel, "pred", fs, kine, angles, lep1, lep2, lep3, lep4, centr, lo, hi);
324 >            if(doJets) fillAllJetHists( ctrl, cs, channel, "pred", fs, kine, lep1, lep2, lep3, lep4, fusion, goodJets, ji, centr, lo, hi);
325 >
326 >          } else if(types[iz2]=="PF") { // lllj events
327 >            if(fs->dataset_!="fakes" && iz2!=hiPtPfZ2) continue; // shouldn't have this when I extrapolate to signal region
328 >
329 >            if(ctrl.makeFakeTuples && fs->dataset_!="fakes" && ctrl.faketype=="3P1F") {
330 >              assert(lep3.isLoose || lep4.isLoose);
331 >              assert(!(lep3.isLoose && lep4.isLoose));
332 >              double fwgt = lep3.isLoose ? fwgts.fwgt_4 : fwgts.fwgt_3;
333 >              double fillwgt;// only fill for data or ZZ
334 >              if(fs->isdata_)           fillwgt = wgt*fwgt;     // set the weight to be the fake weight (maybe check that this is the same weight as I read in from the fakes dataset?)
335 >              else if(cs->name=="zz")   fillwgt = -wgt*fwgt;    // subtract off the zz contribution in the 3P1F region
336 >              else assert(0);
337 >              fillFakeTuple(cs,fs,evtdata,ientry,fillwgt);
338 >            }
339 >            
340 >            cutvec["fillPF"] += 1;
341 >            fillAllHists( ctrl, cs, channel, "PF", fs, kine, angles, lep1, lep2, lep3, lep4, wgt);
342 >            if(doJets) fillAllJetHists( ctrl, cs, channel, "PF", fs, kine, lep1, lep2, lep3, lep4, fusion, goodJets, ji, wgt);
343            } else assert(0);
344          }
345        }
346 <      cout << "\t\tWARNING: skipped " << nDuplSkipped << " duplicate events" << endl;
346 >      if(ctrl.writessofratio) fs->writeSsofRatios();
347 >      cout << "\t\t" << setw(7) << nDuplSkipped << " duplicate events skipped" << endl;
348 >      if(ctrl.makeFakeTuples) {
349 >        fs->outFotuple->getFile()->cd();
350 >        fs->outFotuple->getTree()->Write();
351 >        fs->outtuple->WriteClose();
352 >      }
353 >      fs->del();
354      }
355 +    for(unsigned icut=0; icut<cutstrs.size(); icut++) {
356 +      cout << setw(22) << cutstrs[icut] << setw(22) << cutvec[cutstrs[icut]] << endl;
357 +    }
358 +    if(makeJetTuple)
359 +      jettuple->WriteClose();
360    }
361    cout << "run range: " << setw(12) << minRun << setw(12) << maxRun << endl;
362 +
363 +  // plot!
364    assert(samplev.size()>0);
365    vector<TString> typev;
366    typev.push_back("all");
367 <  typev.push_back("4e");
368 <  typev.push_back("4m");
369 <  typev.push_back("2e2m");
367 >
368 >  if(ctrl.plotAllCats) {
369 >    typev.push_back("4e");
370 >    typev.push_back("4m");
371 >    typev.push_back("2e2m");
372 >  }
373 >
374 >  ofstream txtOutFile("fakes.txt",ios_base::app);
375 >  txtOutFile << "---> " << ctrl.faketype << " " << plotLabel << endl;
376 >  // loop over channels
377    for(unsigned itype=0; itype<typev.size(); itype++) {
378      TString type(typev[itype]);
379 <    gSystem->mkdir(ctrl.outdir+"/"+plotLabel+"/"+type,true);
380 <    TFile runHistFile(ctrl.outdir+"/"+plotLabel+"/"+type+"/runs.root","recreate");
379 >    TString fullOutDir(ctrl.outdir+"/"+plotLabel+"/"+type);
380 >    gSystem->mkdir(fullOutDir,true);
381 >    TFile runHistFile(fullOutDir+"/runs.root","recreate");
382 >    // loop over variables
383      map<TString,TH1D*>::iterator it_v;
384      for(it_v=(*(samplev[0]->hists)[type+"_obs"]).begin(); it_v!=(*(samplev[0]->hists)[type+"_obs"]).end(); it_v++) {
385        TString var((*it_v).first);
386 <      CPlot cplot(var,"",(*(samplev[0]->hists)[type+"_obs"])[var]->GetXaxis()->GetTitle(),"events",ctrl.outdir+"/"+plotLabel+"/"+type+"/plots");
386 >      CPlot cplot(var,TString(""),(*(samplev[0]->hists)[type+"_obs"])[var]->GetXaxis()->GetTitle(),TString("events"),TString(fullOutDir+"/plots"));
387 >      double fakeCounter=0;
388        double ymax=0;
389 +      // loop over csamples
390        for(unsigned isam=0; isam<samplev.size(); isam++) {
391          CSample *cs = samplev[isam];
392 <        TH1D *hObs = (*(cs->hists)[type+"_obs"])[var];
393 <        TH1D *hPred = (*(cs->hists)[type+"_pred"])[var];
394 <        TH1D *hPred_lo = (*(cs->hists)[type+"_pred_lo"])[var];
395 <        TH1D *hPred_hi = (*(cs->hists)[type+"_pred_hi"])[var];
396 <
397 <        if(cs->isdata) {
398 <          double ratio = integrateHist(hObs) / integrateHist(hPred);
399 <          cplot.AddHist1D(hObs,cs->legend+": "+integral_str(hObs,0)+", ratio: "+f_to_a(ratio),"E");
400 <          cplot.AddHist1D(hPred,"FR predic: "+integral_str(hPred,2),"hist",kRed);
401 <          cplot.AddHist1D(hPred_lo,"stat lo: "+integral_str(hPred_lo,2),"hist",kRed,kDashed);
402 <          cplot.AddHist1D(hPred_hi,"stat hi: "+integral_str(hPred_hi,2),"hist",kRed,kDashed);
403 <          ymax = max(ymax,histMax(hObs,hPred,hPred_lo,hPred_hi));
404 <        } else {
405 <          cplot.AddToStack(hPred,cs->legend+" pred.: "+integral_str(hPred,2),cs->color);
406 <          ymax = max(ymax,hPred->GetMaximum());
407 <          // cplot.AddHist1D(hObs,cs->legend+": "+integral_str(hObs),"Ehist",kBlue);//cs->color);
392 >        map<TString,TH1D*> hs = setHistSet(cs,type,var);
393 >        if(var=="met")  //var=="mjj" || var=="etaProd" || var=="ncj")
394 >          shiftOverflows(hs);
395 >        bool plotShapeOnly = false;
396 >        if(plotShapeOnly)
397 >          scaleHists(hs);
398 >        
399 >        if(cs->isdata && !(cs->name=="fakes")) {
400 >          if(ctrl.faketype=="SR" || (ctrl.heavyFlavor && !ctrl.plotWholeSample) || (ctrl.ssof && !ctrl.plotWholeSample)) {
401 >            cplot.AddHist1D(hs["obs"],cs->legend+": "+integral_str(hs["obs"],0),"E");
402 >            ymax = max(ymax,hs["obs"]->GetMaximum());
403 >          }
404 >          if(ctrl.faketype=="2P2F") {
405 >            if(ctrl.plotWholeSample) {
406 >              cplot.AddHist1D(hs["pred"],cs->legend+": "+integral_str(hs["pred"],0),"E");
407 >              ymax = max(ymax,hs["pred"]->GetMaximum());
408 >            } else {
409 >              cplot.AddHist1D(hs["pred"],    TString("FR predic: "+integral_str(hs["pred"],3)),   "hist",kRed);
410 >              cplot.AddHist1D(hs["pred_lo"], TString(  "stat lo: "+integral_str(hs["pred_lo"],2)),"hist",kRed,kDashed);
411 >              cplot.AddHist1D(hs["pred_hi"], TString(  "stat hi: "+integral_str(hs["pred_hi"],2)),"hist",kRed,kDashed);
412 >              if(var=="m4l") {
413 >                txtOutFile << "  " << type << ": " << integral_str(hs["pred"],3) << " (" << integral_str(hs["pred_lo"],2) << "," << integral_str(hs["pred_hi"],2) << ")" << endl;
414 >              }
415 >              ymax = max(ymax,histMax(hs["pred"],hs["pred_lo"],hs["pred_hi"]));
416 >            }
417 >          }
418 >          if(ctrl.faketype=="3P1F") {
419 >            double ratio = 0;//integrateHist(hs["PF"]) / integrateHist(hs["pred"]);
420 >            cplot.AddHist1D(hs["PF"],TString(cs->legend+": "+integral_str(hs["PF"],0)+", ratio: "+f_to_a(ratio)),"E",cs->color);
421 >            if(!ctrl.plotWholeSample) {
422 >              cplot.AddToStack(hs["pred"],TString(cs->legend+"(2P2F extrap.): "+integral_str(hs["pred"],1)), kRed, -1);
423 >              ymax = max(ymax,histMax(hs["PF"],cplot.GetStack(),hs["pred"]));
424 >            } else {
425 >              ymax = max(ymax,hs["PF"]->GetMaximum());
426 >            }
427 >            fakeCounter = integrateHist(hs["PF"]) - integrateHist(hs["pred"]);
428 >          }
429 >        } else { // mc
430 >          TH1D *mchist = 0;
431 >          if(ctrl.faketype=="SR")   mchist = hs["obs"];
432 >          if(ctrl.faketype=="2P2F") {
433 >            if(ctrl.plotWholeSample)  mchist = hs["pred"];
434 >            else                      mchist = hs["obs"];
435 >          }
436 >          if(ctrl.faketype=="3P1F")   mchist = hs["PF"];
437 >          assert(mchist);
438 >          bool stackMc = true;
439 >          if(stackMc) cplot.AddToStack(mchist,TString(cs->legend+": "+integral_str(mchist,2)),cs->color,-1);
440 >          else        cplot.AddHist1D(mchist,TString(cs->legend +": "+integral_str(mchist,3)),"Ehist",cs->color);//cs->color);
441 >          if(cs->name=="zz") fakeCounter -= integrateHist(hs["PF"]);
442 >          ymax = max(ymax,histMax(mchist,cplot.GetStack()));
443          }
444          if(cs->isdata && var=="run") {
445 <          assert(hObs->GetBinContent(0)==0 && hObs->GetBinContent(hObs->GetXaxis()->GetNbins()+1)==0);
446 <          hObs->Write("runs");
445 >          assert(hs["obs"]->GetBinContent(0)==0 && hs["obs"]->GetBinContent(hs["obs"]->GetXaxis()->GetNbins()+1)==0);
446 >          hs["obs"]->Write("runs");
447          }
448 <        if(var.Contains("ip3d")) {
234 <          double maxVal = max(hObs->GetMaximum(), hPred->GetMaximum());
235 <          double isoMin = 0.0005*maxVal;
236 <          double isoMax = 1.8*maxVal;
237 <          cplot.SetYRange(isoMin,isoMax);
238 <          // cplot.SetLogy();
239 <        } else {
448 >        if(!var.Contains("fusionMVA"))
449            cplot.SetYRange(0,1.2*ymax);
450 <        }
450 >        if(ctrl.faketype=="3P1F") cplot.AddTextBox(TString("diff: "+f_to_a(fakeCounter)),.7,.5,.8,.6);
451        }
452        cplot.Draw(can,true,"png");
453 +      if(var.Contains("fusionMVA")) {
454 +        cplot.SetLogy();
455 +        cplot.Draw(can,true,"png",0,var+"-log");
456 +        cplot.SetLogy(false);
457 +      }
458      }
459      runHistFile.Close();
460 <    makeHTML(ctrl,type,plotLabel);
460 >    makeHTML(ctrl,type,plotLabel,fullOutDir);
461    }
462 +  txtOutFile.close();
463 +      
464 +  fr2011.FR_struct::~FR_struct();
465 +  fr2012.FR_struct::~FR_struct();
466   }
467   //----------------------------------------------------------------------------------------
468   map<TString,map<TString,TH1D*>* > init_hists(FOFlags &ctrl, TString str)
# Line 254 | Line 472 | map<TString,map<TString,TH1D*>* > init_h
472    map<TString,TH1D*> *h_4e_pred         = new map<TString,TH1D*>;      hists["4e_pred"]         = h_4e_pred;
473    map<TString,TH1D*> *h_4e_pred_lo      = new map<TString,TH1D*>;      hists["4e_pred_lo"]      = h_4e_pred_lo;
474    map<TString,TH1D*> *h_4e_pred_hi      = new map<TString,TH1D*>;      hists["4e_pred_hi"]      = h_4e_pred_hi;
475 +  map<TString,TH1D*> *h_4e_PF           = new map<TString,TH1D*>;      hists["4e_PF"]           = h_4e_PF;
476 +  map<TString,TH1D*> *h_4e_PF_lo        = new map<TString,TH1D*>;      hists["4e_PF_lo"]        = h_4e_PF_lo;
477 +  map<TString,TH1D*> *h_4e_PF_hi        = new map<TString,TH1D*>;      hists["4e_PF_hi"]        = h_4e_PF_hi;
478    map<TString,TH1D*> *h_4m_obs          = new map<TString,TH1D*>;      hists["4m_obs"]          = h_4m_obs;
479    map<TString,TH1D*> *h_4m_pred         = new map<TString,TH1D*>;      hists["4m_pred"]         = h_4m_pred;
480    map<TString,TH1D*> *h_4m_pred_lo      = new map<TString,TH1D*>;      hists["4m_pred_lo"]      = h_4m_pred_lo;
481    map<TString,TH1D*> *h_4m_pred_hi      = new map<TString,TH1D*>;      hists["4m_pred_hi"]      = h_4m_pred_hi;
482 +  map<TString,TH1D*> *h_4m_PF           = new map<TString,TH1D*>;      hists["4m_PF"]           = h_4m_PF;
483 +  map<TString,TH1D*> *h_4m_PF_lo        = new map<TString,TH1D*>;      hists["4m_PF_lo"]        = h_4m_PF_lo;
484 +  map<TString,TH1D*> *h_4m_PF_hi        = new map<TString,TH1D*>;      hists["4m_PF_hi"]        = h_4m_PF_hi;
485    map<TString,TH1D*> *h_2e2m_obs        = new map<TString,TH1D*>;      hists["2e2m_obs"]        = h_2e2m_obs;
486    map<TString,TH1D*> *h_2e2m_pred       = new map<TString,TH1D*>;      hists["2e2m_pred"]       = h_2e2m_pred;
487    map<TString,TH1D*> *h_2e2m_pred_lo    = new map<TString,TH1D*>;      hists["2e2m_pred_lo"]    = h_2e2m_pred_lo;
488    map<TString,TH1D*> *h_2e2m_pred_hi    = new map<TString,TH1D*>;      hists["2e2m_pred_hi"]    = h_2e2m_pred_hi;
489 +  map<TString,TH1D*> *h_2e2m_PF         = new map<TString,TH1D*>;      hists["2e2m_PF"]         = h_2e2m_PF;
490 +  map<TString,TH1D*> *h_2e2m_PF_lo      = new map<TString,TH1D*>;      hists["2e2m_PF_lo"]      = h_2e2m_PF_lo;
491 +  map<TString,TH1D*> *h_2e2m_PF_hi      = new map<TString,TH1D*>;      hists["2e2m_PF_hi"]      = h_2e2m_PF_hi;
492    map<TString,TH1D*> *h_all_obs         = new map<TString,TH1D*>;      hists["all_obs"]         = h_all_obs;
493    map<TString,TH1D*> *h_all_pred        = new map<TString,TH1D*>;      hists["all_pred"]        = h_all_pred;
494    map<TString,TH1D*> *h_all_pred_lo     = new map<TString,TH1D*>;      hists["all_pred_lo"]     = h_all_pred_lo;
495    map<TString,TH1D*> *h_all_pred_hi     = new map<TString,TH1D*>;      hists["all_pred_hi"]     = h_all_pred_hi;
496 +  map<TString,TH1D*> *h_all_PF          = new map<TString,TH1D*>;      hists["all_PF"]          = h_all_PF;
497 +  map<TString,TH1D*> *h_all_PF_lo       = new map<TString,TH1D*>;      hists["all_PF_lo"]       = h_all_PF_lo;
498 +  map<TString,TH1D*> *h_all_PF_hi       = new map<TString,TH1D*>;      hists["all_PF_hi"]       = h_all_PF_hi;
499    map<TString,map<TString,TH1D*>* >::iterator it_h;
500  
501    for(it_h=hists.begin(); it_h!=hists.end(); it_h++) {
502 <    (*((*it_h).second))["run"]          = new TH1D(TString("run") +"_"+(*it_h).first+str,";#bf{run};",          50,160800,196535);   (*((*it_h).second))["run"]->Sumw2();
503 <    (*((*it_h).second))["mZ1"]          = new TH1D(TString("mZ1") +"_"+(*it_h).first+str,";#bf{mZ1 [GeV]};",    20,60,120);          (*((*it_h).second))["mZ1"]->Sumw2();
502 >    (*((*it_h).second))["npv"]          = new TH1D(TString("npv") +"_"+(*it_h).first+str,";#bf{N PV};",         50,-0.5,49.5);      (*((*it_h).second))["npv"]->Sumw2();
503 >    (*((*it_h).second))["run"]          = new TH1D(TString("run") +"_"+(*it_h).first+str,";#bf{run};",          50,160800,203744/*196535*/);   (*((*it_h).second))["run"]->Sumw2();
504 >    (*((*it_h).second))["mZ1"]          = new TH1D(TString("mZ1") +"_"+(*it_h).first+str,";#bf{mZ1 [GeV]};",    20,40,120);          (*((*it_h).second))["mZ1"]->Sumw2();
505      (*((*it_h).second))["mZ2"]          = new TH1D(TString("mZ2") +"_"+(*it_h).first+str,";#bf{mZ2 [GeV]};",    30,0,115);           (*((*it_h).second))["mZ2"]->Sumw2();
506      (*((*it_h).second))["mZ2_lo"]       = new TH1D(TString("mZ2_lo") +"_"+(*it_h).first+str,";#bf{mZ2 [GeV]};", 30,0,10);           (*((*it_h).second))["mZ2_lo"]->Sumw2();
507 <    (*((*it_h).second))["m4l"]          = new TH1D(TString("m4l") +"_"+(*it_h).first+str,";#bf{m4l [GeV]};",    20,50,500);          (*((*it_h).second))["m4l"]->Sumw2();
508 <    (*((*it_h).second))["Z1pt"]         = new TH1D(TString("Z1pt") +"_"+(*it_h).first+str,";#bf{Z1pt [GeV]};",  20,0,200);           (*((*it_h).second))["Z1pt"]->Sumw2();
509 <    (*((*it_h).second))["ZZpt"]         = new TH1D(TString("ZZpt") +"_"+(*it_h).first+str,";#bf{ZZpt [GeV]};",  30,0,200);           (*((*it_h).second))["ZZpt"]->Sumw2();
507 >    (*((*it_h).second))["m4l_lo"]       = new TH1D(TString("m4l_lo") +"_"+(*it_h).first+str,";#bf{m4l [GeV]};", 35,70,120);          (*((*it_h).second))["m4l_lo"]->Sumw2();
508 >    (*((*it_h).second))["m4l_med"]      = new TH1D(TString("m4l_med") +"_"+(*it_h).first+str,";#bf{m4l [GeV]};",35,100,180);          (*((*it_h).second))["m4l_med"]->Sumw2();
509 >    (*((*it_h).second))["m4l"]          = new TH1D(TString("m4l") +"_"+(*it_h).first+str,";#bf{m4l [GeV]};",    35,100,600);          (*((*it_h).second))["m4l"]->Sumw2();
510 >    // (*((*it_h).second))["Z1pt"]              = new TH1D(TString("Z1pt") +"_"+(*it_h).first+str,";#bf{Z1pt [GeV]};",  20,0,200);           (*((*it_h).second))["Z1pt"]->Sumw2();
511 >    // (*((*it_h).second))["ZZpt"]              = new TH1D(TString("ZZpt") +"_"+(*it_h).first+str,";#bf{ZZpt [GeV]};",  30,0,200);           (*((*it_h).second))["ZZpt"]->Sumw2();
512 >    (*((*it_h).second))["met"]          = new TH1D(TString("met") +"_"+(*it_h).first+str,";#bf{met [GeV]};",    30,0,100);           (*((*it_h).second))["met"]->Sumw2();
513  
514      (*((*it_h).second))["pt_l1"]        = new TH1D(TString("pt_l1") +"_"+(*it_h).first+str,";#bf{l1 p_{T} [GeV]};",     37,0,120);  (*((*it_h).second))["pt_l1"]->Sumw2();
515      (*((*it_h).second))["pt_l2"]        = new TH1D(TString("pt_l2") +"_"+(*it_h).first+str,";#bf{l2 p_{T} [GeV]};",     37,0,65);  (*((*it_h).second))["pt_l2"]->Sumw2();
# Line 287 | Line 521 | map<TString,map<TString,TH1D*>* > init_h
521      (*((*it_h).second))["eta_l3"]       = new TH1D(TString("eta_l3")+"_"+(*it_h).first+str,";#bf{l3 #eta};",            25,-2.5,2.5);     (*((*it_h).second))["eta_l3"]->Sumw2();
522      (*((*it_h).second))["eta_l4"]       = new TH1D(TString("eta_l4")+"_"+(*it_h).first+str,";#bf{l4 #eta};",            25,-2.5,2.5);     (*((*it_h).second))["eta_l4"]->Sumw2();
523  
524 <    (*((*it_h).second))["ip3ds_l1"]     = new TH1D(TString("ip3ds_l1") +"_"+(*it_h).first+str,";#bf{ip3ds l1};",30,-5,5);   (*((*it_h).second))["ip3ds_l1"]->Sumw2();
525 <    (*((*it_h).second))["ip3ds_l2"]     = new TH1D(TString("ip3ds_l2") +"_"+(*it_h).first+str,";#bf{ip3ds l2};",30,-5,5);   (*((*it_h).second))["ip3ds_l2"]->Sumw2();
526 <    (*((*it_h).second))["ip3ds_l3"]     = new TH1D(TString("ip3ds_l3") +"_"+(*it_h).first+str,";#bf{ip3ds l3};",30,-10,10);   (*((*it_h).second))["ip3ds_l3"]->Sumw2();
527 <    (*((*it_h).second))["ip3ds_l4"]     = new TH1D(TString("ip3ds_l4") +"_"+(*it_h).first+str,";#bf{ip3ds l4};",30,-10,10);   (*((*it_h).second))["ip3ds_l4"]->Sumw2();
524 >    (*((*it_h).second))["ip3ds_l1"]     = new TH1D(TString("ip3ds_l1") +"_"+(*it_h).first+str,";#bf{ip3ds l1};",37,-3,3);       (*((*it_h).second))["ip3ds_l1"]->Sumw2();
525 >    (*((*it_h).second))["ip3ds_l2"]     = new TH1D(TString("ip3ds_l2") +"_"+(*it_h).first+str,";#bf{ip3ds l2};",37,-3,3);       (*((*it_h).second))["ip3ds_l2"]->Sumw2();
526 >    (*((*it_h).second))["ip3ds_l3_lo"]  = new TH1D(TString("ip3ds_l3_lo") +"_"+(*it_h).first+str,";#bf{ip3ds l3_lo};",25,-6,6); (*((*it_h).second))["ip3ds_l3_lo"]->Sumw2();
527 >    (*((*it_h).second))["ip3ds_l4_lo"]  = new TH1D(TString("ip3ds_l4_lo") +"_"+(*it_h).first+str,";#bf{ip3ds l4_lo};",25,-6,6); (*((*it_h).second))["ip3ds_l4_lo"]->Sumw2();
528 >    (*((*it_h).second))["ip3ds_l3"]     = new TH1D(TString("ip3ds_l3") +"_"+(*it_h).first+str,";#bf{ip3ds l3};",55,-40,40);     (*((*it_h).second))["ip3ds_l3"]->Sumw2();
529 >    (*((*it_h).second))["ip3ds_l4"]     = new TH1D(TString("ip3ds_l4") +"_"+(*it_h).first+str,";#bf{ip3ds l4};",55,-40,40);     (*((*it_h).second))["ip3ds_l4"]->Sumw2();
530 >
531 >    (*((*it_h).second))["d0_l1"]        = new TH1D(TString("d0_l1") +"_"+(*it_h).first+str,";#bf{d0 l1};",50,-.008,.008);      (*((*it_h).second))["d0_l1"]->Sumw2();
532 >    (*((*it_h).second))["d0_l2"]        = new TH1D(TString("d0_l2") +"_"+(*it_h).first+str,";#bf{d0 l2};",50,-.008,.008);      (*((*it_h).second))["d0_l2"]->Sumw2();
533 >    (*((*it_h).second))["d0_l3_lo"]     = new TH1D(TString("d0_l3_lo") +"_"+(*it_h).first+str,";#bf{d0 l3_lo};",25,-.03,.03);  (*((*it_h).second))["d0_l3_lo"]->Sumw2();
534 >    (*((*it_h).second))["d0_l4_lo"]     = new TH1D(TString("d0_l4_lo") +"_"+(*it_h).first+str,";#bf{d0 l4_lo};",25,-.03,.03);  (*((*it_h).second))["d0_l4_lo"]->Sumw2();
535 >    (*((*it_h).second))["d0_l3"]        = new TH1D(TString("d0_l3") +"_"+(*it_h).first+str,";#bf{d0 l3};",50,-.1,.1);          (*((*it_h).second))["d0_l3"]->Sumw2();
536 >    (*((*it_h).second))["d0_l4"]        = new TH1D(TString("d0_l4") +"_"+(*it_h).first+str,";#bf{d0 l4};",50,-.1,.1);          (*((*it_h).second))["d0_l4"]->Sumw2();
537 >
538 >    (*((*it_h).second))["dz_l1"]        = new TH1D(TString("dz_l1") +"_"+(*it_h).first+str,";#bf{dz l1};",50,-.01,.01);   (*((*it_h).second))["dz_l1"]->Sumw2();
539 >    (*((*it_h).second))["dz_l2"]        = new TH1D(TString("dz_l2") +"_"+(*it_h).first+str,";#bf{dz l2};",50,-.01,.01);   (*((*it_h).second))["dz_l2"]->Sumw2();
540 >    (*((*it_h).second))["dz_l3"]        = new TH1D(TString("dz_l3") +"_"+(*it_h).first+str,";#bf{dz l3};",50,-.2,.2);   (*((*it_h).second))["dz_l3"]->Sumw2();
541 >    (*((*it_h).second))["dz_l4"]        = new TH1D(TString("dz_l4") +"_"+(*it_h).first+str,";#bf{dz l4};",50,-.2,.2);   (*((*it_h).second))["dz_l4"]->Sumw2();
542  
543      (*((*it_h).second))["dR_l3l4_lo"]   = new TH1D(TString("dR_l3l4_lo") +"_"+(*it_h).first+str,";#bf{#Delta R l3,l4};",75,0,.2);    (*((*it_h).second))["dR_l3l4_lo"]->Sumw2();
544      (*((*it_h).second))["dR_l3l4"]      = new TH1D(TString("dR_l3l4") +"_"+(*it_h).first+str,";#bf{#Delta R l3,l4};",75,0,6);        (*((*it_h).second))["dR_l3l4"]->Sumw2();
545 +
546 +    // jets
547 +    (*((*it_h).second))["pt_allJet"]    = new TH1D(TString("pt_allJet") +"_"+(*it_h).first+str,";#bf{jet 1 p_{T} [GeV]};",37,0,400);  (*((*it_h).second))["pt_allJet"]->Sumw2();
548 +    (*((*it_h).second))["eta_allJet"]   = new TH1D(TString("eta_allJet") +"_"+(*it_h).first+str,";#bf{jet 1 p_{T} [GeV]};",37,-4.8,4.8);  (*((*it_h).second))["eta_allJet"]->Sumw2();
549 +    (*((*it_h).second))["pt_j1"]        = new TH1D(TString("pt_j1") +"_"+(*it_h).first+str,";#bf{jet 1 p_{T} [GeV]};",  37,0,400);  (*((*it_h).second))["pt_j1"]->Sumw2();
550 +    (*((*it_h).second))["pt_j2"]        = new TH1D(TString("pt_j2") +"_"+(*it_h).first+str,";#bf{jet 2 p_{T} [GeV]};",  37,0,125);  (*((*it_h).second))["pt_j2"]->Sumw2();
551 +    (*((*it_h).second))["pt_j3"]        = new TH1D(TString("pt_j3") +"_"+(*it_h).first+str,";#bf{jet 3 p_{T} [GeV]};",  37,0,125);  (*((*it_h).second))["pt_j3"]->Sumw2();
552 +    (*((*it_h).second))["pt_j4"]        = new TH1D(TString("pt_j4") +"_"+(*it_h).first+str,";#bf{jet 4 p_{T} [GeV]};",  37,0,125);  (*((*it_h).second))["pt_j4"]->Sumw2();
553 +    (*((*it_h).second))["eta_j1"]       = new TH1D(TString("eta_j1")+"_"+(*it_h).first+str,";#bf{jet 1 #eta};",         55,-4.8,4.8);     (*((*it_h).second))["eta_j1"]->Sumw2();
554 +    (*((*it_h).second))["eta_j2"]       = new TH1D(TString("eta_j2")+"_"+(*it_h).first+str,";#bf{jet 2 #eta};",         55,-4.8,4.8);     (*((*it_h).second))["eta_j2"]->Sumw2();
555 +    (*((*it_h).second))["eta_j3"]       = new TH1D(TString("eta_j3")+"_"+(*it_h).first+str,";#bf{jet 3 #eta};",         55,-4.8,4.8);     (*((*it_h).second))["eta_j3"]->Sumw2();
556 +    (*((*it_h).second))["eta_j4"]       = new TH1D(TString("eta_j4")+"_"+(*it_h).first+str,";#bf{jet 4 #eta};",         55,-4.8,4.8);     (*((*it_h).second))["eta_j4"]->Sumw2();
557 +    (*((*it_h).second))["phi_j1"]       = new TH1D(TString("phi_j1")+"_"+(*it_h).first+str,";#bf{jet 1 #phi};",         25,-3.2,3.2);     (*((*it_h).second))["phi_j1"]->Sumw2();
558 +    (*((*it_h).second))["phi_j2"]       = new TH1D(TString("phi_j2")+"_"+(*it_h).first+str,";#bf{jet 2 #phi};",         25,-3.2,3.2);     (*((*it_h).second))["phi_j2"]->Sumw2();
559 +    (*((*it_h).second))["phi_j3"]       = new TH1D(TString("phi_j3")+"_"+(*it_h).first+str,";#bf{jet 3 #phi};",         25,-3.2,3.2);     (*((*it_h).second))["phi_j3"]->Sumw2();
560 +    (*((*it_h).second))["phi_j4"]       = new TH1D(TString("phi_j4")+"_"+(*it_h).first+str,";#bf{jet 4 #phi};",         25,-3.2,3.2);     (*((*it_h).second))["phi_j4"]->Sumw2();
561 +    (*((*it_h).second))["idmva_j1"]     = new TH1D(TString("idmva_j1")+"_"+(*it_h).first+str,";#bf{jet 1 MVA};",        25,-1.1,1.1);     (*((*it_h).second))["idmva_j1"]->Sumw2();
562 +    (*((*it_h).second))["idmva_j2"]     = new TH1D(TString("idmva_j2")+"_"+(*it_h).first+str,";#bf{jet 2 MVA};",        25,-1.1,1.1);     (*((*it_h).second))["idmva_j2"]->Sumw2();
563 +    (*((*it_h).second))["idmva_j3"]     = new TH1D(TString("idmva_j3")+"_"+(*it_h).first+str,";#bf{jet 3 MVA};",        25,-1.1,1.1);     (*((*it_h).second))["idmva_j3"]->Sumw2();
564 +    (*((*it_h).second))["idmva_j4"]     = new TH1D(TString("idmva_j4")+"_"+(*it_h).first+str,";#bf{jet 4 MVA};",        25,-1.1,1.1);     (*((*it_h).second))["idmva_j4"]->Sumw2();
565 +    (*((*it_h).second))["mjj"]          = new TH1D(TString("mjj")+"_"+(*it_h).first+str,";#bf{m_{jj}};",                25,10,1550);     (*((*it_h).second))["mjj"]->Sumw2();
566 +    (*((*it_h).second))["dEta"]         = new TH1D(TString("dEta")+"_"+(*it_h).first+str,";#bf{#Delta #eta};",          25,-6,6);       (*((*it_h).second))["dEta"]->Sumw2();
567 +    (*((*it_h).second))["etaProd"]      = new TH1D(TString("etaProd")+"_"+(*it_h).first+str,";#bf{#eta_{1} * #eta_{2}};",25,-12,12);      (*((*it_h).second))["etaProd"]->Sumw2();
568 +    (*((*it_h).second))["njets"]        = new TH1D(TString("njets")+"_"+(*it_h).first+str,";#bf{N Jets};",      7,-0.5,6.5);      (*((*it_h).second))["njets"]->Sumw2();
569 +
570 +    (*((*it_h).second))["dR_l1j1"]      = new TH1D(TString("dR_l1j1") +"_"+(*it_h).first+str,";#bf{#Delta R l1,jet 1};",75,0,6);        (*((*it_h).second))["dR_l1j1"]->Sumw2();
571 +    (*((*it_h).second))["dR_l2j1"]      = new TH1D(TString("dR_l2j1") +"_"+(*it_h).first+str,";#bf{#Delta R l2,jet 1};",75,0,6);        (*((*it_h).second))["dR_l2j1"]->Sumw2();
572 +    (*((*it_h).second))["dR_l3j1"]      = new TH1D(TString("dR_l3j1") +"_"+(*it_h).first+str,";#bf{#Delta R l3,jet 1};",75,0,6);        (*((*it_h).second))["dR_l3j1"]->Sumw2();
573 +    (*((*it_h).second))["dR_l4j1"]      = new TH1D(TString("dR_l4j1") +"_"+(*it_h).first+str,";#bf{#Delta R l4,jet 1};",75,0,6);        (*((*it_h).second))["dR_l4j1"]->Sumw2();
574 +    (*((*it_h).second))["dR_l1j2"]      = new TH1D(TString("dR_l1j2") +"_"+(*it_h).first+str,";#bf{#Delta R l1,jet 2};",75,0,6);        (*((*it_h).second))["dR_l1j2"]->Sumw2();
575 +    (*((*it_h).second))["dR_l2j2"]      = new TH1D(TString("dR_l2j2") +"_"+(*it_h).first+str,";#bf{#Delta R l2,jet 2};",75,0,6);        (*((*it_h).second))["dR_l2j2"]->Sumw2();
576 +    (*((*it_h).second))["dR_l3j2"]      = new TH1D(TString("dR_l3j2") +"_"+(*it_h).first+str,";#bf{#Delta R l3,jet 2};",75,0,6);        (*((*it_h).second))["dR_l3j2"]->Sumw2();
577 +    (*((*it_h).second))["dR_l4j2"]      = new TH1D(TString("dR_l4j2") +"_"+(*it_h).first+str,";#bf{#Delta R l4,jet 2};",75,0,6);        (*((*it_h).second))["dR_l4j2"]->Sumw2();
578 +    (*((*it_h).second))["dR_l1j3"]      = new TH1D(TString("dR_l1j3") +"_"+(*it_h).first+str,";#bf{#Delta R l1,jet 3};",75,0,6);        (*((*it_h).second))["dR_l1j3"]->Sumw2();
579 +    (*((*it_h).second))["dR_l2j3"]      = new TH1D(TString("dR_l2j3") +"_"+(*it_h).first+str,";#bf{#Delta R l2,jet 3};",75,0,6);        (*((*it_h).second))["dR_l2j3"]->Sumw2();
580 +    (*((*it_h).second))["dR_l3j3"]      = new TH1D(TString("dR_l3j3") +"_"+(*it_h).first+str,";#bf{#Delta R l3,jet 3};",75,0,6);        (*((*it_h).second))["dR_l3j3"]->Sumw2();
581 +    (*((*it_h).second))["dR_l4j3"]      = new TH1D(TString("dR_l4j3") +"_"+(*it_h).first+str,";#bf{#Delta R l4,jet 3};",75,0,6);        (*((*it_h).second))["dR_l4j3"]->Sumw2();
582 +    (*((*it_h).second))["dR_l1j4"]      = new TH1D(TString("dR_l1j4") +"_"+(*it_h).first+str,";#bf{#Delta R l1,jet 4};",75,0,6);        (*((*it_h).second))["dR_l1j4"]->Sumw2();
583 +    (*((*it_h).second))["dR_l2j4"]      = new TH1D(TString("dR_l2j4") +"_"+(*it_h).first+str,";#bf{#Delta R l2,jet 4};",75,0,6);        (*((*it_h).second))["dR_l2j4"]->Sumw2();
584 +    (*((*it_h).second))["dR_l3j4"]      = new TH1D(TString("dR_l3j4") +"_"+(*it_h).first+str,";#bf{#Delta R l3,jet 4};",75,0,6);        (*((*it_h).second))["dR_l3j4"]->Sumw2();
585 +    (*((*it_h).second))["dR_l4j4"]      = new TH1D(TString("dR_l4j4") +"_"+(*it_h).first+str,";#bf{#Delta R l4,jet 4};",75,0,6);        (*((*it_h).second))["dR_l4j4"]->Sumw2();
586 +
587 +    int nbins=35;
588 +    (*((*it_h).second))["costheta1"]    = new TH1D(TString("costheta1") +"_"+(*it_h).first+str,";#bf{costheta1};",                nbins,-1,1);          (*((*it_h).second))["costheta1"]->Sumw2();
589 +    (*((*it_h).second))["costheta2"]    = new TH1D(TString("costheta2") +"_"+(*it_h).first+str,";#bf{costheta2};",                nbins,-1,1);          (*((*it_h).second))["costheta2"]->Sumw2();
590 +    (*((*it_h).second))["costhetastar"] = new TH1D(TString("costhetastar") +"_"+(*it_h).first+str,";#bf{costhetastar};",          nbins,-1,1);          (*((*it_h).second))["costhetastar"]->Sumw2();
591 +    (*((*it_h).second))["Phi"]          = new TH1D(TString("Phi") +"_"+(*it_h).first+str,";#bf{Phi};",                            nbins,-3.15,3.15);          (*((*it_h).second))["Phi"]->Sumw2();
592 +    (*((*it_h).second))["Phi1"]         = new TH1D(TString("Phi1") +"_"+(*it_h).first+str,";#bf{Phi1};",                          nbins,-3.15,3.15);          (*((*it_h).second))["Phi1"]->Sumw2();
593 +
594 +    (*((*it_h).second))["pt4l"]         = new TH1D(TString("pt4l") +"_"+(*it_h).first+str,";#bf{pt4l/m4l};",                      nbins-7,0,0.5);          (*((*it_h).second))["pt4l"]->Sumw2();
595 +    (*((*it_h).second))["pt4l_log"]     = new TH1D(TString("pt4l_log") +"_"+(*it_h).first+str,";#bf{pt4l/m4l};",                  nbins,0,1.5);          (*((*it_h).second))["pt4l_log"]->Sumw2();
596 +    (*((*it_h).second))["y4l"]          = new TH1D(TString("y4l") +"_"+(*it_h).first+str,";#bf{y4l};",                            nbins,-2.4,2.4);      (*((*it_h).second))["y4l"]->Sumw2();
597 +    (*((*it_h).second))["Z1pt"]         = new TH1D(TString("Z1pt") +"_"+(*it_h).first+str,";#bf{Z1pt/m4l};",                      nbins,0,0.5);          (*((*it_h).second))["Z1pt"]->Sumw2();
598 +    (*((*it_h).second))["Z1pt_log"]     = new TH1D(TString("Z1pt_log") +"_"+(*it_h).first+str,";#bf{Z1pt/m4l};",                  nbins,0,1.5);          (*((*it_h).second))["Z1pt_log"]->Sumw2();
599 +    (*((*it_h).second))["Z2pt"]         = new TH1D(TString("Z2pt") +"_"+(*it_h).first+str,";#bf{Z2pt/m4l};",                      nbins,0,0.5);          (*((*it_h).second))["Z2pt"]->Sumw2();
600 +    (*((*it_h).second))["Z2pt_log"]     = new TH1D(TString("Z2pt_log") +"_"+(*it_h).first+str,";#bf{Z2pt/m4l};",                  nbins,0,1.5);          (*((*it_h).second))["Z2pt_log"]->Sumw2();
601 +
602 +    (*((*it_h).second))["ZZdotZ1"]      = new TH1D(TString("ZZdotZ1") +"_"+(*it_h).first+str,";#bf{ZZ #bullet Z1/(m4l*mZ1)};",    nbins,-.2,2.5);          (*((*it_h).second))["ZZdotZ1"]->Sumw2();
603 +    (*((*it_h).second))["ZZdotZ2"]      = new TH1D(TString("ZZdotZ2") +"_"+(*it_h).first+str,";#bf{ZZ #bullet Z2/(m4l*mZ2)};",    nbins,-1,3);          (*((*it_h).second))["ZZdotZ2"]->Sumw2();
604 +    (*((*it_h).second))["ZZdotZ1_log"]  = new TH1D(TString("ZZdotZ1_log") +"_"+(*it_h).first+str,";#bf{ZZ #bullet Z1/(m4l*mZ1)};",nbins,-1.5,15);          (*((*it_h).second))["ZZdotZ1_log"]->Sumw2();
605 +    (*((*it_h).second))["ZZdotZ2_log"]  = new TH1D(TString("ZZdotZ2_log") +"_"+(*it_h).first+str,";#bf{ZZ #bullet Z2/(m4l*mZ2)};",nbins,-1.5,15);          (*((*it_h).second))["ZZdotZ2_log"]->Sumw2();
606 +    (*((*it_h).second))["dphi1"]        = new TH1D(TString("dphi1") +"_"+(*it_h).first+str,";#bf{dphi1};",                        nbins,-1,1);          (*((*it_h).second))["dphi1"]->Sumw2();
607 +    (*((*it_h).second))["dphi2"]        = new TH1D(TString("dphi2") +"_"+(*it_h).first+str,";#bf{dphi2};",                        nbins,-1,1);          (*((*it_h).second))["dphi2"]->Sumw2();
608 +    (*((*it_h).second))["dphi1_log"]    = new TH1D(TString("dphi1_log") +"_"+(*it_h).first+str,";#bf{dphi1};",                    nbins,-1,1);          (*((*it_h).second))["dphi1_log"]->Sumw2();
609 +    (*((*it_h).second))["dphi2_log"]    = new TH1D(TString("dphi2_log") +"_"+(*it_h).first+str,";#bf{dphi2};",                    nbins,-1,1);          (*((*it_h).second))["dphi2_log"]->Sumw2();
610 +
611 +    (*((*it_h).second))["fusionMVA"]            = new TH1D(TString("fusionMVA")+"_"+(*it_h).first+str,";#bf{MVA output};",        100,-1,1);      (*((*it_h).second))["fusionMVA"]->Sumw2();
612 +    (*((*it_h).second))["fusionMVA_lo"]         = new TH1D(TString("fusionMVA_lo")+"_"+(*it_h).first+str,";#bf{MVA output};",        100,-1,-.83);      (*((*it_h).second))["fusionMVA_lo"]->Sumw2();
613 +    (*((*it_h).second))["fusionMVA_med"]                = new TH1D(TString("fusionMVA_med")+"_"+(*it_h).first+str,";#bf{MVA output};",        100,-.5,1);      (*((*it_h).second))["fusionMVA_med"]->Sumw2();
614 +    (*((*it_h).second))["fusionMVA_hi"]         = new TH1D(TString("fusionMVA_hi")+"_"+(*it_h).first+str,";#bf{MVA output};",        100,.75,1);      (*((*it_h).second))["fusionMVA_hi"]->Sumw2();
615 +    (*((*it_h).second))["m4l_jet_lo"]           = new TH1D(TString("m4l_jet_lo") +"_"+(*it_h).first+str,";#bf{m4l [GeV]};",     45,100,180);          (*((*it_h).second))["m4l_jet_lo"]->Sumw2();
616 +    (*((*it_h).second))["m4l_jet"]              = new TH1D(TString("m4l_jet") +"_"+(*it_h).first+str,";#bf{m4l [GeV]};",        45,100,600);          (*((*it_h).second))["m4l_jet"]->Sumw2();
617    }
298  
618    return hists;
619   }
620   //--------------------------------------------------------------------------------------------------
621 < void makeHTML(FOFlags &ctrl, TString type, TString plotLabel)
621 > void makeHTML(FOFlags &ctrl, TString type, TString plotLabel, TString fullOutDir)
622   {
623 <  TString title("Signal region: "+type);
624 <  ofstream htmlfile;
625 <  char htmlfname[100];
626 <  sprintf(htmlfname,"%s/plots.html",TString(ctrl.outdir+"/"+plotLabel+"/"+type).Data());
627 <  htmlfile.open(htmlfname);
623 >  TString tmpString(plotLabel);
624 >  tmpString.ReplaceAll("/"," ");
625 >  TString title(ctrl.faketype+", "+tmpString+", "+type);
626 >  TString htmlfname(fullOutDir+"/plots.html");
627 >  ofstream htmlfile(htmlfname);
628  
629    htmlfile << "<!DOCTYPE html" << endl;
630    htmlfile << "    PUBLIC \"-//W3C//DTD HTML 3.2//EN\">" << endl;
631    htmlfile << "<html>" << endl;
632  
633    htmlfile << "<head><title>"+title+"</title></head>" << endl;
634 <  htmlfile << "<body bgcolor=\"EEEEEE\">" << endl;
634 >  htmlfile << "<body bgcolor=\"000000\">" << endl;
635    htmlfile << "<h3 style=\"text-align:left; color:DD6600;\">"+title+"</h3>" << endl;
636  
637 +  htmlfile << "<h3 style=\"text-align:left; color:DD6600;\">boson kinematics</h3>" << endl;
638    htmlfile << "<table border=\"0\" cellspacing=\"5\" width=\"100%\">" << endl;  
639  
640    htmlfile << "<tr>" << endl;
641 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/m4l_lo.png\"><img src=\"plots/m4l_lo.png\" alt=\"plots/m4l_lo.png\" width=\"100%\"></a></td>" << endl;
642 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/m4l_med.png\"><img src=\"plots/m4l_med.png\" alt=\"plots/m4l_med.png\" width=\"100%\"></a></td>" << endl;
643 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/m4l.png\"><img src=\"plots/m4l.png\" alt=\"plots/m4l.png\" width=\"100%\"></a></td>" << endl;
644 +  htmlfile << "<td width=\"25%\"><a></a></td>" << endl;
645 +  htmlfile << "</tr>" << endl;
646 +
647 +  htmlfile << "<tr>" << endl;
648    htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/mZ1.png\"><img src=\"plots/mZ1.png\" alt=\"plots/mZ1.png\" width=\"100%\"></a></td>" << endl;
649    htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/mZ2_lo.png\"><img src=\"plots/mZ2_lo.png\" alt=\"plots/mZ2_lo.png\" width=\"100%\"></a></td>" << endl;
650    htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/mZ2.png\"><img src=\"plots/mZ2.png\" alt=\"plots/mZ2.png\" width=\"100%\"></a></td>" << endl;
324  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/m4l.png\"><img src=\"plots/m4l.png\" alt=\"plots/m4l.png\" width=\"100%\"></a></td>" << endl;
651    htmlfile << "<td width=\"25%\"><a></a></td>" << endl;
652    htmlfile << "</tr>" << endl;
653  
654    htmlfile << "<tr>" << endl;
655    htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/Z1pt.png\"><img src=\"plots/Z1pt.png\" alt=\"plots/Z1pt.png\" width=\"100%\"></a></td>" << endl;
656    htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/ZZpt.png\"><img src=\"plots/ZZpt.png\" alt=\"plots/ZZpt.png\" width=\"100%\"></a></td>" << endl;
657 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/met.png\"><img src=\"plots/met.png\" alt=\"plots/met.png\" width=\"100%\"></a></td>" << endl;
658    htmlfile << "<td width=\"25%\"><a></a></td>" << endl;
659    htmlfile << "<td width=\"25%\"><a></a></td>" << endl;
660    htmlfile << "</tr>" << endl;
661  
662 +  htmlfile << "</table>" << endl;
663 +  htmlfile << "<hr />" << endl;
664 +  htmlfile << "control: " << endl;
665 +  htmlfile << "<table border=\"0\" cellspacing=\"5\" width=\"100%\">" << endl;  
666 +
667    htmlfile << "<tr>" << endl;
668 <  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/ip3ds_l1.png\"><img src=\"plots/ip3ds_l1.png\" alt=\"plots/ip3ds_l1.png\" width=\"100%\"></a></td>" << endl;
669 <  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/ip3ds_l2.png\"><img src=\"plots/ip3ds_l2.png\" alt=\"plots/ip3ds_l2.png\" width=\"100%\"></a></td>" << endl;
670 <  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/ip3ds_l3.png\"><img src=\"plots/ip3ds_l3.png\" alt=\"plots/ip3ds_l3.png\" width=\"100%\"></a></td>" << endl;
671 <  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/ip3ds_l4.png\"><img src=\"plots/ip3ds_l4.png\" alt=\"plots/ip3ds_l4.png\" width=\"100%\"></a></td>" << endl;
668 >  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/run.png\"><img src=\"plots/run.png\" alt=\"plots/run.png\" width=\"100%\"></a></td>" << endl;
669 >  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/npv.png\"><img src=\"plots/npv.png\" alt=\"plots/npv.png\" width=\"100%\"></a></td>" << endl;
670 >  htmlfile << "<td width=\"25%\"><a></a></td>" << endl;
671 >  htmlfile << "<td width=\"25%\"><a></a></td>" << endl;
672    htmlfile << "</tr>" << endl;
673  
674 +  htmlfile << "</table>" << endl;
675 +
676 +  htmlfile << "</body>" << endl;
677 +  htmlfile << "</html>" << endl;
678 +  htmlfile.close();
679 +
680 +  TString anglefname(htmlfname);
681 +  anglefname.ReplaceAll("plots.html","angleplots.html");
682 +  htmlfile.open(anglefname);
683 +
684 +  htmlfile << "<!DOCTYPE html" << endl;
685 +  htmlfile << "    PUBLIC \"-//W3C//DTD HTML 3.2//EN\">" << endl;
686 +  htmlfile << "<html>" << endl;
687 +
688 +  htmlfile << "<head><title>"+title+"</title></head>" << endl;
689 +  htmlfile << "<body bgcolor=\"000000\">" << endl;
690 +  htmlfile << "<h3 style=\"text-align:left; color:DD6600;\">"+title+"</h3>" << endl;
691 +
692 +  htmlfile << "<h3 style=\"text-align:left; color:DD6600;\">Angles & Co.</h3>" << endl;
693 +  htmlfile << "<hr />" << endl;
694 +  htmlfile << "<table border=\"0\" cellspacing=\"5\" width=\"100%\">" << endl;  
695 +  htmlfile << "</table>" << endl;
696 +
697 +  htmlfile << "<h3 style=\"text-align:left; color:DD6600;\">Angles:</h3>" << endl;
698 +  htmlfile << "<table border=\"0\" cellspacing=\"5\" width=\"100%\">" << endl;  
699 +
700    htmlfile << "<tr>" << endl;
701 <  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/pt_l1.png\"><img src=\"plots/pt_l1.png\" alt=\"plots/pt_l1.png\" width=\"100%\"></a></td>" << endl;
702 <  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/pt_l2.png\"><img src=\"plots/pt_l2.png\" alt=\"plots/pt_l2.png\" width=\"100%\"></a></td>" << endl;
703 <  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/pt_l3.png\"><img src=\"plots/pt_l3.png\" alt=\"plots/pt_l3.png\" width=\"100%\"></a></td>" << endl;
704 <  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/pt_l4.png\"><img src=\"plots/pt_l4.png\" alt=\"plots/pt_l4.png\" width=\"100%\"></a></td>" << endl;
701 >  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/costheta1.png\"><img src=\"plots/costheta1.png\" alt=\"plots/costheta1.png\" width=\"100%\"></a></td>" << endl;
702 >  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/costheta2.png\"><img src=\"plots/costheta2.png\" alt=\"plots/costheta2.png\" width=\"100%\"></a></td>" << endl;
703 >  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/costhetastar.png\"><img src=\"plots/costhetastar.png\" alt=\"plots/costhetastar.png\" width=\"100%\"></a></td>" << endl;
704 >  htmlfile << "<td width=\"25%\"></td>" << endl;
705    htmlfile << "</tr>" << endl;
706  
707    htmlfile << "<tr>" << endl;
708 <  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dR_l3l4_lo.png\"><img src=\"plots/dR_l3l4_lo.png\" alt=\"plots/dR_l3l4_lo.png\" width=\"100%\"></a></td>" << endl;
709 <  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dR_l3l4.png\"><img src=\"plots/dR_l3l4.png\" alt=\"plots/dR_l3l4.png\" width=\"100%\"></a></td>" << endl;
710 <  htmlfile << "<td width=\"25%\"><a><</a></td>" << endl;
711 <  htmlfile << "<td width=\"25%\"><a><</a></td>" << endl;
708 >  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/Phi.png\"><img src=\"plots/Phi.png\" alt=\"plots/Phi.png\" width=\"100%\"></a></td>" << endl;
709 >  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/Phi1.png\"><img src=\"plots/Phi1.png\" alt=\"plots/Phi1.png\" width=\"100%\"></a></td>" << endl;
710 >  htmlfile << "<td width=\"25%\"><a></a></td>" << endl;
711 >  htmlfile << "<td width=\"25%\"><a></a></td>" << endl;
712    htmlfile << "</tr>" << endl;
713  
714 +  htmlfile << "</table>" << endl;
715 +  htmlfile << "<hr />" << endl;
716 +  htmlfile << "<h3 style=\"text-align:left; color:DD6600;\">Boson pt variables: " << endl;
717 +  htmlfile << "<table border=\"0\" cellspacing=\"5\" width=\"100%\">" << endl;  
718 +
719    htmlfile << "<tr>" << endl;
720 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/y4l.png\"><img src=\"plots/y4l.png\" alt=\"plots/y4l.png\" width=\"100%\"></a></td>" << endl;
721 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/pt4l.png\"><img src=\"plots/pt4l.png\" alt=\"plots/pt4l.png\" width=\"100%\"></a></td>" << endl;
722 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/pt4l_log.png\"><img src=\"plots/pt4l_log.png\" alt=\"plots/pt4l_log.png\" width=\"100%\"></a></td>" << endl;
723 +  htmlfile << "<td width=\"25%\"><a></a></td>" << endl;
724 +  htmlfile << "<tr>" << endl;
725 +
726 +  htmlfile << "</tr>" << endl;
727 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/Z1pt.png\"><img src=\"plots/Z1pt.png\" alt=\"plots/Z1pt.png\" width=\"100%\"></a></td>" << endl;
728 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/Z2pt.png\"><img src=\"plots/Z2pt.png\" alt=\"plots/Z2pt.png\" width=\"100%\"></a></td>" << endl;
729 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/Z1pt_log.png\"><img src=\"plots/Z1pt_log.png\" alt=\"plots/Z1pt_log.png\" width=\"100%\"></a></td>" << endl;
730 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/Z2pt_log.png\"><img src=\"plots/Z2pt_log.png\" alt=\"plots/Z2pt_log.png\" width=\"100%\"></a></td>" << endl;
731 +  htmlfile << "</tr>" << endl;
732 +
733 +  htmlfile << "<tr>" << endl;
734 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/ZZdotZ1.png\"><img src=\"plots/ZZdotZ1.png\" alt=\"plots/ZZdotZ1.png\" width=\"100%\"></a></td>" << endl;
735 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/ZZdotZ2.png\"><img src=\"plots/ZZdotZ2.png\" alt=\"plots/ZZdotZ2.png\" width=\"100%\"></a></td>" << endl;
736 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/ZZdotZ1_log.png\"><img src=\"plots/ZZdotZ1_log.png\" alt=\"plots/ZZdotZ1_log.png\" width=\"100%\"></a></td>" << endl;
737 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/ZZdotZ2_log.png\"><img src=\"plots/ZZdotZ2_log.png\" alt=\"plots/ZZdotZ2_log.png\" width=\"100%\"></a></td>" << endl;
738 +  htmlfile << "</tr>" << endl;
739 +
740 +  htmlfile << "<tr>" << endl;
741 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dphi1.png\"><img src=\"plots/dphi1.png\" alt=\"plots/dphi1.png\" width=\"100%\"></a></td>" << endl;
742 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dphi2.png\"><img src=\"plots/dphi2.png\" alt=\"plots/dphi2.png\" width=\"100%\"></a></td>" << endl;
743 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dphi1_log.png\"><img src=\"plots/dphi1_log.png\" alt=\"plots/dphi1_log.png\" width=\"100%\"></a></td>" << endl;
744 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dphi2_log.png\"><img src=\"plots/dphi2_log.png\" alt=\"plots/dphi2_log.png\" width=\"100%\"></a></td>" << endl;
745 +  htmlfile << "</tr>" << endl;
746 +
747 +
748 +  htmlfile << "</table>" << endl;
749 +
750 +  htmlfile << "</body>" << endl;
751 +  htmlfile << "</html>" << endl;
752 +  htmlfile.close();
753 +
754 +  TString leptonfname(htmlfname);
755 +  leptonfname.ReplaceAll("plots.html","leptonplots.html");
756 +  htmlfile.open(leptonfname);
757 +
758 +  htmlfile << "<!DOCTYPE html" << endl;
759 +  htmlfile << "    PUBLIC \"-//W3C//DTD HTML 3.2//EN\">" << endl;
760 +  htmlfile << "<html>" << endl;
761 +
762 +  htmlfile << "<head><title>"+title+"</title></head>" << endl;
763 +  htmlfile << "<body bgcolor=\"000000\">" << endl;
764 +  htmlfile << "<h3 style=\"text-align:left; color:DD6600;\">"+title+"</h3>" << endl;
765 +
766 +  htmlfile << "<h3 style=\"text-align:left; color:DD6600;\">lepton plots</h3>" << endl;
767 +  htmlfile << "<hr />" << endl;
768 +  htmlfile << "<table border=\"0\" cellspacing=\"5\" width=\"100%\">" << endl;  
769 +  htmlfile << "</table>" << endl;
770 +
771 +  htmlfile << "<h3 style=\"text-align:left; color:DD6600;\">Z1 leptons:</h3>" << endl;
772 +  htmlfile << "<table border=\"0\" cellspacing=\"5\" width=\"100%\">" << endl;  
773 +
774 +  htmlfile << "<tr>" << endl;
775 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/pt_l1.png\"><img src=\"plots/pt_l1.png\" alt=\"plots/pt_l1.png\" width=\"100%\"></a></td>" << endl;
776 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/pt_l2.png\"><img src=\"plots/pt_l2.png\" alt=\"plots/pt_l2.png\" width=\"100%\"></a></td>" << endl;
777    htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/eta_l1.png\"><img src=\"plots/eta_l1.png\" alt=\"plots/eta_l1.png\" width=\"100%\"></a></td>" << endl;
778    htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/eta_l2.png\"><img src=\"plots/eta_l2.png\" alt=\"plots/eta_l2.png\" width=\"100%\"></a></td>" << endl;
779 +  htmlfile << "</tr>" << endl;
780 +
781 +  htmlfile << "<tr>" << endl;
782 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/ip3ds_l1.png\"><img src=\"plots/ip3ds_l1.png\" alt=\"plots/ip3ds_l1.png\" width=\"100%\"></a></td>" << endl;
783 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/ip3ds_l2.png\"><img src=\"plots/ip3ds_l2.png\" alt=\"plots/ip3ds_l2.png\" width=\"100%\"></a></td>" << endl;
784 +  htmlfile << "<td width=\"25%\"><a></a></td>" << endl;
785 +  htmlfile << "<td width=\"25%\"><a></a></td>" << endl;
786 +  htmlfile << "</tr>" << endl;
787 +
788 +  htmlfile << "<tr>" << endl;
789 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/d0_l1.png\"><img src=\"plots/d0_l1.png\" alt=\"plots/d0_l1.png\" width=\"100%\"></a></td>" << endl;
790 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/d0_l2.png\"><img src=\"plots/d0_l2.png\" alt=\"plots/d0_l2.png\" width=\"100%\"></a></td>" << endl;
791 +  htmlfile << "<td width=\"25%\"><a></a></td>" << endl;
792 +  htmlfile << "<td width=\"25%\"><a></a></td>" << endl;
793 +  htmlfile << "</tr>" << endl;
794 +
795 +  htmlfile << "<tr>" << endl;
796 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dz_l1.png\"><img src=\"plots/dz_l1.png\" alt=\"plots/dz_l1.png\" width=\"100%\"></a></td>" << endl;
797 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dz_l2.png\"><img src=\"plots/dz_l2.png\" alt=\"plots/dz_l2.png\" width=\"100%\"></a></td>" << endl;
798 +  htmlfile << "<td width=\"25%\"><a></a></td>" << endl;
799 +  htmlfile << "<td width=\"25%\"><a></a></td>" << endl;
800 +  htmlfile << "</tr>" << endl;
801 +
802 +  // htmlfile << "<tr>" << endl;
803 +  // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dR_l3l4_lo.png\"><img src=\"plots/dR_l3l4_lo.png\" alt=\"plots/dR_l3l4_lo.png\" width=\"100%\"></a></td>" << endl;
804 +  // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dR_l3l4.png\"><img src=\"plots/dR_l3l4.png\" alt=\"plots/dR_l3l4.png\" width=\"100%\"></a></td>" << endl;
805 +  // htmlfile << "<td width=\"25%\"><a><</a></td>" << endl;
806 +  // htmlfile << "<td width=\"25%\"><a><</a></td>" << endl;
807 +  // htmlfile << "</tr>" << endl;
808 +
809 +  htmlfile << "</table>" << endl;
810 +  htmlfile << "<h3 style=\"text-align:left; color:DD6600;\">extra leptons (l3 and l4): </h3>" << endl;
811 +  htmlfile << "<table border=\"0\" cellspacing=\"5\" width=\"100%\">" << endl;  
812 +
813 +  htmlfile << "<tr>" << endl;
814 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/pt_l3.png\"><img src=\"plots/pt_l3.png\" alt=\"plots/pt_l3.png\" width=\"100%\"></a></td>" << endl;
815 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/pt_l4.png\"><img src=\"plots/pt_l4.png\" alt=\"plots/pt_l4.png\" width=\"100%\"></a></td>" << endl;
816    htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/eta_l3.png\"><img src=\"plots/eta_l3.png\" alt=\"plots/eta_l3.png\" width=\"100%\"></a></td>" << endl;
817    htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/eta_l4.png\"><img src=\"plots/eta_l4.png\" alt=\"plots/eta_l4.png\" width=\"100%\"></a></td>" << endl;
818    htmlfile << "</tr>" << endl;
819 +
820 +  htmlfile << "<tr>" << endl;
821 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/ip3ds_l3_lo.png\"><img src=\"plots/ip3ds_l3_lo.png\" alt=\"plots/ip3ds_l3_lo.png\" width=\"100%\"></a></td>" << endl;
822 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/ip3ds_l4_lo.png\"><img src=\"plots/ip3ds_l4_lo.png\" alt=\"plots/ip3ds_l4_lo.png\" width=\"100%\"></a></td>" << endl;
823 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/ip3ds_l3.png\"><img src=\"plots/ip3ds_l3.png\" alt=\"plots/ip3ds_l3.png\" width=\"100%\"></a></td>" << endl;
824 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/ip3ds_l4.png\"><img src=\"plots/ip3ds_l4.png\" alt=\"plots/ip3ds_l4.png\" width=\"100%\"></a></td>" << endl;
825 +  htmlfile << "</tr>" << endl;
826 +
827 +  htmlfile << "<tr>" << endl;
828 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/d0_l3_lo.png\"><img src=\"plots/d0_l3_lo.png\" alt=\"plots/d0_l3_lo.png\" width=\"100%\"></a></td>" << endl;
829 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/d0_l4_lo.png\"><img src=\"plots/d0_l4_lo.png\" alt=\"plots/d0_l4_lo.png\" width=\"100%\"></a></td>" << endl;
830 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/d0_l3.png\"><img src=\"plots/d0_l3.png\" alt=\"plots/d0_l3.png\" width=\"100%\"></a></td>" << endl;
831 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/d0_l4.png\"><img src=\"plots/d0_l4.png\" alt=\"plots/d0_l4.png\" width=\"100%\"></a></td>" << endl;
832 +  htmlfile << "</tr>" << endl;
833 +
834 +  htmlfile << "<tr>" << endl;
835 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dz_l3.png\"><img src=\"plots/dz_l3.png\" alt=\"plots/dz_l3.png\" width=\"100%\"></a></td>" << endl;
836 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dz_l4.png\"><img src=\"plots/dz_l4.png\" alt=\"plots/dz_l4.png\" width=\"100%\"></a></td>" << endl;
837 +  htmlfile << "<td width=\"25%\"><a></a></td>" << endl;
838 +  htmlfile << "<td width=\"25%\"><a></a></td>" << endl;
839 +  htmlfile << "</tr>" << endl;
840 +
841 +  htmlfile << "</table>" << endl;
842 +
843 +  htmlfile << "</body>" << endl;
844 +  htmlfile << "</html>" << endl;
845 +  htmlfile.close();
846 +
847 +  TString jetfname(htmlfname);
848 +  jetfname.ReplaceAll("plots.html","jetplots.html");
849 +  htmlfile.open(jetfname);
850 +
851 +  htmlfile << "<!DOCTYPE html" << endl;
852 +  htmlfile << "    PUBLIC \"-//W3C//DTD HTML 3.2//EN\">" << endl;
853 +  htmlfile << "<html>" << endl;
854 +
855 +  htmlfile << "<head><title>"+title+"</title></head>" << endl;
856 +  htmlfile << "<body bgcolor=\"000000\">" << endl;
857 +  htmlfile << "<h3 style=\"text-align:left; color:DD6600;\">"+title+"</h3>" << endl;
858 +
859 +  htmlfile << "<h3 style=\"text-align:left; color:DD6600;\">jet plots</h3>" << endl;
860 +  htmlfile << "<hr />" << endl;
861 +  htmlfile << "<table border=\"0\" cellspacing=\"5\" width=\"100%\">" << endl;  
862 +
863 +  htmlfile << "<tr>" << endl;
864 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/pt_j1.png\"><img src=\"plots/pt_j1.png\" alt=\"plots/pt_j1.png\" width=\"100%\"></a></td>" << endl;
865 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/pt_j2.png\"><img src=\"plots/pt_j2.png\" alt=\"plots/pt_j2.png\" width=\"100%\"></a></td>" << endl;
866 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/pt_j2.png\"><img src=\"plots/pt_j2.png\" alt=\"plots/pt_j2.png\" width=\"100%\"></a></td>" << endl;
867 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/pt_j4.png\"><img src=\"plots/pt_j4.png\" alt=\"plots/pt_j4.png\" width=\"100%\"></a></td>" << endl;
868 +  htmlfile << "</tr>" << endl;
869 +
870 +  htmlfile << "<tr>" << endl;
871 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/eta_j1.png\"><img src=\"plots/eta_j1.png\" alt=\"plots/eta_j1.png\" width=\"100%\"></a></td>" << endl;
872 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/eta_j2.png\"><img src=\"plots/eta_j2.png\" alt=\"plots/eta_j2.png\" width=\"100%\"></a></td>" << endl;
873 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/eta_j3.png\"><img src=\"plots/eta_j3.png\" alt=\"plots/eta_j3.png\" width=\"100%\"></a></td>" << endl;
874 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/eta_j4.png\"><img src=\"plots/eta_j4.png\" alt=\"plots/eta_j4.png\" width=\"100%\"></a></td>" << endl;
875 +  htmlfile << "</tr>" << endl;
876 +
877 +  htmlfile << "<tr>" << endl;
878 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/idmva_j1.png\"><img src=\"plots/idmva_j1.png\" alt=\"plots/idmva_j1.png\" width=\"100%\"></a></td>" << endl;
879 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/idmva_j2.png\"><img src=\"plots/idmva_j2.png\" alt=\"plots/idmva_j2.png\" width=\"100%\"></a></td>" << endl;
880 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/idmva_j3.png\"><img src=\"plots/idmva_j3.png\" alt=\"plots/idmva_j3.png\" width=\"100%\"></a></td>" << endl;
881 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/idmva_j4.png\"><img src=\"plots/idmva_j4.png\" alt=\"plots/idmva_j4.png\" width=\"100%\"></a></td>" << endl;
882 +  htmlfile << "</tr>" << endl;
883 +
884 +  htmlfile << "<tr>" << endl;
885 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/phi_j1.png\"><img src=\"plots/phi_j1.png\" alt=\"plots/phi_j1.png\" width=\"100%\"></a></td>" << endl;
886 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/phi_j2.png\"><img src=\"plots/phi_j2.png\" alt=\"plots/phi_j2.png\" width=\"100%\"></a></td>" << endl;
887 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/phi_j3.png\"><img src=\"plots/phi_j3.png\" alt=\"plots/phi_j3.png\" width=\"100%\"></a></td>" << endl;
888 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/phi_j4.png\"><img src=\"plots/phi_j4.png\" alt=\"plots/phi_j4.png\" width=\"100%\"></a></td>" << endl;
889 +  htmlfile << "</tr>" << endl;
890 +
891 +  htmlfile << "<tr>" << endl;
892 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/mjj.png\"><img src=\"plots/mjj.png\" alt=\"plots/mjj.png\" width=\"100%\"></a></td>" << endl;
893 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dEta.png\"><img src=\"plots/dEta.png\" alt=\"plots/dEta.png\" width=\"100%\"></a></td>" << endl;
894 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/etaProd.png\"><img src=\"plots/etaProd.png\" alt=\"plots/etaProd.png\" width=\"100%\"></a></td>" << endl;
895 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/njets.png\"><img src=\"plots/njets.png\" alt=\"plots/njets.png\" width=\"100%\"></a></td>" << endl;
896 +  htmlfile << "</tr>" << endl;
897 +
898 +  // htmlfile << "<tr>" << endl;
899 +  // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dR_l1j1.png\"><img src=\"plots/dR_l1j1.png\" alt=\"plots/dR_l1j1.png\" width=\"100%\"></a></td>" << endl;
900 +  // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dR_l2j1.png\"><img src=\"plots/dR_l2j1.png\" alt=\"plots/dR_l2j1.png\" width=\"100%\"></a></td>" << endl;
901 +  // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dR_l3j1.png\"><img src=\"plots/dR_l3j1.png\" alt=\"plots/dR_l3j1.png\" width=\"100%\"></a></td>" << endl;
902 +  // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dR_l4j1.png\"><img src=\"plots/dR_l4j1.png\" alt=\"plots/dR_l4j1.png\" width=\"100%\"></a></td>" << endl;
903 +  // htmlfile << "</tr>" << endl;
904 +
905 +  // htmlfile << "<tr>" << endl;
906 +  // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dR_l1j2.png\"><img src=\"plots/dR_l1j2.png\" alt=\"plots/dR_l1j2.png\" width=\"100%\"></a></td>" << endl;
907 +  // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dR_l2j2.png\"><img src=\"plots/dR_l2j2.png\" alt=\"plots/dR_l2j2.png\" width=\"100%\"></a></td>" << endl;
908 +  // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dR_l3j2.png\"><img src=\"plots/dR_l3j2.png\" alt=\"plots/dR_l3j2.png\" width=\"100%\"></a></td>" << endl;
909 +  // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dR_l4j2.png\"><img src=\"plots/dR_l4j2.png\" alt=\"plots/dR_l4j2.png\" width=\"100%\"></a></td>" << endl;
910 +  // htmlfile << "</tr>" << endl;
911 +
912 +  // htmlfile << "<tr>" << endl;
913 +  // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dR_l1j3.png\"><img src=\"plots/dR_l1j3.png\" alt=\"plots/dR_l1j3.png\" width=\"100%\"></a></td>" << endl;
914 +  // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dR_l2j3.png\"><img src=\"plots/dR_l2j3.png\" alt=\"plots/dR_l2j3.png\" width=\"100%\"></a></td>" << endl;
915 +  // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dR_l3j3.png\"><img src=\"plots/dR_l3j3.png\" alt=\"plots/dR_l3j3.png\" width=\"100%\"></a></td>" << endl;
916 +  // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dR_l4j3.png\"><img src=\"plots/dR_l4j3.png\" alt=\"plots/dR_l4j3.png\" width=\"100%\"></a></td>" << endl;
917 +  // htmlfile << "</tr>" << endl;
918 +
919 +  // htmlfile << "<tr>" << endl;
920 +  // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dR_l1j4.png\"><img src=\"plots/dR_l1j4.png\" alt=\"plots/dR_l1j4.png\" width=\"100%\"></a></td>" << endl;
921 +  // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dR_l2j4.png\"><img src=\"plots/dR_l2j4.png\" alt=\"plots/dR_l2j4.png\" width=\"100%\"></a></td>" << endl;
922 +  // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dR_l3j4.png\"><img src=\"plots/dR_l3j4.png\" alt=\"plots/dR_l3j4.png\" width=\"100%\"></a></td>" << endl;
923 +  // htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/dR_l4j4.png\"><img src=\"plots/dR_l4j4.png\" alt=\"plots/dR_l4j4.png\" width=\"100%\"></a></td>" << endl;
924 +  // htmlfile << "</tr>" << endl;
925 +
926 +  htmlfile << "<tr>" << endl;
927 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/fusionMVA.png\"><img src=\"plots/fusionMVA.png\" alt=\"plots/fusionMVA.png\" width=\"100%\"></a></td>" << endl;
928 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/fusionMVA_lo.png\"><img src=\"plots/fusionMVA_lo.png\" alt=\"plots/fusionMVA_lo.png\" width=\"100%\"></a></td>" << endl;
929 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/fusionMVA_hi.png\"><img src=\"plots/fusionMVA_hi.png\" alt=\"plots/fusionMVA_hi.png\" width=\"100%\"></a></td>" << endl;
930 +  htmlfile << "<td width=\"25%\"><a></a></td>" << endl;
931 +  htmlfile << "</tr>" << endl;
932 +
933 +  htmlfile << "<tr>" << endl;
934 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/fusionMVA-log.png\"><img src=\"plots/fusionMVA-log.png\" alt=\"plots/fusionMVA-log.png\" width=\"100%\"></a></td>" << endl;
935 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/fusionMVA_lo-log.png\"><img src=\"plots/fusionMVA_lo-log.png\" alt=\"plots/fusionMVA_lo-log.png\" width=\"100%\"></a></td>" << endl;
936 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/fusionMVA_hi-log.png\"><img src=\"plots/fusionMVA_hi-log.png\" alt=\"plots/fusionMVA_hi-log.png\" width=\"100%\"></a></td>" << endl;
937 +  htmlfile << "<td width=\"25%\"><a></a></td>" << endl;
938 +  htmlfile << "</tr>" << endl;
939 +
940 +  htmlfile << "<tr>" << endl;
941 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/m4l_jet_lo.png\"><img src=\"plots/m4l_jet_lo.png\" alt=\"plots/m4l_jet_lo.png\" width=\"100%\"></a></td>" << endl;
942 +  htmlfile << "<td width=\"25%\"><a target=\"_blank\" href=\"plots/m4l_jet.png\"><img src=\"plots/m4l_jet.png\" alt=\"plots/m4l_jet.png\" width=\"100%\"></a></td>" << endl;
943 +  htmlfile << "<td width=\"25%\"><a></a></td>" << endl;
944 +  htmlfile << "<td width=\"25%\"><a></a></td>" << endl;
945 +  htmlfile << "</tr>" << endl;
946 +
947 +
948    htmlfile << "</table>" << endl;
949  
950    htmlfile << "<hr />" << endl;
# Line 372 | Line 958 | void makeHTML(FOFlags &ctrl, TString typ
958   //----------------------------------------------------------------------------------------
959   void fillHist(CSample *cs, TString channel, TString type, TString var, double val, double wgt, double wgt_lo, double wgt_hi)
960   {
961 <  // // name = channel+"_"+type;
962 <  // // name = "all_"+type+"_lo";
963 <  // // name = "all_"+type+"_hi";
378 <  // // name = channel+"_"+type+"_lo";
379 <  // // name = channel+"_"+type+"_hi";
380 <
381 <  // cout << endl << "all_"+type;
382 <  // (*(cs->hists)["all_"+type])[var]->Fill(        val,   wgt);
383 <  // if(channel!="") {
384 <  //   cout << endl << channel+"_"+type;
385 <  //   (*(cs->hists)[channel+"_"+type])[var]->Fill(   val,   wgt);
386 <  // }
387 <  // if(type=="pred") {
388 <  //   cout << endl << "all_"+type+"_lo";
389 <  //   (*(cs->hists)["all_"+type+"_lo"])[var]->Fill(   val,   wgt_lo);
390 <  //   cout << endl << "all_"+type+"_hi";
391 <  //   (*(cs->hists)["all_"+type+"_hi"])[var]->Fill(   val,   wgt_hi);
392 <  //   if(channel!="") {
393 <  //     cout << endl << channel+"_"+type+"_lo";
394 <  //     (*(cs->hists)[channel+"_"+type+"_lo"])[var]->Fill(   val,   wgt_lo);
395 <  //     cout << endl << channel+"_"+type+"_hi" << endl;
396 <  //     (*(cs->hists)[channel+"_"+type+"_hi"])[var]->Fill(   val,   wgt_hi);
397 <  //   }
398 <  // }
961 >  assert(wgt==wgt);
962 >  assert(wgt_lo==wgt_lo);
963 >  assert(wgt_hi==wgt_hi);
964    (*(cs->hists)["all_"+type])[var]->Fill(           val,   wgt);
965    if(channel!="")
966       (*(cs->hists)[channel+"_"+type])[var]->Fill(   val,   wgt);
967 <  if(type=="pred") {
967 >  if(type=="pred" || type=="PF") {
968      (*(cs->hists)["all_"+type+"_lo"])[var]->Fill(   val,   wgt_lo);
969      (*(cs->hists)["all_"+type+"_hi"])[var]->Fill(   val,   wgt_hi);
970      if(channel!="") {
# Line 408 | Line 973 | void fillHist(CSample *cs, TString chann
973      }
974    }
975   }
976 + //----------------------------------------------------------------------------------------
977 + void fillAllHists(FOFlags ctrl, CSample *cs, TString channel, TString type, filestuff *fs, KinematicsStruct kine, Angles angles,
978 +                  SimpleLepton lep1, SimpleLepton lep2, SimpleLepton lep3, SimpleLepton lep4,
979 +                  double wgt, double wgt_lo, double wgt_hi)
980 + {
981 +  fillHist( cs, channel, type, "npv"         , fs->info->npv  , wgt, wgt_lo, wgt_hi);
982 +  fillHist( cs, channel, type, "run"         , fs->info->run  , wgt, wgt_lo, wgt_hi);
983 +  fillHist( cs, channel, type, "mZ1"         , kine.mZ1       , wgt, wgt_lo, wgt_hi);                
984 +  fillHist( cs, channel, type, "mZ2"         , kine.mZ2       , wgt, wgt_lo, wgt_hi);                
985 +  fillHist( cs, channel, type, "mZ2_lo"      , kine.mZ2       , wgt, wgt_lo, wgt_hi);                
986 +  fillHist( cs, channel, type, "m4l_lo"      , kine.m4l       , wgt, wgt_lo, wgt_hi);                
987 +  fillHist( cs, channel, type, "m4l_med"     , kine.m4l       , wgt, wgt_lo, wgt_hi);                
988 +  fillHist( cs, channel, type, "m4l"         , kine.m4l       , wgt, wgt_lo, wgt_hi);                
989 +  fillHist( cs, channel, type, "met"         , fs->info->met  , wgt, wgt_lo, wgt_hi);                
990 +  fillHist( cs, channel, type, "ip3ds_l1"    , lep1.ip3dSig   , wgt, wgt_lo, wgt_hi);
991 +  fillHist( cs, channel, type, "ip3ds_l2"    , lep2.ip3dSig   , wgt, wgt_lo, wgt_hi);
992 +  fillHist( cs, channel, type, "ip3ds_l3"    , lep3.ip3dSig   , wgt, wgt_lo, wgt_hi);
993 +  fillHist( cs, channel, type, "ip3ds_l4"    , lep4.ip3dSig   , wgt, wgt_lo, wgt_hi);
994 +  fillHist( cs, channel, type, "ip3ds_l3_lo" , lep3.ip3dSig   , wgt, wgt_lo, wgt_hi);
995 +  fillHist( cs, channel, type, "ip3ds_l4_lo" , lep4.ip3dSig   , wgt, wgt_lo, wgt_hi);
996 +  fillHist( cs, channel, type, "d0_l1"       , lep1.d0        , wgt, wgt_lo, wgt_hi);
997 +  fillHist( cs, channel, type, "d0_l2"       , lep2.d0        , wgt, wgt_lo, wgt_hi);
998 +  fillHist( cs, channel, type, "d0_l3"       , lep3.d0        , wgt, wgt_lo, wgt_hi);
999 +  fillHist( cs, channel, type, "d0_l4"       , lep4.d0        , wgt, wgt_lo, wgt_hi);
1000 +  fillHist( cs, channel, type, "d0_l3_lo"    , lep3.d0        , wgt, wgt_lo, wgt_hi);
1001 +  fillHist( cs, channel, type, "d0_l4_lo"    , lep4.d0        , wgt, wgt_lo, wgt_hi);
1002 +  fillHist( cs, channel, type, "dz_l1"       , lep1.dz        , wgt, wgt_lo, wgt_hi);
1003 +  fillHist( cs, channel, type, "dz_l2"       , lep2.dz        , wgt, wgt_lo, wgt_hi);
1004 +  fillHist( cs, channel, type, "dz_l3"       , lep3.dz        , wgt, wgt_lo, wgt_hi);
1005 +  fillHist( cs, channel, type, "dz_l4"       , lep4.dz        , wgt, wgt_lo, wgt_hi);
1006 +  fillHist( cs, channel, type, "pt_l1"       , lep1.vec.Pt()  , wgt, wgt_lo, wgt_hi);
1007 +  fillHist( cs, channel, type, "pt_l2"       , lep2.vec.Pt()  , wgt, wgt_lo, wgt_hi);
1008 +  fillHist( cs, channel, type, "pt_l3"       , lep3.vec.Pt()  , wgt, wgt_lo, wgt_hi);
1009 +  fillHist( cs, channel, type, "pt_l4"       , lep4.vec.Pt()  , wgt, wgt_lo, wgt_hi);
1010 +  fillHist( cs, channel, type, "eta_l1"      , lep1.vec.Eta() , wgt, wgt_lo, wgt_hi);
1011 +  fillHist( cs, channel, type, "eta_l2"      , lep2.vec.Eta() , wgt, wgt_lo, wgt_hi);
1012 +  fillHist( cs, channel, type, "eta_l3"      , lep3.vec.Eta() , wgt, wgt_lo, wgt_hi);
1013 +  fillHist( cs, channel, type, "eta_l4"      , lep4.vec.Eta() , wgt, wgt_lo, wgt_hi);
1014 +  fillHist( cs, channel, type, "dR_l3l4_lo"  , dr(lep3,lep4)  , wgt, wgt_lo, wgt_hi);
1015 +  fillHist( cs, channel, type, "dR_l3l4"     , dr(lep3,lep4)  , wgt, wgt_lo, wgt_hi);
1016 +
1017 +  fillHist( cs, channel, type, "costheta1"      , angles.costheta1                  ,   wgt, wgt_lo, wgt_hi);
1018 +  fillHist( cs, channel, type, "costheta2"      , angles.costheta2                  ,   wgt, wgt_lo, wgt_hi);
1019 +  fillHist( cs, channel, type, "costhetastar"   , angles.costhetastar               ,   wgt, wgt_lo, wgt_hi);
1020 +  fillHist( cs, channel, type, "Phi"            , angles.Phi                        ,   wgt, wgt_lo, wgt_hi);
1021 +  fillHist( cs, channel, type, "Phi1"           , angles.Phi1                       ,   wgt, wgt_lo, wgt_hi);
1022 +  fillHist( cs, channel, type, "pt4l"           , kine.ZZpt/kine.m4l                ,   wgt, wgt_lo, wgt_hi);
1023 +  fillHist( cs, channel, type, "pt4l_log"       , kine.ZZpt/kine.m4l                ,   wgt, wgt_lo, wgt_hi);
1024 +  fillHist( cs, channel, type, "y4l"            , kine.ZZy                          ,   wgt, wgt_lo, wgt_hi);
1025 +  fillHist( cs, channel, type, "Z1pt"           , kine.Z1pt/kine.m4l                ,   wgt, wgt_lo, wgt_hi);
1026 +  fillHist( cs, channel, type, "Z1pt_log"       , kine.Z1pt/kine.m4l                ,   wgt, wgt_lo, wgt_hi);
1027 +  fillHist( cs, channel, type, "Z2pt"           , kine.Z2pt/kine.m4l                ,   wgt, wgt_lo, wgt_hi);
1028 +  fillHist( cs, channel, type, "Z2pt_log"       , kine.Z2pt/kine.m4l                ,   wgt, wgt_lo, wgt_hi);
1029 +  fillHist( cs, channel, type, "ZZdotZ1"        , kine.ZZdotZ1/(kine.m4l*kine.mZ1)  ,   wgt, wgt_lo, wgt_hi);
1030 +  fillHist( cs, channel, type, "ZZdotZ2"        , kine.ZZdotZ2/(kine.m4l*kine.mZ2)  ,   wgt, wgt_lo, wgt_hi);
1031 +  fillHist( cs, channel, type, "ZZdotZ1_log"    , kine.ZZdotZ1/(kine.m4l*kine.mZ1)  ,   wgt, wgt_lo, wgt_hi);
1032 +  fillHist( cs, channel, type, "ZZdotZ2_log"    , kine.ZZdotZ2/(kine.m4l*kine.mZ2)  ,   wgt, wgt_lo, wgt_hi);
1033 +  fillHist( cs, channel, type, "dphi1"          , kine.ZZptZ1ptCosDphi              ,   wgt, wgt_lo, wgt_hi);
1034 +  fillHist( cs, channel, type, "dphi2"          , kine.ZZptZ2ptCosDphi              ,   wgt, wgt_lo, wgt_hi);
1035 +  fillHist( cs, channel, type, "dphi1_log"      , kine.ZZptZ1ptCosDphi              ,   wgt, wgt_lo, wgt_hi);
1036 +  fillHist( cs, channel, type, "dphi2_log"      , kine.ZZptZ2ptCosDphi              ,   wgt, wgt_lo, wgt_hi);
1037 +
1038 + }
1039 + //----------------------------------------------------------------------------------------
1040 + void fillAllJetHists( FOFlags ctrl, CSample *cs, TString channel, TString type, filestuff *fs, KinematicsStruct kine,
1041 +                      SimpleLepton lep1, SimpleLepton lep2, SimpleLepton lep3, SimpleLepton lep4,
1042 +                      FusionMva &fusion, vector<SimpleLepton> &goodJets, JetInfoStruct ji,
1043 +                      double wgt, double wgt_lo, double wgt_hi)
1044 + {
1045 +  double fMVAval = (ctrl.uncert=="") ? 0 : fusion.reader->EvaluateMVA("BDTG");
1046 +  dr_struct drs = fill_dr_struct(goodJets,lep1,lep2,lep3,lep4);
1047 +  fillHist( cs, channel, type, "pt_j1"  ,     ji.ptJet1,        wgt, wgt_lo, wgt_hi);
1048 +  fillHist( cs, channel, type, "pt_j2"  ,     ji.ptJet2,        wgt, wgt_lo, wgt_hi);
1049 +  fillHist( cs, channel, type, "pt_j3"  ,     ji.ptJet3,        wgt, wgt_lo, wgt_hi);
1050 +  fillHist( cs, channel, type, "pt_j4"  ,     ji.ptJet4,        wgt, wgt_lo, wgt_hi);
1051 +  fillHist( cs, channel, type, "eta_j1" ,     ji.etaJet1,       wgt, wgt_lo, wgt_hi);
1052 +  fillHist( cs, channel, type, "eta_j2" ,     ji.etaJet2,       wgt, wgt_lo, wgt_hi);
1053 +  fillHist( cs, channel, type, "eta_j3" ,     ji.etaJet3,       wgt, wgt_lo, wgt_hi);
1054 +  fillHist( cs, channel, type, "eta_j4" ,     ji.etaJet4,       wgt, wgt_lo, wgt_hi);
1055 +  fillHist( cs, channel, type, "phi_j1" ,     ji.phiJet1,       wgt, wgt_lo, wgt_hi);
1056 +  fillHist( cs, channel, type, "phi_j2" ,     ji.phiJet2,       wgt, wgt_lo, wgt_hi);
1057 +  fillHist( cs, channel, type, "phi_j3" ,     ji.phiJet3,       wgt, wgt_lo, wgt_hi);
1058 +  fillHist( cs, channel, type, "phi_j4" ,     ji.phiJet4,       wgt, wgt_lo, wgt_hi);
1059 +  fillHist( cs, channel, type, "idmva_j1",    ji.mvaJet1,       wgt, wgt_lo, wgt_hi);
1060 +  fillHist( cs, channel, type, "idmva_j2",    ji.mvaJet2,       wgt, wgt_lo, wgt_hi);
1061 +  fillHist( cs, channel, type, "idmva_j3",    ji.mvaJet3,       wgt, wgt_lo, wgt_hi);
1062 +  fillHist( cs, channel, type, "idmva_j4",    ji.mvaJet4,       wgt, wgt_lo, wgt_hi);
1063 +  fillHist( cs, channel, type, "mjj"    ,     ji.mjj,           wgt, wgt_lo, wgt_hi);
1064 +  fillHist( cs, channel, type, "dEta"   ,     ji.dEta,          wgt, wgt_lo, wgt_hi);
1065 +  fillHist( cs, channel, type, "etaProd",     ji.etaProd,       wgt, wgt_lo, wgt_hi);
1066 +  fillHist( cs, channel, type, "njets"    ,   goodJets.size(),  wgt, wgt_lo, wgt_hi);
1067 +  fillHist( cs, channel, type, "dR_l1j1",     drs.l1j1,         wgt, wgt_lo, wgt_hi);
1068 +  fillHist( cs, channel, type, "dR_l2j1",     drs.l2j1,         wgt, wgt_lo, wgt_hi);
1069 +  fillHist( cs, channel, type, "dR_l3j1",     drs.l3j1,         wgt, wgt_lo, wgt_hi);
1070 +  fillHist( cs, channel, type, "dR_l4j1",     drs.l4j1,         wgt, wgt_lo, wgt_hi);
1071 +  fillHist( cs, channel, type, "dR_l1j2",     drs.l1j2,         wgt, wgt_lo, wgt_hi);
1072 +  fillHist( cs, channel, type, "dR_l2j2",     drs.l2j2,         wgt, wgt_lo, wgt_hi);
1073 +  fillHist( cs, channel, type, "dR_l3j2",     drs.l3j2,         wgt, wgt_lo, wgt_hi);
1074 +  fillHist( cs, channel, type, "dR_l4j2",     drs.l4j2,         wgt, wgt_lo, wgt_hi);
1075 +  fillHist( cs, channel, type, "dR_l1j3",     drs.l1j3,         wgt, wgt_lo, wgt_hi);
1076 +  fillHist( cs, channel, type, "dR_l2j3",     drs.l2j3,         wgt, wgt_lo, wgt_hi);
1077 +  fillHist( cs, channel, type, "dR_l3j3",     drs.l3j3,         wgt, wgt_lo, wgt_hi);
1078 +  fillHist( cs, channel, type, "dR_l4j3",     drs.l4j3,         wgt, wgt_lo, wgt_hi);
1079 +  fillHist( cs, channel, type, "dR_l1j4",     drs.l1j4,         wgt, wgt_lo, wgt_hi);
1080 +  fillHist( cs, channel, type, "dR_l2j4",     drs.l2j4,         wgt, wgt_lo, wgt_hi);
1081 +  fillHist( cs, channel, type, "dR_l3j4",     drs.l3j4,         wgt, wgt_lo, wgt_hi);
1082 +  fillHist( cs, channel, type, "dR_l4j4",     drs.l4j4,         wgt, wgt_lo, wgt_hi);
1083 +
1084 +  fillHist( cs, channel, type, "fusionMVA_lo", fMVAval,         wgt, wgt_lo, wgt_hi);
1085 +  fillHist( cs, channel, type, "fusionMVA_med",fMVAval,         wgt, wgt_lo, wgt_hi);
1086 +  fillHist( cs, channel, type, "fusionMVA_hi", fMVAval,         wgt, wgt_lo, wgt_hi);
1087 +  fillHist( cs, channel, type, "fusionMVA",    fMVAval,         wgt, wgt_lo, wgt_hi);
1088 +  if(fMVAval > -.3) {
1089 +    fillHist( cs, channel, type, "m4l_jet_lo",  kine.m4l  ,     wgt, wgt_lo, wgt_hi);                
1090 +    fillHist( cs, channel, type, "m4l_jet",     kine.m4l  ,     wgt, wgt_lo, wgt_hi);
1091 +  }
1092 + }
1093 + //----------------------------------------------------------------------------------------
1094 + bool passHlt(FOFlags &ctrl, TrigInfo ti, InfoStruct *info, unsigned lep1matchBits,
1095 +             unsigned lep2matchBits, unsigned lep3matchBits,
1096 +             unsigned lep4matchBits)
1097 + {
1098 +  bool pass=false;
1099 +  bool onePassedButWasOutside=false;
1100 +  bitset<30> firedBits(info->status);
1101 +  if(ctrl.debug) cout << setw(12) << info->run << setw(12) << info->evt << setw(65) << firedBits <<endl;
1102 +  for(unsigned ibit=0; ibit<ti.trigBits.size(); ibit++) {
1103 +    bool outsideRunRange=false;
1104 +    if(info->run < ti.minRuns[ibit] || info->run > ti.maxRuns[ibit]) {
1105 +      outsideRunRange = true;
1106 +    }
1107 +    int baconBit = ti.trigBits[ibit];
1108 +    bool passBit = firedBits.test(ibit);
1109 +    if(ctrl.debug) cout << "   ibit: " << setw(4) << ibit << " (bacon bit: " << baconBit << ") fired: " << passBit << endl;
1110 +    if(ctrl.debug && passBit && outsideRunRange) cout << "        would have passed but it's outside run range (" << ti.minRuns[ibit] << "," << ti.maxRuns[ibit] << ")" << endl;
1111 +    if(passBit && outsideRunRange) {
1112 +       onePassedButWasOutside = true;
1113 +    }
1114 +    if(passBit && !outsideRunRange) pass = true;
1115 +  }
1116 +  if(!pass && onePassedButWasOutside) cout << "WARNING: would have passed, but one was outside its run range" << endl;
1117 +  return pass;
1118 + }
1119 + //----------------------------------------------------------------------------------------
1120 + void init_cuts( vector<TString> &cutstrs, map<TString,int> &cutvec)
1121 + {
1122 +  cutstrs.push_back("start"  );    cutvec["start"]  = 0;
1123 +  cutstrs.push_back("rlrmAndDupl"  );    cutvec["rlrmAndDupl"]  = 0;
1124 +  // cutstrs.push_back("skim"  );     cutvec["skim"]  = 0;
1125 +  cutstrs.push_back("4lsele"  );     cutvec["4lsele"]  = 0;
1126 +  cutstrs.push_back("twoJets"  );  cutvec["twoJets"] = 0;
1127 +  cutstrs.push_back("twoJetsAfter"  );  cutvec["twoJetsAfter"] = 0;
1128 +  cutstrs.push_back("filling"  );  cutvec["filling"] = 0;
1129 +  cutstrs.push_back("fillPass"  );  cutvec["fillPass"] = 0;
1130 +  cutstrs.push_back("fillFail"  );  cutvec["fillFail"] = 0;
1131 +  cutstrs.push_back("fillPF"  );  cutvec["fillPF"] = 0;
1132 + }
1133 + //----------------------------------------------------------------------------------------
1134 + bool findGoodJets(vector<SimpleLepton> &goodJets, filestuff *fs,
1135 +                  SimpleLepton lep1, SimpleLepton lep2, SimpleLepton lep3, SimpleLepton lep4)
1136 + {
1137 +  int nHighPtJets=0,nLowPtJets=0;
1138 +  for(unsigned ijet=0; ijet<fs->jets->size(); ijet++) {
1139 +    SimpleLepton *jet = &((*fs->jets)[ijet]);
1140 +    if(dr(*jet,lep1) < 0.2)             continue;
1141 +    if(dr(*jet,lep2) < 0.2)             continue;
1142 +    if(dr(*jet,lep3) < 0.2)             continue;
1143 +    if(dr(*jet,lep4) < 0.2)             continue;
1144 +    if(!(jet->status.passPre()))        continue;
1145 +    if(!jet->isLoose)                   continue;
1146 +    if(fabs(jet->vec.Eta()) > 4.5)      continue;
1147 +    goodJets.push_back(*jet);
1148 +    if(jet->vec.Pt() > 40)              nHighPtJets++;
1149 +    if(jet->vec.Pt() > 20)              nLowPtJets++;
1150 +  }
1151 +  sort( goodJets.begin(), goodJets.end(), SimpleLepton::lep_pt_sort ); // note: they're not sorted, 'cause jet corrections were applied in applyZPlusX
1152 +  if((goodJets.size()>0 && nHighPtJets<1) || // require pt > 40,20 if the jets are there
1153 +     (goodJets.size()>1 && nLowPtJets<2))
1154 +    return false;
1155 +  else
1156 +    return true;
1157 + }
1158 + //----------------------------------------------------------------------------------------
1159 + map<TString,TH1D*> setHistSet(CSample *cs, TString type, TString var)
1160 + {
1161 +  map<TString,TH1D*> hset;
1162 +  hset["obs"]            = (*(cs->hists)[type+"_obs"])[var];
1163 +  hset["pred"]           = (*(cs->hists)[type+"_pred"])[var];
1164 +  hset["pred_lo"]        = (*(cs->hists)[type+"_pred_lo"])[var];
1165 +  hset["pred_hi"]        = (*(cs->hists)[type+"_pred_hi"])[var];
1166 +  hset["PF"]             = (*(cs->hists)[type+"_PF"])[var];
1167 +  hset["PF_lo"]          = (*(cs->hists)[type+"_PF_lo"])[var];
1168 +  hset["PF_hi"]          = (*(cs->hists)[type+"_PF_hi"])[var];
1169 +  return hset;
1170 + }
1171 + //----------------------------------------------------------------------------------------
1172 + void fillFakeTuple(CSample *cs, filestuff *fs, EventData evtdata, unsigned ientry, double fillweight)
1173 + {
1174 +  fs->getentry(ientry,"","zznt"); // make sure we've got this entry for all the branches
1175 +  fillAngles(evtdata,*fs->angles);
1176 +  fillKinematics(evtdata,*fs->kine); // reminder: kine has the fake information, while fs->kine *had*, until this line, whatever ZPlusX put in it
1177 +  fs->weights->w = fillweight;
1178 +  fs->outtuple->Fill();
1179 +  fs->outFotuple->Fill();
1180 + }
1181 + //----------------------------------------------------------------------------------------
1182 + void incrementSsofCounters(FOFlags &ctrl, filestuff *fs, double minMz2,
1183 +                           pair<int,int> *best_z_indices,
1184 +                           double wgt)
1185 + {
1186 +  assert(ctrl.ssof); // only makes sense to write this out when we're thinking about ssof method
1187 +  vector<pair<SimpleLepton,SimpleLepton> > z2cands;
1188 +  vector<TString> types;
1189 +  
1190 +  int hiPtFailZ2 = findZ2CandidatesPassFail(fs->failingL, z2cands, types, "XX-SF", minMz2, "fail");
1191 +  if(hiPtFailZ2 == -1) return; // no z2 found
1192 +  SimpleLepton lep1 = (*fs->passingL)[best_z_indices->first];
1193 +  SimpleLepton lep2 = (*fs->passingL)[best_z_indices->second];
1194 +  SimpleLepton lep3 = z2cands[hiPtFailZ2].first;
1195 +  SimpleLepton lep4 = z2cands[hiPtFailZ2].second;
1196 +  TString channel = getChannel(lep1,lep2,lep3,lep4);
1197 +  TString sign = (lep3.charge == lep4.charge) ? "SS" : "OS";
1198 +
1199 +  fs->counters_[sign+"_"+channel] += wgt;
1200 +  fs->counters_[sign] += wgt;
1201 + }
1202 + //----------------------------------------------------------------------------------------
1203 + double getSsofWgt(TString channel, map<TString,double> &ssofRatios)
1204 + {
1205 +  double returnval = ssofRatios[channel];
1206 +  if(returnval < 0.1 || returnval > 3) {
1207 +    cout << "\nERROR! ssof ratio out of bounds for " << channel << ": " << returnval << endl;
1208 +    assert(0);
1209 +  }
1210 +  return returnval;
1211 + }
1212 + //----------------------------------------------------------------------------------------
1213 + map<TString,double> initSsofRatios(vector<CSample*> &samplev)
1214 + {
1215 +  double OS,SS;
1216 +  double OS_4e,SS_4e;
1217 +  double OS_4m,SS_4m;
1218 +  double OS_2e2m,SS_2e2m;
1219 +  cout << "Initializing ssof ratios: " << endl;
1220 +  for(unsigned isam=0; isam<samplev.size(); isam++) {
1221 +    CSample *cs = samplev[isam];
1222 +    for(unsigned ifs=0; ifs<(cs->fsv).size(); ifs++) {
1223 +      filestuff *fs = (cs->fsv)[ifs];
1224 +      if(fs->useSsofRatio_) {
1225 +        cout << "  adding from: " << fs->fname_ << endl;
1226 +        cout << "        " << fs->counters_["ratio"] << setw(8) << fixed << setprecision(2) << fs->counters_["ratio_4e"] << setw(8) << fixed << setprecision(2) << fs->counters_["ratio_4m"] << setw(8) << fixed << setprecision(2) << fs->counters_["ratio_2e2m"] << endl;
1227 +        OS      += fs->counters_["OS"];
1228 +        SS      += fs->counters_["SS"];
1229 +        OS_4e   += fs->counters_["OS_4e"];
1230 +        SS_4e   += fs->counters_["SS_4e"];
1231 +        OS_4m   += fs->counters_["OS_4m"];
1232 +        SS_4m   += fs->counters_["SS_4m"];
1233 +        OS_2e2m += fs->counters_["OS_2e2m"];
1234 +        SS_2e2m += fs->counters_["SS_2e2m"];
1235 +      }
1236 +    }
1237 +  }
1238 +  assert(OS!=0 && SS!=0 && OS_4e!=0 && SS_4e!=0 && OS_4m!=0 && SS_4m!=0 && OS_2e2m && SS_2e2m!=0);
1239 +  map<TString,double> ssofRatios;
1240 +  ssofRatios[""]     = OS/SS;
1241 +  ssofRatios["4e"]   = OS_4e/SS_4e;
1242 +  ssofRatios["4m"]   = OS_4m/SS_4m;
1243 +  ssofRatios["2e2m"] = OS_2e2m/SS_2e2m;
1244 +  cout << "returning: " << ssofRatios[""] << setw(8) << fixed << setprecision(2) << ssofRatios["4e"] << setw(8) << fixed << setprecision(2) << ssofRatios["4m"] << setw(8) << fixed << setprecision(2) << ssofRatios["2e2m"] << endl;
1245 +  return ssofRatios;
1246 + }
1247 +        

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines