Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // G4MultiSensitiveDetector 26 // G4MultiSensitiveDetector 27 27 28 #include "G4MultiSensitiveDetector.hh" 28 #include "G4MultiSensitiveDetector.hh" 29 << 30 #include "G4SDManager.hh" 29 #include "G4SDManager.hh" 31 << 32 #include <sstream> 30 #include <sstream> 33 31 34 void G4MultiSensitiveDetector::Initialize(G4HC << 32 //#define MSDDEBUG >> 33 #ifdef MSDDEBUG >> 34 #define DBG( msg ) G4cout<<msg<<G4endl >> 35 #else >> 36 #define DBG( msg ) >> 37 #endif >> 38 #define VDBG( vl , msg ) if ( vl<=verboseLevel ) G4cout<<msg<<G4endl >> 39 >> 40 G4MultiSensitiveDetector::G4MultiSensitiveDetector(G4String name) >> 41 : G4VSensitiveDetector(name) 35 { 42 { 36 // SDManager is resposnsible for calling thi << 43 #ifdef MSDDEBUG 37 // are also registered << 44 verboseLevel = 3; 38 // for ( auto sd : fSensitiveDetectors ) sd- << 45 #endif >> 46 VDBG(1,"Creating G4MultiSenstiveDetector with name: "<<name); >> 47 } >> 48 >> 49 G4MultiSensitiveDetector::~G4MultiSensitiveDetector() >> 50 { >> 51 VDBG(2,GetName()<<" : Destructing G4MultiSensitiveDetector"); >> 52 ClearSDs(); >> 53 } >> 54 >> 55 G4MultiSensitiveDetector::G4MultiSensitiveDetector(const G4MultiSensitiveDetector& rhs) >> 56 : G4VSensitiveDetector(rhs) , >> 57 fSensitiveDetectors(rhs.fSensitiveDetectors) >> 58 { >> 59 VDBG(3,GetName()<<" : Copy constructor called."); >> 60 } >> 61 >> 62 G4MultiSensitiveDetector& >> 63 G4MultiSensitiveDetector::operator=(const G4MultiSensitiveDetector& rhs) >> 64 { >> 65 if ( this != &rhs ) { >> 66 //G4VSensitiveDetector::operator=(static_cast<const G4VSensitiveDetector&>(rhs)); >> 67 G4VSensitiveDetector::operator=(static_cast<const G4VSensitiveDetector&>(rhs)); >> 68 fSensitiveDetectors = rhs.fSensitiveDetectors; >> 69 } >> 70 return *this; 39 } 71 } 40 72 41 void G4MultiSensitiveDetector::EndOfEvent(G4HC << 73 void >> 74 G4MultiSensitiveDetector::Initialize(G4HCofThisEvent* ) 42 { 75 { 43 // SDManager is resposnsible for calling thi << 76 //SDManager is resposnsible for calling this since the granular SDs 44 // are also registered 77 // are also registered 45 // for ( auto sd : fSensitiveDetectors ) sd- << 78 //for ( auto sd : fSensitiveDetectors ) sd->Initialize(hcte); >> 79 } >> 80 >> 81 void >> 82 G4MultiSensitiveDetector::EndOfEvent(G4HCofThisEvent* ) >> 83 { >> 84 //SDManager is resposnsible for calling this since the granular SDs >> 85 // are also registered >> 86 //for ( auto sd : fSensitiveDetectors ) sd->EndOfEvent(hcte); 46 } 87 } 47 88 48 void G4MultiSensitiveDetector::clear() << 89 void >> 90 G4MultiSensitiveDetector::clear() 49 { 91 { 50 for (auto sd : fSensitiveDetectors) << 92 for ( auto sd : fSensitiveDetectors ) sd->clear(); 51 sd->clear(); << 52 } 93 } 53 94 54 void G4MultiSensitiveDetector::DrawAll() << 95 void >> 96 G4MultiSensitiveDetector::DrawAll() 55 { 97 { 56 for (auto sd : fSensitiveDetectors) << 98 for ( auto sd : fSensitiveDetectors ) sd->DrawAll(); 57 sd->DrawAll(); << 58 } 99 } 59 100 60 void G4MultiSensitiveDetector::PrintAll() << 101 void >> 102 G4MultiSensitiveDetector::PrintAll() 61 { 103 { 62 for (auto sd : fSensitiveDetectors) << 104 for ( auto sd : fSensitiveDetectors ) sd->PrintAll(); 63 sd->PrintAll(); << 64 } 105 } 65 106 66 G4bool G4MultiSensitiveDetector::ProcessHits(G << 107 G4bool >> 108 G4MultiSensitiveDetector::ProcessHits(G4Step*aStep,G4TouchableHistory*) 67 { 109 { 68 G4bool result = true; << 110 VDBG(2,GetName()<<" : Called processHits: "<<aStep<<" with Edep: "<<aStep->GetTotalEnergyDeposit()); 69 for (auto sd : fSensitiveDetectors) << 111 G4bool result = true; 70 result &= sd->Hit(aStep); << 112 for (auto sd : fSensitiveDetectors ) 71 return result; << 113 result &= sd->Hit(aStep); >> 114 return result; 72 } 115 } 73 116 74 G4int G4MultiSensitiveDetector::GetCollectionI 117 G4int G4MultiSensitiveDetector::GetCollectionID(G4int) 75 { 118 { 76 G4ExceptionDescription msg; << 119 G4ExceptionDescription msg; 77 msg << GetName() << 120 msg << GetName()<<" : This method cannot be called for an instance of type G4MultiSensitiveDetector." 78 << " : This method cannot be called for << 121 << " First retrieve a contained G4VSensitiveDetector with. i.e. GetSD and then " 79 "G4MultiSensitiveDetector." << 122 << " call this method."; 80 << " First retrieve a contained G4VSensi << 123 G4Exception("G4MultiSensitiveDetector::GetCollectionID","Det0011",FatalException,msg); 81 "and then " << 124 return -1; 82 << " call this method."; << 83 G4Exception("G4MultiSensitiveDetector::GetCo << 84 return -1; << 85 } 125 } 86 126 87 // This method requires all contained SD to be << 127 //This method requires all contained SD to be clonable 88 G4VSensitiveDetector* G4MultiSensitiveDetector 128 G4VSensitiveDetector* G4MultiSensitiveDetector::Clone() const 89 { 129 { 90 auto newInst = new G4MultiSensitiveDetector( << 130 VDBG(2,GetName()<<"Cloning an instance of G4MultiSensitiveDetector"); 91 for (auto sd : fSensitiveDetectors) << 131 G4MultiSensitiveDetector* newInst = new G4MultiSensitiveDetector(this->GetName()); 92 newInst->AddSD(sd->Clone()); << 132 for ( auto sd : fSensitiveDetectors ) 93 return newInst; << 133 newInst->AddSD( sd->Clone() ); >> 134 return newInst; 94 } 135 } 95 136