Skip to content
Snippets Groups Projects
Analysis.cc 6.41 KiB
#include "ObjectManager.hh"

using namespace std;

int main(int argc,char** argv)
{	
	
	if(argc!=4) 
		{
			cout << 
			"you need to specify both a Reaction file and a Detector file such as : Analysis 	myReaction.reaction myDetector.detector runToRead.run" 
			<< endl;
			return 0;
		}
	
	string reactionfileName 	= argv[1]	;
	string detectorfileName 	= argv[2]	;
	string runToReadfileName 	= argv[3]	;
	
	//	First of All instantiate RootInput and Output
	//	Detector will be attached later
	RootInput:: getInstance(runToReadfileName)	;
	RootOutput::getInstance("Analysis/10HeRiken_AnalyzedData", "AnalyzedTree")					;
	
	//	Instantiate a Reaction
	NPL::Reaction* myReaction = new Reaction					;
	myReaction	->	ReadConfigurationFile(reactionfileName)		;

		//	Instantiate the detector using a file 
	DetectorManager* myDetector = new DetectorManager 			;
	myDetector	->	ReadConfigurationFile(detectorfileName)		;
	
	//	Attach more branch to the output
	double ThinSi=-1 ;double Ex = 0 ; double EE = 0 ; double TT = 0 ; double X = 0 ; double Y = 0 ; int det ; double ResolThetaCM=0;
	double ThetaCM=0;
	RootOutput::getInstance()->GetTree()->Branch("ExcitationEnergy",&Ex,"Ex/D") ;
	RootOutput::getInstance()->GetTree()->Branch("E",&EE,"EE/D") ;
	RootOutput::getInstance()->GetTree()->Branch("A",&TT,"TT/D") ;
	RootOutput::getInstance()->GetTree()->Branch("X",&X,"X/D") ;
	RootOutput::getInstance()->GetTree()->Branch("Y",&Y,"Y/D") ;
	RootOutput::getInstance()->GetTree()->Branch("Y",&Y,"Y/D") ;
	RootOutput::getInstance()->GetTree()->Branch("ThinSi_E",&ThinSi,"ThinSi/D") ;
	RootOutput::getInstance()->GetTree()->Branch("ThetaCM",&ThetaCM,"ThetaCM/D") ;
	RootOutput::getInstance()->GetTree()->Branch("ResolThetaCM",&ResolThetaCM,"ResolThetaCM/D") ;
	//	Get the formed Chained Tree and Treat it
	TChain* Chain = RootInput:: getInstance() -> GetChain()	;
	
	// Open the ThinSi Branch
	Chain->SetBranchStatus("ThinSiEnergy",true)	;
	Chain->SetBranchStatus("InitialConditions",true)	;
	Chain->SetBranchStatus("fIC_*",true)	;

	 TInitialConditions* Init = new TInitialConditions();
	Chain->SetBranchAddress("ThinSiEnergy"		,&ThinSi	);
	Chain->SetBranchAddress("InitialConditions"	,&Init		);
	
	
 double TargetX=0 ; double TargetY=0; double BeamTheta = 0 ; double BeamPhi = 0 ;
double TrueE=0 ; double TrueTheta=0 ;

	// Get Must2 Pointer:
	MUST2Array* M2 = (MUST2Array*) myDetector -> m_Detector["MUST2"] ;
	
	int i;	
	for ( i = 0 ; i < Chain -> GetEntries() ; i ++ )
		{
			if( i%10000 == 0 && i!=0) cout << i << " Event annalysed " << endl ;						
			Chain -> GetEntry(i);
			myDetector -> ClearEventPhysics()				;
			myDetector -> BuildPhysicalEvent()				;
			
			double E = M2 -> GetEnergyDeposit();
			TVector3 HitDirection  = M2 -> GetPositionOfInteraction() - TVector3(Init->GetICPositionX(0),Init->GetICPositionY(0),0);
			
			BeamTheta = Init->GetICIncidentAngleTheta(0)*deg ; BeamPhi = Init->GetICIncidentAnglePhi(0)*deg ; 

//			TVector3 BeamDirection = TVector3(cos(BeamPhi)*sin(BeamTheta) , sin(BeamPhi)*sin(BeamTheta) , cos(BeamTheta)) ;	
			TVector3 BeamDirection = TVector3(0,0,1) ;  BeamDirection.SetTheta(BeamTheta) ; BeamDirection.SetPhi(BeamPhi) ;
			double Theta  = ThetaCalculation ( HitDirection , BeamDirection   ) ;				
			double ThetaN = ThetaCalculation ( HitDirection , TVector3(0,0,1) ) ;
			double ThetaMM2Surface = ThetaCalculation ( HitDirection , M2 -> GetPositionOfInteraction() );

			if(E>-1000 && ThinSi>0 )	
				{
						E= He3StripAl.EvaluateInitialEnergy(	E 					, // Energy of the detected particle
																2*0.4*micrometer	, // Target Thickness at 0 degree
																ThetaMM2Surface		);
						E = E + ThinSi ;
						
						E= He3StripAl.EvaluateInitialEnergy(	E 					, // Energy of the detected particle
																0.4*micrometer		, // Target Thickness at 0 degree
																ThetaMM2Surface		);

					//	cout << E << "  " << Eb-E << " " << ThinSi << endl ;

						E= He3TargetWind.EvaluateInitialEnergy( 		E 					, // Energy of the detected particle
																 		15*micrometer		, // Target Thickness at 0 degree
																		ThetaN				);
															
						E= He3TargetGaz.EvaluateInitialEnergy(			E 					, // Energy of the detected particle
																		1.5*mm				, // Target Thickness at 0 degree
																		ThetaN				);
																		
					ThetaCM = myReaction -> EnergyLabToThetaCM( E , 1 ) /deg ;
					ResolThetaCM =ThetaCM - Init->GetICEmittedAngleThetaCM(0) ;
					Ex = myReaction -> ReconstructRelativistic( E , Theta ) ;	
					X = HitDirection . X();
					Y = HitDirection . Y();	
				}
				
//			else if(ThinSi>0)
//				{
//				
////					ThinSi= He3StripAl.EvaluateInitialEnergy(	ThinSi 				, // Energy of the detected particle
////																2*0.4*micrometer	, // Target Thickness at 0 degree
////																0					);
////				
//					ThinSi= He3TargetWind.EvaluateInitialEnergy( ThinSi 			, // Energy of the detected particle
//																 15*micrometer	, // Target Thickness at 0 degree
//																 ThetaN				);
////															
////						ThinSi= He3TargetGaz.EvaluateInitialEnergy(	ThinSi 			, // Energy of the detected particle
////																3*mm				, // Target Thickness at 0 degree
////																ThetaN				);
//				 
//					E= ThinSi;
//					
//					Ex = myReaction -> ReconstructRelativistic( E , Theta ) ;	
//					X = HitDirection . X();
//					Y = HitDirection . Y();	
//					
//				} 

			else if(E>-1000 )
				{
			
				E= He3StripAl.EvaluateInitialEnergy(	E 					, // Energy of the detected particle
														0.4*micrometer		, // Target Thickness at 0 degree
														ThetaMM2Surface		);
			
				E= He3TargetWind.EvaluateInitialEnergy( E 					, // Energy of the detected particle
														15*micrometer		, // Target Thickness at 0 degree
														ThetaN				);
				
				E= He3TargetGaz.EvaluateInitialEnergy(	E 					, // Energy of the detected particle
														1.5*mm				, // Target Thickness at 0 degree
														ThetaN				);
					
				Ex = myReaction -> ReconstructRelativistic( E, Theta ) ;	
				X = HitDirection . X();
				Y = HitDirection . Y();	
				
				}	
				
			else {Ex=-100 ; X = -100 ; Y = -100 ;}
								
			EE = E ; TT = Theta/deg ;
			
			RootOutput::getInstance()->GetTree()->Fill()	;
			ThinSi = -1 ;
		}
	cout << "A total of " << i << " event has been annalysed " << endl ;
	
	RootOutput::getInstance()->Destroy();
	return 0	;
}


double ThetaCalculation (TVector3 A , TVector3 B)
	{
		double Theta = acos( (A.Dot(B)) / (A.Mag()*B.Mag()) ) ;
		return Theta*rad ;
	}