Skip to content
Snippets Groups Projects
Commit aade0d29 authored by adrien-matta's avatar adrien-matta
Browse files

* Progress on new Example1

parent 2c1b640c
No related branches found
No related tags found
No related merge requests found
#include "Analysis.h"
int main(int argc, char** argv){
// command line parsing
NPOptionManager* myOptionManager = NPOptionManager::getInstance(argc,argv);
// Instantiate RootInput
string runToReadfileName = myOptionManager->GetRunToReadFile();
RootInput:: getInstance("RunToTreat.txt");
TChain* Chain = RootInput:: getInstance()->GetChain();
// if input files are not given, use those from TAsciiFile
if (myOptionManager->IsDefault("DetectorConfiguration")) {
string name = RootInput::getInstance()->DumpAsciiFile("DetectorConfiguration");
myOptionManager->SetDetectorFile(name);
}
// get input files from NPOptionManager
string detectorfileName = myOptionManager->GetDetectorFile();
string OutputfileName = myOptionManager->GetOutputFile();
// Instantiate RootOutput
RootOutput::getInstance("Analysis/"+OutputfileName, "ResultTree");
// RootOutput::getInstance()->GetFile()->SetCompressionLevel(0);
// Instantiate the detector using a file
NPA::DetectorManager* myDetector = new DetectorManager();
myDetector->ReadConfigurationFile(detectorfileName);
// Attach new branch
/*****************************************************************************
* Copyright (C) 2009-2014 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: Adrien MATTA contact address: a.matta@surrey.ac.uk *
* *
* Creation Date : march 2025 *
* Last update : *
*---------------------------------------------------------------------------*
* Decription: *
* Class describing the property of an Analysis object *
* *
*---------------------------------------------------------------------------*
* Comment: *
* *
* *
*****************************************************************************/
#include<iostream>
using namespace std;
#include"Analysis.h"
#include"NPAnalysisFactory.h"
#include"NPDetectorManager.h"
#include"NPOptionManager.h"
#include"RootOutput.h"
#include"RootInput.h"
////////////////////////////////////////////////////////////////////////////////
Analysis::Analysis(){
}
////////////////////////////////////////////////////////////////////////////////
Analysis::~Analysis(){
}
////////////////////////////////////////////////////////////////////////////////
void Analysis::Init(){
M2= (TMust2Physics*) m_DetectorManager->GetDetector("MUST2Array");
SSSD= (TSSSDPhysics*) m_DetectorManager->GetDetector("SSSD");
InitOutputBranch();
InitInputBranch();
Rand = TRandom3();
He10Reaction= new NPL::Reaction();
He10Reaction->ReadConfigurationFile(NPOptionManager::getInstance()->GetReactionFile());
DetectorNumber = 0 ;
ThetaNormalTarget = 0 ;
ThetaM2Surface = 0;
X_M2 = 0 ;
Y_M2 = 0 ;
Z_M2 = 0 ;
Si_E_M2 = 0 ;
CsI_E_M2 = 0 ;
E_SSSD = 0 ;
Energy = 0;
E_M2 = 0;
Si_X_M2 = 0;
Si_Y_M2 = 0;
ZTarget = 0;
TargetThickness = m_DetectorManager->GetTargetThickness();
}
// Instantiate the Reaction
NPL::Reaction* He10Reaction = new Reaction ;
He10Reaction -> ReadConfigurationFile("10He.reaction") ;
////////////////////////////////////////////////////////
// Get pointer to the different detector
TMust2Physics* M2 = (TMust2Physics*) myDetector -> GetDetector("MUST2");
TSSSDPhysics* SSSD = (TSSSDPhysics*) myDetector -> GetDetector("SSSD");
// intermediate variable
TRandom3 Rand = TRandom3();
int DetectorNumber = 0 ;
double ThetaNormalTarget = 0 ;
double ThetaM2Surface = 0;
double X_M2 = 0 ;
double Y_M2 = 0 ;
double Z_M2 = 0 ;
double Si_E_M2 = 0 ;
double CsI_E_M2 = 0 ;
double E_SSSD = 0 ;
double Energy = 0;
double E_M2 = 0;
double Si_X_M2 = 0;
double Si_Y_M2 = 0;
double ZTarget = 0;
double TargetThickness = 18*micrometer;
// Get number of events to treat
cout << endl << "///////// Starting Analysis ///////// "<< endl;
int nentries = Chain->GetEntries();
cout << " Number of Event to be treated : " << nentries << endl;
clock_t begin = clock();
clock_t end = begin;
cout.precision(5);
//////////////////////////////////////////////////////////////////////////////
// main loop on entries //
for (int i = 0 ; i < nentries; i++) {
if (i%10000 == 0 && i!=0) {
end = clock();
long double TimeElapsed = (long double) (end-begin) / CLOCKS_PER_SEC;
double percent = (double)i/nentries;
double TimeToWait = (TimeElapsed/percent) - TimeElapsed;
cout << " "<< flush;
cout << "\r Progression:"
<< percent*100 << " % \t | \t Remaining time : ~"
<< TimeToWait <<"s | Analysis Rate : "
<< (double) i/TimeElapsed << flush;
}
else if (i == nentries-1) cout << "\r Progression:" << " 100% " <<endl;
// Get the raw Data
Chain -> GetEntry(i);
// Clear previous Event
myDetector->ClearEventPhysics();
// Build the current event
myDetector->BuildPhysicalEvent();
////////////////////////////////////////////////////////////////////////////////
void Analysis::TreatEvent(){
// Reinitiate calculated variable
ReInitValue();
......@@ -94,12 +70,12 @@ int main(int argc, char** argv){
// This is because the beam diagnosis are not simulated
// PPAC position resolution on target is assumed to be 1mm
double XTarget = Rand.Gaus(Init->GetIncidentPositionX(),1);
double YTarget = Rand.Gaus(Init->GetIncidentPositionY(),1);
TVector3 BeamDirection = Init->GetBeamDirection();
double XTarget = Rand.Gaus(Initial->GetIncidentPositionX(),1);
double YTarget = Rand.Gaus(Initial->GetIncidentPositionY(),1);
TVector3 BeamDirection = Initial->GetBeamDirection();
// Beam energy is measured using F3 and F2 plastic TOF
double BeamEnergy = Rand.Gaus(Init->GetIncidentInitialKineticEnergy(),4.5);
double BeamEnergy = Rand.Gaus(Initial->GetIncidentInitialKineticEnergy(),4.5);
BeamEnergy = Li11CD2.Slow(BeamEnergy,TargetThickness/2.,0);
He10Reaction->SetBeamEnergy(BeamEnergy);
......@@ -190,22 +166,14 @@ int main(int argc, char** argv){
}
} //end loop SSSD
}//end loop MUST2
}
if(ELab>0)
RootOutput::getInstance()->GetTree()->Fill();
}// loop over events
cout << "A total of " << nentries << " event has been annalysed " << endl ;
RootOutput::getInstance()->Destroy();
RootInput::getInstance()->Destroy();
NPOptionManager::getInstance()->Destroy();
/////////////////////////////////////////////////////////////////////////////
return 0 ;
////////////////////////////////////////////////////////////////////////////////
void Analysis::End(){
}
////////////////////////////////////////////////////////////////////////////////
void InitOutputBranch() {
void Analysis::InitOutputBranch() {
RootOutput::getInstance()->GetTree()->Branch("Ex",&Ex,"Ex/D");
RootOutput::getInstance()->GetTree()->Branch("ELab",&ELab,"ELab/D");
RootOutput::getInstance()->GetTree()->Branch("ThetaLab",&ThetaLab,"ThetaLab/D");
......@@ -213,18 +181,38 @@ void InitOutputBranch() {
}
////////////////////////////////////////////////////////////////////////////////
void InitInputBranch(){
RootInput:: getInstance()->GetChain()->SetBranchAddress("InitialConditions",&Init );
void Analysis::InitInputBranch(){
RootInput:: getInstance()->GetChain()->SetBranchAddress("InitialConditions",&Initial);
RootInput:: getInstance()->GetChain()->SetBranchStatus("InitialConditions",true );
RootInput:: getInstance()->GetChain()->SetBranchStatus("fIC_*",true );
}
////////////////////////////////////////////////////////////////////////////////
void ReInitValue(){
void Analysis::ReInitValue(){
Ex = -1000 ;
ELab = -1000;
ThetaLab = -1000;
ThetaCM = -1000;
}
////////////////////////////////////////////////////////////////////////////////
// Construct Method to be pass to the DetectorFactory //
////////////////////////////////////////////////////////////////////////////////
NPA::VAnalysis* Analysis::Construct(){
return (NPA::VAnalysis*) new Analysis();
}
////////////////////////////////////////////////////////////////////////////////
// Registering the construct method to the factory //
////////////////////////////////////////////////////////////////////////////////
extern "C"{
class proxy{
public:
proxy(){
NPA::AnalysisFactory::getInstance()->SetConstructor(Analysis::Construct);
}
};
proxy p;
}
// You can use this file to declare your spectra, file, energy loss , ... and whatever you want.
// This way you can remove all unnecessary declaration in the main programm.
// In order to help debugging and organizing we use Name Space.
#ifndef Analysis_h
#define Analysis_h
/*****************************************************************************
* Copyright (C) 2009-2014 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 *
*****************************************************************************/
/////////////////////////////////////////////////////////////////////////////////////////////////
// -------------------------------------- VARIOUS INCLUDE ---------------------------------------
// NPL
#include "DetectorManager.h"
#include "NPOptionManager.h"
#include "NPReaction.h"
#include "RootInput.h"
#include "RootOutput.h"
/*****************************************************************************
* Original Author: Adrien MATTA contact address: a.matta@surrey.ac.uk *
* *
* Creation Date : march 2025 *
* Last update : *
*---------------------------------------------------------------------------*
* Decription: *
* Class describing the property of an Analysis object *
* *
*---------------------------------------------------------------------------*
* Comment: *
* *
* *
*****************************************************************************/
#include"NPVAnalysis.h"
#include"TAnnularS1Physics.h"
#include "TMust2Physics.h"
#include "TSSSDPhysics.h"
#include "TInitialConditions.h"
#include "NPEnergyLoss.h"
using namespace NPL ;
// STL C++
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cmath>
#include <cstdlib>
using namespace std;
// ROOT
#include <TROOT.h>
#include <TChain.h>
#include <TFile.h>
#include <TVector3.h>
#include <TRandom3.h>
#include <TMath.h>
#include <TObject.h>
#include "NPReaction.h"
#include "TRandom3.h"
class Analysis: public NPA::VAnalysis{
public:
Analysis();
~Analysis();
public:
void Init();
void TreatEvent();
void End();
void InitOutputBranch();
void InitInputBranch();
void ReInitValue();
static NPA::VAnalysis* Construct();
// ----------------------------------------------------------------------------------------------
void InitOutputBranch() ;
void InitInputBranch() ;
void ReInitValue() ;
/////////////////////////////////////////////////////////////////////////////////////////////////
// ----------------------------------- DOUBLE, INT, BOOL AND MORE -------------------------------
namespace VARIABLE{
double Ex;
double ELab;
double ThetaLab;
double ThetaCM;
TInitialConditions* Init = new TInitialConditions();
}
private:
double Ex;
double ELab;
double ThetaLab;
double ThetaCM;
NPL::Reaction* He10Reaction;
using namespace VARIABLE ;
// ----------------------------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////////////////////////
// -----------------------------------ENERGY LOSS----------------------------------------------
namespace ENERGYLOSS{
// Energy loss table: the G4Table are generated by the simulation
EnergyLoss He3CD2 = EnergyLoss("He3_CD2.G4table","G4Table",100 );
EnergyLoss He3Al = EnergyLoss("He3_Al.G4table","G4Table",10);
EnergyLoss He3Si = EnergyLoss("He3_Si.G4table","G4Table",10);
EnergyLoss Li11CD2 = EnergyLoss("Li11[0.0]_CD2.G4table","G4Table",100);
}
// intermediate variable
TRandom3 Rand;
int DetectorNumber;
double ThetaNormalTarget;
double ThetaM2Surface;
double X_M2;
double Y_M2;
double Z_M2;
double Si_E_M2;
double CsI_E_M2;
double E_SSSD;
double Energy = 0;
double E_M2 = 0;
double Si_X_M2 = 0;
double Si_Y_M2 = 0;
double ZTarget = 0;
double TargetThickness;
using namespace ENERGYLOSS ;
// ----------------------------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////////////////////////
NPL::EnergyLoss He3CD2 ;
NPL::EnergyLoss He3Al ;
NPL::EnergyLoss He3Si ;
NPL::EnergyLoss Li11CD2 ;
TMust2Physics* M2;
TSSSDPhysics* SSSD;
TInitialConditions* Initial;
};
#endif
cmake_minimum_required (VERSION 2.8)
#Finding NPTool
set(NPTOOL "$ENV{NPTOOL}")
set(NPLIB "${NPTOOL}/NPLib")
set(NPTOOL_INCLUDE_DIR "${NPLIB}/include")
set(NPTOOL_LIB_DIR "${NPLIB}/lib")
include("${NPLIB}/FindROOT.cmake")
project (NPAnalysis)
set(CMAKE_BUILD_TYPE Release)
# Add root to the link and include directories
include_directories( ${ROOT_INCLUDE_DIR})
link_directories( ${ROOT_LIBRARY_DIR})
include_directories( ${NPTOOL_INCLUDE_DIR})
link_directories( ${NPTOOL_LIB_DIR})
# Get the compilator flag from root to assure consistancy
EXEC_PROGRAM(${ROOT_CONFIG_EXECUTABLE}
ARGS "--cflags"
OUTPUT_VARIABLE root_cflags )
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${root_cflags}")
# If the compiler is Clang, silence the unrecognised flags
if(${CMAKE_CXX_COMPILER_ID} MATCHES ".*Clang.*")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Qunused-arguments -undefined dynamic_lookup")
endif()
add_library(NPAnalysis SHARED Analysis.cxx)
target_link_libraries(NPAnalysis ${ROOT_LIBRARIES} -L${NPLIB}/lib -lNPCore -lNPPhysics -lNPInitialConditions -lNPInteractionCoordinates)
# include same architecture file than for NPLib
# so that consistency is ensured
include $(NPLIB)/Makefile.arch
# additional libraries
LIBRARY = `$(NPLIB)/liblist`
LIBRARY += -L$(CLHEP_LIB_DIR) -l$(CLHEP_LIB)
PROGRAMS = NPAnalysis
all: $(PROGRAMS)
NPAnalysis: Analysis.o
$(LD) $(LDFLAGS) $^ $(LIBS) $(LIBRARY) $(OutPutOpt) $@
@echo "$@ done"
# rule for creating .o from .cxx
.SUFFIXES: .$(SrcSuf)
.$(SrcSuf).$(ObjSuf):
$(CXX) $(CXXFLAGS) $(INCLUDE) -c $<
# some cleaning
clean:
rm -rf *.o
distclean:
make clean; rm $(PROGRAMS)
# dependences
Analysis.o: Analysis.cxx Analysis.h
......@@ -46,8 +46,8 @@ class Analysis: public NPA::VAnalysis{
void InitOutputBranch();
void InitInputBranch();
void ReInitValue();
static NPA::VAnalysis* Construct();
static NPA::VAnalysis* Construct();
private:
double Ex;
double ELab;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment