From 067234ee6116d03706ba07266b5eada622f9f0e7 Mon Sep 17 00:00:00 2001
From: Louis Lemair <lemair@lpccaen.in2p3.fr>
Date: Tue, 29 Mar 2022 10:25:51 +0200
Subject: [PATCH] * Adding new scorers for Nebula plastic bars

  - For now only a copy of CalorimeterScorers
  - Adapted CMakeLists.txt
---
 NPSimulation/Scorers/CMakeLists.txt |   2 +-
 NPSimulation/Scorers/PlasticBar.cc  | 106 +++++++++++++++++++++++
 NPSimulation/Scorers/PlasticBar.hh  | 125 ++++++++++++++++++++++++++++
 3 files changed, 232 insertions(+), 1 deletion(-)
 create mode 100644 NPSimulation/Scorers/PlasticBar.cc
 create mode 100644 NPSimulation/Scorers/PlasticBar.hh

diff --git a/NPSimulation/Scorers/CMakeLists.txt b/NPSimulation/Scorers/CMakeLists.txt
index 8b616543f..6d6e2df09 100644
--- a/NPSimulation/Scorers/CMakeLists.txt
+++ b/NPSimulation/Scorers/CMakeLists.txt
@@ -1,2 +1,2 @@
-add_library(NPSScorers SHARED CylinderTPCScorers.cc DriftChamberScorers.cc NPSHitsMap.hh CalorimeterScorers.cc InteractionScorers.cc DSSDScorers.cc SiliconScorers.cc PhotoDiodeScorers.cc ObsoleteGeneralScorers.cc DriftElectronScorers.cc TPCScorers.cc MDMScorer.cc NeutronDetectorScorers.cc ProcessScorers.cc)
+add_library(NPSScorers SHARED CylinderTPCScorers.cc DriftChamberScorers.cc NPSHitsMap.hh CalorimeterScorers.cc InteractionScorers.cc DSSDScorers.cc SiliconScorers.cc PhotoDiodeScorers.cc ObsoleteGeneralScorers.cc DriftElectronScorers.cc TPCScorers.cc MDMScorer.cc NeutronDetectorScorers.cc ProcessScorers.cc PlasticBar.cc)
 target_link_libraries(NPSScorers ${ROOT_LIBRARIES} ${Geant4_LIBRARIES} ${NPLib_LIBRARIES} -lNPInitialConditions -lNPInteractionCoordinates)
diff --git a/NPSimulation/Scorers/PlasticBar.cc b/NPSimulation/Scorers/PlasticBar.cc
new file mode 100644
index 000000000..a81634f1b
--- /dev/null
+++ b/NPSimulation/Scorers/PlasticBar.cc
@@ -0,0 +1,106 @@
+/*****************************************************************************
+ * Copyright (C) 2009-2016   this file is part of the NPTool Project         *
+ *                                                                           *
+ * For the licensing terms see $NPTOOL/Licence/NPTool_Licence                *
+ * For the list of contributors see $NPTOOL/Licence/Contributors             *
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Original Author: Adrien MATTA  contact address: matta@lpccaen.in2p3.fr    *
+ *                                                                           *
+ * Creation Date  : February 2013                                            *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  File old the scorer specific to the Sharc Detector                       *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ * This new type of scorer is aim to become the standard for DSSD,SSSD and   *
+ * PAD detector (any Silicon Detector)                                       *
+ *****************************************************************************/
+#include "PlasticBar.hh"
+#include "G4UnitsTable.hh"
+using namespace PlasticBar;
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+unsigned int
+PlasticBarData::CalculateIndex(const vector<unsigned int>& level) {
+
+  unsigned int size       = level.size();
+  unsigned int result     = 0;
+  unsigned int multiplier = 1;
+  for (unsigned int i = 0; i < size; i++) {
+    result += level[i] * multiplier;
+    multiplier *= 1000;
+  }
+  return result;
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+vector<PlasticBarData>::iterator
+PlasticBarDataVector::find(const unsigned int& index) {
+  for (vector<PlasticBarData>::iterator it = m_Data.begin();
+       it != m_Data.end(); it++) {
+    if ((*it).GetIndex() == index)
+      return it;
+  }
+  return m_Data.end();
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+PS_PlasticBar::PS_PlasticBar(G4String name, vector<G4int> NestingLevel,
+                               G4int depth)
+    : G4VPrimitiveScorer(name, depth) {
+  m_NestingLevel = NestingLevel;
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+PS_PlasticBar::~PS_PlasticBar() {}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+G4bool PS_PlasticBar::ProcessHits(G4Step* aStep, G4TouchableHistory*) {
+  G4String particlename
+      = aStep->GetTrack()->GetParticleDefinition()->GetParticleName();
+    cout << particlename << " has left ";
+    // Contain Energy, Time + as many copy number as nested volume
+    unsigned int mysize = m_NestingLevel.size();
+    t_Energy            = aStep->GetTotalEnergyDeposit();
+    cout << t_Energy << " MeV";
+    t_Time              = aStep->GetPreStepPoint()->GetGlobalTime();
+    cout << " after " << t_Time << " ms" << endl;
+    t_Level.clear();
+    for (unsigned int i = 0; i < mysize; i++) {
+      t_Level.push_back(
+          aStep->GetPreStepPoint()->GetTouchableHandle()->GetCopyNumber(
+              m_NestingLevel[i]));
+    }
+    // Check if the particle has interact before, if yes, add up the energies.
+    vector<PlasticBarData>::iterator it;
+    it = m_Data.find(PlasticBarData::CalculateIndex(t_Level));
+    if (it != m_Data.end()) {
+      it->Add(t_Energy);
+    } else {
+      m_Data.Set(t_Energy, t_Time, t_Level);
+    }
+    return TRUE;
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void PS_PlasticBar::Initialize(G4HCofThisEvent*) { clear(); }
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void PS_PlasticBar::EndOfEvent(G4HCofThisEvent*) {}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void PS_PlasticBar::clear() {
+  m_Data.clear();
+  t_Level.clear();
+}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void PS_PlasticBar::DrawAll() {}
+
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+void PS_PlasticBar::PrintAll() {}
+//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
diff --git a/NPSimulation/Scorers/PlasticBar.hh b/NPSimulation/Scorers/PlasticBar.hh
new file mode 100644
index 000000000..0e8a6d29d
--- /dev/null
+++ b/NPSimulation/Scorers/PlasticBar.hh
@@ -0,0 +1,125 @@
+#ifndef PlasticBar_h
+#define PlasticBar_h 1
+/*****************************************************************************
+ * Copyright (C) 2009-2016   this file is part of the NPTool Project         *
+ *                                                                           *
+ * For the licensing terms see $NPTOOL/Licence/NPTool_Licence                *
+ * For the list of contributors see $NPTOOL/Licence/Contributors             *
+ *****************************************************************************/
+
+/*****************************************************************************
+ * Original Author: Adrien MATTA  contact address: matta@lpccaen.in2p3.fr    *
+ *                                                                           *
+ * Creation Date  : February 2013                                            *
+ * Last update    :                                                          *
+ *---------------------------------------------------------------------------*
+ * Decription:                                                               *
+ *  File old the scorer specific to the Silicon Detector                     *
+ *                                                                           *
+ *---------------------------------------------------------------------------*
+ * Comment:                                                                  *
+ * This new style of scorer is aim to become the standard way of doing scorer*
+ * in NPTool.                                                                *
+ *The index is build using the TrackID, Detector Number and Strip Number.    *
+ *The scorer Hold Energy and time together                                   *
+ *Only one scorer is needed for a detector                                   *
+ *****************************************************************************/
+#include "G4VPrimitiveScorer.hh"
+#include "NPSHitsMap.hh"
+//#include "NPSecondaries.hh"
+
+#include <map>
+using namespace std;
+using namespace CLHEP;
+
+namespace PlasticBar {
+  // Hold One hit info
+  class PlasticBarData{
+      public:
+        PlasticBarData(const double& Energy,const double& Time,const vector<unsigned int>& Nesting){
+          m_Index=CalculateIndex(Nesting);
+          m_Level=Nesting;
+          m_Energy=Energy;
+          m_Time=Time;
+          };
+        ~PlasticBarData(){};
+
+      private:
+        unsigned int m_Index;
+        vector<unsigned int> m_Level;
+        double m_Energy;
+        double m_Time;
+
+      public:
+        static unsigned int CalculateIndex(const vector<unsigned int>& Nesting);
+     
+      public:
+        inline unsigned int GetIndex() const {return m_Index;}
+        inline vector<unsigned int> GetLevel() const {return m_Level;}; 
+        inline double GetEnergy() const {return m_Energy;};
+        inline double GetTime() const {return m_Time;};
+
+      public:
+        void Add(const double& Energy) {m_Energy+=Energy;};
+      };
+
+  // Manage a vector of DSSD hit
+  class PlasticBarDataVector{
+    public:
+      PlasticBarDataVector(){};
+      ~PlasticBarDataVector(){};
+
+    private:
+      vector<PlasticBarData> m_Data;
+
+    public:
+      vector<PlasticBarData>::iterator find(const unsigned int& index) ;
+      inline void clear(){m_Data.clear();} ;
+      inline vector<PlasticBarData>::iterator end() {return m_Data.end();};
+      inline vector<PlasticBarData>::iterator begin() {return m_Data.begin();};
+      inline unsigned int size() {return m_Data.size();};
+      inline void Add(const unsigned int& index,const double& Energy) {find(index)->Add(Energy);};
+      inline void Set(const double& Energy, const double& Time, const vector<unsigned int>& Nesting) {m_Data.push_back(PlasticBarData(Energy,Time,Nesting));};
+      PlasticBarData* operator[](const unsigned int& i){return &m_Data[i];};
+  };
+
+
+    //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
+    class PS_PlasticBar : public G4VPrimitiveScorer{
+        
+    public: // with description
+        PS_PlasticBar(G4String name, vector<G4int> NestingLevel,G4int depth=0);
+        ~PS_PlasticBar();
+
+        
+    protected: // with description
+        G4bool ProcessHits(G4Step*, G4TouchableHistory*);
+        
+    public:
+        void Initialize(G4HCofThisEvent*);
+        void EndOfEvent(G4HCofThisEvent*);
+        void clear();
+        void DrawAll();
+        void PrintAll();
+        
+    private: // How much level of volume nesting should be considered
+        // Give the list of the nesting level at which the copy number should be return.
+        // 0 is the lowest level possible (the actual volume copy number in which the interaction happen)
+        vector<G4int> m_NestingLevel;
+        
+    private: 
+        PlasticBarDataVector m_Data;
+        double t_Energy;
+        double t_Time;
+        vector<unsigned int> t_Level;
+        double t_ParticleMultiplicity;
+    public:
+      inline unsigned int  GetMult() {return m_Data.size();};
+      inline double GetEnergy(const unsigned int& i) {return m_Data[i]->GetEnergy();};
+      inline double GetTime(const unsigned int& i) {return m_Data[i]->GetTime();};
+      inline vector<unsigned int> GetLevel(const unsigned int& i) {return m_Data[i]->GetLevel();};
+    };
+}
+
+
+#endif
-- 
GitLab