-
Pierre Morfouace authoredPierre Morfouace authored
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;
}