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: G4SDManager.cc 73819 2013-09-12 15:52:52Z gcosmo $ 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 G4ThreadLocal G4SDManager* G4SDManager::fSDMan << 37 >> 38 G4ThreadLocal G4SDManager* G4SDManager::fSDManager = 0; 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; << 64 HCtable = nullptr; << 65 treeTop = nullptr; << 66 fSDManager = nullptr; << 67 } 65 } 68 66 69 void G4SDManager::AddNewDetector(G4VSensitiveD << 67 void G4SDManager::AddNewDetector(G4VSensitiveDetector*aSD) 70 { 68 { 71 G4int numberOfCollections = aSD->GetNumberOf 69 G4int numberOfCollections = aSD->GetNumberOfCollections(); 72 G4String pathName = aSD->GetPathName(); 70 G4String pathName = aSD->GetPathName(); 73 if (pathName[0] != '/') pathName.insert(0, " << 71 if( pathName(0) != '/' ) pathName.prepend("/"); 74 if (pathName.back() != '/') pathName += "/"; << 72 if( pathName(pathName.length()-1) != '/' ) pathName += "/"; 75 treeTop->AddNewDetector(aSD, pathName); << 73 treeTop->AddNewDetector(aSD,pathName); 76 if (numberOfCollections < 1) return; << 74 if(numberOfCollections<1) return; 77 for (G4int i = 0; i < numberOfCollections; i << 75 for(G4int i=0;i<numberOfCollections;i++) >> 76 { 78 G4String SDname = aSD->GetName(); 77 G4String SDname = aSD->GetName(); 79 G4String DCname = aSD->GetCollectionName(i 78 G4String DCname = aSD->GetCollectionName(i); 80 AddNewCollection(SDname, DCname); << 79 AddNewCollection(SDname,DCname); 81 } 80 } 82 if (verboseLevel > 0) { << 81 if( verboseLevel > 0 ) 83 G4cout << "New sensitive detector <" << aS << 82 { 84 << G4endl; << 83 G4cout << "New sensitive detector <" << aSD->GetName() >> 84 << "> is registored at " << pathName << G4endl; 85 } 85 } 86 } 86 } 87 87 88 void G4SDManager::AddNewCollection(const G4Str << 88 void G4SDManager::AddNewCollection(G4String SDname,G4String DCname) 89 { 89 { 90 G4int i = HCtable->Registor(SDname, DCname); << 90 G4int i = HCtable->Registor(SDname,DCname); 91 if (verboseLevel > 0) { << 91 if(verboseLevel>0) 92 if (i < 0) { << 92 { 93 if (verboseLevel > 1) << 93 if(i<0) { 94 G4cout << "G4SDManager::AddNewCollecti << 94 if(verboseLevel>1) G4cout << "G4SDManager::AddNewCollection : the collection <" 95 << "> has already been reginste << 95 << SDname << "/" << DCname << "> has already been reginstered." << G4endl; 96 } 96 } 97 else { << 97 else 98 G4cout << "G4SDManager::AddNewCollection << 98 { 99 << "> is registered at " << i << << 99 G4cout << "G4SDManager::AddNewCollection : the collection <" >> 100 << SDname << "/" << DCname << "> is registered at " << i << G4endl; 100 } 101 } 101 } 102 } 102 } 103 } 103 104 104 G4HCofThisEvent* G4SDManager::PrepareNewEvent( 105 G4HCofThisEvent* G4SDManager::PrepareNewEvent() 105 { 106 { 106 auto HCE = new G4HCofThisEvent(HCtable->entr << 107 G4HCofThisEvent* HCE = new G4HCofThisEvent(HCtable->entries()); 107 treeTop->Initialize(HCE); 108 treeTop->Initialize(HCE); 108 return HCE; 109 return HCE; 109 } 110 } 110 111 111 void G4SDManager::TerminateCurrentEvent(G4HCof << 112 void G4SDManager::TerminateCurrentEvent(G4HCofThisEvent* HCE) >> 113 { >> 114 treeTop->Terminate(HCE); >> 115 } 112 116 113 void G4SDManager::Activate(const G4String& dNa << 117 void G4SDManager::Activate(G4String dName, G4bool activeFlag) 114 { 118 { 115 G4String pathName = dName; 119 G4String pathName = dName; 116 if (pathName[0] != '/') pathName.insert(0, " << 120 if( pathName(0) != '/' ) pathName.prepend("/"); 117 treeTop->Activate(pathName, activeFlag); << 121 treeTop->Activate(pathName,activeFlag); 118 } 122 } 119 123 120 G4VSensitiveDetector* G4SDManager::FindSensiti << 124 G4VSensitiveDetector* G4SDManager::FindSensitiveDetector(G4String dName, G4bool warning) 121 { 125 { 122 G4String pathName = dName; 126 G4String pathName = dName; 123 if (pathName[0] != '/') pathName.insert(0, " << 127 if( pathName(0) != '/' ) pathName.prepend("/"); 124 return treeTop->FindSensitiveDetector(pathNa 128 return treeTop->FindSensitiveDetector(pathName, warning); 125 } 129 } 126 130 127 G4int G4SDManager::GetCollectionID(const G4Str << 131 G4int G4SDManager::GetCollectionID(G4String colName) 128 { 132 { 129 G4int id = HCtable->GetCollectionID(colName) 133 G4int id = HCtable->GetCollectionID(colName); 130 if (id == -1) { << 134 if(id==-1) 131 G4cout << "<" << colName << "> is not foun << 135 { G4cout << "<" << colName << "> is not found." << G4endl; } 132 } << 136 else if(id==-2) 133 else if (id == -2) { << 137 { G4cout << "<" << colName << "> is ambiguous." << G4endl; } 134 G4cout << "<" << colName << "> is ambiguou << 135 } << 136 return id; 138 return id; 137 } 139 } 138 140 139 G4int G4SDManager::GetCollectionID(G4VHitsColl 141 G4int G4SDManager::GetCollectionID(G4VHitsCollection* aHC) 140 { 142 { 141 G4String HCname = aHC->GetSDname(); 143 G4String HCname = aHC->GetSDname(); 142 HCname += "/"; 144 HCname += "/"; 143 HCname += aHC->GetName(); 145 HCname += aHC->GetName(); 144 return GetCollectionID(HCname); 146 return GetCollectionID(HCname); 145 } 147 } 146 148 147 void G4SDManager::RegisterSDFilter(G4VSDFilter << 148 149 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 150