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 // 26 // >> 27 // $Id$ 27 // 28 // 28 29 29 #include "G4SDManager.hh" 30 #include "G4SDManager.hh" 30 << 31 #include "G4HCofThisEvent.hh" << 32 #include "G4SDmessenger.hh" 31 #include "G4SDmessenger.hh" >> 32 #include "G4HCofThisEvent.hh" 33 #include "G4VHitsCollection.hh" 33 #include "G4VHitsCollection.hh" 34 #include "G4VSensitiveDetector.hh" 34 #include "G4VSensitiveDetector.hh" 35 #include "G4ios.hh" 35 #include "G4ios.hh" 36 36 >> 37 37 G4ThreadLocal G4SDManager* G4SDManager::fSDMan 38 G4ThreadLocal G4SDManager* G4SDManager::fSDManager = nullptr; 38 39 39 G4SDManager* G4SDManager::GetSDMpointer() 40 G4SDManager* G4SDManager::GetSDMpointer() 40 { 41 { 41 if (fSDManager == nullptr) { << 42 if(!fSDManager) >> 43 { 42 fSDManager = new G4SDManager; 44 fSDManager = new G4SDManager; 43 } 45 } 44 return fSDManager; 46 return fSDManager; 45 } 47 } 46 48 47 G4SDManager* G4SDManager::GetSDMpointerIfExist << 49 G4SDManager* G4SDManager::GetSDMpointerIfExist() >> 50 { return fSDManager; } 48 51 49 G4SDManager::G4SDManager() << 52 G4SDManager::G4SDManager():verboseLevel(0) 50 { 53 { 51 G4String topName = "/"; 54 G4String topName = "/"; 52 treeTop = new G4SDStructure(topName); 55 treeTop = new G4SDStructure(topName); 53 theMessenger = new G4SDmessenger(this); 56 theMessenger = new G4SDmessenger(this); 54 HCtable = new G4HCtable; 57 HCtable = new G4HCtable; 55 } 58 } 56 59 57 G4SDManager::~G4SDManager() 60 G4SDManager::~G4SDManager() 58 { 61 { 59 delete theMessenger; 62 delete theMessenger; 60 delete HCtable; 63 delete HCtable; 61 delete treeTop; 64 delete treeTop; 62 DestroyFilters(); << 63 theMessenger = nullptr; 65 theMessenger = nullptr; 64 HCtable = nullptr; 66 HCtable = nullptr; 65 treeTop = nullptr; 67 treeTop = nullptr; 66 fSDManager = nullptr; 68 fSDManager = nullptr; 67 } 69 } 68 70 69 void G4SDManager::AddNewDetector(G4VSensitiveD << 71 void G4SDManager::AddNewDetector(G4VSensitiveDetector*aSD) 70 { 72 { 71 G4int numberOfCollections = aSD->GetNumberOf 73 G4int numberOfCollections = aSD->GetNumberOfCollections(); 72 G4String pathName = aSD->GetPathName(); 74 G4String pathName = aSD->GetPathName(); 73 if (pathName[0] != '/') pathName.insert(0, " << 75 if( pathName(0) != '/' ) pathName.prepend("/"); 74 if (pathName.back() != '/') pathName += "/"; << 76 if( pathName(pathName.length()-1) != '/' ) pathName += "/"; 75 treeTop->AddNewDetector(aSD, pathName); << 77 treeTop->AddNewDetector(aSD,pathName); 76 if (numberOfCollections < 1) return; << 78 if(numberOfCollections<1) return; 77 for (G4int i = 0; i < numberOfCollections; i << 79 for(G4int i=0;i<numberOfCollections;i++) >> 80 { 78 G4String SDname = aSD->GetName(); 81 G4String SDname = aSD->GetName(); 79 G4String DCname = aSD->GetCollectionName(i 82 G4String DCname = aSD->GetCollectionName(i); 80 AddNewCollection(SDname, DCname); << 83 AddNewCollection(SDname,DCname); 81 } 84 } 82 if (verboseLevel > 0) { << 85 if( verboseLevel > 0 ) 83 G4cout << "New sensitive detector <" << aS << 86 { 84 << G4endl; << 87 G4cout << "New sensitive detector <" << aSD->GetName() >> 88 << "> is registered at " << pathName << G4endl; 85 } 89 } 86 } 90 } 87 91 88 void G4SDManager::AddNewCollection(const G4Str << 92 void G4SDManager::AddNewCollection(G4String SDname,G4String DCname) 89 { 93 { 90 G4int i = HCtable->Registor(SDname, DCname); << 94 G4int i = HCtable->Registor(SDname,DCname); 91 if (verboseLevel > 0) { << 95 if(verboseLevel>0) 92 if (i < 0) { << 96 { 93 if (verboseLevel > 1) << 97 if(i<0) { 94 G4cout << "G4SDManager::AddNewCollecti << 98 if(verboseLevel>1) G4cout << "G4SDManager::AddNewCollection : the collection <" 95 << "> has already been reginste << 99 << SDname << "/" << DCname << "> has already been reginstered." << G4endl; 96 } 100 } 97 else { << 101 else 98 G4cout << "G4SDManager::AddNewCollection << 102 { 99 << "> is registered at " << i << << 103 G4cout << "G4SDManager::AddNewCollection : the collection <" >> 104 << SDname << "/" << DCname << "> is registered at " << i << G4endl; 100 } 105 } 101 } 106 } 102 } 107 } 103 108 104 G4HCofThisEvent* G4SDManager::PrepareNewEvent( 109 G4HCofThisEvent* G4SDManager::PrepareNewEvent() 105 { 110 { 106 auto HCE = new G4HCofThisEvent(HCtable->entr << 111 G4HCofThisEvent* HCE = new G4HCofThisEvent(HCtable->entries()); 107 treeTop->Initialize(HCE); 112 treeTop->Initialize(HCE); 108 return HCE; 113 return HCE; 109 } 114 } 110 115 111 void G4SDManager::TerminateCurrentEvent(G4HCof << 116 void G4SDManager::TerminateCurrentEvent(G4HCofThisEvent* HCE) >> 117 { >> 118 treeTop->Terminate(HCE); >> 119 } 112 120 113 void G4SDManager::Activate(const G4String& dNa << 121 void G4SDManager::Activate(G4String dName, G4bool activeFlag) 114 { 122 { 115 G4String pathName = dName; 123 G4String pathName = dName; 116 if (pathName[0] != '/') pathName.insert(0, " << 124 if( pathName(0) != '/' ) pathName.prepend("/"); 117 treeTop->Activate(pathName, activeFlag); << 125 treeTop->Activate(pathName,activeFlag); 118 } 126 } 119 127 120 G4VSensitiveDetector* G4SDManager::FindSensiti << 128 G4VSensitiveDetector* G4SDManager::FindSensitiveDetector(G4String dName, G4bool warning) 121 { 129 { 122 G4String pathName = dName; 130 G4String pathName = dName; 123 if (pathName[0] != '/') pathName.insert(0, " << 131 if( pathName(0) != '/' ) pathName.prepend("/"); 124 return treeTop->FindSensitiveDetector(pathNa 132 return treeTop->FindSensitiveDetector(pathName, warning); 125 } 133 } 126 134 127 G4int G4SDManager::GetCollectionID(const G4Str << 135 G4int G4SDManager::GetCollectionID(G4String colName) 128 { 136 { 129 G4int id = HCtable->GetCollectionID(colName) 137 G4int id = HCtable->GetCollectionID(colName); 130 if (id == -1) { << 138 if(id==-1) 131 G4cout << "<" << colName << "> is not foun << 139 { G4cout << "<" << colName << "> is not found." << G4endl; } 132 } << 140 else if(id==-2) 133 else if (id == -2) { << 141 { G4cout << "<" << colName << "> is ambiguous." << G4endl; } 134 G4cout << "<" << colName << "> is ambiguou << 135 } << 136 return id; 142 return id; 137 } 143 } 138 144 139 G4int G4SDManager::GetCollectionID(G4VHitsColl 145 G4int G4SDManager::GetCollectionID(G4VHitsCollection* aHC) 140 { 146 { 141 G4String HCname = aHC->GetSDname(); 147 G4String HCname = aHC->GetSDname(); 142 HCname += "/"; 148 HCname += "/"; 143 HCname += aHC->GetName(); 149 HCname += aHC->GetName(); 144 return GetCollectionID(HCname); 150 return GetCollectionID(HCname); 145 } 151 } 146 152 147 void G4SDManager::RegisterSDFilter(G4VSDFilter << 148 153 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 154