Quellcode durchsuchen

Cumulative update w/ many changes

  - New version of filval/filval-python
  - Plotter adds comparison plots of efficiencies of different window
  choices
  - Adds requirement that hits in residual plots be from sim-matched
  seeds w/ ECAL energy consistent with simtrack energy.
Caleb Fangmeier vor 6 Jahren
Ursprung
Commit
ed982f26b4

+ 0 - 1
looper/analysis/TrackingNtupleObjs.yaml

@@ -238,7 +238,6 @@ SimTrack:
       - name: seedIdx
         type: vector<int>
 
-
 SimVertex:
     treename_prefix: simvtx
     fields:

+ 432 - 62
looper/analysis/config.yaml

@@ -1,8 +1,130 @@
-# max-events: 300
+#max-events: 50000
 debug: false
 
-output-file: ../hists/new_seeding.root
-source-files:
+output-file: ../hists/narrow-window.root
+source-file-key: narrow-window
+
+#output-file: ../hists/wide-window.root
+#source-file-key: wide-window
+
+#output-file: ../hists/extra-wide-window.root
+#source-file-key: extra-wide-window
+
+extra-narrow-window:
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_1.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_2.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_3.root
+#    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_4.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_5.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_6.root
+#    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_7.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_8.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_9.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_10.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_11.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_12.root
+#    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_13.root
+#    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_14.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_15.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_16.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_17.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_18.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_19.root
+#    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_20.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_21.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_22.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_23.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_24.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_25.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_26.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_27.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_28.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_29.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_30.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_31.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_32.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_33.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_34.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_35.root
+#    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_36.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_37.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_38.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_39.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_40.root
+#    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_41.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_42.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_43.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_44.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_45.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_46.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_47.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_48.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_49.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_50.root
+#    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_51.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_52.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_53.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_54.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_55.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_56.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_57.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_58.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_59.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_60.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_61.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_62.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_63.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_64.root
+#    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_65.root
+#    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_66.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_67.root
+#    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_68.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_69.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_70.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_71.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_72.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_73.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_74.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_75.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_76.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_77.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_78.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_79.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_80.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_81.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_82.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_83.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_84.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_85.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_86.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_87.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_88.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_89.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_90.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_91.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_92.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_93.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_94.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_95.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_96.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_97.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_98.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_99.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_100.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_101.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_102.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_103.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_104.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_105.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_106.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_107.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_108.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_109.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_110.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_111.root
+    - filename: ../data/new_trees_extra_narrow_windows/trackingNtuple_112.root
+
+narrow-window:
     - filename: ../data/new_trees/trackingNtuple_1.root
     - filename: ../data/new_trees/trackingNtuple_2.root
     - filename: ../data/new_trees/trackingNtuple_3.root
@@ -82,26 +204,273 @@ source-files:
     - filename: ../data/new_trees/trackingNtuple_77.root
     - filename: ../data/new_trees/trackingNtuple_78.root
     - filename: ../data/new_trees/trackingNtuple_79.root
+    - filename: ../data/new_trees/trackingNtuple_80.root
+    - filename: ../data/new_trees/trackingNtuple_81.root
+    - filename: ../data/new_trees/trackingNtuple_82.root
+    - filename: ../data/new_trees/trackingNtuple_83.root
+    - filename: ../data/new_trees/trackingNtuple_84.root
+    - filename: ../data/new_trees/trackingNtuple_85.root
+    - filename: ../data/new_trees/trackingNtuple_86.root
+    - filename: ../data/new_trees/trackingNtuple_87.root
+    - filename: ../data/new_trees/trackingNtuple_88.root
+    - filename: ../data/new_trees/trackingNtuple_89.root
+    - filename: ../data/new_trees/trackingNtuple_90.root
+    - filename: ../data/new_trees/trackingNtuple_91.root
+    - filename: ../data/new_trees/trackingNtuple_92.root
+    - filename: ../data/new_trees/trackingNtuple_93.root
+    - filename: ../data/new_trees/trackingNtuple_94.root
+    - filename: ../data/new_trees/trackingNtuple_95.root
+    - filename: ../data/new_trees/trackingNtuple_96.root
+    - filename: ../data/new_trees/trackingNtuple_97.root
+    - filename: ../data/new_trees/trackingNtuple_98.root
+    - filename: ../data/new_trees/trackingNtuple_99.root
+    - filename: ../data/new_trees/trackingNtuple_100.root
+    - filename: ../data/new_trees/trackingNtuple_101.root
+    - filename: ../data/new_trees/trackingNtuple_102.root
+    - filename: ../data/new_trees/trackingNtuple_103.root
+    - filename: ../data/new_trees/trackingNtuple_104.root
+    - filename: ../data/new_trees/trackingNtuple_105.root
+    - filename: ../data/new_trees/trackingNtuple_106.root
+    - filename: ../data/new_trees/trackingNtuple_107.root
+    - filename: ../data/new_trees/trackingNtuple_108.root
+    - filename: ../data/new_trees/trackingNtuple_109.root
+    - filename: ../data/new_trees/trackingNtuple_110.root
+    - filename: ../data/new_trees/trackingNtuple_111.root
+    - filename: ../data/new_trees/trackingNtuple_112.root
 
-hist-params:
+wide-window:
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_1.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_2.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_3.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_4.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_5.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_6.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_7.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_8.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_9.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_10.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_11.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_12.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_13.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_14.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_15.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_16.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_17.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_18.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_19.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_20.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_21.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_22.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_23.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_24.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_25.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_26.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_27.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_28.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_29.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_30.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_31.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_32.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_33.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_34.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_35.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_36.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_37.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_38.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_39.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_40.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_41.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_42.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_43.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_44.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_45.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_46.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_47.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_48.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_49.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_50.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_51.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_52.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_53.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_54.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_55.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_56.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_57.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_58.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_59.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_60.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_61.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_62.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_63.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_64.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_65.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_66.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_67.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_68.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_69.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_70.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_71.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_72.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_73.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_74.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_75.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_76.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_77.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_78.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_79.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_80.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_81.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_82.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_83.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_84.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_85.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_86.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_87.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_88.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_89.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_90.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_91.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_92.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_93.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_94.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_95.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_96.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_97.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_98.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_99.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_100.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_101.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_102.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_103.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_104.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_105.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_106.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_107.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_108.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_109.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_110.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_111.root
+    - filename: ../data/new_trees_wide_windows/trackingNtuple_112.root
 
-    dRz:
-        label_x: "dRz (cm)"
-        nbins: 30
-        low: 0
-        high: 10
-        label_y: ""
+extra-wide-window:
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_1.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_2.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_3.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_4.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_5.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_6.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_7.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_8.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_9.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_10.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_11.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_12.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_13.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_14.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_15.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_16.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_17.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_18.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_19.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_20.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_21.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_22.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_23.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_24.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_25.root
+#    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_26.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_27.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_28.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_29.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_30.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_31.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_32.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_33.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_34.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_35.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_36.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_37.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_38.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_39.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_40.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_41.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_42.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_43.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_44.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_45.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_46.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_47.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_48.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_49.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_50.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_51.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_52.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_53.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_54.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_55.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_56.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_57.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_58.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_59.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_60.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_61.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_62.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_63.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_64.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_65.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_66.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_67.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_68.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_69.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_70.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_71.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_72.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_73.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_74.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_75.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_76.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_77.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_78.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_79.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_80.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_81.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_82.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_83.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_84.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_85.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_86.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_87.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_88.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_89.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_90.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_91.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_92.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_93.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_94.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_95.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_96.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_97.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_98.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_99.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_100.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_101.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_102.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_103.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_104.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_105.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_106.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_107.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_108.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_109.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_110.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_111.root
+    - filename: ../data/new_trees_extra_wide_windows/trackingNtuple_112.root
 
-    dPhi:
-        label_x: "dPhi (rad)"
-        nbins: 30
-        low: 0
-        high: 0.15
-        label_y: ""
+hist-params:
 
     dRz_v_Et:
         label_x: "dRz (cm)"
-        nbins_x: 30
+        nbins_x: 60
         low_x: 0
         high_x: 10
         label_y: "$E_T$"
@@ -111,33 +480,19 @@ hist-params:
 
     dPhi_v_Et:
         label_x: "dPhi (rad)"
-        nbins_x: 30
+        nbins_x: 60
         low_x: 0
-        high_x: 0.15
+        high_x: 0.2
         label_y: "$E_T$"
         nbins_y: 30
         low_y: 0
         high_y: 100
 
-    dRz_outer_hits:
-        label_x: "dRz (cm)"
-        nbins: 30
-        low: 0
-        high: 0.1
-        label_y: ""
-
-    dPhi_outer_hits:
-        label_x: "dPhi (rad)"
-        nbins: 30
-        low: 0
-        high: 0.004
-        label_y: ""
-
     dRz_v_Et_outer_hits:
         label_x: "dRz (cm)"
-        nbins_x: 30
+        nbins_x: 60
         low_x: 0
-        high_x: 0.15
+        high_x: 0.20
         label_y: "$E_T$"
         nbins_y: 30
         low_y: 0
@@ -145,9 +500,9 @@ hist-params:
 
     dPhi_v_Et_outer_hits:
         label_x: "dPhi (rad)"
-        nbins_x: 30
+        nbins_x: 60
         low_x: 0
-        high_x: 0.004
+        high_x: 0.012
         label_y: "$E_T$"
         nbins_y: 30
         low_y: 0
@@ -155,41 +510,50 @@ hist-params:
 
     eff_v_pt:
         label_x: "eff_v_pt"
-        nbins: 30
-        low: 0
-        high: 300
-        label_y: ""
+        nbins_x: 30
+        low_x: 0
+        high_x: 300
     eff_v_eta:
         label_x: "eff_v_eta"
-        nbins: 30
-        low: -3.0
-        high: 3.0
-        label_y: ""
+        nbins_x: 30
+        low_x: -3.0
+        high_x: 3.0
     eff_v_phi:
         label_x: "eff_v_phi"
-        nbins: 30
-        low: -3.2
-        high: 3.2
-        label_y: ""
+        nbins_x: 30
+        low_x: -3.2
+        high_x: 3.2
+    eff_v_eta_pt:
+        label_x: "eta"
+        nbins_x: 30
+        low_x: -3.0
+        high_x: 3.0
+        label_y: "pt"
+        nbins_y: 30
+        low_y: 0
+        high_y: 300
 
     pur_v_pt:
         label_x: "pur_v_pt"
-        nbins: 30
-        low: 0
-        high: 300
-        label_y: ""
+        nbins_x: 30
+        low_x: 0
+        high_x: 300
     pur_v_eta:
         label_x: "pur_v_eta"
-        nbins: 30
-        low: -3.0
-        high: 3.0
-        label_y: ""
+        nbins_x: 30
+        low_x: -3.0
+        high_x: 3.0
     pur_v_phi:
         label_x: "pur_v_phi"
-        nbins: 30
-        low: -3.2
-        high: 3.2
-        label_y: ""
+        nbins_x: 30
+        low_x: -3.2
+        high_x: 3.2
+
+    gsf_tracks_nmatch_sim_tracks:
+        label_x: "nMatchedSimTracks"
+        nbins_x: 5
+        low_x: -0.5
+        high_x: 4.5
 
     n_hit_v_eta:
         label_x: "eta"
@@ -209,4 +573,10 @@ hist-params:
         label_y: "hit number"
         nbins_y: 5
         low_y: 0.5
-        high_y: 5.5
+        high_y: 5.5
+
+    ecal_energy_resolution:
+        label_x: "delta E"
+        nbins_x: 200
+        low_x: -1
+        low_x: 1

+ 135 - 28
looper/analysis/tracking_eff.cpp

@@ -6,11 +6,8 @@
 #include "filval.hpp"
 #include "root_filval.hpp"
 
-#include <boost/range/combine.hpp>
-
 #include "analysis/TrackingNtupleObjs.hpp"
 
-
 SeedCollection seeds;
 SimTrackCollection sim_tracks;
 SimVertexCollection sim_vertices;
@@ -49,6 +46,13 @@ bool is_good_sim(const SimTrack& sim_track) {
     return abs(sim_track.pdgId()) == 11 and in_lum_region(vertex);
 };
 
+float reco_energy_rel_err(const SimTrack& sim_track, const Seed& seed) {
+    return (sim_track.pt() - seed.Et()) / sim_track.pt() ;
+}
+
+bool reco_energy_consistent(const SimTrack& sim_track, const Seed& seed, float consistency_cut=0.1) {
+    return fabs(reco_energy_rel_err(sim_track, seed)) < consistency_cut;
+}
 
 void run(bool silent){
     using namespace std;
@@ -73,10 +77,10 @@ void run(bool silent){
     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;
+    THParams 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");
+            hist_params = (hit==1) ? THParams::lookup("dRz_v_Et") : THParams::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);
@@ -84,7 +88,7 @@ void run(bool silent){
             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");
+            hist_params = (hit==1) ? THParams::lookup("dPhi_v_Et") : THParams::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);
@@ -95,32 +99,80 @@ void run(bool silent){
     }
 
 
-    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"));
-    auto& seed_eff_v_phi = *tds.register_container<EfficiencyContainer<float>>("seed_eff_v_phi", TH1Params::lookup("eff_v_phi"));
+    auto& seed_eff_v_pt  = *tds.register_container<EfficiencyContainer<float>>("seed_eff_v_pt",  THParams::lookup("eff_v_pt"));
+    auto& seed_eff_v_eta = *tds.register_container<EfficiencyContainer<float>>("seed_eff_v_eta", THParams::lookup("eff_v_eta"));
+    auto& seed_eff_v_phi = *tds.register_container<EfficiencyContainer<float>>("seed_eff_v_phi", THParams::lookup("eff_v_phi"));
+    auto& seed_eff_v_eta_pt  = *tds.register_container<EfficiencyContainer2D<float>>("seed_eff_v_eta_pt",  THParams::lookup("eff_v_eta_pt"));
+
+    auto& tracking_eff_v_pt  = *tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_pt",  THParams::lookup("eff_v_pt"));
+    auto& tracking_eff_v_eta = *tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_eta", THParams::lookup("eff_v_eta"));
+    auto& tracking_eff_v_phi = *tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_phi", THParams::lookup("eff_v_phi"));
+    auto& tracking_eff_v_eta_pt  = *tds.register_container<EfficiencyContainer2D<float>>("tracking_eff_v_eta_pt",  THParams::lookup("eff_v_eta_pt"));
+
+    auto& tracking_eff_v_pt2  = *tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_pt2",  THParams::lookup("eff_v_pt"));
+    auto& tracking_eff_v_eta2 = *tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_eta2", THParams::lookup("eff_v_eta"));
+    auto& tracking_eff_v_phi2 = *tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_phi2", THParams::lookup("eff_v_phi"));
+
+    auto& seed_pur_v_pt  = *tds.register_container<EfficiencyContainer<float>>("seed_pur_v_pt",  THParams::lookup("pur_v_pt"));
+    auto& seed_pur_v_eta = *tds.register_container<EfficiencyContainer<float>>("seed_pur_v_eta", THParams::lookup("pur_v_eta"));
+    auto& seed_pur_v_phi = *tds.register_container<EfficiencyContainer<float>>("seed_pur_v_phi", THParams::lookup("pur_v_phi"));
+
+    auto& tracking_pur_v_pt  = *tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_pt",  THParams::lookup("pur_v_pt"));
+    auto& tracking_pur_v_eta = *tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_eta", THParams::lookup("pur_v_eta"));
+    auto& tracking_pur_v_phi = *tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_phi", THParams::lookup("pur_v_phi"));
+
+    auto& tracking_pur_v_pt2  = *tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_pt2",  THParams::lookup("pur_v_pt"));
+    auto& tracking_pur_v_eta2 = *tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_eta2", THParams::lookup("pur_v_eta"));
+    auto& tracking_pur_v_phi2 = *tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_phi2", THParams::lookup("pur_v_phi"));
+
 
-    auto& tracking_eff_v_pt  = *tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_pt",  TH1Params::lookup("eff_v_pt"));
-    auto& tracking_eff_v_eta = *tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_eta", TH1Params::lookup("eff_v_eta"));
-    auto& tracking_eff_v_phi = *tds.register_container<EfficiencyContainer<float>>("tracking_eff_v_phi", TH1Params::lookup("eff_v_phi"));
 
-    auto& seed_pur_v_pt  = *tds.register_container<EfficiencyContainer<float>>("seed_pur_v_pt",  TH1Params::lookup("pur_v_pt"));
-    auto& seed_pur_v_eta = *tds.register_container<EfficiencyContainer<float>>("seed_pur_v_eta", TH1Params::lookup("pur_v_eta"));
-    auto& seed_pur_v_phi = *tds.register_container<EfficiencyContainer<float>>("seed_pur_v_phi", TH1Params::lookup("pur_v_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& tracking_pur_v_pt  = *tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_pt",  TH1Params::lookup("pur_v_pt"));
-    auto& tracking_pur_v_eta = *tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_eta", TH1Params::lookup("pur_v_eta"));
-    auto& tracking_pur_v_phi = *tds.register_container<EfficiencyContainer<float>>("tracking_pur_v_phi", TH1Params::lookup("pur_v_phi"));
+    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& hit_vs_layer_barrel = *tds.register_container<ContainerTH2<int>>("hit_vs_layer_barrel", TH2Params::lookup("hit_vs_layer"));
-    auto& hit_vs_layer_forward = *tds.register_container<ContainerTH2<int>>("hit_vs_layer_forward", TH2Params::lookup("hit_vs_layer"));
+    auto& ecal_energy_resolution = *tds.register_container<ContainerTH1<float>>("ecal_energy_resolution ", THParams::lookup("ecal_energy_resolution"));
 
     while (tds.next(!silent)) {
 
+//        for (const auto& gsf_track : gsf_tracks) {
+//            cout << "GSF Track " << gsf_track.idx << endl;
+//            long n_matched_sim = gsf_track.simTrkIdx().size();
+//            for (int idx=0; idx<n_matched_sim; idx++) {
+//                int sim_trk_idx = gsf_track.simTrkIdx()[idx];
+//                int sim_trk_share = gsf_track.shareFrac()[idx];
+//                cout << "  " <<
+//                cout << "  " << sim_tracks[sim_trk_idx].
+//            }
+//        }
+
+//        ecal_energy_resolution.fill(0.0);
         for (const auto& sim_track : sim_tracks) {
             if (!is_good_sim(sim_track)) continue;
             if (seeds.size() == 0) continue;
-            bool matched = !sim_track.seedIdx().empty();
+            for (const auto &seed_idx : sim_track.seedIdx()) {
+                const Seed& seed = seeds[seed_idx];
+                if (not seed.isECALDriven()) continue;
+//                cout << "trk_idx: " << sim_track.idx << " seed_idx: " << seed_idx << " err: " << reco_energy_rel_err(sim_track, seed) << endl;
+                ecal_energy_resolution.fill(reco_energy_rel_err(sim_track, seed));
+            }
+        }
+
+        // Seeding Efficiency
+        for (const auto& sim_track : sim_tracks) {
+            if (!is_good_sim(sim_track)) continue;
+            if (seeds.size() == 0) continue;
+            bool matched = false;
+            for (const auto& seed_idx : sim_track.seedIdx()) {
+                const Seed& seed = seeds[seed_idx];
+                if (seed.isECALDriven()) {
+                    matched=true;
+                    break;
+                }
+            }
+            seed_eff_v_eta_pt.fill(sim_track.eta(), sim_track.pt(), matched);
             if (abs(sim_track.eta()) < 2.4)
                 seed_eff_v_pt.fill(sim_track.pt(), matched);
             if (sim_track.pt() > 20.0)
@@ -129,18 +181,45 @@ void run(bool silent){
                 seed_eff_v_phi.fill(sim_track.phi(), matched);
         }
 
+        // Tracking Efficiency
         for (const auto& sim_track : sim_tracks) {
             if (!is_good_sim(sim_track)) continue;
             if (gsf_tracks.size() == 0) continue;
-            bool matched = !sim_track.trkIdx().empty();
+            bool matched = false;
+            for (const auto& track_idx : sim_track.trkIdx()) {
+                const Seed& seed = seeds[gsf_tracks[track_idx].seedIdx()];
+                if (seed.isECALDriven()) {
+                    matched=true;
+                    break;
+                }
+            }
+            tracking_eff_v_eta_pt.fill(sim_track.eta(), sim_track.pt(), matched);
             if (abs(sim_track.eta()) < 2.4)
                 tracking_eff_v_pt.fill(sim_track.pt(), matched);
             if (sim_track.pt() > 20.0)
                 tracking_eff_v_eta.fill(sim_track.eta(), matched);
             if (abs(sim_track.eta()) < 2.4 and sim_track.pt() > 20)
                 tracking_eff_v_phi.fill(sim_track.phi(), matched);
+
+
+
+            matched = false;
+            for (const auto& seed_idx : sim_track.seedIdx()) {
+                const Seed& seed = seeds[seed_idx];
+                if (seed.isECALDriven() and seed.trkIdx()>=0 and reco_energy_consistent(sim_track, seed)) {
+                    matched=true;
+                    break;
+                }
+            }
+            if (abs(sim_track.eta()) < 2.4)
+                tracking_eff_v_pt2.fill(sim_track.pt(), matched);
+            if (sim_track.pt() > 20.0)
+                tracking_eff_v_eta2.fill(sim_track.eta(), matched);
+            if (abs(sim_track.eta()) < 2.4 and sim_track.pt() > 20)
+                tracking_eff_v_phi2.fill(sim_track.phi(), matched);
         }
 
+        // Seeding Purity
         for (const auto& seed : seeds) {
             if (!seed.isECALDriven()) continue;
             bool match = false;
@@ -158,10 +237,12 @@ void run(bool silent){
                 seed_pur_v_phi.fill(seed.phi(), match);
         }
 
+        // Tracking Purity
         for (const auto& gsf_track : gsf_tracks) {
+            gsf_tracks_nmatch_sim_tracks.fill(gsf_track.simTrkIdx().size());
             bool match = false;
             for (const auto& sim_track_idx : gsf_track.simTrkIdx()) {
-                if(is_good_sim(sim_tracks[sim_track_idx])) {
+                if (is_good_sim(sim_tracks[sim_track_idx])) {
                     match = true;
                     break;
                 }
@@ -173,11 +254,36 @@ void run(bool silent){
             if (abs(gsf_track.eta()) < 2.4 and gsf_track.pt() > 20)
                 tracking_pur_v_phi.fill(gsf_track.phi(), match);
 
+            match = false;
+            for (const auto& sim_track_idx : seeds[gsf_track.seedIdx()].simTrkIdx()) {
+                if (is_good_sim(sim_tracks[sim_track_idx])) {
+                    match = true;
+                    break;
+                }
+            }
+            if (abs(gsf_track.eta()) < 2.4)
+                tracking_pur_v_pt2.fill(gsf_track.pt(), match);
+            if (gsf_track.pt() > 20)
+                tracking_pur_v_eta2.fill(gsf_track.eta(), match);
+            if (abs(gsf_track.eta()) < 2.4 and gsf_track.pt() > 20)
+                tracking_pur_v_phi2.fill(gsf_track.phi(), match);
         }
 
+        // Hit Residuals
         for (const auto& seed : seeds) {
-            if (seed.trkIdx() < 0) continue;
+            if (seed.trkIdx() < 0) continue;  // require that seed produced gsf-track
             if (!seed.isECALDriven()) continue;
+            bool is_sim_matched = false;
+            for (const auto& sim_track_idx : seed.simTrkIdx()) {
+                const SimTrack& sim_track = sim_tracks[sim_track_idx];
+                if (is_good_sim(sim_track) and reco_energy_consistent(sim_track, seed)) {
+                    is_sim_matched = true;
+                    break;
+//                    std::cout << "Matched to non-electron: " << sim_tracks[sim_track_idx].pdgId()
+//                              << " (" << seed.simTrkIdx().size() << ")" << std::endl;
+                }
+            }
+            if (!is_sim_matched) continue;
             const auto the_track = gsf_tracks[seed.trkIdx()];
             vector<int>   hits_valid;
             vector<float> hits_dRz;
@@ -195,7 +301,7 @@ void run(bool silent){
             const vector<int>& hits_layerOrDiskNr = seed.layerOrDiskNr();
 
             size_t nHits = hits_valid.size();
-            for(size_t hit_idx=0; hit_idx<nHits; hit_idx++) {
+            for (size_t hit_idx=0; hit_idx<nHits; hit_idx++) {
                 if (!hits_valid[hit_idx]) continue;
                 bool isBarrel = hits_isBarrel[hit_idx] == 1;
                 int layerOrDiskNr = hits_layerOrDiskNr[hit_idx];
@@ -224,9 +330,10 @@ void run(bool silent){
 int main(int argc, char * argv[]){
     using namespace fv_util;
     ArgParser args(argc, argv);
-    bool silent = args.cmdOptionExists("-s");
-    if(args.cmdOptionExists("-c")) {
-        init_config(args.getCmdOption("-c"));
+    bool silent = args.cmd_option_exists("-s");
+    if(args.cmd_option_exists("-c")) {
+        init_config(args.get_cmd_option("-c"));
+        args.update_config();
         init_log(LogPriority::kLogInfo);
 //        gSystem->Load("libfilval.so");
         run(silent);

+ 1 - 1
looper/filval

@@ -1 +1 @@
-Subproject commit 7805222983a853d6b440a700b1d7ab3d43714118
+Subproject commit 26472a33ce97110b2daafc667a5f04da92eaa05a

+ 23 - 0
looper/tools/run_in_tmux.sh

@@ -0,0 +1,23 @@
+#!/usr/bin/env zsh
+
+config="analysis/config.yaml"
+release=cmake-build-release
+
+tmux new-window -n  'Run' \
+                      "./$release/tracking_eff -c $config \
+                          source-file-key=narrow-window \
+                          output-file=../hists/narrow-window.root"
+
+tmux split-window -h  "./$release/tracking_eff -c $config \
+                          source-file-key=extra-narrow-window \
+                          output-file=../hists/extra-narrow-window.root"
+
+tmux split-window -h  "./$release/tracking_eff -c $config \
+                          source-file-key=wide-window \
+                          output-file=../hists/wide-window.root"
+
+tmux split-window -h  "./$release/tracking_eff -c $config \
+                          source-file-key=extra-wide-window \
+                          output-file=../hists/extra-wide-window.root"
+
+tmux select-layout even-vertical

+ 375 - 71
plotting/eff_plots.py

@@ -3,7 +3,7 @@ import numpy as np
 import matplotlib.pyplot as plt
 
 from filval.result_set import ResultSet
-from filval.histogram import hist, hist_add, hist_norm, hist_scale, hist2d
+from filval.histogram import hist, hist_integral, hist2d, hist2d_percent_contour
 from filval.plotting import (decl_plot, render_plots, hist_plot, hist2d_plot,
                              Plot, generate_dashboard, simple_plot)
 
@@ -14,58 +14,151 @@ def center_text(x, y, txt, **kwargs):
              transform=plt.gca().transAxes, **kwargs)
 
 
+def hist_integral_ratio(num, den):
+    num_int = hist_integral(num, times_bin_width=False)
+    den_int = hist_integral(den, times_bin_width=False)
+
+    ratio = num_int / den_int
+    error = np.sqrt(den_int) / den_int  # TODO: Check this definition of error
+    return ratio, error
+
 @decl_plot
-def plot_residuals(rs, layer, hit, variable, subdet, plot_cuts=True):
-    matching_cuts = [
-        dict(
-            dPhiMaxHighEt=0.05,
-            dPhiMaxHighEtThres=20.0,
-            dPhiMaxLowEtGrad=-0.002,
-            dRzMaxHighEt=9999.0,
-            dRzMaxHighEtThres=0.0,
-            dRzMaxLowEtGrad=0.0,
-        ),
-        dict(
-            dPhiMaxHighEt=0.003,
-            dPhiMaxHighEtThres=0.0,
-            dPhiMaxLowEtGrad=0.0,
-            dRzMaxHighEt=0.05,
-            dRzMaxHighEtThres=30.0,
-            dRzMaxLowEtGrad=-0.002,
-        ),
-        dict(
-            dPhiMaxHighEt=0.003,
-            dPhiMaxHighEtThres=0.0,
-            dPhiMaxLowEtGrad=0.0,
-            dRzMaxHighEt=0.05,
-            dRzMaxHighEtThres=30.0,
-            dRzMaxLowEtGrad=-0.002,
-        )
-    ]
+def plot_residuals(rs, layer, hit, variable, subdet, plot_cuts=True, cut_sel='tight'):
+    matching_cuts = {
+        'extra-narrow': [
+            dict(
+                dPhiMaxHighEt=0.025,
+                dPhiMaxHighEtThres=20.0,
+                dPhiMaxLowEtGrad=-0.002,
+                dRzMaxHighEt=9999.0,
+                dRzMaxHighEtThres=0.0,
+                dRzMaxLowEtGrad=0.0,
+            ),
+            dict(
+                dPhiMaxHighEt=0.0015,
+                dPhiMaxHighEtThres=0.0,
+                dPhiMaxLowEtGrad=0.0,
+                dRzMaxHighEt=0.025,
+                dRzMaxHighEtThres=30.0,
+                dRzMaxLowEtGrad=-0.002,
+            ),
+            dict(
+                dPhiMaxHighEt=0.0015,
+                dPhiMaxHighEtThres=0.0,
+                dPhiMaxLowEtGrad=0.0,
+                dRzMaxHighEt=0.025,
+                dRzMaxHighEtThres=30.0,
+                dRzMaxLowEtGrad=-0.002,
+            )
+        ],
+        'narrow': [
+            dict(
+                dPhiMaxHighEt=0.05,
+                dPhiMaxHighEtThres=20.0,
+                dPhiMaxLowEtGrad=-0.002,
+                dRzMaxHighEt=9999.0,
+                dRzMaxHighEtThres=0.0,
+                dRzMaxLowEtGrad=0.0,
+            ),
+            dict(
+                dPhiMaxHighEt=0.003,
+                dPhiMaxHighEtThres=0.0,
+                dPhiMaxLowEtGrad=0.0,
+                dRzMaxHighEt=0.05,
+                dRzMaxHighEtThres=30.0,
+                dRzMaxLowEtGrad=-0.002,
+            ),
+            dict(
+                dPhiMaxHighEt=0.003,
+                dPhiMaxHighEtThres=0.0,
+                dPhiMaxLowEtGrad=0.0,
+                dRzMaxHighEt=0.05,
+                dRzMaxHighEtThres=30.0,
+                dRzMaxLowEtGrad=-0.002,
+            )
+        ],
+        'wide': [
+            dict(
+                dPhiMaxHighEt=0.10,
+                dPhiMaxHighEtThres=20.0,
+                dPhiMaxLowEtGrad=-0.002,
+                dRzMaxHighEt=9999.0,
+                dRzMaxHighEtThres=0.0,
+                dRzMaxLowEtGrad=0.0,
+            ),
+            dict(
+                dPhiMaxHighEt=0.006,
+                dPhiMaxHighEtThres=0.0,
+                dPhiMaxLowEtGrad=0.0,
+                dRzMaxHighEt=0.10,
+                dRzMaxHighEtThres=30.0,
+                dRzMaxLowEtGrad=-0.002,
+            ),
+            dict(
+                dPhiMaxHighEt=0.006,
+                dPhiMaxHighEtThres=0.0,
+                dPhiMaxLowEtGrad=0.0,
+                dRzMaxHighEt=0.10,
+                dRzMaxHighEtThres=30.0,
+                dRzMaxLowEtGrad=-0.002,
+            )
+        ],
+        'extra-wide': [
+            dict(
+                dPhiMaxHighEt=0.15,
+                dPhiMaxHighEtThres=20.0,
+                dPhiMaxLowEtGrad=-0.002,
+                dRzMaxHighEt=9999.0,
+                dRzMaxHighEtThres=0.0,
+                dRzMaxLowEtGrad=0.0,
+            ),
+            dict(
+                dPhiMaxHighEt=0.009,
+                dPhiMaxHighEtThres=0.0,
+                dPhiMaxLowEtGrad=0.0,
+                dRzMaxHighEt=0.15,
+                dRzMaxHighEtThres=30.0,
+                dRzMaxLowEtGrad=-0.002,
+            ),
+            dict(
+                dPhiMaxHighEt=0.009,
+                dPhiMaxHighEtThres=0.0,
+                dPhiMaxLowEtGrad=0.0,
+                dRzMaxHighEt=0.15,
+                dRzMaxHighEtThres=30.0,
+                dRzMaxLowEtGrad=-0.002,
+            )
+        ]
+    }
 
     h = hist2d(getattr(rs, f'{variable}_{subdet}_L{layer}_H{hit}_v_Et'))
 
     def calc_window(et):
         idx = min(hit-1, 2)
-        high_et = matching_cuts[idx][f'{variable}MaxHighEt']
-        high_et_thres = matching_cuts[idx][f'{variable}MaxHighEtThres']
-        low_et_grad = matching_cuts[idx][f'{variable}MaxLowEtGrad']
+        cuts = matching_cuts[cut_sel]
+        high_et = cuts[idx][f'{variable}MaxHighEt']
+        high_et_thres = cuts[idx][f'{variable}MaxHighEtThres']
+        low_et_grad = cuts[idx][f'{variable}MaxLowEtGrad']
         return high_et + min(0, et-high_et_thres)*low_et_grad
 
     hist2d_plot(h, colorbar=True)
 
+    xs, ys = hist2d_percent_contour(h, .90, 'x')
+    plt.plot(xs, ys, color='green', label='90\% contour')
+    xs, ys = hist2d_percent_contour(h, .995, 'x')
+    plt.plot(xs, ys, color='darkgreen', label='99.5\% contour')
+
     if plot_cuts:
         ets = h[3][:, 0]
         cuts = [calc_window(et) for et in ets]
         plt.plot(cuts, ets, color='red', label='Cut Value')
-        plt.legend()
+        plt.legend(loc='upper right')
 
     plt.xlabel({'dPhi': r'$\delta \phi$ (rads)',
                 'dRz': r'$\delta R/z$ (cm)'}[variable])
     plt.ylabel('$E_T$ (GeV)')
 
 
-
 @decl_plot
 def plot_seed_eff(rs):
     r"""## ECAL-Driven Seeding Efficiency
@@ -107,6 +200,7 @@ def plot_tracking_eff(rs):
     ax_pt = plt.subplot(221)
     ax_eta = plt.subplot(222)
     ax_phi = plt.subplot(223)
+    ax_eta_pt = plt.subplot(224)
 
     errors = True
     plt.sca(ax_pt)
@@ -127,6 +221,12 @@ def plot_tracking_eff(rs):
     plt.xlabel(r"Sim-Track $\phi$")
     plt.ylim((0, 1.1))
 
+    plt.sca(ax_eta_pt)
+    hist2d_plot(hist2d(rs.tracking_eff_v_eta_pt))
+    plt.xlabel(r"Sim-Track $\eta$")
+    plt.ylabel(r"Sim-Track $p_T$")
+    plt.colorbar()
+
 
 @decl_plot
 def plot_seed_purity(rs, ext=""):
@@ -184,22 +284,19 @@ def plot_track_purity(rs, ext=""):
     hist_plot(get_hist("tracking_pur_v_pt"), include_errors=errors)
     center_text(0.5, 0.3, r'$|\eta|<2.4$')
     plt.xlabel(r"GSF-Track $p_T$")
-    if not ext:
-        plt.ylim((0, 1.1))
+    plt.ylim((0, 1.1))
 
     plt.sca(ax_eta)
     hist_plot(get_hist("tracking_pur_v_eta"), include_errors=errors)
     center_text(0.5, 0.3, r'$p_T>20$')
     plt.xlabel(r"GSF-Track $\eta$")
-    if not ext:
-        plt.ylim((0, 1.1))
+    plt.ylim((0, 1.1))
 
     plt.sca(ax_phi)
     hist_plot(get_hist("tracking_pur_v_phi"), include_errors=errors)
     center_text(0.5, 0.3, r'$p_T>20$ and $|\eta|<2.4$')
     plt.xlabel(r"GSF-Track $\phi$")
-    if not ext:
-        plt.ylim((0, 1.1))
+    plt.ylim((0, 1.1))
 
 
 @decl_plot
@@ -212,50 +309,44 @@ def plot_hit_vs_layer(rs, region):
     plt.ylabel('Hit \#')
 
 
-if __name__ == '__main__':
-    rs = ResultSet('seeds', '../hists/new_seeding.root')
+def single_cut_plots(cut_sel):
+    rs = ResultSet(f'{cut_sel}-window', f'../hists/{cut_sel}-window.root')
 
-    # Next, declare all of the (sub)plots that will be assembled into full
-    # figures later
-    seed_eff = plot_seed_eff, (rs, )
+    seed_eff = plot_seed_eff, (rs,)
     tracking_eff = plot_tracking_eff, (rs,)
 
-    seed_pur = plot_seed_purity, rs
-    seed_pur_num = plot_seed_purity, (rs,), {'ext': '_num'}
-    seed_pur_den = plot_seed_purity, (rs,), {'ext': '_den'}
+    seed_pur = plot_seed_purity, (rs,)
 
     track_pur = plot_track_purity, (rs,)
-    track_pur_num = plot_track_purity, (rs,), {'ext': '_num'}
-    track_pur_den = plot_track_purity, (rs,), {'ext': '_den'}
+    track_pur_seed_match = plot_track_purity, (rs,), dict(ext='2')
 
-    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_dPhi = plot_residuals, (rs, 1, 1, 'dPhi', 'BPIX'), dict(cut_sel=cut_sel)
+    BPIX_residuals_L2_H2_dPhi = plot_residuals, (rs, 2, 2, 'dPhi', 'BPIX'), dict(cut_sel=cut_sel)
+    BPIX_residuals_L3_H3_dPhi = plot_residuals, (rs, 3, 3, 'dPhi', 'BPIX'), dict(cut_sel=cut_sel)
 
     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')
+    BPIX_residuals_L2_H2_dRz = plot_residuals, (rs, 2, 2, 'dRz', 'BPIX'), dict(cut_sel=cut_sel)
+    BPIX_residuals_L3_H3_dRz = plot_residuals, (rs, 3, 3, 'dRz', 'BPIX'), dict(cut_sel=cut_sel)
 
-    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_dPhi = plot_residuals, (rs, 1, 1, 'dPhi', 'FPIX'), dict(cut_sel=cut_sel)
+    FPIX_residuals_L2_H2_dPhi = plot_residuals, (rs, 2, 2, 'dPhi', 'FPIX'), dict(cut_sel=cut_sel)
+    FPIX_residuals_L3_H3_dPhi = plot_residuals, (rs, 3, 3, 'dPhi', 'FPIX'), dict(cut_sel=cut_sel)
 
     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_L2_H2_dRz = plot_residuals, (rs, 2, 2, 'dRz', 'FPIX'), dict(cut_sel=cut_sel)
+    FPIX_residuals_L3_H3_dRz = plot_residuals, (rs, 3, 3, 'dRz', 'FPIX'), dict(cut_sel=cut_sel)
 
-    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_dPhi = plot_residuals, (rs, 1, 2, 'dPhi', 'FPIX'), dict(cut_sel=cut_sel)
+    FPIX_residuals_L1_H3_dPhi = plot_residuals, (rs, 1, 3, 'dPhi', 'FPIX'), dict(cut_sel=cut_sel)
+    FPIX_residuals_L2_H3_dPhi = plot_residuals, (rs, 2, 3, 'dPhi', 'FPIX'), dict(cut_sel=cut_sel)
 
-    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')
+    FPIX_residuals_L1_H2_dRz = plot_residuals, (rs, 1, 2, 'dPhi', 'FPIX'), dict(cut_sel=cut_sel)
+    FPIX_residuals_L1_H3_dRz = plot_residuals, (rs, 1, 3, 'dPhi', 'FPIX'), dict(cut_sel=cut_sel)
+    FPIX_residuals_L2_H3_dRz = plot_residuals, (rs, 2, 3, 'dPhi', 'FPIX'), dict(cut_sel=cut_sel)
 
     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(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'),
@@ -282,15 +373,228 @@ if __name__ == '__main__':
         Plot(tracking_eff, 'GSF Tracking Efficiency'),
         Plot(hit_vs_layer_barrel, 'Hit vs Layer - Barrel'),
         Plot(hit_vs_layer_forward, 'Hit vs Layer - Forward'),
+        Plot(seed_pur, 'ECAL-Driven Seeding Purity'),
         Plot(track_pur, 'GSF Track Purity'),
-        Plot(track_pur_num, 'GSF Track Purity Numerator'),
-        Plot(track_pur_den, 'GSF Track Purity Denominator'),
+        Plot(track_pur_seed_match , 'GSF Track Purity (Seed Truth Match)'),
+        simple_plot(rs.gsf_tracks_nmatch_sim_tracks, log='y'),
     ]
 
-    # Finally, render and save the plots and generate the html+bootstrap
-    # dashboard to view them
     render_plots(plots, to_disk=False)
     generate_dashboard(plots, 'Seeding Efficiency',
-                       output='eff_plots.html',
+                       output=f'{rs.sample_name}.html',
                        source=__file__,
                        config=rs.config)
+
+
+@decl_plot
+def plot_seed_roc_curve(rss):
+    def get_num_den(rs, basename):
+        num = hist(getattr(rs, f'{basename}_num'))
+        den = hist(getattr(rs, f'{basename}_den'))
+        return hist_integral_ratio(num, den)
+    for rs in rss:
+        eff, eff_err = get_num_den(rs, 'seed_eff_v_phi')
+        pur, pur_err = get_num_den(rs, 'seed_pur_v_phi')
+        plt.errorbar([pur], [eff], xerr=[pur_err], yerr=[eff_err], label=rs.sample_name)
+    center_text(0.5, 0.3, r'$p_T>20$ and $|\eta|<2.4$')
+    plt.axis('equal')
+    plt.xlim((0.8, 1.0))
+    plt.ylim((0.8, 1.0))
+    plt.xlabel('ECAL-Driven Seeding Purity')
+    plt.ylabel('ECAL-Driven Seeding Efficiency')
+    plt.grid()
+    plt.legend()
+
+
+@decl_plot
+def plot_seed_eff_all(rss):
+    ax_pt = plt.subplot(221)
+    ax_eta = plt.subplot(222)
+    ax_phi = plt.subplot(223)
+    errors = True
+    for rs in rss:
+        plt.sca(ax_pt)
+        hist_plot(hist(rs.seed_eff_v_pt), include_errors=errors, label=rs.sample_name)
+        plt.sca(ax_eta)
+        hist_plot(hist(rs.seed_eff_v_eta), include_errors=errors, label=rs.sample_name)
+        plt.sca(ax_phi)
+        hist_plot(hist(rs.seed_eff_v_phi), include_errors=errors, label=rs.sample_name)
+
+    plt.sca(ax_pt)
+    center_text(0.5, 0.3, r'$|\eta|<2.4$')
+    plt.xlabel(r"Sim-Track $p_T$")
+    plt.ylim((0, 1.1))
+
+    plt.sca(ax_eta)
+    center_text(0.5, 0.3, r'$p_T>20$')
+    plt.xlabel(r"Sim-Track $\eta$")
+    plt.ylim((0, 1.1))
+    plt.legend(loc='lower right')
+
+    plt.sca(ax_phi)
+    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))
+
+
+@decl_plot
+def plot_seed_pur_all(rss):
+    ax_pt = plt.subplot(221)
+    ax_eta = plt.subplot(222)
+    ax_phi = plt.subplot(223)
+    errors = True
+    for rs in rss:
+        plt.sca(ax_pt)
+        hist_plot(hist(rs.seed_pur_v_pt), include_errors=errors, label=rs.sample_name)
+        plt.sca(ax_eta)
+        hist_plot(hist(rs.seed_pur_v_eta), include_errors=errors, label=rs.sample_name)
+        plt.sca(ax_phi)
+        hist_plot(hist(rs.seed_pur_v_phi), include_errors=errors, label=rs.sample_name)
+
+    plt.sca(ax_pt)
+    center_text(0.5, 0.3, r'$|\eta|<2.4$')
+    plt.xlabel(r"Seed $p_T$")
+    plt.ylim((0, 1.1))
+
+    plt.sca(ax_eta)
+    center_text(0.5, 0.3, r'$p_T>20$')
+    plt.xlabel(r"Seed $\eta$")
+    plt.ylim((0, 1.1))
+    plt.legend(loc='lower right')
+
+    plt.sca(ax_phi)
+    center_text(0.5, 0.3, r'$p_T>20$ and $|\eta|<2.4$')
+    plt.xlabel(r"Seed $\phi$")
+    plt.ylim((0, 1.1))
+
+
+@decl_plot
+def plot_tracking_roc_curve(rss, ext=''):
+    def get_num_den(rs, basename):
+        num = hist(getattr(rs, f'{basename}{ext}_num'))
+        den = hist(getattr(rs, f'{basename}{ext}_den'))
+        return hist_integral_ratio(num, den)
+    for rs in rss:
+        eff, eff_err = get_num_den(rs, 'tracking_eff_v_phi')
+        pur, pur_err = get_num_den(rs, 'tracking_pur_v_phi')
+        plt.errorbar([pur], [eff], xerr=[pur_err], yerr=[eff_err], label=rs.sample_name)
+    center_text(0.5, 0.3, r'$p_T>20$ and $|\eta|<2.4$')
+    plt.axis('equal')
+    plt.xlim((0.8, 1.0))
+    plt.ylim((0.8, 1.0))
+    plt.xlabel('GSF-Track Purity')
+    plt.ylabel('GSF-Track Efficiency')
+    plt.grid()
+    plt.legend()
+
+
+@decl_plot
+def plot_tracking_eff_all(rss, ext=''):
+    ax_pt = plt.subplot(221)
+    ax_eta = plt.subplot(222)
+    ax_phi = plt.subplot(223)
+    errors = True
+    for rs in rss:
+        plt.sca(ax_pt)
+        hist_plot(hist(getattr(rs, f'tracking_eff_v_pt{ext}')), include_errors=errors, label=rs.sample_name)
+        plt.sca(ax_eta)
+        hist_plot(hist(getattr(rs, f'tracking_eff_v_eta{ext}')), include_errors=errors, label=rs.sample_name)
+        plt.sca(ax_phi)
+        hist_plot(hist(getattr(rs, f'tracking_eff_v_phi{ext}')), include_errors=errors, label=rs.sample_name)
+
+    plt.sca(ax_pt)
+    center_text(0.5, 0.3, r'$|\eta|<2.4$')
+    plt.xlabel(r"Sim-Track $p_T$")
+    plt.ylim((0, 1.1))
+
+    plt.sca(ax_eta)
+    center_text(0.5, 0.3, r'$p_T>20$')
+    plt.xlabel(r"Sim-Track $\eta$")
+    plt.ylim((0, 1.1))
+    plt.legend(loc='lower right')
+
+    plt.sca(ax_phi)
+    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))
+
+
+@decl_plot
+def plot_tracking_pur_all(rss, ext=''):
+    ax_pt = plt.subplot(221)
+    ax_eta = plt.subplot(222)
+    ax_phi = plt.subplot(223)
+    errors = True
+    for rs in rss:
+        plt.sca(ax_pt)
+        hist_plot(hist(getattr(rs, f'tracking_pur_v_pt{ext}')), include_errors=errors, label=rs.sample_name)
+        plt.sca(ax_eta)
+        hist_plot(hist(getattr(rs, f'tracking_pur_v_eta{ext}')), include_errors=errors, label=rs.sample_name)
+        plt.sca(ax_phi)
+        hist_plot(hist(getattr(rs, f'tracking_pur_v_phi{ext}')), include_errors=errors, label=rs.sample_name)
+
+    plt.sca(ax_pt)
+    center_text(0.5, 0.3, r'$|\eta|<2.4$')
+    plt.xlabel(r"GSF-Track $p_T$")
+    plt.ylim((0, 1.1))
+
+    plt.sca(ax_eta)
+    center_text(0.5, 0.3, r'$p_T>20$')
+    plt.xlabel(r"GSF-Track $\eta$")
+    plt.ylim((0, 1.1))
+    plt.legend(loc='lower right')
+
+    plt.sca(ax_phi)
+    center_text(0.5, 0.3, r'$p_T>20$ and $|\eta|<2.4$')
+    plt.xlabel(r"GSF-Track $\phi$")
+    plt.ylim((0, 1.1))
+
+
+@decl_plot
+def plot_ecal_rel_res(rss):
+    for rs in rss:
+        hist_plot(hist(rs.ecal_energy_resolution), label=rs.sample_name)
+    plt.xlabel(r"ECAL $E_T$ relative error")
+    plt.legend()
+
+def all_cut_plots(cuts):
+    rss = [ResultSet(f'{cut_sel}-window', f'../hists/{cut_sel}-window.root') for cut_sel in cuts]
+
+    tracking_roc_curve = plot_tracking_roc_curve, (rss,)
+    tracking_eff_all = plot_tracking_eff_all, (rss,)
+    tracking_pur_all = plot_tracking_pur_all, (rss,)
+    tracking_roc_curve2 = plot_tracking_roc_curve, (rss, '2')
+    tracking_eff_all2 = plot_tracking_eff_all, (rss, '2')
+    tracking_pur_all2 = plot_tracking_pur_all, (rss, '2')
+
+    seed_roc_curve = plot_seed_roc_curve, (rss,)
+    seed_eff_all = plot_seed_eff_all, (rss,)
+    seed_pur_all = plot_seed_pur_all, (rss,)
+
+    ecal_rel_res = plot_ecal_rel_res, (rss,)
+
+    plots = [
+        Plot(tracking_roc_curve, 'Tracking ROC Curve'),
+        Plot(tracking_eff_all, 'Tracking Efficiency'),
+        Plot(tracking_pur_all, 'Tracking Purity'),
+        Plot(tracking_roc_curve2, 'Tracking ROC Curve (Seed Matched)'),
+        Plot(tracking_eff_all2, 'Tracking Efficiency (Seed Matched)'),
+        Plot(tracking_pur_all2, 'Tracking Purity (Seed Matched)'),
+        Plot(seed_roc_curve, 'Seeding ROC Curve'),
+        Plot(seed_eff_all, 'ECAL-Driven Seeding Efficiency'),
+        Plot(seed_pur_all, 'ECAL-Driven Seeding Purity'),
+        Plot(ecal_rel_res, 'ECAL ET Relative Resolution'),
+    ]
+
+    render_plots(plots, to_disk=False)
+    generate_dashboard(plots, 'Comparisons',
+                       output='comparisons.html',
+                       source=__file__,
+                       config=rss[0].config)
+
+
+if __name__ == '__main__':
+    cuts = ['extra-narrow', 'narrow', 'wide', 'extra-wide']
+    all_cut_plots(cuts)
+    for cut in cuts:
+        single_cut_plots(cut)

+ 1 - 1
plotting/filval-python

@@ -1 +1 @@
-Subproject commit dc8c3cf99bc4193833b82c69e4dd9cf57306a7ea
+Subproject commit 0cf8a45d1318c5fc3c4f9c1508317ad36d3ef420