From c8b52b3b7eae7ae3f5689d4fccd2eba9562cebde Mon Sep 17 00:00:00 2001
From: clement <clement@ganp408.ganil.local>
Date: Mon, 7 Mar 2022 14:30:47 +0100
Subject: [PATCH] Major Improovement in EXOGAM PSA

---
 AnalysisADNE.C   |   2 +-
 GUser.C          |  16 ++-
 ListRun.txt      |   3 +-
 TExogam2.cxx     | 176 ++++++++++++++++++++++++++-----
 TExogam2.h       |  14 ++-
 Utils/files.h    | 266 +++++++++++++++++++++++++++++++++++++++++++++++
 Utils/psa.txt    |   6 ++
 Utils/root2spe   | Bin 0 -> 35915 bytes
 Utils/root2spe.C | 264 ++++++++++++++++++++++++++++++++++++++++++++++
 9 files changed, 713 insertions(+), 34 deletions(-)
 create mode 100755 Utils/files.h
 create mode 100644 Utils/psa.txt
 create mode 100755 Utils/root2spe
 create mode 100755 Utils/root2spe.C

diff --git a/AnalysisADNE.C b/AnalysisADNE.C
index b16a40d..19436ff 100644
--- a/AnalysisADNE.C
+++ b/AnalysisADNE.C
@@ -77,7 +77,7 @@ int main(){
 		cerr<< "File Open"<<endl;
 		printf("\033[32mInfo:: File Open\033[m \n");
 		//schaine.ReplaceAll("/space/clement/space/AGATA/OutMerger/","");
-		//schaine.ReplaceAll("/data/exogamX/e826/acquisition/run/","");
+	//	schaine.ReplaceAll("/data/exogamX/e826/acquisition/run/","");
 		schaine.ReplaceAll("/data/e826X/e826/acquisition/run/","");
 		//schaine.ReplaceAll("/data/lise_zddX/test/acquisition/run/","");
 		if(schaine.BeginsWith("run_")){
diff --git a/GUser.C b/GUser.C
index 7a57c72..4d1f985 100644
--- a/GUser.C
+++ b/GUser.C
@@ -101,7 +101,7 @@ GUser::GUser (GDevice* _fDevIn, GDevice* _fDevOut)
   
   fExogam2->ActivateGOCCETrack(false); //activate a second level of checking for GOCCE
   
-  fExogam2->SetPromptGate(0,64000);
+  fExogam2->SetPromptGate(0,1e5);
   
   
   fExogam2->SetCloverPosition(0,0,141.); //ecc# flange# dis[mm] // from 2022 and numexo2 eccId==flangeId
@@ -192,8 +192,8 @@ void GUser::InitUser()
       if(fExogam2->IsCloverActive(k)){
 	MySpectraList->AddSpectrum(fExogam2->fMyHistoCloverECal[k],"Exogam/Clover_ECal");
 	MySpectraList->AddSpectrum(fExogam2->fMyHistoCloverECalACAdd[k],"Exogam/Clover_ECalACAdd");
-	MySpectraList->AddSpectrum(fExogam2->fMyHistoCloverECalACAdd_TC[k],"Exogam/Clover_ECalACAdd_TC");
-	MySpectraList->AddSpectrum(fExogam2->fMyHistoCloverECalACAdd_TQ[k],"Exogam/Clover_ECalACAddDC_TQ");
+	MySpectraList->AddSpectrum(fExogam2->fMyHistoCloverECalACAdd_TC[k],"Exogam/Clover_ECalACAdd_TC"); //AddBack + AC + prompt /clover
+	MySpectraList->AddSpectrum(fExogam2->fMyHistoCloverECalACAdd_TQ[k],"Exogam/Clover_ECalACAddDC_TQ");//AddBack + AC  /clover
 	MySpectraList->AddSpectrum(fExogam2->fMyHistoCloverECalACAddRejectF[k],"Exogam/Clover_ECalACAddRejF");
 			
 	MySpectraList->AddSpectrum(fExogam2->fMyHistoCloverTCal[k],"Exogam/Clover_TCal");
@@ -227,8 +227,14 @@ void GUser::InitUser()
     
     MySpectraList->AddSpectrum(fExogam2->fMyHistoGOCCENet,"Exogam/PSA") ;
     MySpectraList->AddSpectrum(fExogam2->fMyHistoGOCCEMirror,"Exogam/PSA") ;
+    MySpectraList->AddSpectrum(fExogam2->fMyHistoRMirror,"Exogam/PSA") ;
     MySpectraList->AddSpectrum(fExogam2->fMyHistoPhiMirror,"Exogam/PSA") ;
-    MySpectraList->AddSpectrum(fExogam2->fMyHistoSumECCE,"Exogam/Sum");
+    MySpectraList->AddSpectrum(fExogam2->fMyHistoPSASurface,"Exogam/PSA") ;
+    MySpectraList->AddSpectrum(fExogam2->fMyHistoPSASurfaceCarte,"Exogam/PSA") ;
+    MySpectraList->AddSpectrum(fExogam2->ShortTrace,"Exogam/PSA") ;
+    MySpectraList->AddSpectrum(fExogam2->fMyHistoPSAChi2,"Exogam/PSA") ;
+    MySpectraList->AddSpectrum(fExogam2->fMyHistoPSAChi2_Radius,"Exogam/PSA") ;
+    MySpectraList->AddSpectrum(fExogam2->fMyHistoSumECCE,"Exogam/Sum"); //sumCore
     MySpectraList->AddSpectrum(fExogam2->fMyHistoSumECCT,"Exogam/Sum");
     MySpectraList->AddSpectrum(fExogam2->fMyHistoSumGOCCEE,"Exogam/Sum");
 
@@ -239,7 +245,7 @@ void GUser::InitUser()
     MySpectraList->AddSpectrum(fExogam2->fMyHistoPatternGOCCEE,"Exogam/Exogam_Pattern");
     MySpectraList->AddSpectrum(fExogam2->fMyHistoPatternGOCCET,"Exogam/Exogam_Pattern");
     MySpectraList->AddSpectrum(fExogam2->fMyHistoECCcopy_val,"Exogam");
-    MySpectraList->AddSpectrum(fExogam2->fMyHistoSumExogam2,"Exogam/Sum");
+    MySpectraList->AddSpectrum(fExogam2->fMyHistoSumExogam2,"Exogam/Sum"); //AddBack + AC rejected
     MySpectraList->AddSpectrum(fExogam2->fMyHistoSumExogam2DC,"Exogam/Sum");
     MySpectraList->AddSpectrum(fExogam2->fMyHistoSumExogam2FoldCond,"Exogam/Sum");
     MySpectraList->AddSpectrum(fExogam2->fMyHistoSumExogam2DCFoldCond,"Exogam/Sum");
diff --git a/ListRun.txt b/ListRun.txt
index 208d56e..280f0fb 100644
--- a/ListRun.txt
+++ b/ListRun.txt
@@ -11,4 +11,5 @@
 #exogamwithmirror
 #/data/exogamX/e826/acquisition/run/run_0041.dat.08-02-22_14h17m46s
 #exogamparisfull
-/data/e826X/e826/acquisition/run/run_0072.dat.25-02-22_12h07m58s
+#/data/e826X/e826/acquisition/run/run_0072.dat.25-02-22_12h07m58s
+/data/e826X/e826/acquisition/run/run_0075.dat.25-02-22_17h20m44s
diff --git a/TExogam2.cxx b/TExogam2.cxx
index f4c1a26..3f12db8 100644
--- a/TExogam2.cxx
+++ b/TExogam2.cxx
@@ -16,6 +16,12 @@ TExogam2::TExogam2(bool bspec)
    Goccetrack=GOCCEActive=ESSActive=false;
    LUTBool=false;
    PrevTS=0;
+   
+   	
+	 trace = new TF1("trace","[0]/(1.+exp((x-[1])/[2]))",-1000,1000); //wood-saxon like traces
+         traceExp = new TGraph(6);
+   
+	
 }
 
 
@@ -167,7 +173,7 @@ if(BoolSpec){
 			HListExogam2.Add(fMyHistoECCECal[k][l-1]);
 			
 			sprintf(title,"ECC%d_%c_TCal",k,cristal[l-1]);
-			fMyHistoECCTCal[k][l-1]= new TH1F(title,title,4000,0,16000); 
+			fMyHistoECCTCal[k][l-1]= new TH1F(title,title,4000,0,80000); 
 			//HListExogam2.Add(fMyHistoECCTCal[k][l-1]);
 			
 			sprintf(title,"ECC%d_%c_T30",k,cristal[l-1]);
@@ -228,24 +234,34 @@ if(BoolSpec){
 		}
 	}
 		
-	fMyHistoSumECCE= new TH1F("SumEnergyCoreExogam2","SumEnergyCoreExogam2",4000,0,2000); 
+	fMyHistoSumECCE= new TH1F("fMyHistoSumECCE","fMyHistoSumECCE",4000,0,2000); 
 	HListExogam2.Add(fMyHistoSumECCE);
-	fMyHistoSumECCT= new TH1F("SumTimeCoreExogam2","SumTimeCoreExogam2",4000,0,2000); 
+	fMyHistoSumECCT= new TH1F("fMyHistoSumECCT","fMyHistoSumECCT",4000,0,2000); 
 	HListExogam2.Add(fMyHistoSumECCT);
 
-	fMyHistoSumGOCCEE= new TH1F("SumEnergySegExogam2","SumEnergySegExogam2",70000,0,70000); 
+	fMyHistoSumGOCCEE= new TH1F("fMyHistoSumGOCCEE","fMyHistoSumGOCCEE",70000,0,70000); 
 	HListExogam2.Add(fMyHistoSumGOCCEE);
-	fMyHistoSumGOCCET= new TH1F("SumTimeSegExogam2","SumTimeSegExogam2",4000,0,2000); 
+	fMyHistoSumGOCCET= new TH1F("fMyHistoSumGOCCET","fMyHistoSumGOCCET",4000,0,2000); 
 	HListExogam2.Add(fMyHistoSumGOCCET);
 	
 	
 	
 	fMyHistoGOCCENet= new TH1F("fMyHistoGOCCENet","fMyHistoGOCCENet",70000,0,70000);  
 	fMyHistoGOCCEMirror = new TH1F("fMyHistoGOCCEMirror","fMyHistoGOCCEMirror",70000,-35000,35000);
-	fMyHistoPhiMirror = new TH1F("fMyHistoPhiMirror","fMyHistoPhiMirror",1000,-200,200); 
+	fMyHistoPhiMirror = new TH1F("fMyHistoPhiMirror","fMyHistoPhiMirror",400,0,400); 
+	fMyHistoRMirror= new TH1F("fMyHistoRMirror","fMyHistoRMirror",100,0,100); 
+	fMyHistoPSASurface= new TH2F("fMyHistoPSASurface","fMyHistoPSASurface",200,0,2000,1000,-200,200);
+	fMyHistoPSASurfaceCarte= new TH2F("fMyHistoPSASurfaceCarte","fMyHistoPSASurfaceCarte",200,-100,100,200,-100,100);
+	ShortTrace= new TGraph(6);
+	fMyHistoPSAChi2 = new TH1F("fMyHistoPSAChi2","fMyHistoPSAChi2",7000,0,700);
+	fMyHistoPSAChi2_Radius= new TH2F("fMyHistoPSAChi2_Radius","fMyHistoPSAChi2_Radius",7000,0,700,2000,0,1000);
 	HListExogam2.Add(fMyHistoGOCCENet);
 	HListExogam2.Add(fMyHistoGOCCEMirror);
 	HListExogam2.Add(fMyHistoPhiMirror);
+	HListExogam2.Add(fMyHistoRMirror);
+	HListExogam2.Add(fMyHistoPSASurfaceCarte);
+	HListExogam2.Add(fMyHistoPSAChi2);
+
 	
 	fMyHistoPatternECCE= new TH1F("PatternEnergyCoreExogam2","PatternEnergyCoreExogam2",200,0,200); 
 	HListExogam2.Add(fMyHistoPatternECCE);
@@ -260,7 +276,7 @@ if(BoolSpec){
 	
 	
 	
-	fMyHistoSumExogam2= new TH1F("Exogam2AddB_AC_noDC","Exogam2AddB_AC_noDC",4000,0,2000);
+	fMyHistoSumExogam2= new TH1F("Exogam2AddB_AC_noDC","Exogam2AddB_AC_noDC",4000,0,2000);//AddBack + AC rejected
 	HListExogam2.Add(fMyHistoSumExogam2);
 	fMyHistoSumExogam2FoldCond= new TH1F("Exogam2AddB_AC_noDC_Fold1","Exogam2AddB_AC_noDC_Fold1",4000,0,4000);
 	HListExogam2.Add(fMyHistoSumExogam2FoldCond);
@@ -604,6 +620,9 @@ bool TExogam2::IsMFMExo(MFMExogamFrame *frame)
    double valf,valf2,valf3;
    bool result = false;
    bool debug = false;
+   //---------------PSA control
+   bool PSA_debug = false;
+
    int  EXO2BoardId, EXO2CrysId, MapFinger,MulNetCharge ;
    int statusSegment, binstatus;
    float s[4]={0.,0.,0.,0.};
@@ -613,11 +632,24 @@ bool TExogam2::IsMFMExo(MFMExogamFrame *frame)
    int q1,q2;
    float PSA_phi;
    float T30,T60,T90,PSA_r;
-   float I1,I2,I3;
+   TVector2 PSAHit(0,0);
+   float psa_T[6] = {0,0,0,0,0,0};
+   float psa_Q[6] = {0,0,0,0,0,0};
+   float psa_TD1[5] = {0,0,0,0,0};
+   float psa_QD1[5] = {0,0,0,0,0};
+   float psa_TD2[4] = {0,0,0,0};
+   float psa_QD2[4] = {0,0,0,0};
+   float QMAX, TMAX,chi2,Xp,Yp, Rp,ThetaP;
+   int Method=2;
+   float PSACutOFF=160.;
+   
+   //---------------PSA control
    
    //cout<<frame->GetTimeStamp()<<endl;
    clo=cri=MapFinger=-100;
    T30=T60=T90=PSA_r=PSA_phi=0;
+   QMAX= TMAX = -1e3;
+   
    if(LUTBool==false){
    	printf("\033[31m Error in TExogam2::IsMFMExo => The Look Up Table is not known: I won't be able to unpack the event   \033[m \n"); 
 	}
@@ -769,25 +801,24 @@ bool TExogam2::IsMFMExo(MFMExogamFrame *frame)
         		MaxSeg[clo][cri]=seg;
        		}
        }//end Loop Segement
-       		/*if(MulNetCharge==1){ //PSA Studies
-       			cout<<""<<endl;
-      			cout<<"PSA Analysis || Single interaction only"<<endl;
-       			printf("(%d)%f --- (%d)%f \n",psa[0],s[0],psa[1],s[1]);
-                	printf("---     %f     ---\n",valf);
-       			printf("(%d)%f --- (%d)%f \n",psa[3],s[3],psa[2],s[2]);
-       			cout<<"----------------------"<<endl;
+       		if(MulNetCharge==1&&valf>100){ //PSA Studies
+       			if(PSA_debug)cout<<""<<endl;
+			if(PSA_debug)cout<<"======================================="<<endl;
+      			if(PSA_debug)cout<<"PSA Analysis || Single interaction only"<<endl;
+       			if(PSA_debug)printf("(%d)%f --- (%d)%f \n",psa[0],s[0],psa[1],s[1]);
+                	if(PSA_debug)printf("---     %f     ---\n",valf);
+       			if(PSA_debug)printf("(%d)%f --- (%d)%f \n",psa[3],s[3],psa[2],s[2]);
+       			if(PSA_debug)cout<<"----------------------"<<endl;
 			
 			for(Int_t search = 0 ; search<4 ; search++){
 			   	if(psa[search]==0){
-			   		PSANetcharge=search;
+			   		PSANetcharge=search; // search for the next charge of the event
 					break;
 				}
 			}
 			if(PSANetcharge==0){
 				q1=1;
 				q2=3;
-				
-				
 			}
 			else if(PSANetcharge==3){
 				q1=0;
@@ -799,19 +830,111 @@ bool TExogam2::IsMFMExo(MFMExogamFrame *frame)
 			}
 			
 			PSA_phi=TMath::Log10(abs(s[q2])/abs(s[q1]));
-			cout<<"Phi " <<PSA_phi<<endl;
-			fMyHistoPhiMirror->Fill(0.26*PSA_phi*TMath::RadToDeg()+7.3);
+			PSA_phi=45.+(0.26*PSA_phi*TMath::RadToDeg()+10.); // in Deg 7.3
+			
+			
+			
+			if(PSA_debug)cout<<"Phi " <<PSA_phi<<endl;
+			
+			psa_T[0]=Cal(T30,0.,-10.,0);
+			psa_T[1]= 0.;
+			psa_T[2]=-1.0*psa_T[0];
+			psa_T[3]=Cal(T60,0.,10.,0);
+			psa_T[4]=Cal(T90,0.,10.,0);
+			psa_T[5]=psa_T[4]+400.;
+			
+			psa_Q[0]=0;
+			psa_Q[1]=0.;
+			psa_Q[2]=30.;
+			psa_Q[3]=60.;
+			psa_Q[4]=90.;
+			psa_Q[5]=100.;
+			if(PSA_debug)cout<<"Input Trace"<<endl;
+		        for(Int_t psaStep = 0 ; psaStep<6; psaStep++){
+				if(PSA_debug)cout<<psa_T[psaStep]<<"  "<<psa_Q[psaStep]<<endl;
+			  	traceExp->SetPoint(psaStep,psa_T[psaStep],psa_Q[psaStep]);
+			}
+			
+			
+			if(Method==1){
+				for(Int_t psaStep = 0 ; psaStep<5; psaStep++){psa_TD1[psaStep]=psa_T[psaStep+1];}
+				for(Int_t psaStep = 0 ; psaStep<5; psaStep++){psa_QD1[psaStep]=(psa_Q[psaStep+1]-psa_Q[psaStep])/(psa_T[psaStep+1]-psa_T[psaStep]);}
+			
+				for(Int_t psaStep = 0 ; psaStep<4; psaStep++){psa_TD2[psaStep]=psa_TD1[psaStep+1];}
+				for(Int_t psaStep = 0 ; psaStep<4; psaStep++){psa_QD2[psaStep]=(psa_QD1[psaStep+1]-psa_QD1[psaStep])/(psa_TD1[psaStep+1]-psa_TD1[psaStep]);}
+			
+			
+				for(Int_t psaStep = 0 ; psaStep<4; psaStep++){
+			    		if(PSA_debug)cout<<" Time  " << psa_TD2[psaStep] << "  Charge "<< psa_QD2[psaStep]<<endl;
+					if(psa_QD2[psaStep]>QMAX){
+						QMAX=psa_QD2[psaStep];
+						TMAX=psa_TD2[psaStep];
+					} 
+				}
+				chi2=1;
+			
+			}
+			else if (Method==2){
+				trace->SetParameter(0,100);
+				trace->SetParameter(1,100) ;
+				trace->SetParameter(2,-300);
+				for(Int_t trial = 0 ; trial < 5; trial++){
+					traceExp->Fit("trace","Q");
+				}
+				if(PSA_debug)cout<<"Chi2 is "<<trace->GetChisquare()<<endl;
+				
+				chi2=trace->GetChisquare();
+				for(Int_t trial = psa_T[0] ; trial <psa_T[5] ; trial++){
+					if(trace->Derivative2(trial)>QMAX){
+						QMAX=trace->Derivative2(trial);
+						TMAX=1.*trial;
+					}
+				}
+			
+		
+			}	
+			if(PSA_debug)cout<<"Max is "<<QMAX<<" at "<<TMAX<<endl;
+			
+			if(chi2<PSACutOFF){ //these are good traces
+				PSA_r=TMAX*0.05+0.0;
+				PSAHit.SetMagPhi(PSA_r,PSA_phi*TMath::DegToRad());
+				//cout<<PSAHit.Phi()*TMath::RadToDeg()<<endl;
+				//cout<<"then rotate by "<<1.*PSANetcharge*(90.*TMath::DegToRad())<<endl;
+				
+				//PSAHit.Rotate((double)(PSANetcharge*90.*TMath::RadToDeg()));
+				Xp=PSAHit.X()*TMath::Cos(PSANetcharge*90.*TMath::RadToDeg())-PSAHit.Y()*TMath::Sin(PSANetcharge*90.*TMath::RadToDeg());
+				Yp=PSAHit.X()*TMath::Sin(PSANetcharge*90.*TMath::RadToDeg())+PSAHit.Y()*TMath::Cos(PSANetcharge*90.*TMath::RadToDeg());
+				Rp=sqrt(Xp*Xp+Yp*Yp);
+				
+				if(Xp>0&&Yp>=0)ThetaP=TMath::ATan(Yp/Xp);
+				if(Xp>0&&Yp<0)ThetaP=TMath::ATan(Yp/Xp)+2*TMath::Pi();
+				if(Xp<0)ThetaP=TMath::ATan(Yp/Xp)+TMath::Pi();
+				if(Xp==0&&Yp>0)ThetaP=TMath::Pi()/2.;
+				if(Xp==0&&Yp<0)ThetaP=3*TMath::Pi()/2.;
+				PSAHit.SetMagPhi(Rp,ThetaP);
+				
+				//cout<<PSAHit.Phi()*TMath::RadToDeg()<<endl;
+				if(BoolSpec)fMyHistoPhiMirror->Fill(PSAHit.Phi()*TMath::RadToDeg());// in Deg
+				
+				if(BoolSpec)fMyHistoRMirror->Fill(PSA_r);
+				if(BoolSpec)fMyHistoPSASurface->Fill(PSA_r,PSAHit.Phi()*TMath::RadToDeg());
+				if(BoolSpec)fMyHistoPSAChi2_Radius->Fill(chi2,PSA_r);
+				
+				if(BoolSpec)fMyHistoPSAChi2->Fill(chi2);
+				if(BoolSpec)fMyHistoPSASurfaceCarte->Fill(PSAHit.X(),PSAHit.Y());
+
 			
-			I1=(60.-30.)/(1.*T60-T30);
-			I2=(90.-60.)/(1.*T90-T60);
-			I3=(I2-I1)/(1.*T90-T60);
-			cout<<"I1 " <<I1<<"  I2  "<<I2 <<endl;
-       		}*/
+				for(Int_t psaStep = 0 ; psaStep<6; psaStep++){
+					if(PSA_debug)cout<<psaStep<<"---- psa_T / psa_Q "<<psa_T[psaStep]<< "/" <<psa_Q[psaStep]<<endl;
+					ShortTrace->SetPoint(psaStep,psa_T[psaStep],psa_Q[psaStep]);
+				}
+			}
+       		}
        
        
   //------------------Now Anti Comption     
        UShort_t sum = frame->ExoGetBGO()+frame->ExoGetCsi(); //do a sum of CsI+BGO energies
-       if(sum>10){
+       if(sum>150){
        		NoComptonCore[clo][cri]=false;
        		NoCompton[clo]=false;
        }
@@ -841,6 +964,7 @@ float Theta_Gamma, Phi_Gamma;
 bool IsPrompt[16][4];
 float SumCalorimeter;
 
+
 SumCalorimeter=0;
 	//------------------Time Treat
 	for(Int_t c=0;c<16;c++){
diff --git a/TExogam2.h b/TExogam2.h
index f3695a8..c089bd5 100644
--- a/TExogam2.h
+++ b/TExogam2.h
@@ -14,11 +14,13 @@
 
 #include <MFMExogamFrame.h>
 #include "TVector3.h"
+#include "TVector2.h"
 #include "TF1.h"
 #include "TTree.h"
 #include "TH1.h"
 #include "TH2.h"
 #include "TMath.h"
+#include "TGraph.h"
 #include <TObject.h>
 #include "TRandom.h"
 #include "TString.h"
@@ -76,7 +78,17 @@ class TExogam2 : public TDetector {
    TH1F * fMyHistoGOCCENet ;
    TH1F * fMyHistoGOCCEMirror ;
    TH1F * fMyHistoPhiMirror ;
-
+   TH1F * fMyHistoRMirror ;
+   TH2F * fMyHistoPSASurface ;
+   TH2F * fMyHistoPSASurfaceCarte ;
+   TGraph *ShortTrace;
+   TF1 *trace;
+   TGraph *traceExp;
+   
+   
+   TH1F * fMyHistoPSAChi2 ;
+   TH2F * fMyHistoPSAChi2_Radius ;
+   
    TH1F * fMyHistoESS_BGO[16][4];
    TH1F * fMyHistoESS_CSI[16][4];
    
diff --git a/Utils/files.h b/Utils/files.h
new file mode 100755
index 0000000..f8fa62b
--- /dev/null
+++ b/Utils/files.h
@@ -0,0 +1,266 @@
+#ifndef FILES_H
+#define FILES_H 1
+
+#define matsize 4096
+#define io_read 0
+#define io_write 1
+
+
+class files{
+	int file_id;
+	char filename[80];
+	char text[100];
+	int lum;
+	FILE *fp;
+	int fd;
+public:
+	char EUROGAM_NAME[80];
+	files();
+	files(const char*);
+	struct ganil_header{
+         unsigned long    num_run;          // ! numero run (a la sauvegarde)
+         char   reserve_1[12];     // !
+         char   nom_run[16];      // ! nom run (facultatif, 15 car utiles)
+         long int    num_spectre;       // ! numero spectre
+         char   type_spectre[2];   // ! type ("1D" ou "2D")
+         char   reserve_2[10];    // !
+         char   nom_spectre[16];  // ! nom du spectre (15 car utiles)
+         char   date[12];         // ! date de creation ("jj-mmm-aaaa")
+         char   heure[8];         // ! heure de creation ("hh:mn:ss")
+         long int    nat_spectre;      // ! reserve ulterieure (=0)
+         unsigned long    codeur_x;         // ! val max du codeur en x
+         unsigned long    codeur_y;         // ! val max du codeur en y
+         unsigned long    taille_canal;     // ! taille utile par canal (16 ou 32)
+         char   type_canal[4];    // ! type variable ("I*4" , "I*2")
+         unsigned long    dim_x;            // ! dimension du spectre en x
+         unsigned long    dim_y;            // ! dimension du spectre en y
+         unsigned long    min_x;            // ! numero du canal min en x
+         unsigned long    min_y;            // ! numero du canal min en y
+         unsigned long    max_x;            // ! numero du canal max en x
+         unsigned long    max_y;            // ! numero du canal max en y
+         char   commentaire[80];  // ! commentaire utilisateur
+         char   nom_par_x[16];    // ! nom du parametre x (15 car utiles)
+         char   nom_par_y[16];    // ! nom du parametre y (15 car utiles)
+         char   unite_x[8];       // ! unite en x (8 car utiles)
+         char   unite_y[8];       // ! unite en y (8 car utiles)
+	}header_ganil;
+
+	struct header_ans{
+		char revision_code[2]; //0-1
+		char file_name[12];  //2-13
+		char spectrum_id[72]; //14-85
+		char Start_Date[8];    //86-93
+		char Stop_Date[8];     //94-101
+		char ElapsedRT[8];    //102-109
+		char ElapsedLT[8];    //110-117
+		char ElapsedPass[4];  //118-121
+		char DeadTime[4];      //122-125
+		char Hard_Setup_AMP[42]; //126-167
+		char Hard_Setup_ADC[84]; //168-251
+		char Hard_Setup_Bias[30]; //252-281
+		char Ener_Calib_Data[32]; //282-313
+		char Shape_Calib_Data[24]; //314-337
+		char Eff_Calib_Data[48]; //338-385
+		char Detector[208];      //386-593
+		char Hardware_spec[24];  //594-617
+		char Hardware_setup_Presets[20]; // 618-637
+		char Tool_Settings[28]; //638-665
+		char Background[24]; // 666-689
+		char Microanalysis[48]; // 690-737
+		char Oxford[10]; // 738-747
+		char Sample[20]; // 748-767
+		char More_Tools[20]; // 768-787
+		char Reserved[226]; // 788-1013
+		char SpecStart[2];
+		char SpecEnd[2];
+		char NROIs[2];
+		char AcqSysType[2];
+		char AcqSysLen[2];
+	}header_ans;
+
+	struct in2p3_header{
+		char nomrun[16];
+		int numrun;
+		char nomspe[16];
+		int nuspe;
+		char date[20];
+		int type;
+		int format;
+		int nbcanx;
+		int candebx;
+		int nbcany;
+		int candeby;
+		int nbcanz;
+		int candebz;
+		int nbcant;
+		int candebt;
+		char oct[4];
+		char idaplic[8];
+		int hlong;
+		char applic[16];
+		char version[8];
+	}header;
+
+	struct header_eurogam
+	{
+		unsigned int magic_number;
+		unsigned int version;	// expect 1 !!!
+		char spectrum_name[32];		// spectrum name
+		unsigned int fold;
+		char creation_date[20];		//creation date
+		char modification_date[20];	// modif date	
+
+		unsigned int base_info[8];	// base info for dim 1-8
+
+		unsigned int range[8];		// range info for dim 1-8
+
+		unsigned int fip[32];	//  information pointer	
+		int anotation_pointer[8];
+		int calibration_pointer[8];
+		int efficiency_pointer[8];
+		unsigned int data_array_descriptor1[5];
+			// 32 bits : array layout (0 for histo/matrix)
+			// 32 bits : array type (5 for 32 bit signed )
+			// 32 bits : reserved for future
+			// 32 bits : reserved for future
+			// 32 bits : pointer
+		unsigned int data_array_descriptor2[5];
+		int base_address_string_space;
+		int string_free_space;
+		unsigned int top_string_space;
+		unsigned int base_address_count_space;
+		unsigned int count_free_space;
+		unsigned int top_count_space;
+		unsigned int unused[20];	// not used ...
+	}header_eurogam;
+
+	void check_little_endian(void);
+	unsigned long swap(unsigned long);
+	void swap4b(char *);
+	void swap2b(char *);
+	int open_file(void);
+	int open_file_r(void);
+	int open_file_r(char *);
+	int fopen_file(void);
+	void get_name(const char *);
+	int is_file_here(void);
+	int is_file_here(char *);
+	void remove(void);
+	void remove(char *);
+	void touch(void);
+	void put_ex_mat();
+	void put_ex_mat(char *);
+	void put_ex_spe();	
+	void put_ex_spe(char *);
+	void put_ex_txt(char *);
+	void put_ex_ans(char *);
+	void put_ex_asc(char *);
+	void put_ex_s();
+	void put_ex_s(char *);
+	void put_ex_mtr();
+	int read_line(FILE *, char *);
+	void specdump(short *, int, FILE*, FILE*);
+	void specdump(int *, int, FILE*, FILE*);
+	void specdump(unsigned int *, int, FILE*, FILE*);
+	void specdump(float *, int, FILE*, FILE*);
+	void specdump(int **, int, int, FILE*, FILE *);
+	void specdump(short **, int, int, FILE*, FILE *);
+// for radware .mat matrices
+	int write_mat_rad(short *, FILE *, FILE *);
+	int write_mat_rad(short *, char *, FILE *, FILE *);
+	void write_mat_rad(int *);
+	int read_mat_rad(short *, FILE *, FILE *);
+	int read_mat_rad(short *, char *, FILE *, FILE *);
+// for mktri matrices format 
+	int read_mktri(short *, int);
+	int write_mktri(short *, int);
+	int check_mat(int, int*, FILE*, FILE* );
+	int check_mat(int, FILE*, FILE* );
+// for in2p3 format 
+	int read_header_in2p3();
+	void write_header_in2p3(FILE *);
+	int read_sp_in2p3(unsigned int *);
+	int read_sp_in2p3(unsigned int **);
+	int get_type_in2p3(){return(header.type);};
+	int get_nx_in2p3(){return(header.nbcanx);};
+	int get_ny_in2p3(){return(header.nbcany);};
+	char* get_nom_in2p3(){return(header.nomspe);};
+// for gpsi format
+	int get_nsp_gpsi(char *);
+	int get_nx_gpsi(int, char *);
+	int get_ny_gpsi(int, char *);
+	void myrgspe(char *, int, float *,int , int, char *, int);
+	void myrgspe(FILE *,char *, int, float *,int , int, char *, int);
+// for cambda format
+	int get_size_cambda(char *);
+	void get_cambda(char *, float *, int);
+	void get_att_mtr(void);
+	int read_mtr(float **);
+// for ascii format
+	int get_size_ascii(char *);
+	void get_ascii(char *, float *, int);
+	void write_tab(float *, int);
+	void write_tab(int *, int);
+// for eurogam format 
+	int swaping_eurogam;
+	int open_eurogam(char *);
+	void close_eurogam(void);
+	int get_parameters_eurogam(char *, int *, int *, int *, FILE *, FILE *);
+	int get_header_eurogam(char *, FILE *, FILE *);
+	int get_header_eurogam(char *);
+	void print_header_eurogam(void);
+	int check_magicnumber_eurogam(char *, FILE *, FILE *);
+	int check_magicnumber_eurogam(char *);
+	void swap_header_eurogam(void);
+
+	int get_fold_eurogam(void){return header_eurogam.fold;};
+	int get_size_eurogam(void){return header_eurogam.count_free_space;};
+	int get_size1_eurogam(void){return header_eurogam.range[0];};
+	int get_size2_eurogam(void){return header_eurogam.range[1];};
+	int get_type_eurogam(void){return
+		header_eurogam.data_array_descriptor1[1];};
+	int get_tab1D_eurogam(unsigned char *);
+	int get_tab1D_eurogam(char *);
+	int get_tab1D_eurogam(unsigned short *);
+	int get_tab1D_eurogam(short *);
+	int get_tab1D_eurogam(unsigned int *);
+	int get_tab1D_eurogam(float *);
+	int get_tab1D_eurogam(int *);
+//	int get_tab2D_eurogam(short *);
+	int get_tab2D_eurogam(short *, int, int);
+	int get_tab2D_eurogam(short **, int, int);
+//	int get_tab2D_eurogam(int *, int);
+	int get_tab2D_eurogam(int *, int, int);
+	int get_tab2D_eurogam(int **, int, int);
+	int init_header_eg(int, int , const char *, int, FILE *, FILE *);
+	int write_eg(int*, int, int , const char *, FILE *, FILE *);
+	int write_eg(int*, int, int , const char *);
+	int write_eg(int**, int, int , const char *, FILE *, FILE *);
+	int write_eg(unsigned int*, int, int , const char *, FILE *, FILE *);
+	int write_eg(short** , int, int , const char *, FILE *, FILE *);
+	int write_eg(float*, int, int , const char *, FILE *, FILE *);
+// for ganil format
+	int get_header_ganil(char *);
+	void print_header_ganil(void);
+	int get_dimx_ganil(void){return swap(header_ganil.dim_x);};
+	int get_ganil_integer4(unsigned long *);
+// for radware monodim format 
+	int write_spe(char *, float *, int, FILE *, FILE *);
+	int read_spe(float *, char *, int *);
+	int read_spe(char *,float *, char *, int *, FILE *, FILE *);
+// for xmgr 
+	int tab_to_xmgr(int, float*, float*, float*);
+	void write_xmgr(int, float *, float *);
+// for ans format
+	int get_header_ans(char *);
+	int open_ans(char *);
+	void close_ans(void);
+	void print_header_ans(void);
+	int get_size_ans();
+	int read_sp_ans(float *);
+//  for asc format
+	int read_header_asc(char *);
+	void read_asc(float *, char *, int);
+};
+
+#endif
diff --git a/Utils/psa.txt b/Utils/psa.txt
new file mode 100644
index 0000000..5864378
--- /dev/null
+++ b/Utils/psa.txt
@@ -0,0 +1,6 @@
+-147.197  0
+0  0
+147.197  30
+279.857  60
+484.151  90
+884.151  100
diff --git a/Utils/root2spe b/Utils/root2spe
new file mode 100755
index 0000000000000000000000000000000000000000..1f7b2605c3276f66172204faeecadd5a36693c70
GIT binary patch
literal 35915
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
ZA9gi<uKu6KqKw-;Bt(N%CT6m^`(HQG4k7>m

literal 0
HcmV?d00001

diff --git a/Utils/root2spe.C b/Utils/root2spe.C
new file mode 100755
index 0000000..18fed1e
--- /dev/null
+++ b/Utils/root2spe.C
@@ -0,0 +1,264 @@
+#include <string.h>
+#include <stdio.h>
+#include <iostream>
+#include <fstream>
+#include <stdlib.h>
+#include <math.h>
+#include <time.h>
+#include <ctype.h>
+#include "TStyle.h"
+#include "TCanvas.h"
+#include "TGraph.h"
+#include "TH2F.h"
+#include "TChain.h"
+#include "TTree.h"
+#include "TNtuple.h"
+#include "TFile.h"
+#include "TRandom.h"
+#include "TVector3.h"
+#include "TRotation.h"
+#include "TLorentzVector.h"
+#include "TGenPhaseSpace.h"
+#include "TMath.h"
+#include "TRint.h"
+#include "TString.h"
+#include "TKey.h"  
+#include "files.h"
+
+/*              root2spe spectrum converter root->spe
+                1D histograms only
+                Ch. Theisen
+                First Version :  Feb 2005
+		
+		compile with :
+g++ root2spe.C -o root2spe `$ROOTSYS/bin/root-config --libs` `$ROOTSYS/bin/root-config --cflags`          
+*/
+                                                
+
+class files File;
+
+files::files(){
+
+	strcpy(EUROGAM_NAME,"Eurogam spectrum");
+
+}
+
+files::files(const char *fname){
+
+	strcpy(EUROGAM_NAME,fname);
+
+}
+int files::is_file_here(char *file){
+FILE *fpa;
+
+	fpa = fopen(file,"r");
+	if (fpa == NULL) return(0);
+	fclose(fpa);
+	return(1);
+}
+
+void files::swap4b(char *buf){
+char c;
+
+  c = buf[3]; buf[3] = buf[0]; buf[0] = c;
+  c = buf[2]; buf[2] = buf[1]; buf[1] = c;
+
+}
+
+int files::write_spe(char *file, float *spectre, int size,  // output name , spectra array[nbin], nbin,
+	FILE *stream1, FILE *stream2){
+FILE *fprad;
+int dum;
+int j = 24;
+int toto;
+int tab[4] = {0,1,1,1};
+int i;
+float *newspec;
+int newsize;
+
+
+	newsize = size;
+	if (size > 16384){
+		newsize=16384;
+		printf("Initial size = %d; resizing to %d \n",size,newsize);
+	}
+
+	tab[0] = newsize;
+	toto = newsize * sizeof(float);
+
+	fprad = fopen(file,"w");
+	if (fprad == NULL){
+		fprintf(stream1,"Cannot write %s \n",file);
+		if (stream2)
+			fprintf(stream2,"Cannot write %s \n",file);
+		fclose(fprad);
+		return(0);
+	}
+	if (LITTLE_ENDIAN == 1){
+		swap4b((char*)&j);
+		for(i=0; i<4; i++)
+			swap4b((char*)&(tab[i]));
+		swap4b((char*)&toto);
+		newspec = new float[newsize];
+		for(i=0; i<newsize; i++){
+		
+			newspec[i] = spectre[i];
+			swap4b((char*)&(newspec[i]));
+		}
+	}
+
+	dum = fwrite(&j, sizeof(int), 1, fprad);
+	dum = fwrite(filename, 8, 1, fprad);
+	dum = fwrite(tab, sizeof(int), 4, fprad);
+	dum = fwrite(&j, sizeof(int), 1, fprad);
+
+	dum = fwrite(&toto, sizeof(int), 1, fprad);
+	if (LITTLE_ENDIAN == 1){
+		dum = fwrite(newspec, sizeof(float), newsize, fprad);
+		delete [] newspec;
+	}
+	else
+		dum = fwrite(spectre, sizeof(float), newsize, fprad);
+
+  	dum = fwrite(&toto,sizeof(int),1,fprad);
+	if (fprad == NULL){
+		fprintf(stream1,"Cannot write %s \n",file);
+		if (stream2)
+			fprintf(stream2,"Cannot write %s \n",file);
+
+		fclose(fprad);
+		return(0);
+	}
+	fclose(fprad);
+
+	return(1);
+}
+
+
+void files::put_ex_spe(char *name){
+int len;
+	len = strlen(name);
+	if ( ( name[len-1] == 'e' ) &&
+	     ( name[len-2] == 'p' ) &&
+	     ( name[len-3] == 's' ) &&
+             ( name[len-4] == '.' ) ) return;
+	sprintf(name,"%s.spe",name);
+}
+int process(TH1F *histo, int option){
+char name[80];
+char radname[80];
+char type[80];
+int nx,ny;
+int binning,range,start;
+float *spec;
+float ch,st;
+int i,j;
+
+	sprintf(name,histo->GetName());
+	printf("processing %s ...\n",name);
+	sprintf(type,histo->ClassName());
+	if (strncmp(type,"TH1",3) != 0){
+		printf("	%s is not a TH1 \n",name);
+		 return(1);
+	}
+
+	nx = histo->GetNbinsX();
+	ny = histo->GetNbinsY();
+	printf("	Nombre de bins X : %d \n",nx);
+	printf("	Nombre de bins Y : %d \n",ny);
+	printf("	First bin : %f \n",histo->GetBinLowEdge(1));
+	printf("	Last bin : %f \n",histo->GetBinLowEdge(nx));
+	
+	spec = new float[nx];
+	for(i=1; i<=nx; i++){
+		ch = histo->GetBinLowEdge(i);
+		st = histo->GetBinContent(i);
+		//printf("%d %f %f \n",i,ch,st);
+		spec[i-1] = histo->GetBinContent(i);
+	}
+	
+
+
+	switch(option){
+		case 1:
+			sprintf(radname,name);
+	        	File.put_ex_spe(radname);
+			printf("	writing %s \n",radname);
+		break;
+		case 2:
+        		printf("Enter output .spe filename : ");
+        		scanf("%s",radname);
+	        	File.put_ex_spe(radname);
+			break;
+	}
+        
+	File.write_spe(radname, spec, nx, stdout, NULL); // output name , spectra array[nbin], nbin,
+        delete [] spec;
+	return(1);
+}
+
+int main(int argc, char *argv[]){
+int mode;       // 1 for only one    2 for all
+int dum;
+char file[80];
+char specname[80];
+TH1F *histo;
+
+        printf("--------------------------------------------------- \n");
+        printf(" root2spe : a program to convert root spectrum   \n");
+        printf("          to Radford spectrum format \n");
+	printf("  use root2spe -all to convert all histos           \n");
+        printf("--------------------------------------------------- \n");
+
+        if (argc == 1){
+                mode = 1;
+        }
+        else{
+                dum = strcmp(argv[1],"-all");
+                if (dum != 0){
+                        printf("unvalid option %s \n",argv[1]);
+                        exit(0);
+                }
+                mode = 2;
+        }
+
+	printf("root file : ");
+	scanf("%s",file);
+
+        if (!File.is_file_here(file)){
+		printf("This file does not exists ...\n");
+		exit(0);
+	}
+	
+
+	TFile *file1 = new TFile(file);
+	if (file1->IsZombie()){
+		printf("%s is not a root file ... \n",file);
+		exit(0);
+	}
+
+	switch(mode){
+	    case 1:
+		file1->ls();
+		printf("histogram name : ");
+		scanf("%s",specname);
+
+		histo = (TH1F*)file1->Get(specname);
+		if (histo == NULL){
+			printf("Error : %s does not exist... \n",specname);
+			exit(0);
+		}
+		process(histo,2);
+		break;
+	    case 2:
+		TIter nextkey(file1->GetListOfKeys());
+		TKey *key;
+		while(key = (TKey*)nextkey()){
+			TH1F *histo = (TH1F*)key->ReadObj();
+			process(histo,1);
+		}
+		break;	
+	}
+	file1->Close();
+
+}
-- 
GitLab