Skip to content

Commit

Permalink
ROOT output exec is now converted into a simple output module definin…
Browse files Browse the repository at this point in the history
…g the TTrees
  • Loading branch information
forthommel committed Jul 15, 2019
1 parent ff10565 commit e467dcf
Show file tree
Hide file tree
Showing 6 changed files with 118 additions and 121 deletions.
10 changes: 10 additions & 0 deletions CepGen/CMakeLists.txt
Expand Up @@ -93,6 +93,16 @@ if(HEPMC_LIB)
include_directories(${HEPMC_INCLUDE})
endif()

#--- linking with ROOT

if(ROOT_FOUND)
message(STATUS "ROOT found in ${ROOT_LIBRARY_DIR}")
list(APPEND addons_libraries ${ROOT_LIBRARIES})
list(APPEND io_sources "IO/ROOTTreeHandler.cpp")
include_directories(${ROOT_INCLUDE_DIRS})
link_directories(${ROOT_LIBRARY_DIR})
endif()

#----- build the objects

add_library(CepGenCore SHARED ${core_sources} ${phys_sources} ${sf_sources})
Expand Down
103 changes: 103 additions & 0 deletions CepGen/IO/ROOTTreeHandler.cpp
@@ -0,0 +1,103 @@
#include "CepGen/IO/ExportHandler.h"
#include "CepGen/IO/ROOTTreeInfo.h"

#include "CepGen/Core/Exception.h"
#include "CepGen/Core/ParametersList.h"

#include "CepGen/Event/Event.h"
#include "CepGen/Parameters.h"

// ROOT includes
#include "TFile.h"

#include <sstream>

namespace cepgen
{
namespace io
{
/**
* Handler for the storage of events in a ROOT format
* \author Laurent Forthomme <laurent.forthomme@cern.ch>
* \date 27 Jan 2014
*/
class ROOTTreeHandler : public GenericExportHandler
{
public:
/// Class constructor
explicit ROOTTreeHandler( const ParametersList& );
~ROOTTreeHandler();

void initialise( const Parameters& ) override;
/// Writer operator
void operator<<( const Event& ) override;
void setCrossSection( double, double ) override;

private:
std::unique_ptr<TFile> file_;
std::unique_ptr<ROOT::CepGenRun> run_tree_;
std::unique_ptr<ROOT::CepGenEvent> evt_tree_;
};

ROOTTreeHandler::ROOTTreeHandler( const ParametersList& params ) :
GenericExportHandler( "root" ),
file_( TFile::Open( params.get<std::string>( "filename", "output.root" ).c_str(), "recreate" ) ),
run_tree_( new ROOT::CepGenRun ), evt_tree_( new ROOT::CepGenEvent )
{
if ( !file_->IsOpen() )
throw CG_FATAL( "ROOTTreeHandler" ) << "Failed to create the output file!";
run_tree_->create();
evt_tree_->create();
}

ROOTTreeHandler::~ROOTTreeHandler()
{
run_tree_->fill();
file_->Write();
}

void
ROOTTreeHandler::initialise( const Parameters& params )
{
run_tree_->litigious_events = 0;
run_tree_->sqrt_s = params.kinematics.sqrtS();
}

void
ROOTTreeHandler::operator<<( const Event& ev )
{
evt_tree_->gen_time = ev.time_generation;
evt_tree_->tot_time = ev.time_total;
evt_tree_->np = 0;
for ( const auto& p : ev.particles() ) {
const cepgen::Particle::Momentum m = p.momentum();
evt_tree_->rapidity[evt_tree_->np] = m.rapidity();
evt_tree_->pt[evt_tree_->np] = m.pt();
evt_tree_->eta[evt_tree_->np] = m.eta();
evt_tree_->phi[evt_tree_->np] = m.phi();
evt_tree_->E[evt_tree_->np] = p.energy();
evt_tree_->m[evt_tree_->np] = p.mass();
evt_tree_->pdg_id[evt_tree_->np] = p.integerPdgId();
evt_tree_->parent1[evt_tree_->np] = ( p.mothers().size() > 0 ) ? *p.mothers().begin() : -1;
evt_tree_->parent2[evt_tree_->np] = ( p.mothers().size() > 1 ) ? *p.mothers().rbegin() : -1;
evt_tree_->status[evt_tree_->np] = (int)p.status();
evt_tree_->stable[evt_tree_->np] = ( (short)p.status() > 0 );
evt_tree_->charge[evt_tree_->np] = p.charge();
evt_tree_->role[evt_tree_->np] = p.role();

evt_tree_->np++;
}
run_tree_->num_events += 1;
evt_tree_->fill();
}

void
ROOTTreeHandler::setCrossSection( double xsect, double xsect_err )
{
run_tree_->xsect = xsect;
run_tree_->errxsect = xsect_err;
}
}
}

REGISTER_IO_MODULE( root, ROOTTreeHandler )
7 changes: 3 additions & 4 deletions test/TreeInfo.h → CepGen/IO/ROOTTreeInfo.h
@@ -1,13 +1,12 @@
#ifndef Test_TreeInfo_h
#define Test_TreeInfo_h
#ifndef CepGen_IO_ROOTTreeInfo_h
#define CepGen_IO_ROOTTreeInfo_h

#include "TFile.h"
#include "TTree.h"
#include "Math/Vector3D.h"
#include "Math/Vector4D.h"

#include <exception>
#include <string>
#include <iostream>

namespace ROOT
{
Expand Down
2 changes: 2 additions & 0 deletions cmake/UseEnvironment.cmake
Expand Up @@ -56,6 +56,8 @@ find_library(PYTHIA6DUMMY pythia6_dummy HINTS ${PYTHIA6_DIRS} PATH_SUFFIXES lib)
set(PYTHIA8_DIRS $ENV{PYTHIA8_DIR} ${PYTHIA8_DIR} /usr /usr/local /opt/pythia8)
find_library(PYTHIA8 pythia8 HINTS ${PYTHIA8_DIRS} PATH_SUFFIXES lib)
find_path(PYTHIA8_INCLUDE Pythia8 HINTS ${PYTHIA8_DIRS} PATH_SUFFIXES include include/Pythia8 include/pythia8)
#--- searching for ROOT
find_package(ROOT QUIET)

message(STATUS "GSL found in ${GSL_LIB}")
list(APPEND CEPGEN_EXTERNAL_CORE_REQS ${GSL_LIB} ${GSL_CBLAS_LIB})
Expand Down
1 change: 0 additions & 1 deletion test/CMakeLists.txt
Expand Up @@ -28,7 +28,6 @@ endforeach()

#----- specify the tests requiring ROOT

find_package(ROOT QUIET)
if(ROOT_FOUND)
include_directories(${ROOT_INCLUDE_DIRS})
link_directories(${ROOT_LIBRARY_DIR})
Expand Down
116 changes: 0 additions & 116 deletions test/cepgen-root.cxx

This file was deleted.

0 comments on commit e467dcf

Please sign in to comment.