From c745ecdba45fa35bebdd0bf3b9984b929ba4cea6 Mon Sep 17 00:00:00 2001
From: adrien matta <matta@lpccaen.in2p3.fr>
Date: Fri, 24 Jul 2020 15:15:11 +0200
Subject: [PATCH] * Adding option to shift strasse barrel XYZ in simulation

---
 NPSimulation/Detectors/Strasse/Strasse.cc     | 20 ++++++++++++-------
 NPSimulation/Detectors/Strasse/Strasse.hh     |  6 ++++--
 .../geometry/strasse_optimized.detector       |  2 ++
 3 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/NPSimulation/Detectors/Strasse/Strasse.cc b/NPSimulation/Detectors/Strasse/Strasse.cc
index 1d8cde5fe..ac019f11a 100644
--- a/NPSimulation/Detectors/Strasse/Strasse.cc
+++ b/NPSimulation/Detectors/Strasse/Strasse.cc
@@ -161,20 +161,23 @@ Strasse::~Strasse(){
 }
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
-void Strasse::AddInnerDetector(double  R, double  Z, double  Phi, double Shift){
+void Strasse::AddInnerDetector(double  R, double  Z, double  Phi, double Shift, G4ThreeVector Ref){
   m_Inner_R.push_back(R);
   m_Inner_Z.push_back(Z);
   m_Inner_Phi.push_back(Phi);
   m_Inner_Shift.push_back(Shift);
+  m_Inner_Ref.push_back(Ref);
 }
 
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
-void Strasse::AddOuterDetector(double  R, double  Z, double  Phi, double Shift){
+void Strasse::AddOuterDetector(double  R, double  Z, double  Phi, double Shift, G4ThreeVector Ref){
   m_Outer_R.push_back(R);
   m_Outer_Z.push_back(Z);
   m_Outer_Phi.push_back(Phi);
   m_Outer_Shift.push_back(Shift);
+  m_Outer_Ref.push_back(Ref);
 }
+
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 void Strasse::AddChamber(double  Z){
   m_Chamber_Z.push_back(Z);
@@ -313,6 +316,7 @@ G4LogicalVolume* Strasse::BuildInnerDetector(){
   }
   return m_InnerDetector;
 }
+
 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 G4LogicalVolume* Strasse::BuildOuterDetector(){
   if(!m_OuterDetector){
@@ -636,7 +640,7 @@ void Strasse::ReadConfiguration(NPL::InputParser parser){
   if(NPOptionManager::getInstance()->GetVerboseLevel())
     cout << "//// " << blocks_inner.size() << " inner detectors found " << endl; 
 
-  vector<string> coord = {"Radius","Z","Phi","Shift"};
+  vector<string> coord = {"Radius","Z","Phi","Shift","Ref"};
 
   for(unsigned int i = 0 ; i < blocks_inner.size() ; i++){
     if(blocks_inner[i]->HasTokenList(coord)){
@@ -647,7 +651,8 @@ void Strasse::ReadConfiguration(NPL::InputParser parser){
       double Z= blocks_inner[i]->GetDouble("Z","mm");
       double Phi = blocks_inner[i]->GetDouble("Phi","deg");
       double Shift = blocks_inner[i]->GetDouble("Shift","mm");
-      AddInnerDetector(R,Z,Phi,Shift);
+      G4ThreeVector Ref = NPS::ConvertVector(blocks_inner[i]->GetTVector3("Ref","mm"));
+      AddInnerDetector(R,Z,Phi,Shift,Ref);
     }
     else{
       cout << "ERROR: check your input file formatting on " << i+1 << " inner block " <<endl;
@@ -669,7 +674,8 @@ void Strasse::ReadConfiguration(NPL::InputParser parser){
       double Z= blocks_outer[i]->GetDouble("Z","mm");
       double Phi = blocks_outer[i]->GetDouble("Phi","deg");
       double Shift = blocks_outer[i]->GetDouble("Shift","mm");
-      AddOuterDetector(R,Z,Phi,Shift);
+      G4ThreeVector Ref = NPS::ConvertVector(blocks_inner[i]->GetTVector3("Ref","mm"));
+      AddOuterDetector(R,Z,Phi,Shift,Ref);
     }
     else{
 
@@ -715,7 +721,7 @@ void Strasse::ConstructDetector(G4LogicalVolume* world){
     Det_pos.rotate(-m_Inner_Phi[i],G4ThreeVector(0,0,1));
     G4RotationMatrix* Rot =  new G4RotationMatrix(0*deg,0*deg,m_Inner_Phi[i]);
 
-    new G4PVPlacement(G4Transform3D(*Rot,Det_pos),
+    new G4PVPlacement(G4Transform3D(*Rot,Det_pos+m_Inner_Ref[i]),
         BuildInnerDetector(),
         "Strasse",world,false,i+1);
   }
@@ -726,7 +732,7 @@ void Strasse::ConstructDetector(G4LogicalVolume* world){
     Det_pos.rotate(-m_Outer_Phi[i],G4ThreeVector(0,0,1));
     G4RotationMatrix* Rot =  new G4RotationMatrix(0*deg,0*deg,m_Outer_Phi[i]);
 
-    new G4PVPlacement(G4Transform3D(*Rot,Det_pos),
+    new G4PVPlacement(G4Transform3D(*Rot,Det_pos+m_Outer_Ref[i]),
         BuildOuterDetector(),
         "Strasse",world,false,i+1);
   }
diff --git a/NPSimulation/Detectors/Strasse/Strasse.hh b/NPSimulation/Detectors/Strasse/Strasse.hh
index e0cc7175c..f2012f6ee 100644
--- a/NPSimulation/Detectors/Strasse/Strasse.hh
+++ b/NPSimulation/Detectors/Strasse/Strasse.hh
@@ -50,8 +50,8 @@ class Strasse : public NPS::VDetector{
     ////////////////////////////////////////////////////
   public:
     // Cylindrical coordinate
-    void AddInnerDetector(double R,double Z,double Phi, double Shift);  
-    void AddOuterDetector(double R,double Z,double Phi, double Shift);  
+    void AddInnerDetector(double R,double Z,double Phi, double Shift, G4ThreeVector Ref);  
+    void AddOuterDetector(double R,double Z,double Phi, double Shift, G4ThreeVector Ref);  
     void AddChamber(double Z);
 
     G4LogicalVolume* BuildInnerDetector();
@@ -131,11 +131,13 @@ class Strasse : public NPS::VDetector{
     vector<double>  m_Inner_Z;
     vector<double>  m_Inner_Phi; 
     vector<double>  m_Inner_Shift; 
+    vector<G4ThreeVector> m_Inner_Ref;
 
     vector<double>  m_Outer_R; 
     vector<double>  m_Outer_Z;
     vector<double>  m_Outer_Phi; 
     vector<double>  m_Outer_Shift; 
+    vector<G4ThreeVector> m_Outer_Ref;
 
     vector<double>  m_Chamber_Z;
 
diff --git a/Projects/Strasse/geometry/strasse_optimized.detector b/Projects/Strasse/geometry/strasse_optimized.detector
index d59bbbdec..24ec3c2a6 100644
--- a/Projects/Strasse/geometry/strasse_optimized.detector
+++ b/Projects/Strasse/geometry/strasse_optimized.detector
@@ -64,6 +64,7 @@ Strasse Inner
   Z= 66.0 mm
   Phi= @InnerPhi deg
   Shift= 3 mm
+  Ref= 0 0 0 mm
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 Alias OuterPhi
@@ -76,6 +77,7 @@ Strasse Outer
   Z= 91.0 mm
   Phi= @OuterPhi deg
   Shift= 0 mm
+  Ref= 0 0 0 mm
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1
 Strasse Chamber
-- 
GitLab