Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer << 3 // * DISCLAIMER * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th << 5 // * The following disclaimer summarizes all the specific disclaimers * 6 // * the Geant4 Collaboration. It is provided << 6 // * of contributors to this software. The specific disclaimers,which * 7 // * conditions of the Geant4 Software License << 7 // * govern, are listed with their locations in: * 8 // * LICENSE and available at http://cern.ch/ << 8 // * http://cern.ch/geant4/license * 9 // * include a list of copyright holders. << 10 // * 9 // * * 11 // * Neither the authors of this software syst 10 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 11 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 12 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 13 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file << 14 // * use. * 16 // * for the full disclaimer and the limitatio << 17 // * 15 // * * 18 // * This code implementation is the result << 16 // * This code implementation is the intellectual property of the * 19 // * technical work of the GEANT4 collaboratio << 17 // * GEANT4 collaboration. * 20 // * By using, copying, modifying or distri << 18 // * By copying, distributing or modifying the Program (or any work * 21 // * any work based on the software) you ag << 19 // * based on the Program) you indicate your acceptance of this * 22 // * use in resulting scientific publicati << 20 // * statement, and all its terms. * 23 // * acceptance of all terms of the Geant4 Sof << 24 // ******************************************* 21 // ******************************************************************** 25 // 22 // 26 // 23 // >> 24 // $Id: G4SDManager.cc,v 1.2 2004/05/03 08:14:01 gcosmo Exp $ >> 25 // GEANT4 tag $Name: geant4-06-02 $ 27 // 26 // 28 27 29 #include "G4SDManager.hh" 28 #include "G4SDManager.hh" 30 << 31 #include "G4HCofThisEvent.hh" << 32 #include "G4SDmessenger.hh" 29 #include "G4SDmessenger.hh" >> 30 #include "G4HCofThisEvent.hh" 33 #include "G4VHitsCollection.hh" 31 #include "G4VHitsCollection.hh" 34 #include "G4VSensitiveDetector.hh" 32 #include "G4VSensitiveDetector.hh" 35 #include "G4ios.hh" 33 #include "G4ios.hh" 36 34 37 G4ThreadLocal G4SDManager* G4SDManager::fSDMan << 35 >> 36 G4SDManager* G4SDManager::fSDManager = 0; 38 37 39 G4SDManager* G4SDManager::GetSDMpointer() 38 G4SDManager* G4SDManager::GetSDMpointer() 40 { 39 { 41 if (fSDManager == nullptr) { << 40 if(!fSDManager) >> 41 { 42 fSDManager = new G4SDManager; 42 fSDManager = new G4SDManager; 43 } 43 } 44 return fSDManager; 44 return fSDManager; 45 } 45 } 46 46 47 G4SDManager* G4SDManager::GetSDMpointerIfExist << 47 G4SDManager* G4SDManager::GetSDMpointerIfExist() >> 48 { return fSDManager; } 48 49 49 G4SDManager::G4SDManager() << 50 G4SDManager::G4SDManager():verboseLevel(0) 50 { 51 { 51 G4String topName = "/"; 52 G4String topName = "/"; 52 treeTop = new G4SDStructure(topName); 53 treeTop = new G4SDStructure(topName); 53 theMessenger = new G4SDmessenger(this); 54 theMessenger = new G4SDmessenger(this); 54 HCtable = new G4HCtable; 55 HCtable = new G4HCtable; 55 } 56 } 56 57 57 G4SDManager::~G4SDManager() 58 G4SDManager::~G4SDManager() 58 { 59 { 59 delete theMessenger; 60 delete theMessenger; 60 delete HCtable; 61 delete HCtable; 61 delete treeTop; 62 delete treeTop; 62 DestroyFilters(); << 63 theMessenger = nullptr; << 64 HCtable = nullptr; << 65 treeTop = nullptr; << 66 fSDManager = nullptr; << 67 } 63 } 68 64 69 void G4SDManager::AddNewDetector(G4VSensitiveD << 65 void G4SDManager::AddNewDetector(G4VSensitiveDetector*aSD) 70 { 66 { 71 G4int numberOfCollections = aSD->GetNumberOf << 72 G4String pathName = aSD->GetPathName(); 67 G4String pathName = aSD->GetPathName(); 73 if (pathName[0] != '/') pathName.insert(0, " << 68 G4int numberOfCollections = aSD->GetNumberOfCollections(); 74 if (pathName.back() != '/') pathName += "/"; << 69 if( pathName(0) != '/' ) pathName.prepend("/"); 75 treeTop->AddNewDetector(aSD, pathName); << 70 if( pathName(pathName.length()-1) != '/' ) pathName += "/"; 76 if (numberOfCollections < 1) return; << 71 treeTop->AddNewDetector(aSD,pathName); 77 for (G4int i = 0; i < numberOfCollections; i << 72 for(G4int i=0;i<numberOfCollections;i++) >> 73 { 78 G4String SDname = aSD->GetName(); 74 G4String SDname = aSD->GetName(); 79 G4String DCname = aSD->GetCollectionName(i 75 G4String DCname = aSD->GetCollectionName(i); 80 AddNewCollection(SDname, DCname); << 76 HCtable->Registor(SDname,DCname); 81 } 77 } 82 if (verboseLevel > 0) { << 78 if( verboseLevel > 0 ) 83 G4cout << "New sensitive detector <" << aS << 79 { 84 << G4endl; << 80 G4cout << "New sensitive detector <" << aSD->GetName() 85 } << 81 << "> is registored at " << pathName << G4endl; 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 } 82 } 102 } 83 } 103 84 104 G4HCofThisEvent* G4SDManager::PrepareNewEvent( 85 G4HCofThisEvent* G4SDManager::PrepareNewEvent() 105 { 86 { 106 auto HCE = new G4HCofThisEvent(HCtable->entr << 87 G4HCofThisEvent* HCE = new G4HCofThisEvent(HCtable->entries()); 107 treeTop->Initialize(HCE); 88 treeTop->Initialize(HCE); 108 return HCE; 89 return HCE; 109 } 90 } 110 91 111 void G4SDManager::TerminateCurrentEvent(G4HCof << 92 void G4SDManager::TerminateCurrentEvent(G4HCofThisEvent* HCE) >> 93 { >> 94 treeTop->Terminate(HCE); >> 95 } 112 96 113 void G4SDManager::Activate(const G4String& dNa << 97 void G4SDManager::Activate(G4String dName, G4bool activeFlag) 114 { 98 { 115 G4String pathName = dName; 99 G4String pathName = dName; 116 if (pathName[0] != '/') pathName.insert(0, " << 100 if( pathName(0) != '/' ) pathName.prepend("/"); 117 treeTop->Activate(pathName, activeFlag); << 101 treeTop->Activate(pathName,activeFlag); 118 } 102 } 119 103 120 G4VSensitiveDetector* G4SDManager::FindSensiti << 104 G4VSensitiveDetector* G4SDManager::FindSensitiveDetector(G4String dName, G4bool warning) 121 { 105 { 122 G4String pathName = dName; 106 G4String pathName = dName; 123 if (pathName[0] != '/') pathName.insert(0, " << 107 if( pathName(0) != '/' ) pathName.prepend("/"); 124 return treeTop->FindSensitiveDetector(pathNa 108 return treeTop->FindSensitiveDetector(pathName, warning); 125 } 109 } 126 110 127 G4int G4SDManager::GetCollectionID(const G4Str << 111 G4int G4SDManager::GetCollectionID(G4String colName) 128 { 112 { 129 G4int id = HCtable->GetCollectionID(colName) 113 G4int id = HCtable->GetCollectionID(colName); 130 if (id == -1) { << 114 if(id==-1) 131 G4cout << "<" << colName << "> is not foun << 115 { G4cout << "<" << colName << "> is not found." << G4endl; } 132 } << 116 else if(id==-2) 133 else if (id == -2) { << 117 { G4cout << "<" << colName << "> is ambiguous." << G4endl; } 134 G4cout << "<" << colName << "> is ambiguou << 135 } << 136 return id; 118 return id; 137 } 119 } 138 120 139 G4int G4SDManager::GetCollectionID(G4VHitsColl 121 G4int G4SDManager::GetCollectionID(G4VHitsCollection* aHC) 140 { 122 { 141 G4String HCname = aHC->GetSDname(); 123 G4String HCname = aHC->GetSDname(); 142 HCname += "/"; 124 HCname += "/"; 143 HCname += aHC->GetName(); 125 HCname += aHC->GetName(); 144 return GetCollectionID(HCname); 126 return GetCollectionID(HCname); 145 } 127 } 146 128 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 129 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 130