From aa33f815f015900c592994776f85a917240d79ff Mon Sep 17 00:00:00 2001
From: Finn Feindt <finn.feindt@desy.de>
Date: Tue, 28 Feb 2023 12:13:19 +0100
Subject: [PATCH] AnalysisEfficiency: Added fake rate plot in separate folder
 and variables to configure fake rate analysis.

---
 .../AnalysisEfficiency/AnalysisEfficiency.cpp | 21 +++++++++++++++++++
 .../AnalysisEfficiency/AnalysisEfficiency.h   | 10 ++++++++-
 2 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/src/modules/AnalysisEfficiency/AnalysisEfficiency.cpp b/src/modules/AnalysisEfficiency/AnalysisEfficiency.cpp
index d0761efc2..e3b4eeaf0 100644
--- a/src/modules/AnalysisEfficiency/AnalysisEfficiency.cpp
+++ b/src/modules/AnalysisEfficiency/AnalysisEfficiency.cpp
@@ -27,6 +27,8 @@ AnalysisEfficiency::AnalysisEfficiency(Configuration& config, std::shared_ptr<De
     config_.setDefault<XYVector>("inpixel_cut_edge", {Units::get(5.0, "um"), Units::get(5.0, "um")});
     config_.setDefault<double>("masked_pixel_distance_cut", 1.);
     config_.setDefault<double>("spatial_cut_sensoredge", 1.);
+    config_.setDefault<double>("fake_rate_radius", -1.);
+    config_.setDefault<double>("fake_rate_sensoredge", -1);
 
     m_timeCutFrameEdge = config_.get<double>("time_cut_frameedge");
     m_chi2ndofCut = config_.get<double>("chi2ndof_cut");
@@ -35,6 +37,8 @@ AnalysisEfficiency::AnalysisEfficiency(Configuration& config, std::shared_ptr<De
     m_inpixelEdgeCut = config_.get<XYVector>("inpixel_cut_edge");
     m_maskedPixelDistanceCut = config_.get<int>("masked_pixel_distance_cut");
     spatial_cut_sensoredge = config_.get<double>("spatial_cut_sensoredge");
+    m_fake_rate_radius = config_.get<double>("fake_rate_radius");
+    m_fake_rate_sensoredge = config_.get<double>("fake_rate_sensoredge");
 }
 void AnalysisEfficiency::initialize() {
 
@@ -294,6 +298,23 @@ void AnalysisEfficiency::initialize() {
     auto nCols = static_cast<size_t>(m_detector->nPixels().X());
     std::vector<double> v_row(nRows, 0.); // create vector will zeros of length <nRows>
     prev_hit_ts.assign(nCols, v_row);     // use vector v_row to construct matrix
+
+    // check if the user wants to analyze fake rates
+    if(m_fake_rate_radius > 0 || m_fake_rate_sensoredge >= 0) {
+        LOG(STATUS) << "Configured to perform fake rate analysis.";
+        createFakeRatePlots();
+    }
+}
+
+void AnalysisEfficiency::createFakeRatePlots() {
+    TDirectory* directory = getROOTDirectory();
+    TDirectory* fake_rate_directory = directory->mkdir("fake_rate");
+    if(fake_rate_directory == nullptr) {
+        throw RuntimeError("Cannot create or access fake rate ROOT directory for module " + this->getUniqueName());
+    }
+    fake_rate_directory->cd();
+
+    hFakeRate = new TH1D("hFakeRate", "number of fake hits per event; hits; # events", 25, 0 - 0.5, 25 - 0.5);
 }
 
 StatusCode AnalysisEfficiency::run(const std::shared_ptr<Clipboard>& clipboard) {
diff --git a/src/modules/AnalysisEfficiency/AnalysisEfficiency.h b/src/modules/AnalysisEfficiency/AnalysisEfficiency.h
index cb6283dc8..efb5f66ca 100644
--- a/src/modules/AnalysisEfficiency/AnalysisEfficiency.h
+++ b/src/modules/AnalysisEfficiency/AnalysisEfficiency.h
@@ -17,6 +17,7 @@
 
 #include "core/module/Module.hpp"
 
+#include <TDirectory.h>
 #include "TEfficiency.h"
 #include "TH2D.h"
 #include "TNamed.h"
@@ -84,7 +85,12 @@ namespace corryvreckan {
         TH2D* hPosDiffPrevTrack_noAssocCluster;
         TH2D* hDistanceCluster_track;
         TH2D* htimeRes_cluster_size;
-        double m_chi2ndofCut, m_timeCutFrameEdge, m_inpixelBinSize, spatial_cut_sensoredge;
+
+        // fake rate
+        TH1D* hFakeRate;
+
+        double m_chi2ndofCut, m_timeCutFrameEdge, m_inpixelBinSize, spatial_cut_sensoredge, m_fake_rate_radius,
+            m_fake_rate_sensoredge;
         XYVector m_inpixelEdgeCut;
         int m_maskedPixelDistanceCut = 1;
         int total_tracks = 0;
@@ -97,6 +103,8 @@ namespace corryvreckan {
         std::vector<std::string> require_associated_cluster_on_;
 
         Matrix<double> prev_hit_ts; // matrix containing previous hit timestamp for every pixel
+
+        void createFakeRatePlots();
     };
 
 } // namespace corryvreckan
-- 
GitLab