Browse Source

Updates to use correct Et used in seeding hit-match cuts

Caleb Fangmeier 6 years ago
parent
commit
40ad797894

+ 0 - 2
looper/CMakeLists.txt

@@ -5,8 +5,6 @@ PROJECT (EGAMMA CXX)
 
 SET(CMAKE_CXX_STANDARD 14)
 
-SET(CMAKE_BUILD_TYPE "Release")
-
 ADD_SUBDIRECTORY(filval)
 
 LIST( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/filval/cmake )

+ 8 - 0
looper/analysis/TrackingNtupleMod.h

@@ -145,6 +145,7 @@ public :
    std::vector<std::vector<float> > *see_shareFrac;
    std::vector<std::vector<int> > *see_simTrkIdx;
    std::vector<unsigned int> *see_offset;
+   std::vector<float> *see_Et;
    std::vector<std::vector<int> > *see_isBarrel;
    std::vector<std::vector<int> > *see_layerOrDiskNr;
    std::vector<std::vector<int> > *see_isValidPos;
@@ -153,6 +154,7 @@ public :
    std::vector<std::vector<int> > *see_isValidNeg;
    std::vector<std::vector<float> > *see_dRZNeg;
    std::vector<std::vector<float> > *see_dPhiNeg;
+   std::vector<short> *see_isECALDriven;
    std::vector<float>   *vtx_x;
    std::vector<float>   *vtx_y;
    std::vector<float>   *vtx_z;
@@ -311,6 +313,7 @@ public :
    TBranch        *b_see_shareFrac;   //!
    TBranch        *b_see_simTrkIdx;   //!
    TBranch        *b_see_offset;   //!
+   TBranch        *b_see_Et;   //!
    TBranch        *b_see_isBarrel;   //!
    TBranch        *b_see_layerOrDiskNr;   //!
    TBranch        *b_see_isValidPos;   //!
@@ -319,6 +322,7 @@ public :
    TBranch        *b_see_isValidNeg;   //!
    TBranch        *b_see_dRZNeg;   //!
    TBranch        *b_see_dPhiNeg;   //!
+   TBranch        *b_see_isECALDriven;   //!
    TBranch        *b_vtx_x;   //!
    TBranch        *b_vtx_y;   //!
    TBranch        *b_vtx_z;   //!
@@ -529,6 +533,7 @@ void TrackingNtuple::Init(TTree *tree)
    see_shareFrac = 0;
    see_simTrkIdx = 0;
    see_offset = 0;
+   see_Et = 0;
    see_isBarrel = 0;
    see_layerOrDiskNr = 0;
    see_isValidPos = 0;
@@ -537,6 +542,7 @@ void TrackingNtuple::Init(TTree *tree)
    see_isValidNeg = 0;
    see_dRZNeg = 0;
    see_dPhiNeg = 0;
+   see_isECALDriven = 0;
    vtx_x = 0;
    vtx_y = 0;
    vtx_z = 0;
@@ -699,6 +705,7 @@ void TrackingNtuple::Init(TTree *tree)
    fChain->SetBranchAddress("see_shareFrac", &see_shareFrac, &b_see_shareFrac);
    fChain->SetBranchAddress("see_simTrkIdx", &see_simTrkIdx, &b_see_simTrkIdx);
    fChain->SetBranchAddress("see_offset", &see_offset, &b_see_offset);
+   fChain->SetBranchAddress("see_Et", &see_Et, &b_see_Et);
    fChain->SetBranchAddress("see_isBarrel", &see_isBarrel, &b_see_isBarrel);
    fChain->SetBranchAddress("see_layerOrDiskNr", &see_layerOrDiskNr, &b_see_layerOrDiskNr);
    fChain->SetBranchAddress("see_isValidPos", &see_isValidPos, &b_see_isValidPos);
@@ -707,6 +714,7 @@ void TrackingNtuple::Init(TTree *tree)
    fChain->SetBranchAddress("see_isValidNeg", &see_isValidNeg, &b_see_isValidNeg);
    fChain->SetBranchAddress("see_dRZNeg", &see_dRZNeg, &b_see_dRZNeg);
    fChain->SetBranchAddress("see_dPhiNeg", &see_dPhiNeg, &b_see_dPhiNeg);
+   fChain->SetBranchAddress("see_isECALDriven", &see_isECALDriven, &b_see_isECALDriven);
    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);

+ 7 - 1
looper/analysis/TrackingNtupleObjs.hpp

@@ -1,4 +1,4 @@
-/** TrackingNtupleObjs.hpp created on 2018-01-24 22:12:19.846573 by generate_class.py
+/** TrackingNtupleObjs.hpp created on 2018-01-29 17:54:20.680281 by generate_class.py
  * AVOID EDITING THIS FILE BY HAND!! Instead edit TrackingNtupleObjs.yaml and re-run
  * generate_class.py
  */
@@ -55,6 +55,7 @@ class SeedCollection {
     Value<vector<vector<float>>>* val_shareFrac;
     Value<vector<vector<int>>>* val_simTrkIdx;
     Value<vector<unsigned int>>* val_offset;
+    Value<vector<float>>* val_Et;
     Value<vector<vector<int>>>* val_isBarrel;
     Value<vector<vector<int>>>* val_layerOrDiskNr;
     Value<vector<vector<int>>>* val_isValidPos;
@@ -63,6 +64,7 @@ class SeedCollection {
     Value<vector<vector<int>>>* val_isValidNeg;
     Value<vector<vector<float>>>* val_dRZNeg;
     Value<vector<vector<float>>>* val_dPhiNeg;
+    Value<vector<short>>* val_isECALDriven;
 
     SeedCollection() { }
 
@@ -92,6 +94,7 @@ class SeedCollection {
         val_shareFrac = tds.track_branch_obj<vector<vector<float>>>("see_shareFrac");
         val_simTrkIdx = tds.track_branch_obj<vector<vector<int>>>("see_simTrkIdx");
         val_offset = tds.track_branch_obj<vector<unsigned int>>("see_offset");
+        val_Et = tds.track_branch_obj<vector<float>>("see_Et");
         val_isBarrel = tds.track_branch_obj<vector<vector<int>>>("see_isBarrel");
         val_layerOrDiskNr = tds.track_branch_obj<vector<vector<int>>>("see_layerOrDiskNr");
         val_isValidPos = tds.track_branch_obj<vector<vector<int>>>("see_isValidPos");
@@ -100,6 +103,7 @@ class SeedCollection {
         val_isValidNeg = tds.track_branch_obj<vector<vector<int>>>("see_isValidNeg");
         val_dRZNeg = tds.track_branch_obj<vector<vector<float>>>("see_dRZNeg");
         val_dPhiNeg = tds.track_branch_obj<vector<vector<float>>>("see_dPhiNeg");
+        val_isECALDriven = tds.track_branch_obj<vector<short>>("see_isECALDriven");
     }
 
     size_t size() const { return (*val_fitok)().size();}
@@ -140,6 +144,7 @@ struct Seed {
     const vector<float>& shareFrac() const {return (*collection->val_shareFrac)().at(idx);}
     const vector<int>& simTrkIdx() const {return (*collection->val_simTrkIdx)().at(idx);}
     const unsigned int& offset() const {return (*collection->val_offset)().at(idx);}
+    const float& Et() const {return (*collection->val_Et)().at(idx);}
     const vector<int>& isBarrel() const {return (*collection->val_isBarrel)().at(idx);}
     const vector<int>& layerOrDiskNr() const {return (*collection->val_layerOrDiskNr)().at(idx);}
     const vector<int>& isValidPos() const {return (*collection->val_isValidPos)().at(idx);}
@@ -148,6 +153,7 @@ struct Seed {
     const vector<int>& isValidNeg() const {return (*collection->val_isValidNeg)().at(idx);}
     const vector<float>& dRZNeg() const {return (*collection->val_dRZNeg)().at(idx);}
     const vector<float>& dPhiNeg() const {return (*collection->val_dPhiNeg)().at(idx);}
+    const short& isECALDriven() const {return (*collection->val_isECALDriven)().at(idx);}
 };
 
 const Seed SeedCollection::iter::operator*() const {

+ 4 - 0
looper/analysis/TrackingNtupleObjs.yaml

@@ -51,6 +51,8 @@ Seed:
         type: vector<int>
       - name: offset
         type: unsigned int
+      - name: Et
+        type: float
       - name: isBarrel
         type: vector<int>
       - name: layerOrDiskNr
@@ -67,6 +69,8 @@ Seed:
         type: vector<float>
       - name: dPhiNeg
         type: vector<float>
+      - name: isECALDriven
+        type: short
 
 Track:
     treename_prefix: trk

+ 60 - 0
looper/analysis/config.yaml

@@ -22,6 +22,66 @@ source-files:
     - filename: ../data/new_trees/trackingNtuple_17.root
     - filename: ../data/new_trees/trackingNtuple_18.root
     - filename: ../data/new_trees/trackingNtuple_19.root
+    - filename: ../data/new_trees/trackingNtuple_20.root
+    - filename: ../data/new_trees/trackingNtuple_21.root
+    - filename: ../data/new_trees/trackingNtuple_22.root
+    - filename: ../data/new_trees/trackingNtuple_23.root
+    - filename: ../data/new_trees/trackingNtuple_24.root
+    - filename: ../data/new_trees/trackingNtuple_25.root
+    - filename: ../data/new_trees/trackingNtuple_26.root
+    - filename: ../data/new_trees/trackingNtuple_27.root
+    - filename: ../data/new_trees/trackingNtuple_28.root
+    - filename: ../data/new_trees/trackingNtuple_29.root
+    - filename: ../data/new_trees/trackingNtuple_30.root
+    - filename: ../data/new_trees/trackingNtuple_31.root
+    - filename: ../data/new_trees/trackingNtuple_32.root
+    - filename: ../data/new_trees/trackingNtuple_33.root
+    - filename: ../data/new_trees/trackingNtuple_34.root
+    - filename: ../data/new_trees/trackingNtuple_35.root
+    - filename: ../data/new_trees/trackingNtuple_36.root
+    - filename: ../data/new_trees/trackingNtuple_37.root
+    - filename: ../data/new_trees/trackingNtuple_38.root
+    - filename: ../data/new_trees/trackingNtuple_39.root
+    - filename: ../data/new_trees/trackingNtuple_40.root
+    - filename: ../data/new_trees/trackingNtuple_41.root
+    - filename: ../data/new_trees/trackingNtuple_42.root
+    - filename: ../data/new_trees/trackingNtuple_43.root
+    - filename: ../data/new_trees/trackingNtuple_44.root
+    - filename: ../data/new_trees/trackingNtuple_45.root
+    - filename: ../data/new_trees/trackingNtuple_46.root
+    - filename: ../data/new_trees/trackingNtuple_47.root
+    - filename: ../data/new_trees/trackingNtuple_48.root
+    - filename: ../data/new_trees/trackingNtuple_49.root
+    - filename: ../data/new_trees/trackingNtuple_50.root
+    - filename: ../data/new_trees/trackingNtuple_51.root
+    - filename: ../data/new_trees/trackingNtuple_52.root
+    - filename: ../data/new_trees/trackingNtuple_53.root
+    - filename: ../data/new_trees/trackingNtuple_54.root
+    - filename: ../data/new_trees/trackingNtuple_55.root
+    - filename: ../data/new_trees/trackingNtuple_56.root
+    - filename: ../data/new_trees/trackingNtuple_57.root
+    - filename: ../data/new_trees/trackingNtuple_58.root
+    - filename: ../data/new_trees/trackingNtuple_59.root
+    - filename: ../data/new_trees/trackingNtuple_60.root
+    - filename: ../data/new_trees/trackingNtuple_61.root
+    - filename: ../data/new_trees/trackingNtuple_62.root
+    - filename: ../data/new_trees/trackingNtuple_63.root
+    - filename: ../data/new_trees/trackingNtuple_64.root
+    - filename: ../data/new_trees/trackingNtuple_65.root
+    - filename: ../data/new_trees/trackingNtuple_66.root
+    - filename: ../data/new_trees/trackingNtuple_67.root
+    - filename: ../data/new_trees/trackingNtuple_68.root
+    - filename: ../data/new_trees/trackingNtuple_69.root
+    - filename: ../data/new_trees/trackingNtuple_70.root
+    - filename: ../data/new_trees/trackingNtuple_71.root
+    - filename: ../data/new_trees/trackingNtuple_72.root
+    - filename: ../data/new_trees/trackingNtuple_73.root
+    - filename: ../data/new_trees/trackingNtuple_74.root
+    - filename: ../data/new_trees/trackingNtuple_75.root
+    - filename: ../data/new_trees/trackingNtuple_76.root
+    - filename: ../data/new_trees/trackingNtuple_77.root
+    - filename: ../data/new_trees/trackingNtuple_78.root
+    - filename: ../data/new_trees/trackingNtuple_79.root
 
 hist-params:
 

+ 38 - 33
looper/analysis/tracking_eff.cpp

@@ -39,7 +39,7 @@ bool in_lum_region(const SimVertex& vertex) {
     float dx = vertex.x() - bs.x->get();
     float dy = vertex.y() - bs.y->get();
     float dz = vertex.z() - bs.z->get();
-    float radius = static_cast<float>(5 * sqrt(pow(bs.sigma_x->get(), 2) + pow(bs.sigma_y->get(), 2)));
+    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;
 };
@@ -68,20 +68,32 @@ void run(bool silent){
         tds.track_branch<float>("bsp_sigmaz")
     };
 
-    auto& dRz_BPIX_L1_H1  = *tds.register_container<ContainerTH1<float>>("dRz_BPIX_L1_H1",  TH1Params::lookup("dRz"));
-    auto& dPhi_BPIX_L1_H1 = *tds.register_container<ContainerTH1<float>>("dPhi_BPIX_L1_H1", TH1Params::lookup("dPhi"));
-    auto& dRz_BPIX_L1_H1_v_Et  = *tds.register_container<ContainerTH2<float>>("dRz_BPIX_L1_H1_v_Et",  TH2Params::lookup("dRz_v_Et"));
-    auto& dPhi_BPIX_L1_H1_v_Et = *tds.register_container<ContainerTH2<float>>("dPhi_BPIX_L1_H1_v_Et", TH2Params::lookup("dPhi_v_Et"));
-
-    auto& dRz_BPIX_L2_H2  = *tds.register_container<ContainerTH1<float>>("dRz_BPIX_L2_H2",  TH1Params::lookup("dRz_outer_hits"));
-    auto& dPhi_BPIX_L2_H2 = *tds.register_container<ContainerTH1<float>>("dPhi_BPIX_L2_H2", TH1Params::lookup("dPhi_outer_hits"));
-    auto& dRz_BPIX_L2_H2_v_Et  = *tds.register_container<ContainerTH2<float>>("dRz_BPIX_L2_H2_v_Et",  TH2Params::lookup("dRz_v_Et_outer_hits"));
-    auto& dPhi_BPIX_L2_H2_v_Et = *tds.register_container<ContainerTH2<float>>("dPhi_BPIX_L2_H2_v_Et", TH2Params::lookup("dPhi_v_Et_outer_hits"));
+    std::map<std::pair<int, int>, ContainerTH2<float>*> BPIX_residuals_dRz;
+    std::map<std::pair<int, int>, ContainerTH2<float>*> BPIX_residuals_dPhi;
+    std::map<std::pair<int, int>, ContainerTH2<float>*> FPIX_residuals_dRz;
+    std::map<std::pair<int, int>, ContainerTH2<float>*> FPIX_residuals_dPhi;
+    stringstream name;
+    TH2Params hist_params;
+    for (int layer=1; layer<=4; layer++) {
+        for (int hit=1; hit<=3; hit++) {
+            hist_params = (hit==1) ? TH2Params::lookup("dRz_v_Et") : TH2Params::lookup("dRz_v_Et_outer_hits");
+            name.str("");
+            name << "dRz_BPIX_L" << layer << "_H" << hit << "_v_Et";
+            BPIX_residuals_dRz[{layer,hit}] = tds.register_container<ContainerTH2<float>>(name.str(), hist_params);
+            name.str("");
+            name << "dRz_FPIX_L" << layer << "_H" << hit << "_v_Et";
+            FPIX_residuals_dRz[{layer,hit}] = tds.register_container<ContainerTH2<float>>(name.str(), hist_params);
+
+            hist_params = (hit==1) ? TH2Params::lookup("dPhi_v_Et") : TH2Params::lookup("dPhi_v_Et_outer_hits");
+            name.str("");
+            name << "dPhi_BPIX_L" << layer << "_H" << hit << "_v_Et";
+            BPIX_residuals_dPhi[{layer,hit}] = tds.register_container<ContainerTH2<float>>(name.str(), hist_params);
+            name.str("");
+            name << "dPhi_FPIX_L" << layer << "_H" << hit << "_v_Et";
+            FPIX_residuals_dPhi[{layer,hit}] = tds.register_container<ContainerTH2<float>>(name.str(), hist_params);
+        }
+    }
 
-    auto& dRz_BPIX_L3_H3  = *tds.register_container<ContainerTH1<float>>("dRz_BPIX_L3_H3",  TH1Params::lookup("dRz_outer_hits"));
-    auto& dPhi_BPIX_L3_H3 = *tds.register_container<ContainerTH1<float>>("dPhi_BPIX_L3_H3", TH1Params::lookup("dPhi_outer_hits"));
-    auto& dRz_BPIX_L3_H3_v_Et  = *tds.register_container<ContainerTH2<float>>("dRz_BPIX_L3_H3_v_Et",  TH2Params::lookup("dRz_v_Et_outer_hits"));
-    auto& dPhi_BPIX_L3_H3_v_Et = *tds.register_container<ContainerTH2<float>>("dPhi_BPIX_L3_H3_v_Et", TH2Params::lookup("dPhi_v_Et_outer_hits"));
 
     auto& seed_eff_v_pt  = *tds.register_container<EfficiencyContainer<float>>("seed_eff_v_pt",  TH1Params::lookup("eff_v_pt"));
     auto& seed_eff_v_eta = *tds.register_container<EfficiencyContainer<float>>("seed_eff_v_eta", TH1Params::lookup("eff_v_eta"));
@@ -111,9 +123,9 @@ void run(bool silent){
             bool matched = !sim_track.seedIdx().empty();
             if (abs(sim_track.eta()) < 2.4)
                 seed_eff_v_pt.fill(sim_track.pt(), matched);
-            if (abs(sim_track.pt()) > 20.0)
+            if (sim_track.pt() > 20.0)
                 seed_eff_v_eta.fill(sim_track.eta(), matched);
-            if (abs(sim_track.eta()) < 2.4 and abs(sim_track.pt()) < 20)
+            if (abs(sim_track.eta()) < 2.4 and sim_track.pt() > 20)
                 seed_eff_v_phi.fill(sim_track.phi(), matched);
         }
 
@@ -130,6 +142,7 @@ void run(bool silent){
         }
 
         for (const auto& seed : seeds) {
+            if (!seed.isECALDriven()) continue;
             bool match = false;
             for (const auto& sim_track_idx : seed.simTrkIdx()) {
                 if(is_good_sim(sim_tracks[sim_track_idx])) {
@@ -164,6 +177,7 @@ void run(bool silent){
 
         for (const auto& seed : seeds) {
             if (seed.trkIdx() < 0) continue;
+            if (!seed.isECALDriven()) continue;
             const auto the_track = gsf_tracks[seed.trkIdx()];
             vector<int>   hits_valid;
             vector<float> hits_dRz;
@@ -187,23 +201,14 @@ void run(bool silent){
                 int layerOrDiskNr = hits_layerOrDiskNr[hit_idx];
                 float dRz = abs(hits_dRz[hit_idx]);
                 float dPhi = abs(hits_dPhi[hit_idx]);
-                if (isBarrel and layerOrDiskNr == 1 and hit_idx == 0 ) {
-                    dRz_BPIX_L1_H1.fill(dRz);
-                    dPhi_BPIX_L1_H1.fill(dPhi);
-                    dRz_BPIX_L1_H1_v_Et.fill(dRz, seed.pt());
-                    dPhi_BPIX_L1_H1_v_Et.fill(dPhi, seed.pt());
-                }
-                if (isBarrel and layerOrDiskNr == 2 and hit_idx == 1 ) {
-                    dRz_BPIX_L2_H2.fill(dRz);
-                    dPhi_BPIX_L2_H2.fill(dPhi);
-                    dRz_BPIX_L2_H2_v_Et.fill(dRz, seed.pt());
-                    dPhi_BPIX_L2_H2_v_Et.fill(dPhi, seed.pt());
-                }
-                if (isBarrel and layerOrDiskNr == 3 and hit_idx == 2 ) {
-                    dRz_BPIX_L3_H3.fill(dRz);
-                    dPhi_BPIX_L3_H3.fill(dPhi);
-                    dRz_BPIX_L3_H3_v_Et.fill(dRz, seed.pt());
-                    dPhi_BPIX_L3_H3_v_Et.fill(dPhi, seed.pt());
+
+
+                if (isBarrel) {
+                    BPIX_residuals_dRz[{layerOrDiskNr, hit_idx+1}]->fill(dRz, seed.Et());
+                    BPIX_residuals_dPhi[{layerOrDiskNr, hit_idx+1}]->fill(dPhi, seed.Et());
+                } else {
+                    FPIX_residuals_dRz[{layerOrDiskNr, hit_idx+1}]->fill(dRz, seed.Et());
+                    FPIX_residuals_dPhi[{layerOrDiskNr, hit_idx+1}]->fill(dPhi, seed.Et());
                 }
                 if (isBarrel)
                     hit_vs_layer_barrel.fill(layerOrDiskNr, static_cast<const int &>(hit_idx + 1));

+ 48 - 19
plotting/eff_plots.py

@@ -15,7 +15,7 @@ def center_text(x, y, txt, **kwargs):
 
 
 @decl_plot
-def plot_residuals(rs, layer, hit, variable, plot_cuts=True):
+def plot_residuals(rs, layer, hit, variable, subdet, plot_cuts=True):
     matching_cuts = [
         dict(
             dPhiMaxHighEt=0.05,
@@ -43,7 +43,7 @@ def plot_residuals(rs, layer, hit, variable, plot_cuts=True):
         )
     ]
 
-    h = hist2d(getattr(rs, f'{variable}_BPIX_L{layer}_H{hit}_v_Et'))
+    h = hist2d(getattr(rs, f'{variable}_{subdet}_L{layer}_H{hit}_v_Et'))
 
     def calc_window(et):
         idx = min(hit-1, 2)
@@ -113,19 +113,19 @@ def plot_tracking_eff(rs):
     hist_plot(hist(rs.tracking_eff_v_pt), include_errors=errors)
     center_text(0.5, 0.3, r'$|\eta|<2.4$')
     plt.xlabel(r"Sim-Track $p_T$")
-    # plt.ylim((0, 1.1))
+    plt.ylim((0, 1.1))
 
     plt.sca(ax_eta)
     hist_plot(hist(rs.tracking_eff_v_eta), include_errors=errors)
     center_text(0.5, 0.3, r'$p_T>20$')
     plt.xlabel(r"Sim-Track $\eta$")
-    # plt.ylim((0, 1.1))
+    plt.ylim((0, 1.1))
 
     plt.sca(ax_phi)
     hist_plot(hist(rs.tracking_eff_v_phi), include_errors=errors)
     center_text(0.5, 0.3, r'$p_T>20$ and $|\eta|<2.4$')
     plt.xlabel(r"Sim-Track $\phi$")
-    # plt.ylim((0, 1.1))
+    plt.ylim((0, 1.1))
 
 
 @decl_plot
@@ -228,27 +228,56 @@ if __name__ == '__main__':
     track_pur_num = plot_track_purity, (rs,), {'ext': '_num'}
     track_pur_den = plot_track_purity, (rs,), {'ext': '_den'}
 
-    residuals_L1_H1_dPhi = plot_residuals, (rs, 1, 1, 'dPhi')
-    residuals_L2_H2_dPhi = plot_residuals, (rs, 2, 2, 'dPhi')
-    residuals_L3_H3_dPhi = plot_residuals, (rs, 3, 3, 'dPhi')
+    BPIX_residuals_L1_H1_dPhi = plot_residuals, (rs, 1, 1, 'dPhi', 'BPIX')
+    BPIX_residuals_L2_H2_dPhi = plot_residuals, (rs, 2, 2, 'dPhi', 'BPIX')
+    BPIX_residuals_L3_H3_dPhi = plot_residuals, (rs, 3, 3, 'dPhi', 'BPIX')
+
+    BPIX_residuals_L1_H1_dRz = plot_residuals, (rs, 1, 1, 'dRz', 'BPIX'), {'plot_cuts': False}
+    BPIX_residuals_L2_H2_dRz = plot_residuals, (rs, 2, 2, 'dRz', 'BPIX')
+    BPIX_residuals_L3_H3_dRz = plot_residuals, (rs, 3, 3, 'dRz', 'BPIX')
 
-    residuals_L1_H1_dRz = plot_residuals, (rs, 1, 1, 'dRz')
-    residuals_L1_H1_dRz_no_cuts = plot_residuals, (rs, 1, 1, 'dRz'), {'plot_cuts': False}
-    residuals_L2_H2_dRz = plot_residuals, (rs, 2, 2, 'dRz')
-    residuals_L3_H3_dRz = plot_residuals, (rs, 3, 3, 'dRz')
+    FPIX_residuals_L1_H1_dPhi = plot_residuals, (rs, 1, 1, 'dPhi', 'FPIX')
+    FPIX_residuals_L2_H2_dPhi = plot_residuals, (rs, 2, 2, 'dPhi', 'FPIX')
+    FPIX_residuals_L3_H3_dPhi = plot_residuals, (rs, 3, 3, 'dPhi', 'FPIX')
+
+    FPIX_residuals_L1_H1_dRz = plot_residuals, (rs, 1, 1, 'dRz', 'FPIX'), {'plot_cuts': False}
+    FPIX_residuals_L2_H2_dRz = plot_residuals, (rs, 2, 2, 'dRz', 'FPIX')
+    FPIX_residuals_L3_H3_dRz = plot_residuals, (rs, 3, 3, 'dRz', 'FPIX')
+
+    FPIX_residuals_L1_H2_dPhi = plot_residuals, (rs, 1, 2, 'dPhi', 'FPIX')
+    FPIX_residuals_L1_H3_dPhi = plot_residuals, (rs, 1, 3, 'dPhi', 'FPIX')
+    FPIX_residuals_L2_H3_dPhi = plot_residuals, (rs, 2, 3, 'dPhi', 'FPIX')
+
+    FPIX_residuals_L1_H2_dRz = plot_residuals, (rs, 1, 2, 'dPhi', 'FPIX')
+    FPIX_residuals_L1_H3_dRz = plot_residuals, (rs, 1, 3, 'dPhi', 'FPIX')
+    FPIX_residuals_L2_H3_dRz = plot_residuals, (rs, 2, 3, 'dPhi', 'FPIX')
 
     hit_vs_layer_barrel = plot_hit_vs_layer, (rs, 'barrel')
     hit_vs_layer_forward = plot_hit_vs_layer, (rs, 'forward')
 
     # Now assemble the plots into figures.
     plots = [
-        Plot(residuals_L1_H1_dPhi, 'Phi Residuals Layer 1 Hit 1'),
-        Plot(residuals_L2_H2_dPhi, 'Phi Residuals Layer 2 Hit 2'),
-        Plot(residuals_L3_H3_dPhi, 'Phi Residuals Layer 3 Hit 3'),
-        Plot(residuals_L1_H1_dRz, 'dZ Residuals Layer 1 Hit 1'),
-        Plot(residuals_L1_H1_dRz_no_cuts, 'dZ Residuals Layer 1 Hit 1 w/o cuts'),
-        Plot(residuals_L2_H2_dRz, 'dZ Residuals Layer 2 Hit 2'),
-        Plot(residuals_L3_H3_dRz, 'dZ Residuals Layer 3 Hit 3'),
+        Plot(BPIX_residuals_L1_H1_dPhi, 'Phi Residuals Layer 1 Hit 1 - BPIX'),
+        Plot(BPIX_residuals_L2_H2_dPhi, 'Phi Residuals Layer 2 Hit 2 - BPIX'),
+        Plot(BPIX_residuals_L3_H3_dPhi, 'Phi Residuals Layer 3 Hit 3 - BPIX'),
+        Plot(BPIX_residuals_L1_H1_dRz, 'dZ Residuals Layer 1 Hit 1 w/o cuts - BPIX'),
+        Plot(BPIX_residuals_L2_H2_dRz, 'dZ Residuals Layer 2 Hit 2 - BPIX'),
+        Plot(BPIX_residuals_L3_H3_dRz, 'dZ Residuals Layer 3 Hit 3 - BPIX'),
+
+        Plot(FPIX_residuals_L1_H1_dPhi, 'Phi Residuals Layer 1 Hit 1 - FPIX'),
+        Plot(FPIX_residuals_L2_H2_dPhi, 'Phi Residuals Layer 2 Hit 2 - FPIX'),
+        Plot(FPIX_residuals_L3_H3_dPhi, 'Phi Residuals Layer 3 Hit 3 - FPIX'),
+        Plot(FPIX_residuals_L1_H1_dRz, 'dR Residuals Layer 1 Hit 1 w/o cuts - FPIX'),
+        Plot(FPIX_residuals_L2_H2_dRz, 'dR Residuals Layer 2 Hit 2 - FPIX'),
+        Plot(FPIX_residuals_L3_H3_dRz, 'dR Residuals Layer 3 Hit 3 - FPIX'),
+
+        Plot(FPIX_residuals_L1_H2_dPhi, 'Phi Residuals Layer 1 Hit 2 - FPIX'),
+        Plot(FPIX_residuals_L1_H3_dPhi, 'Phi Residuals Layer 1 Hit 3 - FPIX'),
+        Plot(FPIX_residuals_L2_H3_dPhi, 'Phi Residuals Layer 2 Hit 3 - FPIX'),
+        Plot(FPIX_residuals_L1_H2_dRz, 'dR Residuals Layer 1 Hit 2 - FPIX'),
+        Plot(FPIX_residuals_L1_H3_dRz, 'dR Residuals Layer 1 Hit 3 - FPIX'),
+        Plot(FPIX_residuals_L2_H3_dRz, 'dR Residuals Layer 2 Hit 3 - FPIX'),
+
         Plot(seed_eff, 'ECAL-Driven Seeding Efficiency'),
         Plot(tracking_eff, 'GSF Tracking Efficiency'),
         Plot(hit_vs_layer_barrel, 'Hit vs Layer - Barrel'),