ATLAS Offline Software
Loading...
Searching...
No Matches
StepNtuple.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "StepNtuple.h"
6
7#include "GaudiKernel/IDataProviderSvc.h"
8#include "GaudiKernel/INTupleSvc.h"
9#include "GaudiKernel/NTuple.h"
10#include "GaudiKernel/SmartDataPtr.h"
12
13#include "G4Step.hh"
14
15#include "GaudiKernel/Bootstrap.h"
16#include "GaudiKernel/ISvcLocator.h"
17#include "GaudiKernel/IMessageSvc.h"
18
19namespace G4UA
20{
21
22 StepNtuple::StepNtuple(const MSG::Level lvl)
23 : AthMessaging(Gaudi::svcLocator()->service< IMessageSvc >( "MessageSvc" ),
24 "StepNtuple")
25 {
27 }
28
29 void StepNtuple::BeginOfEventAction(const G4Event*)
30 {
31 eventSteps.clear();
32 }
33
34 void StepNtuple::EndOfEventAction(const G4Event*)
35 {
36 ATH_MSG_DEBUG("Start end of event; size is " << eventSteps.size());
37 m_nsteps = eventSteps.size();
38
39 for(unsigned int k=0; k<eventSteps.size(); k++){
40 m_pdgcode[k] = eventSteps[k].code;
41 m_step_x[k] = eventSteps[k].x;
42 m_step_y[k] = eventSteps[k].y;
43 m_step_z[k] = eventSteps[k].z;
44 m_time[k] = eventSteps[k].time;
45 m_dep[k] = eventSteps[k].dep;
46 }
47
48 if(! ntupleSvc()->writeRecord("/NTUPLES/FILE1/StepNtuple/10").isSuccess()){
49 ATH_MSG_ERROR( " failed to write record for this event" );
50 }
51 }
52
53 void StepNtuple::UserSteppingAction(const G4Step* aStep)
54 {
55 if(eventSteps.size()<49000){
56
57 stepdata theInfo{};
58
59 theInfo.dep=aStep->GetTotalEnergyDeposit();
60 theInfo.time=aStep->GetPreStepPoint()->GetGlobalTime();
61 theInfo.code=aStep->GetTrack()->GetDefinition()->GetPDGEncoding();
62 G4ThreeVector pos=aStep->GetPreStepPoint()->GetPosition();
63 theInfo.x=pos.x();
64 theInfo.y=pos.y();
65 theInfo.z=pos.z();
66
67 eventSteps.push_back(theInfo);
68 ATH_MSG_VERBOSE("Stepping; size is " << eventSteps.size());
69 }
70 }
71
73 {
74 NTupleFilePtr file1(ntupleSvc(), "/NTUPLES/FILE1");
75
76 SmartDataPtr<NTuple::Directory>
77 ntdir(ntupleSvc(),"/NTUPLES/FILE1/StepNtuple");
78 if ( !ntdir ) {
79 // otherwise create the directory
80 ntdir = ntupleSvc()->createDirectory(file1,"StepNtuple");
81 }
82 if ( ! ntdir ) {
83 ATH_MSG_ERROR( " failed to get ntuple directory" );
84 }
85
86 NTuplePtr nt(ntupleSvc(), "/NTUPLES/FILE1/StepNtuple/10");
87
88 // Check if already booked
89 if ( !nt ) {
90 nt = ntupleSvc()->book( ntdir.ptr(), 10, CLID_ColumnWiseTuple, "G4 Step Ntuple" );
91
92 if ( nt ) {
93 ATH_MSG_DEBUG( "booked ntuple " );
94
95 // WARNING!! Force limit to 50k tracks
96 if( nt->addItem ("NSteps", m_nsteps,0, 50000).isFailure() ||
97 nt->addItem ("PCode", m_nsteps, m_pdgcode ).isFailure() ||
98 nt->addItem ("step_x", m_nsteps, m_step_x).isFailure() ||
99 nt->addItem ("step_y", m_nsteps, m_step_y).isFailure() ||
100 nt->addItem ("step_z", m_nsteps, m_step_z).isFailure() ||
101 nt->addItem ("dep", m_nsteps, m_dep).isFailure() ||
102 nt->addItem ("time", m_nsteps, m_time).isFailure() ) {
103 ATH_MSG_ERROR( "Could not book ntuple!! " );
104 }
105 }
106 }
107 }
108
109} // namespace G4UA
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
INTupleSvc * ntupleSvc()
void setLevel(MSG::Level lvl)
Change the current logging level.
AthMessaging(IMessageSvc *msgSvc, const std::string &name)
Constructor.
virtual void EndOfEventAction(const G4Event *) override
NTuple::Array< float > m_pdgcode
Definition StepNtuple.h:48
virtual void BeginOfRunAction(const G4Run *) override
virtual void BeginOfEventAction(const G4Event *) override
the hooks for G4 UA handling
std::vector< stepdata > eventSteps
holds data extracted from steps
Definition StepNtuple.h:44
NTuple::Array< float > m_step_y
Definition StepNtuple.h:50
virtual void UserSteppingAction(const G4Step *) override
NTuple::Item< long > m_nsteps
handles for ntuple writing
Definition StepNtuple.h:47
NTuple::Array< float > m_time
Definition StepNtuple.h:52
NTuple::Array< float > m_step_x
Definition StepNtuple.h:49
NTuple::Array< float > m_step_z
Definition StepNtuple.h:51
NTuple::Array< float > m_dep
Definition StepNtuple.h:53
StepNtuple(const MSG::Level lvl=MSG::INFO)
Constructor with message level argument for AthMessaging.
=============================================================================
simple struct to hold step information
Definition StepNtuple.h:27