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 // G4ScoringManager << 26 // 27 // ------------------------------------------- << 27 // 28 28 29 #include "G4ScoringManager.hh" 29 #include "G4ScoringManager.hh" 30 #include "G4ScoringMessenger.hh" 30 #include "G4ScoringMessenger.hh" 31 #include "G4ScoreQuantityMessenger.hh" 31 #include "G4ScoreQuantityMessenger.hh" 32 #include "G4VScoringMesh.hh" 32 #include "G4VScoringMesh.hh" 33 #include "G4THitsMap.hh" 33 #include "G4THitsMap.hh" 34 #include "G4VScoreColorMap.hh" 34 #include "G4VScoreColorMap.hh" 35 #include "G4DefaultLinearColorMap.hh" 35 #include "G4DefaultLinearColorMap.hh" 36 #include "G4ScoreLogColorMap.hh" 36 #include "G4ScoreLogColorMap.hh" 37 37 38 G4ThreadLocal G4ScoringManager* G4ScoringManag 38 G4ThreadLocal G4ScoringManager* G4ScoringManager::fSManager = nullptr; 39 39 40 G4ThreadLocal G4int G4ScoringManager::replicaL 40 G4ThreadLocal G4int G4ScoringManager::replicaLevel = 3; 41 41 42 G4ScoringManager* G4ScoringManager::GetScoring 42 G4ScoringManager* G4ScoringManager::GetScoringManager() 43 { 43 { 44 if(fSManager == nullptr) 44 if(fSManager == nullptr) 45 { 45 { 46 fSManager = new G4ScoringManager; 46 fSManager = new G4ScoringManager; 47 } 47 } 48 return fSManager; 48 return fSManager; 49 } 49 } 50 50 51 G4ScoringManager* G4ScoringManager::GetScoring 51 G4ScoringManager* G4ScoringManager::GetScoringManagerIfExist() 52 { 52 { 53 return fSManager; 53 return fSManager; 54 } 54 } 55 55 56 G4ScoringManager::G4ScoringManager() 56 G4ScoringManager::G4ScoringManager() 57 : verboseLevel(0) 57 : verboseLevel(0) 58 , fCurrentMesh(nullptr) 58 , fCurrentMesh(nullptr) 59 { 59 { 60 fMessenger = new G4ScoringMessen 60 fMessenger = new G4ScoringMessenger(this); 61 fQuantityMessenger = new G4ScoreQuantity 61 fQuantityMessenger = new G4ScoreQuantityMessenger(this); 62 fColorMapDict = new ColorMapDict(); 62 fColorMapDict = new ColorMapDict(); 63 fDefaultLinearColorMap = new G4DefaultLinear 63 fDefaultLinearColorMap = new G4DefaultLinearColorMap("defaultLinearColorMap"); 64 (*fColorMapDict)[fDefaultLinearColorMap->Get 64 (*fColorMapDict)[fDefaultLinearColorMap->GetName()] = fDefaultLinearColorMap; 65 G4VScoreColorMap* logColorMap = new G4ScoreL 65 G4VScoreColorMap* logColorMap = new G4ScoreLogColorMap("logColorMap"); 66 (*fColorMapDict)[logColorMap->GetName()] = l 66 (*fColorMapDict)[logColorMap->GetName()] = logColorMap; 67 writer = n 67 writer = new G4VScoreWriter(); 68 } 68 } 69 69 70 G4ScoringManager::~G4ScoringManager() 70 G4ScoringManager::~G4ScoringManager() 71 { 71 { 72 delete writer; 72 delete writer; 73 delete fDefaultLinearColorMap; 73 delete fDefaultLinearColorMap; 74 delete fColorMapDict; 74 delete fColorMapDict; 75 delete fQuantityMessenger; 75 delete fQuantityMessenger; 76 delete fMessenger; 76 delete fMessenger; 77 fSManager = nullptr; 77 fSManager = nullptr; 78 } 78 } 79 79 80 void G4ScoringManager::SetReplicaLevel(G4int l 80 void G4ScoringManager::SetReplicaLevel(G4int lvl) { replicaLevel = lvl; } 81 G4int G4ScoringManager::GetReplicaLevel() { re 81 G4int G4ScoringManager::GetReplicaLevel() { return replicaLevel; } 82 82 83 void G4ScoringManager::Accumulate(G4VHitsColle 83 void G4ScoringManager::Accumulate(G4VHitsCollection* map) 84 { 84 { 85 auto sm = FindMesh(map); 85 auto sm = FindMesh(map); 86 if(sm == nullptr) 86 if(sm == nullptr) 87 return; 87 return; 88 if(verboseLevel > 9) 88 if(verboseLevel > 9) 89 { 89 { 90 G4cout << "G4ScoringManager::Accumulate() 90 G4cout << "G4ScoringManager::Accumulate() for " << map->GetSDname() << " / " 91 << map->GetName() << G4endl; 91 << map->GetName() << G4endl; 92 G4cout << " is calling G4VScoringMesh::Ac 92 G4cout << " is calling G4VScoringMesh::Accumulate() of " 93 << sm->GetWorldName() << G4endl; 93 << sm->GetWorldName() << G4endl; 94 } 94 } 95 sm->Accumulate(static_cast<G4THitsMap<double 95 sm->Accumulate(static_cast<G4THitsMap<double>*>(map)); 96 } 96 } 97 97 98 G4VScoringMesh* G4ScoringManager::FindMesh(G4V 98 G4VScoringMesh* G4ScoringManager::FindMesh(G4VHitsCollection* map) 99 { 99 { 100 auto colID = map->GetColID(); 100 auto colID = map->GetColID(); 101 G4VScoringMesh* sm = nullptr; 101 G4VScoringMesh* sm = nullptr; 102 auto msh = fMeshMap.find(colID); 102 auto msh = fMeshMap.find(colID); 103 if(msh == fMeshMap.end()) 103 if(msh == fMeshMap.end()) 104 { 104 { 105 const auto& wName = map->GetSDname(); << 105 auto wName = map->GetSDname(); 106 sm = FindMesh(wName); 106 sm = FindMesh(wName); 107 fMeshMap[colID] = sm; 107 fMeshMap[colID] = sm; 108 } 108 } 109 else 109 else 110 { 110 { 111 sm = (*msh).second; 111 sm = (*msh).second; 112 } 112 } 113 return sm; 113 return sm; 114 } 114 } 115 115 116 G4VScoringMesh* G4ScoringManager::FindMesh(con 116 G4VScoringMesh* G4ScoringManager::FindMesh(const G4String& wName) 117 { 117 { 118 G4VScoringMesh* sm = nullptr; 118 G4VScoringMesh* sm = nullptr; 119 for(auto msh : fMeshVec) 119 for(auto msh : fMeshVec) 120 { 120 { 121 if(msh->GetWorldName() == wName) 121 if(msh->GetWorldName() == wName) 122 return msh; 122 return msh; 123 } 123 } 124 if((sm == nullptr) && verboseLevel > 9) 124 if((sm == nullptr) && verboseLevel > 9) 125 { 125 { 126 G4cout << "WARNING : G4ScoringManager::Fin 126 G4cout << "WARNING : G4ScoringManager::FindMesh() --- <" << wName 127 << "> is not found. Null returned." 127 << "> is not found. Null returned." << G4endl; 128 } 128 } 129 return nullptr; 129 return nullptr; 130 } 130 } 131 131 132 void G4ScoringManager::List() const 132 void G4ScoringManager::List() const 133 { 133 { 134 G4cout << "G4ScoringManager has " << GetNumb 134 G4cout << "G4ScoringManager has " << GetNumberOfMesh() << " scoring meshes." 135 << G4endl; 135 << G4endl; 136 for(auto msh : fMeshVec) 136 for(auto msh : fMeshVec) 137 msh->List(); 137 msh->List(); 138 } 138 } 139 139 140 void G4ScoringManager::Dump() const 140 void G4ScoringManager::Dump() const 141 { 141 { 142 for(auto msh : fMeshVec) 142 for(auto msh : fMeshVec) 143 msh->Dump(); 143 msh->Dump(); 144 } 144 } 145 145 146 void G4ScoringManager::DrawMesh(const G4String 146 void G4ScoringManager::DrawMesh(const G4String& meshName, 147 const G4String 147 const G4String& psName, 148 const G4String 148 const G4String& colorMapName, G4int axflg) 149 { 149 { 150 G4VScoringMesh* mesh = FindMesh(meshName); 150 G4VScoringMesh* mesh = FindMesh(meshName); 151 if(mesh != nullptr) 151 if(mesh != nullptr) 152 { 152 { 153 G4VScoreColorMap* colorMap = GetScoreColor 153 G4VScoreColorMap* colorMap = GetScoreColorMap(colorMapName); 154 if(colorMap == nullptr) 154 if(colorMap == nullptr) 155 { 155 { 156 G4cerr << "WARNING : Score color map <" 156 G4cerr << "WARNING : Score color map <" << colorMapName 157 << "> is not found. Default linea 157 << "> is not found. Default linear color map is used." << G4endl; 158 colorMap = fDefaultLinearColorMap; 158 colorMap = fDefaultLinearColorMap; 159 } 159 } 160 mesh->DrawMesh(psName, colorMap, axflg); 160 mesh->DrawMesh(psName, colorMap, axflg); 161 } 161 } 162 else 162 else 163 { 163 { 164 G4cerr << "ERROR : G4ScoringManager::DrawM 164 G4cerr << "ERROR : G4ScoringManager::DrawMesh() --- <" << meshName 165 << "> is not found. Nothing is done 165 << "> is not found. Nothing is done." << G4endl; 166 } 166 } 167 } 167 } 168 168 169 void G4ScoringManager::DrawMesh(const G4String 169 void G4ScoringManager::DrawMesh(const G4String& meshName, 170 const G4String 170 const G4String& psName, G4int idxPlane, 171 G4int iColumn, 171 G4int iColumn, const G4String& colorMapName) 172 { 172 { 173 G4VScoringMesh* mesh = FindMesh(meshName); 173 G4VScoringMesh* mesh = FindMesh(meshName); 174 if(mesh != nullptr) 174 if(mesh != nullptr) 175 { 175 { 176 G4VScoreColorMap* colorMap = GetScoreColor 176 G4VScoreColorMap* colorMap = GetScoreColorMap(colorMapName); 177 if(colorMap == nullptr) 177 if(colorMap == nullptr) 178 { 178 { 179 G4cerr << "WARNING : Score color map <" 179 G4cerr << "WARNING : Score color map <" << colorMapName 180 << "> is not found. Default linea 180 << "> is not found. Default linear color map is used." << G4endl; 181 colorMap = fDefaultLinearColorMap; 181 colorMap = fDefaultLinearColorMap; 182 } 182 } 183 mesh->DrawMesh(psName, idxPlane, iColumn, 183 mesh->DrawMesh(psName, idxPlane, iColumn, colorMap); 184 } 184 } 185 else 185 else 186 { 186 { 187 G4cerr << "ERROR : G4ScoringManager::DrawM 187 G4cerr << "ERROR : G4ScoringManager::DrawMesh() --- <" << meshName 188 << "> is not found. Nothing is done 188 << "> is not found. Nothing is done." << G4endl; 189 } 189 } 190 } 190 } 191 191 192 void G4ScoringManager::DumpQuantityToFile(cons 192 void G4ScoringManager::DumpQuantityToFile(const G4String& meshName, 193 cons 193 const G4String& psName, 194 cons 194 const G4String& fileName, 195 cons 195 const G4String& option) 196 { 196 { 197 G4VScoringMesh* mesh = FindMesh(meshName); 197 G4VScoringMesh* mesh = FindMesh(meshName); 198 if(mesh != nullptr) 198 if(mesh != nullptr) 199 { 199 { 200 writer->SetScoringMesh(mesh); 200 writer->SetScoringMesh(mesh); 201 writer->DumpQuantityToFile(psName, fileNam 201 writer->DumpQuantityToFile(psName, fileName, option); 202 } 202 } 203 else 203 else 204 { 204 { 205 G4cerr << "ERROR : G4ScoringManager::DrawQ 205 G4cerr << "ERROR : G4ScoringManager::DrawQuantityToFile() --- <" << meshName 206 << "> is not found. Nothing is done 206 << "> is not found. Nothing is done." << G4endl; 207 } 207 } 208 } 208 } 209 209 210 void G4ScoringManager::DumpAllQuantitiesToFile 210 void G4ScoringManager::DumpAllQuantitiesToFile(const G4String& meshName, 211 211 const G4String& fileName, 212 212 const G4String& option) 213 { 213 { 214 G4VScoringMesh* mesh = FindMesh(meshName); 214 G4VScoringMesh* mesh = FindMesh(meshName); 215 if(mesh != nullptr) 215 if(mesh != nullptr) 216 { 216 { 217 writer->SetScoringMesh(mesh); 217 writer->SetScoringMesh(mesh); 218 writer->DumpAllQuantitiesToFile(fileName, 218 writer->DumpAllQuantitiesToFile(fileName, option); 219 } 219 } 220 else 220 else 221 { 221 { 222 G4cerr << "ERROR : G4ScoringManager::DrawA 222 G4cerr << "ERROR : G4ScoringManager::DrawAllQuantitiesToFile() --- <" 223 << meshName << "> is not found. Not 223 << meshName << "> is not found. Nothing is done." << G4endl; 224 } 224 } 225 } 225 } 226 226 227 void G4ScoringManager::RegisterScoreColorMap(G 227 void G4ScoringManager::RegisterScoreColorMap(G4VScoreColorMap* colorMap) 228 { 228 { 229 if(fColorMapDict->find(colorMap->GetName()) 229 if(fColorMapDict->find(colorMap->GetName()) != fColorMapDict->cend()) 230 { 230 { 231 G4cerr << "ERROR : G4ScoringManager::Regis 231 G4cerr << "ERROR : G4ScoringManager::RegisterScoreColorMap -- " 232 << colorMap->GetName() 232 << colorMap->GetName() 233 << " has already been registered. M 233 << " has already been registered. Method ignored." << G4endl; 234 } 234 } 235 else 235 else 236 { 236 { 237 (*fColorMapDict)[colorMap->GetName()] = co 237 (*fColorMapDict)[colorMap->GetName()] = colorMap; 238 } 238 } 239 } 239 } 240 240 241 G4VScoreColorMap* G4ScoringManager::GetScoreCo 241 G4VScoreColorMap* G4ScoringManager::GetScoreColorMap(const G4String& mapName) 242 { 242 { 243 auto mItr = fColorMapDict->find(mapName); 243 auto mItr = fColorMapDict->find(mapName); 244 if(mItr == fColorMapDict->cend()) 244 if(mItr == fColorMapDict->cend()) 245 { 245 { 246 return nullptr; 246 return nullptr; 247 } 247 } 248 return (mItr->second); 248 return (mItr->second); 249 } 249 } 250 250 251 void G4ScoringManager::ListScoreColorMaps() 251 void G4ScoringManager::ListScoreColorMaps() 252 { 252 { 253 G4cout << "Registered Score Color Maps " 253 G4cout << "Registered Score Color Maps " 254 "--------------------------------- 254 "-------------------------------------------------------" 255 << G4endl; 255 << G4endl; 256 auto mItr = fColorMapDict->cbegin(); 256 auto mItr = fColorMapDict->cbegin(); 257 for(; mItr != fColorMapDict->cend(); ++mItr) 257 for(; mItr != fColorMapDict->cend(); ++mItr) 258 { 258 { 259 G4cout << " " << mItr->first; 259 G4cout << " " << mItr->first; 260 } 260 } 261 G4cout << G4endl; 261 G4cout << G4endl; 262 } 262 } 263 263 264 void G4ScoringManager::Merge(const G4ScoringMa 264 void G4ScoringManager::Merge(const G4ScoringManager* mgr) 265 { 265 { 266 for(auto i = 0; i < (G4int)GetNumberOfMesh() << 266 for(G4int i = 0; i < (G4int)GetNumberOfMesh(); ++i) 267 { 267 { 268 G4VScoringMesh* fMesh = GetMesh(i); 268 G4VScoringMesh* fMesh = GetMesh(i); 269 G4VScoringMesh* scMesh = mgr->GetMesh(i); 269 G4VScoringMesh* scMesh = mgr->GetMesh(i); 270 fMesh->Merge(scMesh); 270 fMesh->Merge(scMesh); 271 } 271 } 272 } 272 } 273 273