Skip to content
Snippets Groups Projects
Analysis.cxx 10.44 KiB
/*****************************************************************************
	* 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: XAUTHORX  contact address: XMAILX                        *
	*                                                                           *
	* Creation Date  : XMONTHX XYEARX                                           *
	* Last update    :                                                          *
	*---------------------------------------------------------------------------*
	* Decription:                                                               *
	*  This class describe  Vendeta analysis project                       *
	*                                                                           *
	*---------------------------------------------------------------------------*
	* Comment:                                                                  *
	*                                                                           *
	*****************************************************************************/

#include<iostream>
using namespace std;
#include"Analysis.h"
#include"NPAnalysisFactory.h"
#include"NPDetectorManager.h"
#include"NPOptionManager.h"
#include"RootInput.h"

////////////////////////////////////////////////////////////////////////////////
Analysis::Analysis(){
}
////////////////////////////////////////////////////////////////////////////////
Analysis::~Analysis(){
}

////////////////////////////////////////////////////////////////////////////////
void Analysis::Init(){
		InitOutputBranch();

		Vendeta= (TVendetaPhysics*) m_DetectorManager->GetDetector("Vendeta");
		FC= (TFissionChamberPhysics*) m_DetectorManager->GetDetector("FissionChamber");

		neutron = new NPL::Particle("1n");
}

////////////////////////////////////////////////////////////////////////////////
void Analysis::TreatEvent(){

		ReInitValue();

		unsigned int FC_mult = FC->AnodeNumber.size();
		unsigned int HF_mult = FC->Time_HF.size();

		double GammaOffset[11] = {969.58, 969.11, 975.03, 974.75, 978.90, 978.16, 967.34, 977.2, 981.14, 983.04, 982.32};

		double incomingDT=0;
		double incomingE=0;
		double flight_path = 21500.;
		/*for(unsigned int j=0; j<HF_mult; j++){
				for(unsigned int i=0; i<FC_mult; i++){
						incomingDT = FC->Time[i] - FC->Time_HF[j] - GammaOffset[FC->AnodeNumber[i]-1];
						if(incomingDT<0){
							incomingDT += 1790;
						}
						double length = flight_path;// + 6*FC->AnodeNumber[i];	
						neutron->SetBeta((length/incomingDT) / c_light);
						incomingE = neutron->GetEnergy();

						inToF.push_back(incomingDT);
						inEnergy.push_back(incomingE);
				}
		}*/

		/*if(FC_mult==2){
				double HF1, HF2;
				for(int i=0; i<2; i++){
						HF1 = FC->Time[0] - FC->Time_HF[0];
						HF2 = FC->Time[1] - FC->Time_HF[1];
				}
				if(FC->AnodeNumber[0]>0 && FC->AnodeNumber[1]>0 && HF1<1790 && HF2<1790)
					cout << FC->AnodeNumber[0] << " / " << FC->AnodeNumber[1] << endl;
		}*/

		if(FC_mult==1){

				int anode = FC->AnodeNumber[0];
				double Time_FC = FC->Time[0];
				bool isFake = FC->isFakeFission[0];
				
				incomingDT = FC->Time[0] - FC->Time_HF[0];
				if(anode>0) incomingDT -= GammaOffset[anode-1];
				if(incomingDT<0){
						incomingDT += 1790;
				}
				double length = flight_path;// + 6*FC->AnodeNumber[i];	
				neutron->SetBeta((length/incomingDT) / c_light);
				incomingE = neutron->GetEnergy();

				inToF.push_back(incomingDT);
				inEnergy.push_back(incomingE);

				FC_Q1.push_back(FC->Q1[0]);
				FC_Q2.push_back(FC->Q2[0]);
				FC_Qmax.push_back(FC->Qmax[0]);
				FC_DT.push_back(FC->DT_FC[0]);
				FC_FakeFission.push_back(FC->isFakeFission[0]);
				FC_Anode_ID.push_back(anode);

				Vendeta->SetAnodeNumber(anode);
				Vendeta->BuildPhysicalEvent();

				// VENDETA LG 
				unsigned int Vendeta_LG_mult = Vendeta->LG_DetectorNumber.size();
				for(unsigned int i=0; i<Vendeta_LG_mult; i++){

						int DetNbr          = Vendeta->LG_DetectorNumber[i];
						double Time_Vendeta = Vendeta->LG_Time[i];
						double Rdet         = Vendeta->GetDistanceFromTarget(DetNbr);
						TVector3 DetPos     = Vendeta->GetVectorDetectorPosition(DetNbr);

						double DT = Time_Vendeta - Time_FC;// + ToF_Shift_Vendlg[DetNbr-1];

						if(DT>-500){

								double DeltaTheta = atan(63.5/Rdet);
								double Theta_Vendeta = DetPos.Theta();
								double Theta_random = ra.Uniform(Theta_Vendeta-DeltaTheta,Theta_Vendeta+DeltaTheta);
								//cout << DetNbr << " " << Rdet << endl;
								//neutron->SetTimeOfFlight(DT*1e-9/(Rdet*1e-3));
								//neutron->SetTimeOfFlight(DT*1e-9/(0.55));
								neutron->SetBeta(  (Rdet/DT) / c_light); 

								double En = neutron->GetEnergy();

								// Filling output tree
								LG_Tof.push_back(DT);
								LG_ID.push_back(DetNbr);
								LG_ELab.push_back(En);
								LG_ThetaLab.push_back(Theta_random);
								LG_Q1.push_back(Vendeta->LG_Q1[i]);
								LG_Q2.push_back(Vendeta->LG_Q2[i]);
								LG_Qmax.push_back(Vendeta->LG_Qmax[i]);
						}
				}

				// VENDETA HG 
				unsigned int Vendeta_HG_mult = Vendeta->HG_DetectorNumber.size();
				for(unsigned int i=0; i<Vendeta_HG_mult; i++){
						int DetNbr          = Vendeta->HG_DetectorNumber[i];
						double Time_Vendeta = Vendeta->HG_Time[i];
						double Rdet         = Vendeta->GetDistanceFromTarget(DetNbr);
						TVector3 DetPos     = Vendeta->GetVectorDetectorPosition(DetNbr);

						double DT = Time_Vendeta - Time_FC;// + ToF_Shift_Vendhg[DetNbr-1];

						if(DT>-500){
								double DeltaTheta = atan(63.5/Rdet);
								double Theta_Vendeta = DetPos.Theta();
								double Theta_random = ra.Uniform(Theta_Vendeta-DeltaTheta,Theta_Vendeta+DeltaTheta);
								//cout << DetNbr << " " << Rdet << endl;
								//neutron->SetTimeOfFlight(DT*1e-9/(Rdet*1e-3));
								//neutron->SetTimeOfFlight(DT*1e-9/(0.55));
								neutron->SetBeta( (Rdet/DT) / c_light); 
								double En = neutron->GetEnergy();

								// Filling output tree
								HG_ID.push_back(DetNbr);
								HG_Tof.push_back(DT);
								HG_ELab.push_back(En);
								HG_ThetaLab.push_back(Theta_random);
								HG_Q1.push_back(Vendeta->HG_Q1[i]);
								HG_Q2.push_back(Vendeta->HG_Q2[i]);
								HG_Qmax.push_back(Vendeta->HG_Qmax[i]);
						}
				}

				//Process coincidences signals in VENDETA LG / HG
				if(HG_Tof.size() > 0 && LG_Tof.size() > 0 ){
						for(int j = 0; j < LG_Tof.size();j++){
								for(int k = 0; k < HG_Tof.size(); k++){
										if(abs(HG_Tof[k]-LG_Tof[j]) < 2 && HG_ID[k] == LG_ID[j]){
												if( HG_Q2[k]>120000){
														HG_ID[k] = -1;
														HG_Tof[k] = - 100000;
														HG_ELab[k] = - 100000;
														HG_ThetaLab[k] = - 100000;
														HG_Q1[k] = - 100000;
														HG_Q2[k] = - 100000;
														HG_Qmax[k] = - 100000;
												}  
												else if( HG_Q2[k]<120000){
														LG_ID[j] = -1;
														LG_Tof[j] = - 100000;
														LG_ELab[j] = - 100000;
														LG_ThetaLab[j] = - 100000;
														LG_Q1[j] = - 100000;
														LG_Q2[j] = - 100000;
														LG_Qmax[j] = - 100000;

												}
										}
								}
						}
				} // if LG && HG*/

		}// if FC = 1
}

////////////////////////////////////////////////////////////////////////////////
void Analysis::InitOutputBranch(){
		// Incoming neutron
		RootOutput::getInstance()->GetTree()->Branch("inToF",&inToF);
		RootOutput::getInstance()->GetTree()->Branch("inEnergy",&inEnergy);
		
		// FissionChamber
		RootOutput::getInstance()->GetTree()->Branch("FC_Q1",&FC_Q1);
		RootOutput::getInstance()->GetTree()->Branch("FC_Q2",&FC_Q2);
		RootOutput::getInstance()->GetTree()->Branch("FC_Qmax",&FC_Qmax);
		RootOutput::getInstance()->GetTree()->Branch("FC_DT",&FC_DT);
		RootOutput::getInstance()->GetTree()->Branch("FC_FakeFission",&FC_FakeFission);
		RootOutput::getInstance()->GetTree()->Branch("FC_Anode_ID",&FC_Anode_ID);

		// LG 
		RootOutput::getInstance()->GetTree()->Branch("LG_ID",&LG_ID);
		RootOutput::getInstance()->GetTree()->Branch("LG_ThetaLab",&LG_ThetaLab);
		RootOutput::getInstance()->GetTree()->Branch("LG_ELab",&LG_ELab);
		RootOutput::getInstance()->GetTree()->Branch("LG_Tof",&LG_Tof);
		RootOutput::getInstance()->GetTree()->Branch("LG_Q1",&LG_Q1);
		RootOutput::getInstance()->GetTree()->Branch("LG_Q2",&LG_Q2);
		RootOutput::getInstance()->GetTree()->Branch("LG_Qmax",&LG_Qmax);

		// HG
		RootOutput::getInstance()->GetTree()->Branch("HG_ID",&HG_ID);
		RootOutput::getInstance()->GetTree()->Branch("HG_ThetaLab",&HG_ThetaLab);
		RootOutput::getInstance()->GetTree()->Branch("HG_ELab",&HG_ELab);
		RootOutput::getInstance()->GetTree()->Branch("HG_Tof",&HG_Tof);
		RootOutput::getInstance()->GetTree()->Branch("HG_Q1",&HG_Q1);
		RootOutput::getInstance()->GetTree()->Branch("HG_Q2",&HG_Q2);
		RootOutput::getInstance()->GetTree()->Branch("HG_Qmax",&HG_Qmax);
}

////////////////////////////////////////////////////////////////////////////////
void Analysis::ReInitValue(){
		inToF.clear();
		inEnergy.clear();

		LG_ThetaLab.clear();
		LG_ELab.clear();
		LG_Tof.clear();
		LG_ID.clear();
		LG_Q1.clear();
		LG_Q2.clear();
		LG_Qmax.clear();

		HG_ThetaLab.clear();
		HG_ELab.clear();
		HG_Tof.clear();
		HG_ID.clear();
		HG_Q1.clear();
		HG_Q2.clear();
		HG_Qmax.clear();

		FC_Q1.clear();
		FC_Q2.clear();
		FC_Qmax.clear();
		FC_DT.clear();
		FC_FakeFission.clear();
		FC_Anode_ID.clear();


}

////////////////////////////////////////////////////////////////////////////////
void Analysis::End(){
}


////////////////////////////////////////////////////////////////////////////////
//            Construct Method to be pass to the DetectorFactory              //
////////////////////////////////////////////////////////////////////////////////
NPL::VAnalysis* Analysis::Construct(){
		return (NPL::VAnalysis*) new Analysis();
}

////////////////////////////////////////////////////////////////////////////////
//            Registering the construct method to the factory                 //
////////////////////////////////////////////////////////////////////////////////
extern "C"{
		class proxy{
				public:
						proxy(){
								NPL::AnalysisFactory::getInstance()->SetConstructor(Analysis::Construct);
						}
		};

		proxy p;
}