Browse Source

Refactors handling of kinematic distributions

Caleb 5 years ago
parent
commit
f509b095dc

+ 2 - 0
looper/.gitignore

@@ -4,3 +4,5 @@ build/
 tags
 
 *.bak
+*.root
+*.log

+ 4 - 0
looper/CMakeLists.txt

@@ -20,3 +20,7 @@ ADD_EXECUTABLE(dump_good_sim analysis/dump_good_sim.cpp)
 # TARGET_LINK_LIBRARIES(dump_good_sim filval yaml-cpp ${ROOT_LIBRARIES})
 TARGET_LINK_LIBRARIES(dump_good_sim yaml-cpp ${ROOT_LIBRARIES})
 TARGET_INCLUDE_DIRECTORIES(dump_good_sim PUBLIC ${ROOT_INCLUDE_DIR} ${CMAKE_SOURCE_DIR} filval/include/ filval/root/include/ filval/yaml-cpp/include/)
+
+ADD_EXECUTABLE(gen_studies analysis/gen_studies.cpp)
+TARGET_LINK_LIBRARIES(gen_studies yaml-cpp ${ROOT_LIBRARIES})
+TARGET_INCLUDE_DIRECTORIES(gen_studies PUBLIC ${ROOT_INCLUDE_DIR} ${CMAKE_SOURCE_DIR} filval/include/ filval/root/include/ filval/yaml-cpp/include/)

+ 17 - 0
looper/analysis/TrackingNtupleWithSCL.h

@@ -160,6 +160,8 @@ public :
    vector<vector<float> > *see_dPhiNeg;
    vector<short>   *see_isECALDriven;
    vector<int>     *see_sclIdx;
+   vector<unsigned int> *initsee_cnt;
+   UInt_t               initsee_tot;
    vector<float>   *vtx_x;
    vector<float>   *vtx_y;
    vector<float>   *vtx_z;
@@ -201,6 +203,9 @@ public :
    vector<float>   *scl_y;
    vector<float>   *scl_z;
    vector<float>   *scl_hoe;
+   float           truePileup;
+   int             inTimePileup;
+   vector<int>     *outOfTimePileup;
 
    // List of branches
    TBranch        *b_event;   //!
@@ -338,6 +343,8 @@ public :
    TBranch        *b_see_dPhiNeg;   //!
    TBranch        *b_see_isECALDriven;   //!
    TBranch        *b_see_sclIdx;   //!
+   TBranch        *b_initsee_cnt;   //!
+   TBranch        *b_initsee_tot;   //!
    TBranch        *b_vtx_x;   //!
    TBranch        *b_vtx_y;   //!
    TBranch        *b_vtx_z;   //!
@@ -379,6 +386,9 @@ public :
    TBranch        *b_scl_y;   //!
    TBranch        *b_scl_z;   //!
    TBranch        *b_scl_hoe;   //!
+   TBranch        *b_truePileup;   //!
+   TBranch        *b_inTimePileup;   //!
+   TBranch        *b_outOfTimePileup;   //!
 
    TrackingNtuple(TTree *tree=0);
    virtual ~TrackingNtuple();
@@ -568,6 +578,7 @@ void TrackingNtuple::Init(TTree *tree)
    see_dPhiNeg = 0;
    see_isECALDriven = 0;
    see_sclIdx = 0;
+   initsee_cnt = 0;
    vtx_x = 0;
    vtx_y = 0;
    vtx_z = 0;
@@ -609,6 +620,7 @@ void TrackingNtuple::Init(TTree *tree)
    scl_y = 0;
    scl_z = 0;
    scl_hoe = 0;
+   outOfTimePileup = 0;
    // Set branch addresses and branch pointers
    if (!tree) return;
    fChain = tree;
@@ -750,6 +762,8 @@ void TrackingNtuple::Init(TTree *tree)
    fChain->SetBranchAddress("see_dPhiNeg", &see_dPhiNeg, &b_see_dPhiNeg);
    fChain->SetBranchAddress("see_isECALDriven", &see_isECALDriven, &b_see_isECALDriven);
    fChain->SetBranchAddress("see_sclIdx", &see_sclIdx, &b_see_sclIdx);
+   fChain->SetBranchAddress("initsee_cnt", &initsee_cnt, &b_initsee_cnt);
+   fChain->SetBranchAddress("initsee_tot", &initsee_tot, &b_initsee_tot);
    fChain->SetBranchAddress("vtx_x", &vtx_x, &b_vtx_x);
    fChain->SetBranchAddress("vtx_y", &vtx_y, &b_vtx_y);
    fChain->SetBranchAddress("vtx_z", &vtx_z, &b_vtx_z);
@@ -791,6 +805,9 @@ void TrackingNtuple::Init(TTree *tree)
    fChain->SetBranchAddress("scl_y", &scl_y, &b_scl_y);
    fChain->SetBranchAddress("scl_z", &scl_z, &b_scl_z);
    fChain->SetBranchAddress("scl_hoe", &scl_hoe, &b_scl_hoe);
+   fChain->SetBranchAddress("truePileup", &truePileup, &b_truePileup);
+   fChain->SetBranchAddress("inTimePileup", &inTimePileup, &b_inTimePileup);
+   fChain->SetBranchAddress("outOfTimePileup", &outOfTimePileup, &b_outOfTimePileup);
    Notify();
 }
 

+ 82 - 23
looper/analysis/config.yaml

@@ -1,29 +1,66 @@
-#max-events: 20
+# max-events: 10000
 debug: false
 
-#output-file: ../hists/ttbar-old-seeding.root
+# output-dir: ../hists
 source-file-key: local
 
 hoe_cut: 0.15
 
-zee-new-default:
-    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/ZToEE_NNPDF30_13TeV-powheg_M_120_200/EGamma_18-04-26_trackingNtuple_narrow-eg/180426_232815/0000/trackingNtuple_*.root
-
-zee-new-wide:
-    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/ZToEE_NNPDF30_13TeV-powheg_M_120_200/EGamma_18-04-26_trackingNtuple_wide-eg/180426_232942/0000/trackingNtuple_*.root
-
-zee-old-default:
-    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/ZToEE_NNPDF30_13TeV-powheg_M_120_200/EGamma_18-04-26_trackingNtuple_old-seeding-eg/180426_233131/0000/trackingNtuple_*.root
-
-tt-new-default:
-    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/TT_TuneCUETP8M2T4_13TeV-powheg-pythia8/EGamma_18-04-26_trackingNtuple_narrow-ttbar/180426_232215/0000/trackingNtuple_*.root
-
-tt-new-wide:
-    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/TT_TuneCUETP8M2T4_13TeV-powheg-pythia8/EGamma_18-04-26_trackingNtuple_wide-ttbar/180426_232354/0000/trackingNtuple_*.root
-
-tt-old-default:
-    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/TT_TuneCUETP8M2T4_13TeV-powheg-pythia8/EGamma_18-04-26_trackingNtuple_old-seeding-ttbar/180426_232526/0000/trackingNtuple_*.root
-
+### Results with skipping disabled
+dy-old-default-noskip:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/DYJetsToLL_M-50_TuneCUETP8M1_13TeV-madgraphMLM-pythia8/EGamma_18_08_01_trackingNtuple_old-seeding_default_dy/180801_230114/0000/trackingNtuple_*.root
+dy-new-default-noskip:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/DYJetsToLL_M-50_TuneCUETP8M1_13TeV-madgraphMLM-pythia8/EGamma_18_08_01_trackingNtuple_new-seeding_default_dy/180801_230234/0000/trackingNtuple_*.root
+dy-new-wide-noskip:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/DYJetsToLL_M-50_TuneCUETP8M1_13TeV-madgraphMLM-pythia8/EGamma_18_08_01_trackingNtuple_new-seeding_wide_dy/180801_230354/0000/trackingNtuple_*.root
+dy-new-extra-wide-noskip:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/DYJetsToLL_M-50_TuneCUETP8M1_13TeV-madgraphMLM-pythia8/EGamma_18_08_01_trackingNtuple_new-seeding_extra-wide_dy/180801_230559/0000/trackingNtuple_*.root
+tt-old-default-noskip:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/TT_TuneCUETP8M2T4_13TeV-powheg-pythia8/EGamma_18_08_01_trackingNtuple_old-seeding_default_tt/180801_224957/0000/trackingNtuple_*.root
+tt-new-default-noskip:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/TT_TuneCUETP8M2T4_13TeV-powheg-pythia8/EGamma_18_08_01_trackingNtuple_new-seeding_default_tt/180801_225618/0000/trackingNtuple_*.root
+tt-new-wide-noskip:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/TT_TuneCUETP8M2T4_13TeV-powheg-pythia8/EGamma_18_08_01_trackingNtuple_new-seeding_wide_tt/180801_225803/0000/trackingNtuple_*.root
+tt-new-extra-wide-noskip:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/TT_TuneCUETP8M2T4_13TeV-powheg-pythia8/EGamma_18_08_01_trackingNtuple_new-seeding_extra-wide_tt/180801_225941/0000/trackingNtuple_*.root
+
+### Results with skipping enabled
+dy-old-default-skip:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/DYJetsToLL_M-50_TuneCUETP8M1_13TeV-madgraphMLM-pythia8/EGamma_18_08_13_trackingNtuple_old-seeding_default_dy/180813_190806/0000/trackingNtuple_*.root
+dy-new-default-skip:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/DYJetsToLL_M-50_TuneCUETP8M1_13TeV-madgraphMLM-pythia8/EGamma_18_08_13_trackingNtuple_new-seeding_default_dy/180813_191441/0000/trackingNtuple_*.root
+dy-new-wide-skip:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/DYJetsToLL_M-50_TuneCUETP8M1_13TeV-madgraphMLM-pythia8/EGamma_18_08_13_trackingNtuple_new-seeding_wide_dy/180813_191601/0000/trackingNtuple_*.root
+dy-new-extra-wide-skip:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/DYJetsToLL_M-50_TuneCUETP8M1_13TeV-madgraphMLM-pythia8/EGamma_18_08_13_trackingNtuple_new-seeding_extra-wide_dy/180813_191805/0000/trackingNtuple_*.root
+tt-old-default-skip:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/TT_TuneCUETP8M2T4_13TeV-powheg-pythia8/EGamma_18_08_13_trackingNtuple_old-seeding_default_tt/180813_191911/0000/trackingNtuple_*.root
+tt-new-default-skip:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/TT_TuneCUETP8M2T4_13TeV-powheg-pythia8/EGamma_18_08_13_trackingNtuple_new-seeding_default_tt/180813_192237/0000/trackingNtuple_*.root
+tt-new-wide-skip:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/TT_TuneCUETP8M2T4_13TeV-powheg-pythia8/EGamma_18_08_13_trackingNtuple_new-seeding_wide_tt/180813_192341/0000/trackingNtuple_*.root
+tt-new-extra-wide-skip:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/TT_TuneCUETP8M2T4_13TeV-powheg-pythia8/EGamma_18_08_13_trackingNtuple_new-seeding_extra-wide_tt/180813_193638/0000/trackingNtuple_*.root
+
+
+### Results with skipping enabled and pileup added (tag fixed
+dy-old-default-skip-pileup:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/DYJetsToLL_M-50_TuneCUETP8M1_13TeV-madgraphMLM-pythia8/EGamma_18_10_30_trackingNtuple_old-seeding_default_dy/181031_021730/0000/trackingNtuple_*.root
+dy-new-default-skip-pileup:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/DYJetsToLL_M-50_TuneCUETP8M1_13TeV-madgraphMLM-pythia8/EGamma_18_10_30_trackingNtuple_new-seeding_default_dy/181031_022040/0000/trackingNtuple_*.root
+dy-new-wide-skip-pileup:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/DYJetsToLL_M-50_TuneCUETP8M1_13TeV-madgraphMLM-pythia8/EGamma_18_10_30_trackingNtuple_new-seeding_wide_dy/181031_022206/0000/trackingNtuple_*.root
+dy-new-extra-wide-skip-pileup:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/DYJetsToLL_M-50_TuneCUETP8M1_13TeV-madgraphMLM-pythia8/EGamma_18_10_30_trackingNtuple_new-seeding_extra-wide_dy/181031_022332/0000/trackingNtuple_*.root
+
+tt-old-default-skip-pileup:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/TT_TuneCUETP8M2T4_13TeV-powheg-pythia8/EGamma_18_10_30_trackingNtuple_old-seeding_default_tt/181031_022500/0000/trackingNtuple_*.root
+tt-new-default-skip-pileup:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/TT_TuneCUETP8M2T4_13TeV-powheg-pythia8/EGamma_18_10_30_trackingNtuple_new-seeding_default_tt/181031_022808/0000/trackingNtuple_*.root
+tt-new-wide-skip-pileup:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/TT_TuneCUETP8M2T4_13TeV-powheg-pythia8/EGamma_18_10_30_trackingNtuple_new-seeding_wide_tt/181031_022927/0000/trackingNtuple_*.root
+tt-new-extra-wide-skip-pileup:
+    files: /mnt/hadoop/user/uscms01/pnfs/unl.edu/data4/cms/store/user/cfangmei/TT_TuneCUETP8M2T4_13TeV-powheg-pythia8/EGamma_18_10_30_trackingNtuple_new-seeding_extra-wide_tt/181031_023040/0000/trackingNtuple_*.root
 
 local:
     files: /home/caleb/Sources/EGamma/data/zee.root
@@ -122,9 +159,13 @@ hist-params:
         nbins_x: 30
         low_x: -3.14159
         high_x: 3.14159
+    PU:
+        nbins_x: 101
+        low_x: -0.5
+        high_x: 100.5
 
     pt_fine:
-        nbins_x: 300
+        nbins_x: 3000
         low_x: 0
         high_x: 300
     eta_fine:
@@ -162,6 +203,24 @@ hist-params:
         low_y: 0.5
         high_y: 5.5
 
+    n_initseeds_v_PU:
+        label_x: "# Initial Seeds"
+        nbins_x: 1001
+        low_x: -0.5
+        high_x: 1000.5
+        label_y: "# PU"
+        nbins_y: 101
+        low_y: -0.5
+        high_y: 100.5
+
+    n_seeds_v_PU:
+        nbins_x: 101
+        low_x: -0.5
+        high_x: 100.5
+        nbins_y: 101
+        low_y: -0.5
+        high_y: 100.5
+
     ecal_energy_resolution:
         label_x: "delta E"
         nbins_x: 200
@@ -169,9 +228,9 @@ hist-params:
         high_x: 1
 
     n_seeds:
-        nbins_x: 201
+        nbins_x: 401
         low_x: -0.5
-        high_x: 200.5
+        high_x: 400.5
 
     matched_dR:
         nbins_x: 300

+ 44 - 19
looper/analysis/dump_good_sim.cpp

@@ -21,8 +21,8 @@ SuperClusterCollection scls;
 
 void register_objects(TrackingDataSet& tds){
     /* seeds.init(tds); */
-    sim_tracks.init(tds);
-    sim_vertices.init(tds);
+    sim_tracks.init(&tds);
+    sim_vertices.init(&tds);
     /* gsf_tracks.init(tds); */
     /* scls.init(tds); */
 }
@@ -66,8 +66,10 @@ template <typename T>
 std::ostream& operator<< (std::ostream& out, const std::vector<T>& v) {
   if ( !v.empty() ) {
     out << '[';
-    std::copy (v.begin(), v.end(), std::ostream_iterator<T>(out, ", "));
+    std::copy(v.begin(), v.end(), std::ostream_iterator<T>(out, ", "));
     out << "\b\b]";
+  } else {
+    cout << "[]";
   }
   return out;
 }
@@ -96,23 +98,46 @@ void run(){
     while (tds.next()) {
 
         cout << "Event: " << tds.get_current_event() << endl;
-        for (const auto& sim_track : sim_tracks) {
-            if (!is_good_sim(sim_track)) continue;
-            /* SimVertex parentvtx = sim_vertices[sim_track.parentVtxIdx()]; */
-            /* SimVertex parentvtx = sim_vertices[sim_track.parentVtxIdx()]; */
-            cout << "\t" << sim_track.pdgId() << " "
-                 << sim_track.pt() << " "
-                 << sim_track.eta() << " "
-                 << sim_track.phi() << " "
-                 << sim_track.parentVtxIdx() << " "
-                 << sim_track.decayVtxIdx() << " ";
-            if (sim_track.decayVtxIdx().size() > 0) {
-                cout << sim_tracks[sim_vertices[sim_track.decayVtxIdx()[0]].daughterSimIdx()[0]].pdgId();
-            }
-
+        /* for (const auto& sim_track : sim_tracks) { */
+        /*     if (!is_good_sim(sim_track)) continue; */
+        /*     /1* SimVertex parentvtx = sim_vertices[sim_track.parentVtxIdx()]; *1/ */
+        /*     /1* SimVertex parentvtx = sim_vertices[sim_track.parentVtxIdx()]; *1/ */
+        /*     cout << "\t" << sim_track.pdgId() << " " */
+        /*          << sim_track.pt() << " " */
+        /*          << sim_track.eta() << " " */
+        /*          << sim_track.phi() << " " */
+        /*          << sim_track.parentVtxIdx() << "(" */
+        /*          << sim_vertices[sim_track.parentVtxIdx()].processType() << ") " */
+        /*          << sim_track.decayVtxIdx() << " "; */
+        /*     if (sim_track.decayVtxIdx().size() > 0) { */
+        /*         cout << sim_tracks[sim_vertices[sim_track.decayVtxIdx()[0]].daughterSimIdx()[0]].pdgId(); */
+        /*     } */
+        /*     cout << endl; */
+        /*     // Log Sim Track */
+        /* } */
+
+        int n_pvx = 0;
+        cout << setprecision(3);
+        for (const auto& sim_vtx : sim_vertices) {
+            if (sim_vtx.sourceSimIdx().size() > 0) continue;
+            n_pvx++;
+            cout << n_pvx << " ("
+                 << sim_vtx.x() <<  ", "
+                 << sim_vtx.y() <<  ", "
+                 << sim_vtx.z() <<  ") "
+                 << sim_vtx.processType() << endl;
+            for (const int& trk_idx : sim_vtx.daughterSimIdx()) {
+                const auto& trk = sim_tracks[trk_idx];
+                cout << "\t"
+                     << setw(5) << trk.pdgId()
+                     << "("
+                     << setw(5) << trk.pt()  << ", "
+                     << setw(5) << trk.eta() << ", "
+                     << setw(5) << trk.phi() << ")"
+                     << endl;
 
-            cout << endl;
-            // Log Sim Track
+            }
+            /* cout << sim_vtx.sourceSimIdx() << endl; */
         }
     }
     tds.save_all();

+ 261 - 0
looper/analysis/gen_studies.cpp

@@ -0,0 +1,261 @@
+#include <iostream>
+#include <vector>
+#include <cmath>
+#include <numeric>
+#include <TSystem.h>
+#include <Math/VectorUtil.h>
+
+#include "filval.hpp"
+#include "root_filval.hpp"
+#include "common.hpp"
+
+#include "analysis/TrackingNtupleObjs.hpp"
+
+const double pi = 3.1415926535897932384626;
+const double pi2 = 2*pi;
+
+std::map<int, std::string> algoName = {
+    {0, "undefAlgorithm"                },
+    {1, "ctf"                           },
+    {2, "duplicateMerge"                },
+    {3, "cosmics"                       },
+    {4, "initialStep"                   },
+    {5, "lowPtTripletStep"              },
+    {6, "pixelPairStep"                 },
+    {7, "detachedTripletStep"           },
+    {8, "mixedTripletStep"              },
+    {9, "pixelLessStep"                 },
+    {10, "tobTecStep"                   },
+    {11, "jetCoreRegionalStep"          },
+    {12, "conversionStep"               },
+    {13, "muonSeededStepInOut"          },
+    {14, "muonSeededStepOutIn"          },
+    {15, "outInEcalSeededConv"          },
+    {16, "inOutEcalSeededConv"          },
+    {17, "nuclInter"                    },
+    {18, "standAloneMuon"               },
+    {19, "globalMuon"                   },
+    {20, "cosmicStandAloneMuon"         },
+    {21, "cosmicGlobalMuon"             },
+    {22, "highPtTripletStep"            },
+    {23, "lowPtQuadStep"                },
+    {24, "detachedQuadStep"             },
+    {25, "reservedForUpgrades1"         },
+    {26, "reservedForUpgrades2"         },
+    {27, "bTagGhostTracks"              },
+    {28, "beamhalo"                     },
+    {29, "gsf"                          },
+    {30, "hltPixel"                     },
+    {31, "hltIter0"                     },
+    {32, "hltIter1"                     },
+    {33, "hltIter2"                     },
+    {34, "hltIter3"                     },
+    {35, "hltIter4"                     },
+    {36, "hltIterX"                     },
+    {37, "hiRegitMuInitialStep"         },
+    {38, "hiRegitMuLowPtTripletStep"    },
+    {39, "hiRegitMuPixelPairStep"       },
+    {40, "hiRegitMuDetachedTripletStep" },
+    {41, "hiRegitMuMixedTripletStep"    },
+    {42, "hiRegitMuPixelLessStep"       },
+    {43, "hiRegitMuTobTecStep"          },
+    {44, "hiRegitMuMuonSeededStepInOut" },
+    {45, "hiRegitMuMuonSeededStepOutIn" }
+};
+
+
+
+typedef ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<float>> Vec4;
+
+SeedCollection seeds;
+GenCollection gens;
+SimTrackCollection sim_tracks;
+SimVertexCollection sim_vertices;
+TrackCollection gsf_tracks;
+SuperClusterCollection scls;
+
+std::vector<SimTrack> sim_els;
+
+Value<float>* truePileup;
+Value<int>* inTimePileup;
+Value<unsigned long>* event;
+/* Value<vector<int>>* outOfTimePileup; */
+
+/* Value<vector<unsigned int>>* totalSeedsAlgo; */
+Value<unsigned int>* totalSeeds;
+
+void register_objects(TrackingDataSet& tds){
+    seeds.init(&tds);
+    gens.init(&tds);
+    /* sim_tracks.init(&tds); */
+    /* sim_vertices.init(&tds); */
+    gsf_tracks.init(&tds);
+    /* scls.init(&tds); */
+}
+
+struct {
+    Value<float>* x;
+    Value<float>* y;
+    Value<float>* z;
+    Value<float>* sigma_x;
+    Value<float>* sigma_y;
+    Value<float>* sigma_z;
+} bs;
+
+
+template <typename T>
+struct KinColl {
+    T* pt;
+    T* eta;
+    T* phi;
+};
+
+
+bool in_lum_region(const SimVertex& vertex) {
+    /* Here approximate the luminous region as a cylinder with length 5*\sigma_z and radius
+     * sqrt(\simga_x^2 + \sigma_y^2) centered as beamspot position.
+     */
+    float dx = vertex.x() - bs.x->get();
+    float dy = vertex.y() - bs.y->get();
+    float dz = vertex.z() - bs.z->get();
+    auto radius = static_cast<float>(5 * sqrt(pow(bs.sigma_x->get(), 2) + pow(bs.sigma_y->get(), 2)));
+    float half_len = 5*bs.sigma_z->get();
+    return sqrt(dx*dx + dy*dy) < radius and abs(dz) < half_len;
+};
+
+bool is_good_sim(const SimTrack& sim_track) {
+    const auto& vertex = sim_vertices[sim_track.parentVtxIdx()];
+    return abs(sim_track.pdgId()) == 11 and  // electrons
+           in_lum_region(vertex) and         // from luminous region
+           abs(sim_track.eta())<3.0;         // inside ECAL acceptance
+};
+
+bool is_good_sim(const std::vector<SimTrack> prompt_sims, const SimTrack& sim_track) {
+    return find(prompt_sims.begin(), prompt_sims.end(), sim_track) != prompt_sims.end();
+};
+
+bool is_good_seed(const Seed& seed, float hoe_cut) {
+    return seed.isECALDriven() and seed.hoe() < hoe_cut;
+}
+
+float reco_energy_rel_err(const SimTrack& sim_track, const Seed& seed) {
+    return (sim_track.pt() - seed.Et()) / sim_track.pt() ;
+}
+
+float reco_energy_rel_err(const SimTrack& sim_track, const Track& track) {
+    return (sim_track.pt() - track.pt()) / sim_track.pt() ;
+}
+
+template<typename TrackOrSeed>
+bool reco_energy_consistent(const SimTrack& sim_track, const TrackOrSeed& track, float consistency_cut=0.1) {
+    return fabs(reco_energy_rel_err(sim_track, track)) < consistency_cut;
+}
+
+Vec4 scl_p4(const SuperCluster& scl) {
+    return Vec4(scl.px(), scl.py(), scl.pz(), scl.e());
+}
+
+double dphi(double phi1, double phi2) {
+    auto spec_mod = [](double a) {
+        return a - floor(a/pi2)*pi2;
+    };
+    return spec_mod(phi2 - phi1 + pi) - pi;
+}
+
+
+double deltaR(double eta1, double phi1, double eta2, double phi2) {
+    return sqrt(pow(eta1 - eta2, 2.0) +
+                pow(dphi(phi1, phi2), 2.0));
+}
+
+struct Track_ {
+    unsigned long idx;
+    float pt;
+    float eta;
+    float phi;
+};
+
+
+void run(){
+    using namespace std;
+    using namespace fv;
+    using namespace fv_root;
+    using namespace fv_util;
+    auto file_list = the_config->get_source_files();
+    string output_filename = the_config->get_output_filename();
+    TrackingDataSet tds(output_filename, file_list, "trackingNtuple/tree");
+    register_objects(tds);
+
+    auto hoe_cut = the_config->get("hoe_cut").as<float>(999);
+
+
+    inTimePileup = tds.track_branch<int>("inTimePileup");
+    truePileup = tds.track_branch<float>("truePileup");
+    event = tds.track_branch<unsigned long>("event");
+
+    while (tds.next()) {
+        cout << "event: " << event << endl;
+
+        // Find Z's Children
+        /* for (const auto& gen : gens) { */
+        /*     if (not gen.isPrompt()) continue; */
+        /*     if (abs(gen.pdgId()) == 11 or */
+        /*         abs(gen.pdgId()) == 13 or */
+        /*         abs(gen.pdgId()) == 15) { */
+        /*         cout << "  " << gen.pdgId() << endl; */
+        /*     } */
+        /* } */
+
+        vector<Track_> tracks_;
+
+        for (const auto& gsf_track : gsf_tracks) {
+            const auto& seed = seeds[gsf_track.seedIdx()];
+            tracks_.push_back({gsf_track.idx, gsf_track.pt(), gsf_track.eta(), gsf_track.phi()});
+            cout << gsf_track.idx << ") " <<
+                gsf_track.nPixel() << " : " << gsf_track.nPixelLay() << " | " <<
+                gsf_track.nStrip() << " : " << gsf_track.nStripLay() << " | " <<
+                algoName[gsf_track.originalAlgo()] <<  " | " <<
+                algoName[gsf_track.algo()] <<  " | " <<
+                algoName[seed.algo()] <<  " | " <<
+                gsf_track.algoMask() <<  " | " <<
+                endl;
+        }
+        std::sort(tracks_.begin(), tracks_.end(), [](Track_ a, Track_ b) {
+            return a.phi < b.phi;
+        });
+        std::sort(tracks_.begin(), tracks_.end(), [](Track_ a, Track_ b) {
+            return a.eta < b.eta;
+        });
+        std::sort(tracks_.begin(), tracks_.end(), [](Track_ a, Track_ b) {
+            return a.pt < b.pt;
+        });
+        /* for (const auto& track_ : tracks_) { */
+        /*     cout << track_.idx << ") " << */ 
+        /*         track_.pt << " : " << */
+        /*         track_.eta << " : " << */
+        /*         track_.phi << endl; */
+        /* } */
+    }
+    /* tds.save_all(); */
+}
+
+int main(int argc, char * argv[]){
+    using namespace fv_util;
+    ArgParser args(argc, argv);
+    if(args.cmd_option_exists("-c")) {
+        init_config(args.get_cmd_option("-c"));
+        args.update_config();
+        if (args.cmd_option_exists("-s")) {
+            the_config->update_key("silent", true);
+        }
+        if (args.cmd_option_exists("-b")) {
+            the_config->update_key("batch", true);
+        }
+        init_log(LogPriority::kLogInfo);
+//        gSystem->Load("libfilval.so");
+        run();
+    } else {
+        cout << "Usage: ./" << argv[0] << " (-s) (-b) -c config_file.yaml" << endl;
+    }
+    return 0;
+}

+ 394 - 251
looper/analysis/tracking_eff.cpp

@@ -2,6 +2,7 @@
 #include <vector>
 #include <cmath>
 #include <numeric>
+#include <utility>
 #include <TSystem.h>
 #include <Math/VectorUtil.h>
 
@@ -11,6 +12,9 @@
 
 #include "analysis/TrackingNtupleObjs.hpp"
 
+const double pi = 3.1415926535897932384626;
+const double pi2 = 2*pi;
+
 typedef ROOT::Math::LorentzVector<ROOT::Math::PxPyPzE4D<float>> Vec4;
 
 SeedCollection seeds;
@@ -22,6 +26,13 @@ SuperClusterCollection scls;
 
 std::vector<SimTrack> sim_els;
 
+Value<float>* truePileup;
+Value<int>* inTimePileup;
+/* Value<vector<int>>* outOfTimePileup; */
+
+/* Value<vector<unsigned int>>* totalSeedsAlgo; */
+Value<unsigned int>* totalSeeds;
+
 void register_objects(TrackingDataSet& tds){
     seeds.init(&tds);
     gens.init(&tds);
@@ -40,13 +51,72 @@ struct {
     Value<float>* sigma_z;
 } bs;
 
-template <typename T>
+struct EffColl {
+    EfficiencyContainer<float>* pt;
+    EfficiencyContainer<float>* eta;
+    EfficiencyContainer<float>* phi;
+    EffColl(TrackingDataSet& tds, const std::string& pfx,
+            THParams pt_params, THParams eta_params, THParams phi_params,
+            const std::string& sfx="") {
+        std::string _sfx = "";
+        if (sfx != "") _sfx = "_"+sfx;
+
+        pt = tds.register_container<EfficiencyContainer<float>>(pfx+"_v_pt"+_sfx, pt_params);
+        eta = tds.register_container<EfficiencyContainer<float>>(pfx+"_v_eta"+_sfx, eta_params);
+        phi = tds.register_container<EfficiencyContainer<float>>(pfx+"_v_phi"+_sfx, phi_params);
+    }
+};
+
 struct KinColl {
-    T* pt;
-    T* eta;
-    T* phi;
+    ContainerTH1<float>* pt;
+    ContainerTH1<float>* eta;
+    ContainerTH1<float>* phi;
+    ContainerTH2<float>* eta_phi;
+
+    KinColl(TrackingDataSet& tds, const std::string& pfx,
+            THParams pt_params, THParams eta_params, THParams phi_params,
+            const std::string& sfx="") {
+        std::string _sfx = "";
+        if (sfx != "") _sfx = "_"+sfx;
+
+        pt = tds.register_container<ContainerTH1<float>>(pfx+"_v_pt"+_sfx, pt_params);
+        eta = tds.register_container<ContainerTH1<float>>(pfx+"_v_eta"+_sfx, eta_params);
+        phi = tds.register_container<ContainerTH1<float>>(pfx+"_v_phi"+_sfx, phi_params);
+
+        THParams eta_phi_params = eta_params;
+        eta_phi_params.low_y = phi_params.low_x;
+        eta_phi_params.high_y = phi_params.high_x;
+        eta_phi_params.label_y = phi_params.label_x;
+
+        eta_phi = tds.register_container<ContainerTH2<float>>(pfx+"_v_eta_phi"+_sfx, eta_phi_params);
+    }
 };
 
+template <typename T1, typename T2>
+struct AugKinColl {
+    T1* pt;
+    T1* eta;
+    T1* phi;
+    T2* eta_phi;
+};
+
+int get_n_pv() {
+    /* std::cout << "------------------------------------------------" << std::endl; */
+    int n_pv = 0;
+    for (const auto& sim_vertex : sim_vertices) {
+        if (sim_vertex.sourceSimIdx().size() == 0) {
+            /* std::cout << "(" */
+            /*     << sim_vertex.x() << ", " */
+            /*     << sim_vertex.y() << ", " */
+            /*     << sim_vertex.z() << ") " */
+            /*     << sim_vertex.processType() << std::endl; */
+            n_pv++;
+        }
+    }
+    /* std::cout << "::::: " << pileup << std::endl; */
+    return n_pv / 2; // for some reason, all vertices are repeated twice...
+}
+
 bool in_lum_region(const SimVertex& vertex) {
     /* Here approximate the luminous region as a cylinder with length 5*\sigma_z and radius
      * sqrt(\simga_x^2 + \sigma_y^2) centered as beamspot position.
@@ -91,9 +161,17 @@ Vec4 scl_p4(const SuperCluster& scl) {
     return Vec4(scl.px(), scl.py(), scl.pz(), scl.e());
 }
 
+double dphi(double phi1, double phi2) {
+    auto spec_mod = [](double a) {
+        return a - floor(a/pi2)*pi2;
+    };
+    return spec_mod(phi2 - phi1 + pi) - pi;
+}
+
+
 double deltaR(double eta1, double phi1, double eta2, double phi2) {
     return sqrt(pow(eta1 - eta2, 2.0) +
-                pow(phi1 - phi2, 2.0));
+                pow(dphi(phi1, phi2), 2.0));
 }
 
 void update_sim_els() {
@@ -211,6 +289,11 @@ void run(){
     using namespace fv;
     using namespace fv_root;
     using namespace fv_util;
+
+    auto lookup = [](const std::string&& key) {
+        return THParams::lookup(std::forward<const std::string>(key));
+    };
+
     auto file_list = the_config->get_source_files();
     string output_filename = the_config->get_output_filename();
     TrackingDataSet tds(output_filename, file_list, "trackingNtuple/tree");
@@ -227,6 +310,12 @@ void run(){
         tds.track_branch<float>("bsp_sigmaz")
     };
 
+    inTimePileup = tds.track_branch<int>("inTimePileup");
+    truePileup = tds.track_branch<float>("truePileup");
+
+
+    totalSeeds = tds.track_branch<unsigned int>("initsee_tot");
+
     enum TMType {
         NoMatch = 0,
         SeedMatched = 1,
@@ -272,23 +361,23 @@ void run(){
     for (int hit=1; hit<=3; hit++) {
         for (int tm_type = NoMatch; tm_type <= SeedAndTrackMatched; tm_type++) {
             for (int layer=1; layer<=4; layer++) {
-                hist_params = (hit == 1) ? THParams::lookup("dRz_v_Et") : THParams::lookup("dRz_v_Et_outer_hits");
+                hist_params = (hit == 1) ? lookup("dRz_v_Et") : lookup("dRz_v_Et_outer_hits");
                 set_name("dRz", "BPIX", layer, hit, tm_type);
                 BPIX_residuals_dRz[make_tuple(layer, hit, tm_type)] = tds.register_container<ContainerTH2<float>>(name.str(), hist_params);
                 set_name("dRz", "FPIX", layer, hit, tm_type);
                 FPIX_residuals_dRz[make_tuple(layer, hit, tm_type)] = tds.register_container<ContainerTH2<float>>(name.str(), hist_params);
 
-                hist_params = (hit == 1) ? THParams::lookup("dPhi_v_Et") : THParams::lookup("dPhi_v_Et_outer_hits");
+                hist_params = (hit == 1) ? lookup("dPhi_v_Et") : lookup("dPhi_v_Et_outer_hits");
                 set_name("dPhi", "BPIX", layer, hit, tm_type);
                 BPIX_residuals_dPhi[make_tuple(layer, hit, tm_type)] = tds.register_container<ContainerTH2<float>>(name.str(), hist_params);
                 set_name("dPhi", "FPIX", layer, hit, tm_type);
                 FPIX_residuals_dPhi[make_tuple(layer, hit, tm_type)] = tds.register_container<ContainerTH2<float>>(name.str(), hist_params);
             }
-            hist_params = (hit == 1) ? THParams::lookup("dRz_v_Et") : THParams::lookup("dRz_v_Et_outer_hits");
+            hist_params = (hit == 1) ? lookup("dRz_v_Et") : lookup("dRz_v_Et_outer_hits");
             set_name("dRz", "ALL", 0, hit, tm_type);
             residuals_dRz[std::make_tuple(hit, tm_type)] = tds.register_container<ContainerTH2<float>>(name.str(), hist_params);
 
-            hist_params = (hit == 1) ? THParams::lookup("dPhi_v_Et") : THParams::lookup("dPhi_v_Et_outer_hits");
+            hist_params = (hit == 1) ? lookup("dPhi_v_Et") : lookup("dPhi_v_Et_outer_hits");
             set_name("dPhi", "ALL", 0, hit, tm_type);
             residuals_dPhi[make_tuple(hit, tm_type)] = tds.register_container<ContainerTH2<float>>(name.str(), hist_params);
         }
@@ -317,194 +406,137 @@ void run(){
     for (int hit=1; hit<=3; hit++) {
         name.str("");
         name << "dPhi_residuals_v_eta_H" << hit;
-        hist_params = (hit==1) ? THParams::lookup("dPhi_v_eta") : THParams::lookup("dPhi_v_eta_outer_hits");
+        hist_params = (hit==1) ? lookup("dPhi_v_eta") : lookup("dPhi_v_eta_outer_hits");
         dPhi_residuals_v_eta[hit] = tds.register_container<ContainerTH2<float>>(name.str(), hist_params);
 
         name.str("");
         name << "dRz_residuals_v_eta_H" << hit;
-        hist_params = (hit==1) ? THParams::lookup("dRz_v_eta") : THParams::lookup("dRz_v_eta_outer_hits");
+        hist_params = (hit==1) ? lookup("dRz_v_eta") : lookup("dRz_v_eta_outer_hits");
         dRz_residuals_v_eta[hit] = tds.register_container<ContainerTH2<float>>(name.str(), hist_params);
         for (int region=1; region<=eta_regions[hit].size()-1; region++){
-            hist_params = (hit==1) ? THParams::lookup("dRz_v_Et") : THParams::lookup("dRz_v_Et_outer_hits");
+            hist_params = (hit==1) ? lookup("dRz_v_Et") : lookup("dRz_v_Et_outer_hits");
             name.str("");
             name << "dRz_residuals_H"  << hit << "_R" << region;
             dRz_residuals_v_region[{hit, region}] = tds.register_container<ContainerTH2<float>>(name.str(), hist_params);
 
-            hist_params = (hit==1) ? THParams::lookup("dPhi_v_Et") : THParams::lookup("dPhi_v_Et_outer_hits");
+            hist_params = (hit==1) ? lookup("dPhi_v_Et") : lookup("dPhi_v_Et_outer_hits");
             name.str("");
             name << "dPhi_residuals_H"  << hit << "_R" << region;
             dPhi_residuals_v_region[{hit, region}] = tds.register_container<ContainerTH2<float>>(name.str(), hist_params);
         }
     }
 
-    KinColl<ContainerTH1<float>> good_sim_kinems = {
-            tds.register_container<ContainerTH1<float>>("good_sim_v_pt",  THParams::lookup("pt_fine")),
-            tds.register_container<ContainerTH1<float>>("good_sim_v_eta", THParams::lookup("eta_fine")),
-            tds.register_container<ContainerTH1<float>>("good_sim_v_phi", THParams::lookup("phi_fine"))};
-
-    KinColl<ContainerTH1<float>> gsf_kinems = {
-            tds.register_container<ContainerTH1<float>>("gsf_track_v_pt",  THParams::lookup("pt_fine")),
-            tds.register_container<ContainerTH1<float>>("gsf_track_v_eta", THParams::lookup("eta_fine")),
-            tds.register_container<ContainerTH1<float>>("gsf_track_v_phi", THParams::lookup("phi_fine"))};
-
-    KinColl<ContainerTH1<float>> seed_kinems = {
-            tds.register_container<ContainerTH1<float>>("seed_v_pt",  THParams::lookup("pt_fine")),
-            tds.register_container<ContainerTH1<float>>("seed_v_eta", THParams::lookup("eta_fine")),
-            tds.register_container<ContainerTH1<float>>("seed_v_phi", THParams::lookup("phi_fine"))};
-
-    KinColl<ContainerTH1<float>> scl_kinems = {
-            tds.register_container<ContainerTH1<float>>("scl_v_pt",  THParams::lookup("pt_fine")),
-            tds.register_container<ContainerTH1<float>>("scl_v_eta", THParams::lookup("eta_fine")),
-            tds.register_container<ContainerTH1<float>>("scl_v_phi", THParams::lookup("phi_fine"))};
-
-    KinColl<ContainerTH1<float>> prompt_kinems = {
-            tds.register_container<ContainerTH1<float>>("prompt_v_pt",  THParams::lookup("pt_fine")),
-            tds.register_container<ContainerTH1<float>>("prompt_v_eta", THParams::lookup("eta_fine")),
-            tds.register_container<ContainerTH1<float>>("prompt_v_phi", THParams::lookup("phi_fine"))};
-
-    KinColl<ContainerTH1<float>> nonprompt_kinems = {
-            tds.register_container<ContainerTH1<float>>("nonprompt_v_pt",  THParams::lookup("pt_fine")),
-            tds.register_container<ContainerTH1<float>>("nonprompt_v_eta", THParams::lookup("eta_fine")),
-            tds.register_container<ContainerTH1<float>>("nonprompt_v_phi", THParams::lookup("phi_fine"))};
-
-
-    KinColl<EfficiencyContainer<float>> seed_eff = {
-            tds.register_container<EfficiencyContainer<float>>("seed_eff_v_pt",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("seed_eff_v_eta", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("seed_eff_v_phi", THParams::lookup("phi"))};
-    KinColl<EfficiencyContainer<float>> seed_pur = {
-            tds.register_container<EfficiencyContainer<float>>("seed_pur_v_pt",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("seed_pur_v_eta", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("seed_pur_v_phi", THParams::lookup("phi"))};
-
-    KinColl<EfficiencyContainer<float>> tracking_eff = {
-            tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_pt",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_eta", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_phi", THParams::lookup("phi"))};
-    KinColl<EfficiencyContainer<float>> tracking_pur = {
-            tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_pt",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_eta", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_phi", THParams::lookup("phi"))};
-    KinColl<EfficiencyContainer<float>> prompt_eff = {
-            tds.register_container<EfficiencyContainer<float>>("prompt_eff_v_pt",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("prompt_eff_v_eta", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("prompt_eff_v_phi", THParams::lookup("phi"))};
-    KinColl<EfficiencyContainer<float>> prompt_pur = {
-            tds.register_container<EfficiencyContainer<float>>("prompt_pur_v_pt",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("prompt_pur_v_eta", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("prompt_pur_v_phi", THParams::lookup("phi"))};
-    KinColl<EfficiencyContainer<float>> nonprompt_eff = {
-            tds.register_container<EfficiencyContainer<float>>("nonprompt_eff_v_pt",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("nonprompt_eff_v_eta", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("nonprompt_eff_v_phi", THParams::lookup("phi"))};
-    KinColl<EfficiencyContainer<float>> nonprompt_pur = {
-            tds.register_container<EfficiencyContainer<float>>("nonprompt_pur_v_pt",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("nonprompt_pur_v_eta", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("nonprompt_pur_v_phi", THParams::lookup("phi"))};
-
-    KinColl<EfficiencyContainer<float>> tracking_eff_dR = {
-            tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_pt_dR",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_eta_dR", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_phi_dR", THParams::lookup("phi"))};
-    KinColl<EfficiencyContainer<float>> tracking_pur_dR = {
-            tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_pt_dR",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_eta_dR", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_phi_dR", THParams::lookup("phi"))};
-    KinColl<EfficiencyContainer<float>> prompt_eff_dR = {
-            tds.register_container<EfficiencyContainer<float>>("prompt_eff_v_pt_dR",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("prompt_eff_v_eta_dR", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("prompt_eff_v_phi_dR", THParams::lookup("phi"))};
-    KinColl<EfficiencyContainer<float>> prompt_pur_dR = {
-            tds.register_container<EfficiencyContainer<float>>("prompt_pur_v_pt_dR",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("prompt_pur_v_eta_dR", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("prompt_pur_v_phi_dR", THParams::lookup("phi"))};
-    KinColl<EfficiencyContainer<float>> nonprompt_eff_dR = {
-            tds.register_container<EfficiencyContainer<float>>("nonprompt_eff_v_pt_dR",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("nonprompt_eff_v_eta_dR", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("nonprompt_eff_v_phi_dR", THParams::lookup("phi"))};
-    KinColl<EfficiencyContainer<float>> nonprompt_pur_dR = {
-            tds.register_container<EfficiencyContainer<float>>("nonprompt_pur_v_pt_dR",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("nonprompt_pur_v_eta_dR", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("nonprompt_pur_v_phi_dR", THParams::lookup("phi"))};
-
-    KinColl<EfficiencyContainer<float>> fake_rate = {
-            tds.register_container<EfficiencyContainer<float>>("fake_rate_v_pt",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("fake_rate_v_eta", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("fake_rate_v_phi", THParams::lookup("phi"))};
-
-    KinColl<EfficiencyContainer<float>> partial_fake_rate = {
-            tds.register_container<EfficiencyContainer<float>>("partial_fake_rate_v_pt",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("partial_fake_rate_v_eta", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("partial_fake_rate_v_phi", THParams::lookup("phi"))};
-
-    KinColl<EfficiencyContainer<float>> full_fake_rate = {
-            tds.register_container<EfficiencyContainer<float>>("full_fake_rate_v_pt",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("full_fake_rate_v_eta", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("full_fake_rate_v_phi", THParams::lookup("phi"))};
-
-    KinColl<EfficiencyContainer<float>> clean_fake_rate = {
-            tds.register_container<EfficiencyContainer<float>>("clean_fake_rate_v_pt",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("clean_fake_rate_v_eta", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("clean_fake_rate_v_phi", THParams::lookup("phi"))};
-
-    KinColl<EfficiencyContainer<float>> fake_rate_incl = {
-            tds.register_container<EfficiencyContainer<float>>("fake_rate_incl_v_pt",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("fake_rate_incl_v_eta", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("fake_rate_incl_v_phi", THParams::lookup("phi"))};
-
-    KinColl<EfficiencyContainer<float>> partial_fake_rate_incl = {
-            tds.register_container<EfficiencyContainer<float>>("partial_fake_rate_incl_v_pt",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("partial_fake_rate_incl_v_eta", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("partial_fake_rate_incl_v_phi", THParams::lookup("phi"))};
-
-    KinColl<EfficiencyContainer<float>> full_fake_rate_incl = {
-            tds.register_container<EfficiencyContainer<float>>("full_fake_rate_incl_v_pt",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("full_fake_rate_incl_v_eta", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("full_fake_rate_incl_v_phi", THParams::lookup("phi"))};
-
-    KinColl<EfficiencyContainer<float>> clean_fake_rate_incl = {
-            tds.register_container<EfficiencyContainer<float>>("clean_fake_rate_incl_v_pt",  THParams::lookup("pt")),
-            tds.register_container<EfficiencyContainer<float>>("clean_fake_rate_incl_v_eta", THParams::lookup("eta")),
-            tds.register_container<EfficiencyContainer<float>>("clean_fake_rate_incl_v_phi", THParams::lookup("phi"))};
-
-    auto& hit_vs_layer_barrel = *tds.register_container<ContainerTH2<int>>("hit_vs_layer_barrel", THParams::lookup("hit_vs_layer"));
-    auto& hit_vs_layer_forward = *tds.register_container<ContainerTH2<int>>("hit_vs_layer_forward", THParams::lookup("hit_vs_layer"));
-
-    auto& gsf_tracks_nmatch_sim_tracks = *tds.register_container<ContainerTH1<size_t>>("gsf_tracks_nmatch_sim_tracks ", THParams::lookup("gsf_tracks_nmatch_sim_tracks"));
-
-
-    auto& ecal_energy_resolution = *tds.register_container<ContainerTH1<float>>("ecal_energy_resolution ", THParams::lookup("ecal_energy_resolution"));
-
-    auto& n_seeds = *tds.register_container<ContainerTH1<size_t>>("n_seeds", THParams::lookup("n_seeds"));
-    auto& n_good_seeds = *tds.register_container<ContainerTH1<size_t>>("n_good_seeds", THParams::lookup("n_seeds"));
-    auto& n_good_sim = *tds.register_container<ContainerTH1<size_t>>("n_good_sim", THParams::lookup("n_seeds"));
-    auto& n_prompt = *tds.register_container<ContainerTH1<size_t>>("n_prompt", THParams::lookup("n_seeds"));
-    auto& n_nonprompt = *tds.register_container<ContainerTH1<size_t>>("n_nonprompt", THParams::lookup("n_seeds"));
-    auto& n_gsf_tracks = *tds.register_container<ContainerTH1<size_t>>("n_gsf_track", THParams::lookup("n_seeds"));
-    auto& n_scl = *tds.register_container<ContainerTH1<size_t>>("n_scl", THParams::lookup("n_seeds"));
-    auto& n_good_scl = *tds.register_container<ContainerTH1<size_t>>("n_good_scl", THParams::lookup("n_seeds"));
-
-    auto& n_matched = *tds.register_container<ContainerTH1<int>>("n_matched", THParams::lookup("n_seeds"));
-    auto& n_merged = *tds.register_container<ContainerTH1<int>>("n_merged", THParams::lookup("n_seeds"));
-    auto& n_lost = *tds.register_container<ContainerTH1<int>>("n_lost", THParams::lookup("n_seeds"));
-    auto& n_split = *tds.register_container<ContainerTH1<int>>("n_split", THParams::lookup("n_seeds"));
-    auto& n_faked = *tds.register_container<ContainerTH1<int>>("n_faked", THParams::lookup("n_seeds"));
-    auto& n_flipped = *tds.register_container<ContainerTH1<int>>("n_flipped", THParams::lookup("n_seeds"));
-
-    auto& matched_dR = *tds.register_container<ContainerTH1<float>>("matched_dR", THParams::lookup("matched_dR"));
-    auto& matched_dpT = *tds.register_container<ContainerTH1<float>>("matched_dpT", THParams::lookup("matched_dpT"));
-
-    auto& n_matched_dR = *tds.register_container<ContainerTH1<int>>("n_matched_dR", THParams::lookup("n_seeds"));
-    auto& n_merged_dR = *tds.register_container<ContainerTH1<int>>("n_merged_dR", THParams::lookup("n_seeds"));
-    auto& n_lost_dR = *tds.register_container<ContainerTH1<int>>("n_lost_dR", THParams::lookup("n_seeds"));
-    auto& n_split_dR = *tds.register_container<ContainerTH1<int>>("n_split_dR", THParams::lookup("n_seeds"));
-    auto& n_faked_dR = *tds.register_container<ContainerTH1<int>>("n_faked_dR", THParams::lookup("n_seeds"));
-    auto& n_flipped_dR = *tds.register_container<ContainerTH1<int>>("n_flipped_dR", THParams::lookup("n_seeds"));
-
-    auto& matched_dR_dR = *tds.register_container<ContainerTH1<float>>("matched_dR_dR", THParams::lookup("matched_dR"));
-    auto& matched_dpT_dR = *tds.register_container<ContainerTH1<float>>("matched_dpT_dR", THParams::lookup("matched_dpT"));
+
+    KinColl good_sim_kinems    (tds, "good_sim",     lookup("pt_fine"), lookup("eta_fine"), lookup("phi_fine"));
+    KinColl gsf_kinems         (tds, "gsf",          lookup("pt_fine"), lookup("eta_fine"), lookup("phi_fine"));
+    KinColl gsf_high_pt1_kinems(tds, "gsf_high_pt1", lookup("pt_fine"), lookup("eta_fine"), lookup("phi_fine"));
+    KinColl gsf_high_pt2_kinems(tds, "gsf_high_pt2", lookup("pt_fine"), lookup("eta_fine"), lookup("phi_fine"));
+    KinColl seed_kinems        (tds, "seed",         lookup("pt_fine"), lookup("eta_fine"), lookup("phi_fine"));
+    KinColl scl_kinems         (tds, "scl",          lookup("pt_fine"), lookup("eta_fine"), lookup("phi_fine"));
+    KinColl prompt_kinems      (tds, "prompt",       lookup("pt_fine"), lookup("eta_fine"), lookup("phi_fine"));
+    KinColl nonprompt_kinems   (tds, "nonprompt",    lookup("pt_fine"), lookup("eta_fine"), lookup("phi_fine"));
+
+
+    EffColl seed_eff(tds, "seed_eff", lookup("pt"), lookup("eta"), lookup("phi"));
+    EffColl seed_pur(tds, "seed_pur", lookup("pt"), lookup("eta"), lookup("phi"));
+
+    EffColl tracking_eff (tds, "tracking_eff",  lookup("pt"), lookup("eta"), lookup("phi"));
+    EffColl tracking_pur (tds, "tracking_pur",  lookup("pt"), lookup("eta"), lookup("phi"));
+    EffColl prompt_eff   (tds, "prompt_eff",    lookup("pt"), lookup("eta"), lookup("phi"));
+    EffColl prompt_pur   (tds, "prompt_pur",    lookup("pt"), lookup("eta"), lookup("phi"));
+    EffColl nonprompt_eff(tds, "nonprompt_eff", lookup("pt"), lookup("eta"), lookup("phi"));
+    EffColl nonprompt_pur(tds, "nonprompt_pur", lookup("pt"), lookup("eta"), lookup("phi"));
+
+    EffColl tracking_eff_dR (tds, "tracking_eff",  lookup("pt"), lookup("eta"), lookup("phi"), "dR");
+    EffColl tracking_pur_dR (tds, "tracking_pur",  lookup("pt"), lookup("eta"), lookup("phi"), "dR");
+    EffColl prompt_eff_dR   (tds, "prompt_eff",    lookup("pt"), lookup("eta"), lookup("phi"), "dR");
+    EffColl prompt_pur_dR   (tds, "prompt_pur",    lookup("pt"), lookup("eta"), lookup("phi"), "dR");
+    EffColl nonprompt_eff_dR(tds, "nonprompt_eff", lookup("pt"), lookup("eta"), lookup("phi"), "dR");
+    EffColl nonprompt_pur_dR(tds, "nonprompt_pur", lookup("pt"), lookup("eta"), lookup("phi"), "dR");
+
+    auto& tracking_eff_v_PU_dR     = *tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_PU_dR",     lookup("PU"));
+    auto& tracking_eff_v_PU_dR_inc = *tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_PU_dR_inc", lookup("PU"));
+    auto& tracking_pur_v_PU_dR     = *tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_PU_dR",     lookup("PU"));
+    auto& tracking_pur_v_PU_dR_inc = *tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_PU_dR_inc", lookup("PU"));
+
+    // Full Efficiency/Purity includes tracker-driven seeds
+    EffColl tracking_eff_full   (tds, "tracking_eff_full", lookup("pt"), lookup("eta"), lookup("phi"));
+    EffColl tracking_eff_full_dR(tds, "tracking_eff_full", lookup("pt"), lookup("eta"), lookup("phi"), "dR");
+    EffColl tracking_pur_full   (tds, "tracking_pur_full", lookup("pt"), lookup("eta"), lookup("phi"));
+    EffColl tracking_pur_full_dR(tds, "tracking_pur_full", lookup("pt"), lookup("eta"), lookup("phi"), "dR");
+
+    EffColl fake_rate           (tds, "fake_rate",            lookup("pt"), lookup("eta"), lookup("phi"));
+    EffColl fake_rate_no_e_match(tds, "fake_rate_no_e_match", lookup("pt"), lookup("eta"), lookup("phi"));
+
+    auto& fake_rate_no_e_match_v_PU     = *tds.register_container<EfficiencyContainer<float>>("fake_rate_no_e_match_v_PU",     lookup("PU"));
+    auto& fake_rate_no_e_match_v_PU_inc = *tds.register_container<EfficiencyContainer<float>>("fake_rate_no_e_match_v_PU_inc", lookup("PU"));
+
+    EffColl partial_fake_rate        (tds, "partial_fake_rate",         lookup("pt"), lookup("eta"), lookup("phi"));
+    EffColl full_fake_rate           (tds, "full_fake_rate",            lookup("pt"), lookup("eta"), lookup("phi"));
+    EffColl clean_fake_rate          (tds, "clean_fake_rate",           lookup("pt"), lookup("eta"), lookup("phi"));
+    EffColl fake_rate_incl           (tds, "fake_rate_incl",            lookup("pt"), lookup("eta"), lookup("phi"));
+    EffColl fake_rate_no_e_match_incl(tds, "fake_rate_no_e_match_incl", lookup("pt"), lookup("eta"), lookup("phi"));
+    EffColl partial_fake_rate_incl   (tds, "partial_fake_rate_incl",    lookup("pt"), lookup("eta"), lookup("phi"));
+    EffColl full_fake_rate_incl      (tds, "full_fake_rate_incl",       lookup("pt"), lookup("eta"), lookup("phi"));
+    EffColl clean_fake_rate_incl     (tds, "clean_fake_rate_incl",      lookup("pt"), lookup("eta"), lookup("phi"));
+
+    auto& hit_vs_layer_barrel  = *tds.register_container<ContainerTH2<int>>("hit_vs_layer_barrel", lookup("hit_vs_layer"));
+    auto& hit_vs_layer_forward = *tds.register_container<ContainerTH2<int>>("hit_vs_layer_forward", lookup("hit_vs_layer"));
+
+    auto& gsf_tracks_nmatch_sim_tracks = *tds.register_container<ContainerTH1<size_t>>("gsf_tracks_nmatch_sim_tracks ", lookup("gsf_tracks_nmatch_sim_tracks"));
+
+    auto& ecal_energy_resolution = *tds.register_container<ContainerTH1<float>>("ecal_energy_resolution ", lookup("ecal_energy_resolution"));
+
+    auto& n_seeds      = *tds.register_container<ContainerTH1<size_t>>("n_seeds",      lookup("n_seeds"));
+    auto& n_good_seeds = *tds.register_container<ContainerTH1<size_t>>("n_good_seeds", lookup("n_seeds"));
+    auto& n_good_sim   = *tds.register_container<ContainerTH1<size_t>>("n_good_sim",   lookup("n_seeds"));
+    auto& n_prompt     = *tds.register_container<ContainerTH1<size_t>>("n_prompt",     lookup("n_seeds"));
+    auto& n_nonprompt  = *tds.register_container<ContainerTH1<size_t>>("n_nonprompt",  lookup("n_seeds"));
+    auto& n_gsf_tracks = *tds.register_container<ContainerTH1<size_t>>("n_gsf_track",  lookup("n_seeds"));
+    auto& n_scl        = *tds.register_container<ContainerTH1<size_t>>("n_scl",        lookup("n_seeds"));
+    auto& n_good_scl   = *tds.register_container<ContainerTH1<size_t>>("n_good_scl",   lookup("n_seeds"));
+
+    auto& n_matched = *tds.register_container<ContainerTH1<int>>("n_matched", lookup("n_seeds"));
+    auto& n_merged  = *tds.register_container<ContainerTH1<int>>("n_merged",  lookup("n_seeds"));
+    auto& n_lost    = *tds.register_container<ContainerTH1<int>>("n_lost",    lookup("n_seeds"));
+    auto& n_split   = *tds.register_container<ContainerTH1<int>>("n_split",   lookup("n_seeds"));
+    auto& n_faked   = *tds.register_container<ContainerTH1<int>>("n_faked",   lookup("n_seeds"));
+    auto& n_flipped = *tds.register_container<ContainerTH1<int>>("n_flipped", lookup("n_seeds"));
+
+    auto& matched_dR  = *tds.register_container<ContainerTH1<float>>("matched_dR", lookup("matched_dR"));
+    auto& matched_dpT = *tds.register_container<ContainerTH1<float>>("matched_dpT", lookup("matched_dpT"));
+
+    auto& n_matched_dR = *tds.register_container<ContainerTH1<int>>("n_matched_dR", lookup("n_seeds"));
+    auto& n_merged_dR  = *tds.register_container<ContainerTH1<int>>("n_merged_dR",  lookup("n_seeds"));
+    auto& n_lost_dR    = *tds.register_container<ContainerTH1<int>>("n_lost_dR",    lookup("n_seeds"));
+    auto& n_split_dR   = *tds.register_container<ContainerTH1<int>>("n_split_dR",   lookup("n_seeds"));
+    auto& n_faked_dR   = *tds.register_container<ContainerTH1<int>>("n_faked_dR",   lookup("n_seeds"));
+    auto& n_flipped_dR = *tds.register_container<ContainerTH1<int>>("n_flipped_dR", lookup("n_seeds"));
+
+    auto& matched_dR_dR = *tds.register_container<ContainerTH1<float>>("matched_dR_dR", lookup("matched_dR"));
+    auto& matched_dpT_dR = *tds.register_container<ContainerTH1<float>>("matched_dpT_dR", lookup("matched_dpT"));
 
     auto& tm_corr = *tds.register_container<ContainerTH2<int>>("tm_corr", THParams(2, -0.5, 1.5, 2, -0.5, 1.5));
+    auto& n_pileup = *tds.register_container<ContainerTH1<int>>("n_pileup", lookup("n_seeds"));
+
+
+    auto& n_seeds_v_PU = *tds.register_container<ContainerTH2<int>>("n_seeds_v_PU",           lookup("n_seeds_v_PU"));
+    auto& n_good_seeds_v_PU = *tds.register_container<ContainerTH2<int>>("n_good_seeds_v_PU", lookup("n_seeds_v_PU"));
+    auto& n_tracks_v_PU = *tds.register_container<ContainerTH2<int>>("n_tracks_v_PU",         lookup("n_seeds_v_PU"));
+    auto& n_pv_v_PU = *tds.register_container<ContainerTH2<int>>("n_pv_v_PU",                 lookup("n_seeds_v_PU"));
+
+    auto& n_seeds_v_tPU = *tds.register_container<ContainerTH2<float>>("n_seeds_v_tPU",           lookup("n_seeds_v_PU"));
+    auto& n_good_seeds_v_tPU = *tds.register_container<ContainerTH2<float>>("n_good_seeds_v_tPU", lookup("n_seeds_v_PU"));
+    auto& n_tracks_v_tPU = *tds.register_container<ContainerTH2<float>>("n_tracks_v_tPU",         lookup("n_seeds_v_PU"));
+    auto& n_pv_v_tPU = *tds.register_container<ContainerTH2<float>>("n_pv_v_tPU",                 lookup("n_seeds_v_PU"));
+
+
+    auto& n_seeds_v_n_scl = *tds.register_container<ContainerTH2<int>>("n_seeds_v_n_scl",                     lookup("n_seeds_v_PU"));
+    auto& n_good_seeds_v_n_scl = *tds.register_container<ContainerTH2<int>>("n_good_seeds_v_n_scl",           lookup("n_seeds_v_PU"));
+    auto& n_good_seeds_v_n_good_scl = *tds.register_container<ContainerTH2<int>>("n_good_seeds_v_n_good_scl", lookup("n_seeds_v_PU"));
+
+    auto& n_initseeds_v_PU = *tds.register_container<ContainerTH2<int>>("n_initseeds_v_PU",     lookup("n_initseeds_v_PU"));
+    auto& n_initseeds_v_tPU = *tds.register_container<ContainerTH2<float>>("n_initseeds_v_tPU", lookup("n_initseeds_v_PU"));
 
     while (tds.next()) {
 
@@ -512,23 +544,67 @@ void run(){
         vector<SimTrack> prompt_sims, nonprompt_sims;
         std::tie(prompt_sims, nonprompt_sims) = get_prompt_sims();
 
+        int n_pv = get_n_pv();
+        n_pileup.fill(n_pv);
+        n_pv_v_PU.fill(n_pv, inTimePileup->get());
+        n_pv_v_tPU.fill(n_pv, truePileup->get());
 
         size_t _n_good_seeds = 0;
+        /* cout << "Event: " << tds.get_current_event() << endl; */
+        int idx = 0;
         for (const auto& seed : seeds) {
+            /* cout << idx << ") [" << seed.pt() << ", " << seed.eta() << ", " << seed.phi() << "] " << seed.sclIdx() << " "; */
+
             if (is_good_seed(seed, hoe_cut)) {
                 _n_good_seeds++;
                 seed_kinems.pt->fill(seed.pt());
                 seed_kinems.eta->fill(seed.eta());
                 seed_kinems.phi->fill(seed.phi());
+                seed_kinems.eta_phi->fill(seed.eta(), seed.phi());
+            }
+            idx++;
+        }
+        size_t _n_good_scl = 0;
+        for (const auto& scl : scls) {
+            if (scl.hoe() < hoe_cut) {
+                _n_good_scl++;
+                scl_kinems.pt->fill(hypot(scl.px(), scl.py()));
+                float eta = pseudorapidity(scl.x(), scl.y(), scl.z());
+                float phi = atan2(scl.y(), scl.x());
+                scl_kinems.eta->fill(eta);
+                scl_kinems.phi->fill(phi);
+                scl_kinems.eta_phi->fill(eta, phi);
             }
         }
+        /* idx = 0; */
+        /* for (const auto& track : gsf_tracks) { */
+        /*     cout << idx << ") [" << track.pt() << ", " << track.eta() << ", " << track.phi() << "] " << track.seedIdx() << endl; */
+        /*     idx++; */
+        /* } */
+        /* string tmp; */
+        /* cin >> tmp; */
+        /* cout << "total seeds: " << totalSeeds->get() << endl; */
+        n_initseeds_v_PU.fill(totalSeeds->get(), inTimePileup->get());
+        n_initseeds_v_tPU.fill(totalSeeds->get(), truePileup->get());
+
+        n_seeds_v_n_scl.fill(seeds.size(), scls.size());
+        n_good_seeds_v_n_scl.fill(_n_good_seeds, scls.size());
+        n_good_seeds_v_n_good_scl.fill(_n_good_seeds, _n_good_scl);
+
         n_seeds.fill(seeds.size());
         n_good_seeds.fill(_n_good_seeds);
 
+        n_seeds_v_PU.fill(seeds.size(), inTimePileup->get());
+        n_good_seeds_v_PU.fill(_n_good_seeds, inTimePileup->get());
+
+        n_seeds_v_tPU.fill(seeds.size(), truePileup->get());
+        n_good_seeds_v_tPU.fill(_n_good_seeds, truePileup->get());
+
         for (const auto& sim_track : sim_els) {
             good_sim_kinems.pt->fill(sim_track.pt());
             good_sim_kinems.eta->fill(sim_track.eta());
             good_sim_kinems.phi->fill(sim_track.phi());
+            good_sim_kinems.eta_phi->fill(sim_track.eta(), sim_track.phi());
         }
 
         n_prompt.fill(prompt_sims.size());
@@ -536,6 +612,7 @@ void run(){
             prompt_kinems.pt->fill(prompt.pt());
             prompt_kinems.eta->fill(prompt.eta());
             prompt_kinems.phi->fill(prompt.phi());
+            prompt_kinems.eta_phi->fill(prompt.eta(), prompt.phi());
         }
 
         n_nonprompt.fill(nonprompt_sims.size());
@@ -543,23 +620,32 @@ void run(){
             nonprompt_kinems.pt->fill(nonprompt.pt());
             nonprompt_kinems.eta->fill(nonprompt.eta());
             nonprompt_kinems.phi->fill(nonprompt.phi());
+            nonprompt_kinems.eta_phi->fill(nonprompt.eta(), nonprompt.phi());
         }
 
         for (const auto& gsf_track : gsf_tracks) {
+            if (!is_good_seed(seeds[gsf_track.seedIdx()], hoe_cut)) continue;
             gsf_kinems.pt->fill(gsf_track.pt());
             gsf_kinems.eta->fill(gsf_track.eta());
             gsf_kinems.phi->fill(gsf_track.phi());
-        }
-
-        size_t _n_good_scl = 0;
-        for (const auto& scl : scls) {
-            if (scl.hoe() < hoe_cut) {
-                _n_good_scl++;
-                scl_kinems.pt->fill(hypot(scl.px(), scl.py()));
-                scl_kinems.eta->fill(pseudorapidity(scl.x(), scl.y(), scl.z()));
-                scl_kinems.phi->fill(atan2(scl.y(), scl.x()));
+            gsf_kinems.eta_phi->fill(gsf_track.eta(), gsf_track.phi());
+            if (gsf_track.pt() > 10) {
+                gsf_high_pt1_kinems.pt->fill(gsf_track.pt());
+                gsf_high_pt1_kinems.eta->fill(gsf_track.eta());
+                gsf_high_pt1_kinems.phi->fill(gsf_track.phi());
+                gsf_high_pt1_kinems.eta_phi->fill(gsf_track.eta(), gsf_track.phi());
             }
+            if (gsf_track.pt() > 20) {
+                gsf_high_pt2_kinems.pt->fill(gsf_track.pt());
+                gsf_high_pt2_kinems.eta->fill(gsf_track.eta());
+                gsf_high_pt2_kinems.phi->fill(gsf_track.phi());
+                gsf_high_pt2_kinems.eta_phi->fill(gsf_track.eta(), gsf_track.phi());
+            }
+
         }
+        n_tracks_v_PU.fill(gsf_tracks.size(), inTimePileup->get());
+        n_tracks_v_tPU.fill(gsf_tracks.size(), truePileup->get());
+
         n_scl.fill(scls.size());
         n_good_scl.fill(_n_good_scl);
 
@@ -606,11 +692,11 @@ void run(){
                     break;
                 }
             }
-            if (abs(sim_track.eta()) < 2.4)
+            if (abs(sim_track.eta()) < 2.5)
                 seed_eff.pt->fill(sim_track.pt(), matched);
             if (sim_track.pt() > 20.0)
                 seed_eff.eta->fill(sim_track.eta(), matched);
-            if (abs(sim_track.eta()) < 2.4 and sim_track.pt() > 20)
+            if (abs(sim_track.eta()) < 2.5 and sim_track.pt() > 20)
                 seed_eff.phi->fill(sim_track.phi(), matched);
         }
 
@@ -618,68 +704,89 @@ void run(){
         for (const auto& sim_track : sim_els) {
             if (gsf_tracks.size() == 0) continue;
             bool matched = false;
+            bool matched_any = false;
             for (const auto& track_idx : sim_track.trkIdx()) {
                 const Seed& seed = seeds[gsf_tracks[track_idx].seedIdx()];
                 if (is_good_seed(seed, hoe_cut)) {
-                    matched=true;
-                    break;
+                    matched = true;
+                    matched_any = true;
+                } else if (!seed.isECALDriven()) {
+                    matched_any = true;
                 }
             }
-            if (abs(sim_track.eta()) < 2.4)
+            if (abs(sim_track.eta()) < 2.5) {
                 tracking_eff.pt->fill(sim_track.pt(), matched);
-            if (sim_track.pt() > 20.0)
+                tracking_eff_full.pt->fill(sim_track.pt(), matched_any);
+            }
+            if (sim_track.pt() > 20.0) {
                 tracking_eff.eta->fill(sim_track.eta(), matched);
-            if (abs(sim_track.eta()) < 2.4 and sim_track.pt() > 20)
+                tracking_eff_full.eta->fill(sim_track.eta(), matched_any);
+            }
+            if (abs(sim_track.eta()) < 2.5 and sim_track.pt() > 20) {
                 tracking_eff.phi->fill(sim_track.phi(), matched);
+                tracking_eff_full.phi->fill(sim_track.phi(), matched_any);
+            }
 
             if (std::find(prompt_sims.begin(), prompt_sims.end(), sim_track) != prompt_sims.end()) {
-                if (abs(sim_track.eta()) < 2.4)
+                if (abs(sim_track.eta()) < 2.5)
                     prompt_eff.pt->fill(sim_track.pt(), matched);
                 if (sim_track.pt() > 20.0)
                     prompt_eff.eta->fill(sim_track.eta(), matched);
-                if (abs(sim_track.eta()) < 2.4 and sim_track.pt() > 20)
+                if (abs(sim_track.eta()) < 2.5 and sim_track.pt() > 20)
                     prompt_eff.phi->fill(sim_track.phi(), matched);
             }
             if (std::find(nonprompt_sims.begin(), nonprompt_sims.end(), sim_track) != nonprompt_sims.end()) {
-                if (abs(sim_track.eta()) < 2.4)
+                if (abs(sim_track.eta()) < 2.5)
                     nonprompt_eff.pt->fill(sim_track.pt(), matched);
                 if (sim_track.pt() > 20.0)
                     nonprompt_eff.eta->fill(sim_track.eta(), matched);
-                if (abs(sim_track.eta()) < 2.4 and sim_track.pt() > 20)
+                if (abs(sim_track.eta()) < 2.5 and sim_track.pt() > 20)
                     nonprompt_eff.phi->fill(sim_track.phi(), matched);
             }
 
             // dR-matching
             matched = false;
+            matched_any = false;
             for (const auto& gsf_track : gsf_tracks) {
                 const Seed& seed = seeds[gsf_track.seedIdx()];
                 double dR = deltaR(sim_track.eta(), sim_track.phi(), gsf_track.eta(), gsf_track.phi());
                 if (is_good_seed(seed, hoe_cut) and dR < 0.2) {
                     matched = true;
-                    break;
+                    matched_any = true;
+                } else if (!seed.isECALDriven()) {
+                    matched_any = true;
                 }
             }
-            if (abs(sim_track.eta()) < 2.4)
+            if (abs(sim_track.eta()) < 2.5) {
                 tracking_eff_dR.pt->fill(sim_track.pt(), matched);
-            if (sim_track.pt() > 20.0)
+                tracking_eff_full_dR.pt->fill(sim_track.pt(), matched_any);
+            }
+            if (sim_track.pt() > 20.0) {
                 tracking_eff_dR.eta->fill(sim_track.eta(), matched);
-            if (abs(sim_track.eta()) < 2.4 and sim_track.pt() > 20)
+                tracking_eff_full_dR.eta->fill(sim_track.eta(), matched_any);
+            }
+            if (abs(sim_track.eta()) < 2.5 and sim_track.pt() > 20) {
                 tracking_eff_dR.phi->fill(sim_track.phi(), matched);
+                tracking_eff_full_dR.phi->fill(sim_track.phi(), matched_any);
+                tracking_eff_v_PU_dR.fill(inTimePileup->get(), matched);
+            }
+
+            tracking_eff_v_PU_dR_inc.fill(inTimePileup->get(), matched);
 
             if (find(prompt_sims.begin(), prompt_sims.end(), sim_track) != prompt_sims.end()) {
-                if (abs(sim_track.eta()) < 2.4)
+                if (abs(sim_track.eta()) < 2.5)
                     prompt_eff_dR.pt->fill(sim_track.pt(), matched);
                 if (sim_track.pt() > 20.0)
                     prompt_eff_dR.eta->fill(sim_track.eta(), matched);
-                if (abs(sim_track.eta()) < 2.4 and sim_track.pt() > 20)
+                if (abs(sim_track.eta()) < 2.5 and sim_track.pt() > 20)
                     prompt_eff_dR.phi->fill(sim_track.phi(), matched);
             }
             if (find(nonprompt_sims.begin(), nonprompt_sims.end(), sim_track) != nonprompt_sims.end()) {
-                if (abs(sim_track.eta()) < 2.4)
+                if (abs(sim_track.eta()) < 2.5)
                     nonprompt_eff_dR.pt->fill(sim_track.pt(), matched);
                 if (sim_track.pt() > 20.0)
                     nonprompt_eff_dR.eta->fill(sim_track.eta(), matched);
-                if (abs(sim_track.eta()) < 2.4 and sim_track.pt() > 20)
+                if (abs(sim_track.eta()) < 2.5 and sim_track.pt() > 20)
                     nonprompt_eff_dR.phi->fill(sim_track.phi(), matched);
             }
         }
@@ -694,11 +801,11 @@ void run(){
                     break;
                 }
             }
-            if (abs(seed.eta()) < 2.4)
+            if (abs(seed.eta()) < 2.5)
                 seed_pur.pt->fill(seed.pt(), match);
             if (seed.pt() > 20)
                 seed_pur.eta->fill(seed.eta(), match);
-            if (abs(seed.eta()) < 2.4 and seed.pt() > 20)
+            if (abs(seed.eta()) < 2.5 and seed.pt() > 20)
                 seed_pur.phi->fill(seed.phi(), match);
         }
 
@@ -706,7 +813,9 @@ void run(){
         for (const auto& gsf_track : gsf_tracks) {
             gsf_tracks_nmatch_sim_tracks.fill(gsf_track.simTrkIdx().size());
             const Seed& seed = seeds[gsf_track.seedIdx()];
-            if (!is_good_seed(seed, hoe_cut)) continue;
+            /* if (!is_good_seed(seed, hoe_cut)) continue; */
+            bool good_ecal_driven_seed = is_good_seed(seed, hoe_cut);
+            bool good_seed = good_ecal_driven_seed or !seed.isECALDriven();
             bool matched = false;
             bool prompt_matched = false;
             bool nonprompt_matched = false;
@@ -721,26 +830,33 @@ void run(){
                     nonprompt_matched = true;
                 }
             }
-            if (abs(gsf_track.eta()) < 2.4)
-                tracking_pur.pt->fill(gsf_track.pt(), matched);
-            if (gsf_track.pt() > 20)
-                tracking_pur.eta->fill(gsf_track.eta(), matched);
-            if (abs(gsf_track.eta()) < 2.4 and gsf_track.pt() > 20)
-                tracking_pur.phi->fill(gsf_track.phi(), matched);
 
-            if (abs(gsf_track.eta()) < 2.4)
-                prompt_pur.pt->fill(gsf_track.pt(), prompt_matched);
+            if (abs(gsf_track.eta()) < 2.5) {
+                if (good_ecal_driven_seed) tracking_pur.pt->fill(gsf_track.pt(), matched);
+                if (good_seed) tracking_pur_full.pt->fill(gsf_track.pt(), matched);
+            }
+            if (gsf_track.pt() > 20) {
+                if (good_ecal_driven_seed) tracking_pur.eta->fill(gsf_track.eta(), matched);
+                if (good_seed) tracking_pur_full.eta->fill(gsf_track.eta(), matched);
+            }
+            if (abs(gsf_track.eta()) < 2.5 and gsf_track.pt() > 20) {
+                if (good_ecal_driven_seed) tracking_pur.phi->fill(gsf_track.phi(), matched);
+                if (good_seed) tracking_pur_full.phi->fill(gsf_track.phi(), matched);
+            }
+
+            if (abs(gsf_track.eta()) < 2.5)
+                if (good_ecal_driven_seed) prompt_pur.pt->fill(gsf_track.pt(), prompt_matched);
             if (gsf_track.pt() > 20)
-                prompt_pur.eta->fill(gsf_track.eta(), prompt_matched);
-            if (abs(gsf_track.eta()) < 2.4 and gsf_track.pt() > 20)
-                prompt_pur.phi->fill(gsf_track.phi(), prompt_matched);
+                if (good_ecal_driven_seed) prompt_pur.eta->fill(gsf_track.eta(), prompt_matched);
+            if (abs(gsf_track.eta()) < 2.5 and gsf_track.pt() > 20)
+                if (good_ecal_driven_seed) prompt_pur.phi->fill(gsf_track.phi(), prompt_matched);
 
-            if (abs(gsf_track.eta()) < 2.4)
-                nonprompt_pur.pt->fill(gsf_track.pt(), nonprompt_matched);
+            if (abs(gsf_track.eta()) < 2.5)
+                if (good_ecal_driven_seed) nonprompt_pur.pt->fill(gsf_track.pt(), nonprompt_matched);
             if (gsf_track.pt() > 20)
-                nonprompt_pur.eta->fill(gsf_track.eta(), nonprompt_matched);
-            if (abs(gsf_track.eta()) < 2.4 and gsf_track.pt() > 20)
-                nonprompt_pur.phi->fill(gsf_track.phi(), nonprompt_matched);
+                if (good_ecal_driven_seed) nonprompt_pur.eta->fill(gsf_track.eta(), nonprompt_matched);
+            if (abs(gsf_track.eta()) < 2.5 and gsf_track.pt() > 20)
+                if (good_ecal_driven_seed) nonprompt_pur.phi->fill(gsf_track.phi(), nonprompt_matched);
 
             // dR-matching
             matched = false;
@@ -759,26 +875,34 @@ void run(){
                 }
             }
 
-            if (abs(gsf_track.eta()) < 2.4)
-                tracking_pur_dR.pt->fill(gsf_track.pt(), matched);
-            if (gsf_track.pt() > 20.0)
-                tracking_pur_dR.eta->fill(gsf_track.eta(), matched);
-            if (abs(gsf_track.eta()) < 2.4 and gsf_track.pt() > 20)
-                tracking_pur_dR.phi->fill(gsf_track.phi(), matched);
+            if (abs(gsf_track.eta()) < 2.5) {
+                if (good_ecal_driven_seed) tracking_pur_dR.pt->fill(gsf_track.pt(), matched);
+                if (good_seed) tracking_pur_full_dR.pt->fill(gsf_track.pt(), matched);
+            }
+            if (gsf_track.pt() > 20.0) {
+                if (good_ecal_driven_seed) tracking_pur_dR.eta->fill(gsf_track.eta(), matched);
+                if (good_seed) tracking_pur_full_dR.eta->fill(gsf_track.eta(), matched);
+            }
+            if (abs(gsf_track.eta()) < 2.5 and gsf_track.pt() > 20) {
+                if (good_ecal_driven_seed) tracking_pur_dR.phi->fill(gsf_track.phi(), matched);
+                if (good_seed) tracking_pur_full_dR.phi->fill(gsf_track.phi(), matched);
+                if (good_ecal_driven_seed) tracking_pur_v_PU_dR.fill(inTimePileup->get(), matched);
+            }
+            tracking_pur_v_PU_dR_inc.fill(inTimePileup->get(), matched);
 
-            if (abs(gsf_track.eta()) < 2.4)
-                prompt_pur_dR.pt->fill(gsf_track.pt(), prompt_matched);
+            if (abs(gsf_track.eta()) < 2.5)
+                if (good_ecal_driven_seed) prompt_pur_dR.pt->fill(gsf_track.pt(), prompt_matched);
             if (gsf_track.pt() > 20)
-                prompt_pur_dR.eta->fill(gsf_track.eta(), prompt_matched);
-            if (abs(gsf_track.eta()) < 2.4 and gsf_track.pt() > 20)
-                prompt_pur_dR.phi->fill(gsf_track.phi(), prompt_matched);
+                if (good_ecal_driven_seed) prompt_pur_dR.eta->fill(gsf_track.eta(), prompt_matched);
+            if (abs(gsf_track.eta()) < 2.5 and gsf_track.pt() > 20)
+                if (good_ecal_driven_seed) prompt_pur_dR.phi->fill(gsf_track.phi(), prompt_matched);
 
-            if (abs(gsf_track.eta()) < 2.4)
-                nonprompt_pur_dR.pt->fill(gsf_track.pt(), nonprompt_matched);
+            if (abs(gsf_track.eta()) < 2.5)
+                if (good_ecal_driven_seed) nonprompt_pur_dR.pt->fill(gsf_track.pt(), nonprompt_matched);
             if (gsf_track.pt() > 20)
-                nonprompt_pur_dR.eta->fill(gsf_track.eta(), nonprompt_matched);
-            if (abs(gsf_track.eta()) < 2.4 and gsf_track.pt() > 20)
-                nonprompt_pur_dR.phi->fill(gsf_track.phi(), nonprompt_matched);
+                if (good_ecal_driven_seed) nonprompt_pur_dR.eta->fill(gsf_track.eta(), nonprompt_matched);
+            if (abs(gsf_track.eta()) < 2.5 and gsf_track.pt() > 20)
+                if (good_ecal_driven_seed) nonprompt_pur_dR.phi->fill(gsf_track.phi(), nonprompt_matched);
         }
 
         // Fake-Rate
@@ -795,10 +919,12 @@ void run(){
             scl2trk[scl_idx].push_back(gsf_truth_matched);
         }
         std::set<size_t> tm_scls; // Set of super-clusters with well matched sim-electrons
+        std::set<size_t> tm_scls_no_e_match; // Set of super-clusters with well matched sim-electrons w/o energy matching
         for (const auto &scl : scls) {
             Vec4 p4 = scl_p4(scl);
             for(const auto& sim_track : sim_els) {
                 if (deltaR(p4.eta(), p4.phi(), sim_track.eta(), sim_track.phi()) > 0.2) continue;
+                tm_scls_no_e_match.insert(scl.idx);
                 if (((p4.Et() - sim_track.pt()) / p4.Et()) > 0.1) continue;
                 tm_scls.insert(scl.idx);
                 break;
@@ -813,7 +939,12 @@ void run(){
             if (scl.hoe() > hoe_cut) continue;
             float scl_pt = hypot(scl.px(), scl.py());
             float scl_eta = pseudorapidity(scl.x(), scl.y(), scl.z());
-            float scl_phi = atan2(scl.py(), scl.px());
+            float scl_phi = atan2(scl.y(), scl.x());
+            float rad = hypot(scl.x(), scl.y());
+            /* cout << "weird phi: " << scl_phi << " (" << scl.x() << ", " << scl.y() << ") - " << rad << "\n"; */
+            /* if (scl_phi > 3.141592653589793238 or scl_phi < -3.141592653589793238) { */
+            /*     cout << "weird phi: " << scl_phi << " (" << scl.x() << ", " << scl.y() << ")\n"; */
+            /* } */
 
             int ntracks = scl2trk[scl.idx].size();
             int ntmtracks = std::accumulate(scl2trk[scl.idx].begin(), scl2trk[scl.idx].end(), 0);
@@ -825,33 +956,45 @@ void run(){
                 partial_fake_rate_incl.pt->fill(scl_pt, partial_fake);
                 partial_fake_rate_incl.eta->fill(scl_eta, partial_fake);
                 partial_fake_rate_incl.phi->fill(scl_phi, partial_fake);
-                if (abs(scl_eta) < 2.4)                 partial_fake_rate.pt->fill(scl_pt, partial_fake);
+                if (abs(scl_eta) < 2.5)                 partial_fake_rate.pt->fill(scl_pt, partial_fake);
                 if (scl_pt > 20.0)                      partial_fake_rate.eta->fill(scl_eta, partial_fake);
-                if (abs(scl_eta) < 2.4 and scl_pt > 20) partial_fake_rate.phi->fill(scl_phi, partial_fake);
+                if (abs(scl_eta) < 2.5 and scl_pt > 20) partial_fake_rate.phi->fill(scl_phi, partial_fake);
 
                 full_fake_rate_incl.pt->fill(scl_pt, full_fake);
                 full_fake_rate_incl.eta->fill(scl_eta, full_fake);
                 full_fake_rate_incl.phi->fill(scl_phi, full_fake);
-                if (abs(scl_eta) < 2.4)                 full_fake_rate.pt->fill(scl_pt, full_fake);
+                if (abs(scl_eta) < 2.5)                 full_fake_rate.pt->fill(scl_pt, full_fake);
                 if (scl_pt > 20.0)                      full_fake_rate.eta->fill(scl_eta, full_fake);
-                if (abs(scl_eta) < 2.4 and scl_pt > 20) full_fake_rate.phi->fill(scl_phi, full_fake);
+                if (abs(scl_eta) < 2.5 and scl_pt > 20) full_fake_rate.phi->fill(scl_phi, full_fake);
 
                 if (tm_scls.count(scl.idx) == 0) {
                     clean_fake_rate_incl.pt->fill(scl_pt, full_fake);
                     clean_fake_rate_incl.eta->fill(scl_eta, full_fake);
                     clean_fake_rate_incl.phi->fill(scl_phi, full_fake);
-                    if (abs(scl_eta) < 2.4)                 clean_fake_rate.pt->fill(scl_pt, full_fake);
+                    if (abs(scl_eta) < 2.5)                 clean_fake_rate.pt->fill(scl_pt, full_fake);
                     if (scl_pt > 20.0)                      clean_fake_rate.eta->fill(scl_eta, full_fake);
-                    if (abs(scl_eta) < 2.4 and scl_pt > 20) clean_fake_rate.phi->fill(scl_phi, full_fake);
+                    if (abs(scl_eta) < 2.5 and scl_pt > 20) clean_fake_rate.phi->fill(scl_phi, full_fake);
                 }
             }
             if (tm_scls.count(scl.idx) == 0) {
                 fake_rate_incl.pt->fill(scl_pt, ntracks>0);
                 fake_rate_incl.eta->fill(scl_eta, ntracks>0);
                 fake_rate_incl.phi->fill(scl_phi, ntracks>0);
-                if (abs(scl_eta) < 2.4)                 fake_rate.pt->fill(scl_pt, ntracks>0);
+                if (abs(scl_eta) < 2.5)                 fake_rate.pt->fill(scl_pt, ntracks>0);
                 if (scl_pt > 20.0)                      fake_rate.eta->fill(scl_eta, ntracks>0);
-                if (abs(scl_eta) < 2.4 and scl_pt > 20) fake_rate.phi->fill(scl_phi, ntracks>0);
+                if (abs(scl_eta) < 2.5 and scl_pt > 20) fake_rate.phi->fill(scl_phi, ntracks>0);
+            }
+            if (tm_scls_no_e_match.count(scl.idx) == 0) {
+                fake_rate_no_e_match_incl.pt->fill(scl_pt, ntracks>0);
+                fake_rate_no_e_match_incl.eta->fill(scl_eta, ntracks>0);
+                fake_rate_no_e_match_incl.phi->fill(scl_phi, ntracks>0);
+                if (abs(scl_eta) < 2.5)                 fake_rate_no_e_match.pt->fill(scl_pt, ntracks>0);
+                if (scl_pt > 20.0)                      fake_rate_no_e_match.eta->fill(scl_eta, ntracks>0);
+                if (abs(scl_eta) < 2.5 and scl_pt > 20) {
+                    fake_rate_no_e_match.phi->fill(scl_phi, ntracks>0);
+                    fake_rate_no_e_match_v_PU.fill(inTimePileup->get(), ntracks>0);
+                }
+                fake_rate_no_e_match_v_PU_inc.fill(inTimePileup->get(), ntracks>0);
             }
             /* cout << endl; */
         }

+ 1 - 1
looper/filval

@@ -1 +1 @@
-Subproject commit c0b4e453a2b3d4dd6d4fcf5bb6803e1ac44eff01
+Subproject commit f1f245f8d9444accf803221e649d2cc5e6c3c90e

+ 36 - 11
looper/run_all.condor

@@ -3,17 +3,42 @@
 #
 ####################
 
-executable = run_all.sh
-universe   = vanilla
-error      = condor_logs/err.$(Process)
-output     = condor_logs/out.$(Process)
-log        = condor_logs/foo.log
+executable   = run_all.sh
+universe     = vanilla
+error        = condor_logs/err.$(Process)
+output       = condor_logs/out.$(Process)
+log          = condor_logs/condor.log
+requirements = (TARGET.Machine != "t3.unl.edu")
+
+should_transfer_files = YES
+when_to_transfer_output = ON_EXIT
+transfer_input_files = build/tracking_eff,analysis/config.yaml
 
 queue arguments from (
-    tt-new-default
-    tt-new-wide
-    tt-old-default
-    zee-new-default
-    zee-new-wide
-    zee-old-default
+    tt-new-extra-wide-skip-pileup
+    tt-new-default-skip-pileup
+    tt-new-wide-skip-pileup
+    tt-old-default-skip-pileup
+    dy-new-default-skip-pileup
+    dy-new-wide-skip-pileup
+    dy-new-extra-wide-skip-pileup
+    dy-old-default-skip-pileup
+#
+    tt-new-extra-wide-skip
+    tt-new-default-skip
+    tt-new-wide-skip
+    tt-old-default-skip
+    dy-new-default-skip
+    dy-new-wide-skip
+    dy-new-extra-wide-skip
+    dy-old-default-skip
+#
+    tt-new-extra-wide-noskip
+    tt-new-default-noskip
+    tt-new-wide-noskip
+    tt-old-default-noskip
+    dy-new-default-noskip
+    dy-new-wide-noskip
+    dy-new-extra-wide-noskip
+    dy-old-default-noskip
 )

+ 12 - 14
looper/run_all.sh

@@ -1,24 +1,22 @@
 #!/usr/bin/env bash
 
-echo "starting run at " $(date)
-pwd
-ls -la
-
-config="analysis/config.yaml"
+config="./config.yaml"
 release="build"
-cmshome="/home/dominguez/cfangmeier/EGamma/CMSSW_9_2_8/src/"
+cmshome="/cvmfs/cms.cern.ch/slc6_amd64_gcc530/cms/cmssw/CMSSW_9_2_8/src/"
+output_dir="."
 
-job_dir="job_${1}"
-mkdir -p $job_dir
+echo "starting run. Current time: " $(date)
+echo "running @ " $(pwd) "in " $(hostname)
+echo "Initial Directory Contents:"
+ls -la
 
 source /cvmfs/cms.cern.ch/cmsset_default.sh
 cd $cmshome
-pwd
-# cmsenv
 eval `scramv1 runtime -sh`
 cd -
 
-cp ./$release/tracking_eff $job_dir
-cp ${config} ${job_dir}/config.yaml
-
-./${job_dir}/tracking_eff -b -c ${job_dir}/config.yaml source-file-key=${1}
+mkdir -p $output_dir
+./tracking_eff -b -c $config source-file-key=${1} output-dir=$output_dir
+echo "Run Finished"
+echo "Final Directory Contents:"
+ls -la

+ 5 - 0
looper/transfer_done.sh

@@ -0,0 +1,5 @@
+#!/usr/bin/env sh
+
+mkdir -p ../hists
+mv *.log ../hists/
+mv *.root ../hists/