Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // 27 // 28 29 #include "G4SDManager.hh" 30 31 #include "G4HCofThisEvent.hh" 32 #include "G4SDmessenger.hh" 33 #include "G4VHitsCollection.hh" 34 #include "G4VSensitiveDetector.hh" 35 #include "G4ios.hh" 36 37 G4ThreadLocal G4SDManager* G4SDManager::fSDMan 38 39 G4SDManager* G4SDManager::GetSDMpointer() 40 { 41 if (fSDManager == nullptr) { 42 fSDManager = new G4SDManager; 43 } 44 return fSDManager; 45 } 46 47 G4SDManager* G4SDManager::GetSDMpointerIfExist 48 49 G4SDManager::G4SDManager() 50 { 51 G4String topName = "/"; 52 treeTop = new G4SDStructure(topName); 53 theMessenger = new G4SDmessenger(this); 54 HCtable = new G4HCtable; 55 } 56 57 G4SDManager::~G4SDManager() 58 { 59 delete theMessenger; 60 delete HCtable; 61 delete treeTop; 62 DestroyFilters(); 63 theMessenger = nullptr; 64 HCtable = nullptr; 65 treeTop = nullptr; 66 fSDManager = nullptr; 67 } 68 69 void G4SDManager::AddNewDetector(G4VSensitiveD 70 { 71 G4int numberOfCollections = aSD->GetNumberOf 72 G4String pathName = aSD->GetPathName(); 73 if (pathName[0] != '/') pathName.insert(0, " 74 if (pathName.back() != '/') pathName += "/"; 75 treeTop->AddNewDetector(aSD, pathName); 76 if (numberOfCollections < 1) return; 77 for (G4int i = 0; i < numberOfCollections; i 78 G4String SDname = aSD->GetName(); 79 G4String DCname = aSD->GetCollectionName(i 80 AddNewCollection(SDname, DCname); 81 } 82 if (verboseLevel > 0) { 83 G4cout << "New sensitive detector <" << aS 84 << G4endl; 85 } 86 } 87 88 void G4SDManager::AddNewCollection(const G4Str 89 { 90 G4int i = HCtable->Registor(SDname, DCname); 91 if (verboseLevel > 0) { 92 if (i < 0) { 93 if (verboseLevel > 1) 94 G4cout << "G4SDManager::AddNewCollecti 95 << "> has already been reginste 96 } 97 else { 98 G4cout << "G4SDManager::AddNewCollection 99 << "> is registered at " << i << 100 } 101 } 102 } 103 104 G4HCofThisEvent* G4SDManager::PrepareNewEvent( 105 { 106 auto HCE = new G4HCofThisEvent(HCtable->entr 107 treeTop->Initialize(HCE); 108 return HCE; 109 } 110 111 void G4SDManager::TerminateCurrentEvent(G4HCof 112 113 void G4SDManager::Activate(const G4String& dNa 114 { 115 G4String pathName = dName; 116 if (pathName[0] != '/') pathName.insert(0, " 117 treeTop->Activate(pathName, activeFlag); 118 } 119 120 G4VSensitiveDetector* G4SDManager::FindSensiti 121 { 122 G4String pathName = dName; 123 if (pathName[0] != '/') pathName.insert(0, " 124 return treeTop->FindSensitiveDetector(pathNa 125 } 126 127 G4int G4SDManager::GetCollectionID(const G4Str 128 { 129 G4int id = HCtable->GetCollectionID(colName) 130 if (id == -1) { 131 G4cout << "<" << colName << "> is not foun 132 } 133 else if (id == -2) { 134 G4cout << "<" << colName << "> is ambiguou 135 } 136 return id; 137 } 138 139 G4int G4SDManager::GetCollectionID(G4VHitsColl 140 { 141 G4String HCname = aHC->GetSDname(); 142 HCname += "/"; 143 HCname += aHC->GetName(); 144 return GetCollectionID(HCname); 145 } 146 147 void G4SDManager::RegisterSDFilter(G4VSDFilter 148 149 void G4SDManager::DeRegisterSDFilter(G4VSDFilt 150 { 151 for (auto f = FilterList.begin(); f != Filte 152 if (*f == filter) { 153 FilterList.erase(f); 154 break; 155 } 156 } 157 } 158 159 void G4SDManager::DestroyFilters() 160 { 161 auto f = FilterList.begin(); 162 while (f != FilterList.end()) { 163 if (verboseLevel > 0) G4cout << "### delet 164 delete *f; 165 f = FilterList.begin(); 166 } 167 FilterList.clear(); 168 } 169