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