ATLAS Offline Software
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 
19 namespace G4UA
20 {
21 
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 
72  void StepNtuple::BeginOfRunAction(const G4Run*)
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
G4UA::StepNtuple::stepdata
simple struct to hold step information
Definition: StepNtuple.h:27
G4UA
for nSW
Definition: CalibrationDefaultProcessing.h:19
G4UA::StepNtuple::UserSteppingAction
virtual void UserSteppingAction(const G4Step *) override
Definition: StepNtuple.cxx:53
ServiceAccessor.h
G4UA::StepNtuple::BeginOfEventAction
virtual void BeginOfEventAction(const G4Event *) override
the hooks for G4 UA handling
Definition: StepNtuple.cxx:29
G4UA::StepNtuple::BeginOfRunAction
virtual void BeginOfRunAction(const G4Run *) override
Definition: StepNtuple.cxx:72
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
G4UA::StepNtuple::m_step_y
NTuple::Array< float > m_step_y
Definition: StepNtuple.h:50
G4UA::StepNtuple::stepdata::dep
float dep
Definition: StepNtuple.h:28
AthMessaging::setLevel
void setLevel(MSG::Level lvl)
Change the current logging level.
Definition: AthMessaging.cxx:28
G4UA::StepNtuple::m_step_x
NTuple::Array< float > m_step_x
Definition: StepNtuple.h:49
TrigConf::MSGTC::Level
Level
Definition: Trigger/TrigConfiguration/TrigConfBase/TrigConfBase/MsgStream.h:21
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
AthMessaging
Class to provide easy MsgStream access and capabilities.
Definition: AthMessaging.h:55
G4UA::StepNtuple::StepNtuple
StepNtuple(const MSG::Level lvl=MSG::INFO)
Constructor with message level argument for AthMessaging.
Definition: StepNtuple.cxx:22
G4UA::StepNtuple::EndOfEventAction
virtual void EndOfEventAction(const G4Event *) override
Definition: StepNtuple.cxx:34
G4UA::StepNtuple::m_dep
NTuple::Array< float > m_dep
Definition: StepNtuple.h:53
G4UA::StepNtuple::m_step_z
NTuple::Array< float > m_step_z
Definition: StepNtuple.h:51
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
G4UA::StepNtuple::m_time
NTuple::Array< float > m_time
Definition: StepNtuple.h:52
StepNtuple.h
G4UA::StepNtuple::eventSteps
std::vector< stepdata > eventSteps
holds data extracted from steps
Definition: StepNtuple.h:44
Gaudi
=============================================================================
Definition: CaloGPUClusterAndCellDataMonitorOptions.h:273
beamspotnt.nt
def nt
Definition: bin/beamspotnt.py:1063
ntupleSvc
INTupleSvc * ntupleSvc()
Definition: ServiceAccessor.h:14
G4UA::StepNtuple::m_nsteps
NTuple::Item< long > m_nsteps
handles for ntuple writing
Definition: StepNtuple.h:47
G4UA::StepNtuple::m_pdgcode
NTuple::Array< float > m_pdgcode
Definition: StepNtuple.h:48
fitman.k
k
Definition: fitman.py:528