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 #include <sstream> 29 30 30 #include "G4SDManager.hh" << 31 //#define MSDDEBUG >> 32 #ifdef MSDDEBUG >> 33 #define DBG( msg ) G4cout<<msg<<G4endl >> 34 #else >> 35 #define DBG( msg ) >> 36 #endif >> 37 #define VDBG( vl , msg ) if ( vl<=verboseLevel ) G4cout<<msg<<G4endl 31 38 32 #include <sstream> << 39 G4MultiSensitiveDetector::G4MultiSensitiveDetector(G4String name) >> 40 : G4VSensitiveDetector(name) >> 41 { >> 42 #ifdef MSDDEBUG >> 43 verboseLevel = 3; >> 44 #endif >> 45 VDBG(1,"Creating G4MultiSenstiveDetector with name: "<<name); >> 46 } 33 47 34 void G4MultiSensitiveDetector::Initialize(G4HC << 48 G4MultiSensitiveDetector::~G4MultiSensitiveDetector() 35 { 49 { 36 // SDManager is resposnsible for calling thi << 50 VDBG(2,GetName()<<" : Destructing G4MultiSensitiveDetector"); 37 // are also registered << 51 ClearSDs(); 38 // for ( auto sd : fSensitiveDetectors ) sd- << 52 } >> 53 >> 54 G4MultiSensitiveDetector::G4MultiSensitiveDetector(const G4MultiSensitiveDetector& rhs) >> 55 : G4VSensitiveDetector(rhs) , >> 56 fSensitiveDetectors(rhs.fSensitiveDetectors) >> 57 { >> 58 VDBG(3,GetName()<<" : Copy constructor called."); 39 } 59 } 40 60 41 void G4MultiSensitiveDetector::EndOfEvent(G4HC << 61 G4MultiSensitiveDetector& >> 62 G4MultiSensitiveDetector::operator=(const G4MultiSensitiveDetector& rhs) 42 { 63 { 43 // SDManager is resposnsible for calling thi << 64 if ( this != &rhs ) { >> 65 //G4VSensitiveDetector::operator=(static_cast<const G4VSensitiveDetector&>(rhs)); >> 66 G4VSensitiveDetector::operator=(static_cast<const G4VSensitiveDetector&>(rhs)); >> 67 fSensitiveDetectors = rhs.fSensitiveDetectors; >> 68 } >> 69 return *this; >> 70 } >> 71 >> 72 void >> 73 G4MultiSensitiveDetector::Initialize(G4HCofThisEvent* ) >> 74 { >> 75 //SDManager is resposnsible for calling this since the granular SDs 44 // are also registered 76 // are also registered 45 // for ( auto sd : fSensitiveDetectors ) sd- << 77 //for ( auto sd : fSensitiveDetectors ) sd->Initialize(hcte); 46 } 78 } 47 79 48 void G4MultiSensitiveDetector::clear() << 80 void >> 81 G4MultiSensitiveDetector::EndOfEvent(G4HCofThisEvent* ) 49 { 82 { 50 for (auto sd : fSensitiveDetectors) << 83 //SDManager is resposnsible for calling this since the granular SDs 51 sd->clear(); << 84 // are also registered >> 85 //for ( auto sd : fSensitiveDetectors ) sd->EndOfEvent(hcte); 52 } 86 } 53 87 54 void G4MultiSensitiveDetector::DrawAll() << 88 void >> 89 G4MultiSensitiveDetector::clear() 55 { 90 { 56 for (auto sd : fSensitiveDetectors) << 91 for ( auto sd : fSensitiveDetectors ) sd->clear(); 57 sd->DrawAll(); << 58 } 92 } 59 93 60 void G4MultiSensitiveDetector::PrintAll() << 94 void >> 95 G4MultiSensitiveDetector::DrawAll() 61 { 96 { 62 for (auto sd : fSensitiveDetectors) << 97 for ( auto sd : fSensitiveDetectors ) sd->DrawAll(); 63 sd->PrintAll(); << 64 } 98 } 65 99 66 G4bool G4MultiSensitiveDetector::ProcessHits(G << 100 void >> 101 G4MultiSensitiveDetector::PrintAll() 67 { 102 { 68 G4bool result = true; << 103 for ( auto sd : fSensitiveDetectors ) sd->PrintAll(); 69 for (auto sd : fSensitiveDetectors) << 104 } 70 result &= sd->Hit(aStep); << 105 71 return result; << 106 G4bool >> 107 G4MultiSensitiveDetector::ProcessHits(G4Step*aStep,G4TouchableHistory*) >> 108 { >> 109 VDBG(2,GetName()<<" : Called processHits: "<<aStep<<" with Edep: "<<aStep->GetTotalEnergyDeposit()); >> 110 G4bool result = true; >> 111 for (auto sd : fSensitiveDetectors ) >> 112 result &= sd->Hit(aStep); >> 113 return result; 72 } 114 } 73 115 74 G4int G4MultiSensitiveDetector::GetCollectionI 116 G4int G4MultiSensitiveDetector::GetCollectionID(G4int) 75 { 117 { 76 G4ExceptionDescription msg; << 118 G4ExceptionDescription msg; 77 msg << GetName() << 119 msg << GetName()<<" : This method cannot be called for an instance of type G4MultiSensitiveDetector." 78 << " : This method cannot be called for << 120 << " First retrieve a contained G4VSensitiveDetector with. i.e. GetSD and then " 79 "G4MultiSensitiveDetector." << 121 << " call this method."; 80 << " First retrieve a contained G4VSensi << 122 G4Exception("G4MultiSensitiveDetector::GetCollectionID","Det0011",FatalException,msg); 81 "and then " << 123 return -1; 82 << " call this method."; << 83 G4Exception("G4MultiSensitiveDetector::GetCo << 84 return -1; << 85 } 124 } 86 125 87 // This method requires all contained SD to be << 126 //This method requires all contained SD to be clonable 88 G4VSensitiveDetector* G4MultiSensitiveDetector 127 G4VSensitiveDetector* G4MultiSensitiveDetector::Clone() const 89 { 128 { 90 auto newInst = new G4MultiSensitiveDetector( << 129 VDBG(2,GetName()<<"Cloning an instance of G4MultiSensitiveDetector"); 91 for (auto sd : fSensitiveDetectors) << 130 G4MultiSensitiveDetector* newInst = new G4MultiSensitiveDetector(this->GetName()); 92 newInst->AddSD(sd->Clone()); << 131 for ( auto sd : fSensitiveDetectors ) 93 return newInst; << 132 newInst->AddSD( sd->Clone() ); >> 133 return newInst; 94 } 134 } >> 135 95 136