BDSIM
BDSIM is a Geant4 extension toolkit for simulation of particle transport in accelerator beamlines.
Loading...
Searching...
No Matches
BDSMultiSensitiveDetectorOrdered.cc
1/*
2Beam Delivery Simulation (BDSIM) Copyright (C) BDSIM Collaboration, 2001 - 2026.
3
4This file is part of BDSIM.
5
6BDSIM is free software: you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published
8by the Free Software Foundation version 3 of the License.
9
10BDSIM is distributed in the hope that it will be useful, but
11WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with BDSIM. If not, see <http://www.gnu.org/licenses/>.
17*/
18#include "BDSMultiSensitiveDetectorOrdered.hh"
19#include "BDSSensitiveDetector.hh"
20
21#include "globals.hh"
22#include "G4VSensitiveDetector.hh"
23
24BDSMultiSensitiveDetectorOrdered::BDSMultiSensitiveDetectorOrdered(const G4String& name):
25 G4VSensitiveDetector(name)
26{;}
27
28BDSMultiSensitiveDetectorOrdered::~BDSMultiSensitiveDetectorOrdered()
29{
30 ClearSDs();
31}
32
33BDSMultiSensitiveDetectorOrdered::BDSMultiSensitiveDetectorOrdered(const BDSMultiSensitiveDetectorOrdered& rhs):
34 G4VSensitiveDetector(rhs),
35 sensitiveDetectors(rhs.sensitiveDetectors)
36{;}
37
39BDSMultiSensitiveDetectorOrdered::operator=(const BDSMultiSensitiveDetectorOrdered& rhs)
40{
41 if (this != &rhs )
42 {
43 G4VSensitiveDetector::operator=(static_cast<const G4VSensitiveDetector&>(rhs));
44 sensitiveDetectors = rhs.sensitiveDetectors;
45 }
46 return *this;
47}
48
49void BDSMultiSensitiveDetectorOrdered::clear()
50{
51 for (auto sd : sensitiveDetectors)
52 {sd->clear();}
53}
54
55void BDSMultiSensitiveDetectorOrdered::DrawAll()
56{
57 for (auto sd : sensitiveDetectors)
58 {sd->DrawAll();}
59}
60
61void BDSMultiSensitiveDetectorOrdered::PrintAll()
62{
63 for (auto sd : sensitiveDetectors)
64 {sd->PrintAll();}
65}
66
67G4bool BDSMultiSensitiveDetectorOrdered::ProcessHits(G4Step* step,
68 G4TouchableHistory* /*row*/)
69{
70 std::vector<G4VHit*> hits;
71 G4bool result = true;
72 for (auto sd : sensitiveDetectors)
73 {
74 // here we don't use Hit() as that calls the default ProcessHits
75 G4bool sdStored = sd->HitOrdered(step, hits);
76 if (sdStored)
77 {hits.push_back(sd->last());}
78 else
79 {hits.push_back(nullptr);} // there was no lastHit as not stored
80 result &= sdStored;
81 }
82 return result;
83}
84
85G4VSensitiveDetector* BDSMultiSensitiveDetectorOrdered::Clone() const
86{
88 for (auto sd : sensitiveDetectors )
89 {
90 G4VSensitiveDetector* newSD = sd->Clone();
91 BDSSensitiveDetector* newSDBDS = dynamic_cast<BDSSensitiveDetector*>(newSD);
92 newInst->AddSD(newSDBDS);
93 }
94 return newInst;
95}
Modified G4MultiSensitiveDetector that retains order and passes hits in sequence.
Virtual class to define interface for ordered multi-sensitive detector.
const char * GetName(int)
Name of element.
Definition parserROOT.cc:37