From 8233e66c4b6869e5a82c403dc4bed009bd9c8bbd Mon Sep 17 00:00:00 2001
From: Morfouace <pierre.morfouace@cea.fr>
Date: Thu, 8 Dec 2022 11:14:33 +0100
Subject: [PATCH] Updating Sofia project

---
 NPLib/Detectors/Sofia/GladFieldMap.cxx        |  7 ++-
 NPLib/Detectors/Sofia/GladFieldMap.h          |  1 +
 NPLib/Detectors/Sofia/TSofFissionFragment.cxx |  2 +
 NPLib/Detectors/Sofia/TSofFissionFragment.h   |  6 +++
 NPLib/Detectors/Sofia/TSofTrimPhysics.cxx     | 14 +++---
 Projects/s455/Analysis.cxx                    | 49 ++++++++++++-------
 6 files changed, 53 insertions(+), 26 deletions(-)

diff --git a/NPLib/Detectors/Sofia/GladFieldMap.cxx b/NPLib/Detectors/Sofia/GladFieldMap.cxx
index faae6633b..0ffcc2ca3 100644
--- a/NPLib/Detectors/Sofia/GladFieldMap.cxx
+++ b/NPLib/Detectors/Sofia/GladFieldMap.cxx
@@ -44,7 +44,7 @@ GladFieldMap::GladFieldMap() {
   m_func = ROOT::Math::Functor(this,&GladFieldMap::Delta,1);
   m_min->SetFunction(m_func);
   m_min->SetPrintLevel(-1);
-  m_Bmax = 2.2;
+  m_Bmax = 2.25;
   m_bin = 50;
   m_Current = 2135.;
   m_Scale = m_Current/3583.81;
@@ -358,8 +358,11 @@ void GladFieldMap::LoadMap(string filename) {
       
         //m_Leff[ix][iy] += abs(By)*m_bin;
         // Need to fill this TGraph before scaling the field to get the proper Leff //
-        gBy->SetPoint(iz,z,abs(By));
+        gBy->SetPoint(iz,z,By);
 
+        x += m_Glad_Entrance.X();
+        y += m_Glad_Entrance.Y();
+        
         z = z + x*sin(m_Tilt);
         z += m_Glad_Entrance.Z();
 
diff --git a/NPLib/Detectors/Sofia/GladFieldMap.h b/NPLib/Detectors/Sofia/GladFieldMap.h
index 462638c7e..0071bee2c 100644
--- a/NPLib/Detectors/Sofia/GladFieldMap.h
+++ b/NPLib/Detectors/Sofia/GladFieldMap.h
@@ -111,6 +111,7 @@ class GladFieldMap{
 
   public:
     double GetLeff(int ix, int iy) {return m_Leff[ix][iy];}
+    double GetGladTiltAngle() {return m_Tilt;}
     TVector3 GetGladEntrance() {return m_Glad_Entrance;}
     TVector3 GetGladTurningPoint() {return m_Glad_TurningPoint;}
     double GetB() {return m_B;}
diff --git a/NPLib/Detectors/Sofia/TSofFissionFragment.cxx b/NPLib/Detectors/Sofia/TSofFissionFragment.cxx
index e7bbbb108..f79cc7528 100644
--- a/NPLib/Detectors/Sofia/TSofFissionFragment.cxx
+++ b/NPLib/Detectors/Sofia/TSofFissionFragment.cxx
@@ -52,6 +52,8 @@ void TSofFissionFragment::Clear() {
   fFF_TOF.clear();
   fFF_Gamma.clear();
   fFF_Brho.clear();
+  fFF_Brho_X.clear();
+  fFF_Brho_Z.clear();
   fFF_Rho.clear();
   fFF_Omega.clear();
   fFF_DT.clear();
diff --git a/NPLib/Detectors/Sofia/TSofFissionFragment.h b/NPLib/Detectors/Sofia/TSofFissionFragment.h
index 08943934a..785e7eef5 100644
--- a/NPLib/Detectors/Sofia/TSofFissionFragment.h
+++ b/NPLib/Detectors/Sofia/TSofFissionFragment.h
@@ -43,6 +43,8 @@ class TSofFissionFragment : public TObject {
     vector<double> fFF_TOF;
     vector<double> fFF_Gamma;
     vector<double> fFF_Brho;
+    vector<double> fFF_Brho_X;
+    vector<double> fFF_Brho_Z;
     vector<double> fFF_Rho;
     vector<double> fFF_Omega;
     vector<double> fFF_DT;
@@ -103,6 +105,8 @@ class TSofFissionFragment : public TObject {
     inline void SetTOF(double val){fFF_TOF.push_back(val);};//!
     inline void SetGamma(double val){fFF_Gamma.push_back(val);};//!
     inline void SetBrho(double val){fFF_Brho.push_back(val);};//!
+    inline void SetBrhoX(double val){fFF_Brho_X.push_back(val);};//!
+    inline void SetBrhoZ(double val){fFF_Brho_Z.push_back(val);};//!
     inline void SetRho(double val){fFF_Rho.push_back(val);};//!
     inline void SetOmega(double val){fFF_Omega.push_back(val);};//!
     inline void SetDT(double val){fFF_DT.push_back(val);};//!
@@ -146,6 +150,8 @@ class TSofFissionFragment : public TObject {
     inline double GetTOF(int i) const {return fFF_TOF[i];}//! 
     inline double GetGamma(int i) const {return fFF_Gamma[i];}//! 
     inline double GetBrho(int i) const {return fFF_Brho[i];}//! 
+    inline double GetBrhoX(int i) const {return fFF_Brho_X[i];}//! 
+    inline double GetBrhoZ(int i) const {return fFF_Brho_Z[i];}//! 
     inline double GetRho(int i) const {return fFF_Rho[i];}//! 
     inline double GetOmega(int i) const {return fFF_Omega[i];}//! 
     inline double GetDT(int i) const {return fFF_DT[i];}//! 
diff --git a/NPLib/Detectors/Sofia/TSofTrimPhysics.cxx b/NPLib/Detectors/Sofia/TSofTrimPhysics.cxx
index b2f606d34..e47aa40fd 100644
--- a/NPLib/Detectors/Sofia/TSofTrimPhysics.cxx
+++ b/NPLib/Detectors/Sofia/TSofTrimPhysics.cxx
@@ -188,12 +188,14 @@ void TSofTrimPhysics::BuildPhysicalEvent() {
     p1_2[i] = Cal->GetValue("SofTrim/SEC"+NPL::itoa(i+1)+"_ANODE2_BETA",1);
     p1_3[i] = Cal->GetValue("SofTrim/SEC"+NPL::itoa(i+1)+"_ANODE3_BETA",1);
 
-    double norm1 = p0_1[i] + p1_1[i]*TMath::Power(m_BetaNorm, -5./3.);
-    double norm2 = p0_2[i] + p1_2[i]*TMath::Power(m_BetaNorm, -5./3.);
-    double norm3 = p0_3[i] + p1_3[i]*TMath::Power(m_BetaNorm, -5./3.);
-    Ep1[i] = norm1 * Ep1[i] / (p0_1[i] + p1_1[i]*TMath::Power(m_Beta, -5./3.));
-    Ep2[i] = norm2 * Ep2[i] / (p0_2[i] + p1_2[i]*TMath::Power(m_Beta, -5./3.));
-    Ep3[i] = norm3 * Ep3[i] / (p0_3[i] + p1_3[i]*TMath::Power(m_Beta, -5./3.));
+    if(p0_1[i]!=0 && p0_2[i]!=0 && p0_3[i]!=0 && p1_1[i]!=0 && p1_2[i]!=0 && p1_3[i]!=0){
+      double norm1 = p0_1[i] + p1_1[i]*TMath::Power(m_BetaNorm, -5./3.);
+      double norm2 = p0_2[i] + p1_2[i]*TMath::Power(m_BetaNorm, -5./3.);
+      double norm3 = p0_3[i] + p1_3[i]*TMath::Power(m_BetaNorm, -5./3.);
+      Ep1[i] = norm1 * Ep1[i] / (p0_1[i] + p1_1[i]*TMath::Power(m_Beta, -5./3.));
+      Ep2[i] = norm2 * Ep2[i] / (p0_2[i] + p1_2[i]*TMath::Power(m_Beta, -5./3.));
+      Ep3[i] = norm3 * Ep3[i] / (p0_3[i] + p1_3[i]*TMath::Power(m_Beta, -5./3.));
+    }
 
     // Angle correction per pair: spline
     /*Ep1[i] = Ep1[i] / fcorr_EvsA[i][0]->Eval(Ddt) * fcorr_EvsA[i][0]->Eval(0);
diff --git a/Projects/s455/Analysis.cxx b/Projects/s455/Analysis.cxx
index 547849d13..182eeecd5 100644
--- a/Projects/s455/Analysis.cxx
+++ b/Projects/s455/Analysis.cxx
@@ -75,6 +75,8 @@ struct TofPair
   double Leff = 0;
   double rho = 0;
   double Brho = 0;
+  double BrhoX = 0;
+  double BrhoZ = 0;
   double omega = 0;
   double deff1 = 0;
   double deff2 = 0;
@@ -101,8 +103,8 @@ void Analysis::Init(){
   
   m_GladField = new GladFieldMap();
   m_GladField->SetCurrent(2135.);
-  m_GladField->SetGladEntrance(0,0,2.774*m);
-  m_GladField->SetGladTurningPoint(0,0,m_GladField->GetGladEntrance().Z()  + 1.654*m);
+  m_GladField->SetGladEntrance(0, 0.02*m, 2.774*m + 0.5405*m);
+  m_GladField->SetGladTurningPoint(0, 0.02*m, 2.774*m  + 0.5405*m + 1.135*m);
   m_GladField->SetGladTiltAngle(14.*deg);
   m_GladField->LoadMap("GladFieldMap.dat");
   m_GladField->SetCentralTheta(20.*deg);
@@ -587,16 +589,13 @@ void Analysis::FissionFragmentAnalysis(){
       double Theta0 = m_GladField->GetCentralTheta();
       double XA = 0;
       double ZA = 2315.5;
-      int ix = (int) (-m_GladField->GetXmin()/50);
-      int iy = (int) (-m_GladField->GetYmin()/50);
-      double Leff_init = m_GladField->GetLeff(ix,iy);
       double ZG = m_GladField->GetGladTurningPoint().Z();
       double ZMW3 = m_GladField->Get_MWPC3_Position().Z();
       double XMW3 = m_GladField->Get_MWPC3_Position().X();
       double ZMW2 = 2651;
       double X3lab = 0;
       double Z3lab = 0;;
-      double Tilt = 14.*deg;
+      double Tilt = m_GladField->GetGladTiltAngle();;//14.*deg;
       TVector3 vZ = TVector3(0,0,1);
       double XC = 0;
       double ZC = 0;
@@ -613,22 +612,22 @@ void Analysis::FissionFragmentAnalysis(){
           // *** Extroplate to C position *** //
           XC = (XA+(ZG-ZA)*tan(TofHit[i].theta_in)) / (1-tan(Tilt)*tan(TofHit[i].theta_in));
           ZC = ZG + XC*tan(Tilt);
-
+          TVector3 vC    = TVector3(XC,0,ZC);
+          
           TofHit[i].xc = XC;
-          TofHit[i].yc = 0;//TofHit[i].y*0.5;
+          TofHit[i].yc = (ZC/8592.)*TofHit[i].y;
           TofHit[i].zc = ZC;
 
           int ix, iy;
           ix = (int)(TofHit[0].xc - m_GladField->GetXmin())/50;
-          iy = (int)(TofHit[0].yc - m_GladField->GetYmin())/50;
+          iy = (int)(TofHit[0].yc -20. - m_GladField->GetYmin())/50;
           TofHit[i].Leff = m_GladField->GetLeff(ix,iy);
 
           X3lab = TofHit[i].x3*cos(Theta0) + XMW3;
           Z3lab = TofHit[i].x3*sin(Theta0) + ZMW3;
           TofHit[i].x3lab = X3lab;
           TofHit[i].z3lab = Z3lab;
-          TVector3 vC    = TVector3(TofHit[i].xc,0,TofHit[i].zc);
-          TVector3 vOut  = TVector3(X3lab-TofHit[i].xc,0,Z3lab-TofHit[i].zc);
+          TVector3 vOut  = TVector3(X3lab-XC,0,Z3lab-ZC);
           double angle = -vZ.Angle(vOut);
           TofHit[i].theta_out = angle;
           TofHit[i].psi = TofHit[i].theta_in - TofHit[i].theta_out;
@@ -646,15 +645,21 @@ void Analysis::FissionFragmentAnalysis(){
           // *** Extrapolate to D position *** //
           //XD = XC + TofHit[i].Leff/2*tan(angle+Tilt)*cos(Tilt);
           //ZD = ZC + TofHit[i].Leff/2*cos(Tilt);
-          double phi = -angle -Tilt;
-          double psi = TMath::Pi()/2+angle;
+          double phi = abs(angle) - Tilt;
+          double psi = TMath::Pi()/2-abs(angle);
           double l = TofHit[i].Leff/(2*cos(phi));
           XD = XC - l*cos(psi);
           ZD = ZC + l*sin(psi);
           TofHit[i].xd = XD;
           TofHit[i].zd = ZD;
           TVector3 vD = TVector3(XD,0,ZD);
-     
+    
+          // *** Extrapolate position of the rho point *** //
+          TofHit[i].BrhoX = XB - TofHit[i].rho*cos(TofHit[i].theta_in); 
+          TofHit[i].BrhoZ = ZB + TofHit[i].rho*sin(TofHit[i].theta_in); 
+          TVector3 vBrho = TVector3(TofHit[i].BrhoX, 0, TofHit[i].BrhoZ);
+            
+
           TVector3 v3lab = TVector3(X3lab,0,Z3lab);
           TVector3 v1 = TVector3(XB,0,ZB);
           TVector3 v3 = TVector3(X3lab-XD,0,Z3lab-ZD);
@@ -679,11 +684,17 @@ void Analysis::FissionFragmentAnalysis(){
 
           TVector3 vCG = vG - vC;
           TVector3 vCA = vA - vC;
-          TofHit[i].deff1 = vCG.Angle(vCA)*180./TMath::Pi();
-          TofHit[i].deff2 = vCG.Angle(vOut)*180./TMath::Pi();
+          //TofHit[i].deff1 = vCG.Angle(vCA)*180./TMath::Pi();
+          //TofHit[i].deff2 = vCG.Angle(vOut)*180./TMath::Pi();
+
+          TVector3 vBD = vD-vB;
+          double vBD_angle = vZ.Angle(vBD);
 
-          //TofHit[i].deff1 = (vC-vB).Mag();
-          //TofHit[i].deff2 = (vC-vD).Mag();
+          double XO = XB - TofHit[i].Leff/(2*cos(vBD_angle - Tilt))*cos(TMath::Pi()/2-vBD_angle);
+          double ZO = ZB + TofHit[i].Leff/(2*cos(vBD_angle - Tilt))*sin(TMath::Pi()/2-vBD_angle);
+          TVector3 vO = TVector3(XO,0,ZO);
+          TofHit[i].deff1 = (vO-vB).Mag();
+          TofHit[i].deff2 = (vD-vO).Mag();
 
           TofHit[i].gamma = 1. / sqrt(1 - pow(TofHit[i].beta,2));
           TofHit[i].AoQ = TofHit[i].Brho / (3.10716 * TofHit[i].beta * TofHit[i].gamma);
@@ -717,6 +728,8 @@ void Analysis::FissionFragmentAnalysis(){
         SofFF->SetAoQ(TofHit[i].AoQ);
         SofFF->SetA(TofHit[i].A);
         SofFF->SetBrho(TofHit[i].Brho);
+        SofFF->SetBrhoX(TofHit[i].BrhoX);
+        SofFF->SetBrhoZ(TofHit[i].BrhoZ);
         SofFF->SetRho(TofHit[i].rho);
         SofFF->SetOmega(TofHit[i].omega);
         SofFF->SetDT(TofHit[i].DT);
-- 
GitLab