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