/* This file is part of MAUS: http://micewww.pp.rl.ac.uk/projects/maus * * MAUS is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * MAUS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MAUS. If not, see . * */ #ifndef _SRC_COMMON_CPP_SIMULATION_MAUSEVENTACTION_HH_ #define _SRC_COMMON_CPP_SIMULATION_MAUSEVENTACTION_HH_ #include #include "Geant4/G4UserEventAction.hh" class MICEDetectorConstruction; namespace MAUS { class MAUSGeant4Manager; class VirtualPlaneManager; class MAUSTrackingAction; class MAUSSteppingAction; class MCEvent; namespace Simulation { class DetectorConstruction; } /** @class MAUSEventAction * * @brief Holds the event buffer for the spill and updates after each event. * * MAUSEventAction is responsible for maintaining the event buffer for the * spill. Several objects hold data buffer for each event. VirtualPlaneManager * holds a buffer of virtual plane hits, tracking holds a buffer of tracks (and * steps), MICEDetectorConstruction holds a buffer of sensitive detector hits. * * At the beginning of every event, MAUSEventAction clears each of these * buffers ready for tracking. At the end of every event, MAUSEventAction gets * data from each of these objects and then clears their buffers ready for the * next event. */ class MAUSEventAction : public G4UserEventAction { public: /** Constructor - Initialises everything to 0 */ MAUSEventAction(); /** Nothing to do as I don't allocate memory */ ~MAUSEventAction() {} /** @brief Clear per-event buffers ready for the new event. * * (I do the clear here so that any other folks who want access to this * data are still able to get it). */ void BeginOfEventAction(const G4Event *anEvent); /** @brief Move per-event buffers into the _events vector. * * Increment the _primary array so that we now point at the next item in * _events. */ void EndOfEventAction(const G4Event *anEvent); /** Set event buffer, set _primary counter to 0 and reassign pointers * @param events: vector of events in the spill. Will append * hits, virtual_hits, tracks to each event after * geant4 is done tracking. MAUSEventAction takes ownership * of this memory. * Also refreshes pointers to objects holding per-event buffers from the * geant4 manager. We support dynamic reallocation of these pointers (even * if geant4 doesnt in some instances). This means, for example, one can * dynamically change the VirtualPlane setup per spill (e.g. to run * reference particles). */ void SetEvents(std::vector* events); /** Returns the event buffer; MAUSEventAction still owns this memory */ std::vector* GetEvents() {return _events;} /** Returns the event buffer; caller owns returned memory */ std::vector* TakeEvents(); private: std::vector* _events; unsigned int _primary; // All borrowed references owned by _g4manager (don't delete!) MAUSGeant4Manager* _g4manager; VirtualPlaneManager* _virtPlanes; MAUSTrackingAction* _tracking; MAUSSteppingAction* _stepping; Simulation::DetectorConstruction* _geometry; }; } #endif