Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 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::fSDManager = nullptr; 38 39 G4SDManager* G4SDManager::GetSDMpointer() 40 { 41 if (fSDManager == nullptr) { 42 fSDManager = new G4SDManager; 43 } 44 return fSDManager; 45 } 46 47 G4SDManager* G4SDManager::GetSDMpointerIfExist() { return fSDManager; } 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(G4VSensitiveDetector* aSD) 70 { 71 G4int numberOfCollections = aSD->GetNumberOfCollections(); 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 <" << aSD->GetName() << "> is registered at " << pathName 84 << G4endl; 85 } 86 } 87 88 void G4SDManager::AddNewCollection(const G4String& SDname, const G4String& DCname) 89 { 90 G4int i = HCtable->Registor(SDname, DCname); 91 if (verboseLevel > 0) { 92 if (i < 0) { 93 if (verboseLevel > 1) 94 G4cout << "G4SDManager::AddNewCollection : the collection <" << SDname << "/" << DCname 95 << "> has already been reginstered." << G4endl; 96 } 97 else { 98 G4cout << "G4SDManager::AddNewCollection : the collection <" << SDname << "/" << DCname 99 << "> is registered at " << i << G4endl; 100 } 101 } 102 } 103 104 G4HCofThisEvent* G4SDManager::PrepareNewEvent() 105 { 106 auto HCE = new G4HCofThisEvent(HCtable->entries()); 107 treeTop->Initialize(HCE); 108 return HCE; 109 } 110 111 void G4SDManager::TerminateCurrentEvent(G4HCofThisEvent* HCE) { treeTop->Terminate(HCE); } 112 113 void G4SDManager::Activate(const G4String& dName, G4bool activeFlag) 114 { 115 G4String pathName = dName; 116 if (pathName[0] != '/') pathName.insert(0, "/"); 117 treeTop->Activate(pathName, activeFlag); 118 } 119 120 G4VSensitiveDetector* G4SDManager::FindSensitiveDetector(const G4String& dName, G4bool warning) 121 { 122 G4String pathName = dName; 123 if (pathName[0] != '/') pathName.insert(0, "/"); 124 return treeTop->FindSensitiveDetector(pathName, warning); 125 } 126 127 G4int G4SDManager::GetCollectionID(const G4String& colName) 128 { 129 G4int id = HCtable->GetCollectionID(colName); 130 if (id == -1) { 131 G4cout << "<" << colName << "> is not found." << G4endl; 132 } 133 else if (id == -2) { 134 G4cout << "<" << colName << "> is ambiguous." << G4endl; 135 } 136 return id; 137 } 138 139 G4int G4SDManager::GetCollectionID(G4VHitsCollection* aHC) 140 { 141 G4String HCname = aHC->GetSDname(); 142 HCname += "/"; 143 HCname += aHC->GetName(); 144 return GetCollectionID(HCname); 145 } 146 147 void G4SDManager::RegisterSDFilter(G4VSDFilter* filter) { FilterList.push_back(filter); } 148 149 void G4SDManager::DeRegisterSDFilter(G4VSDFilter* filter) 150 { 151 for (auto f = FilterList.begin(); f != FilterList.end(); f++) { 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 << "### deleting " << (*f)->GetName() << " " << (*f) << G4endl; 164 delete *f; 165 f = FilterList.begin(); 166 } 167 FilterList.clear(); 168 } 169