Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // 27 // 28 // 29 // John Allison 5th September 2018, based on G4PhysicalVolumeSearchScene 30 // An artificial scene to find physical volumes. Instead of returning the 31 // first occurrence (G4PhysicalVolumeSearchScene) this class (note the extra 32 // 's' in the name of this class) returns a vector of all occurrences. 33 34 #include "G4PhysicalVolumesSearchScene.hh" 35 36 #include <regex> 37 38 G4PhysicalVolumesSearchScene::G4PhysicalVolumesSearchScene 39 (G4PhysicalVolumeModel* pSearchVolumesModel, 40 const G4String& requiredPhysicalVolumeName, 41 G4int requiredCopyNo) 42 : fpSearchVolumesModel (pSearchVolumesModel) 43 , fMatcher (requiredPhysicalVolumeName) 44 , fRequiredCopyNo (requiredCopyNo) 45 {} 46 47 void G4PhysicalVolumesSearchScene::ProcessVolume (const G4VSolid&) 48 { 49 G4VPhysicalVolume* pCurrentPV = fpSearchVolumesModel->GetCurrentPV(); 50 const G4String& name = pCurrentPV->GetName(); 51 G4int copyNo = fpSearchVolumesModel->GetCurrentPVCopyNo(); 52 53 // Match the name with the required physical volume name. The latter can be of 54 // the form "/regexp/", where regexp is a regular expression (see C++ regex), 55 // or a plain name, in which case there must be an exact match. 56 if (fMatcher.Match(name)) { 57 if ((fRequiredCopyNo < 0 || // I.e., ignore negative request 58 fRequiredCopyNo == copyNo)) { 59 auto basePath = fpSearchVolumesModel->GetFullPVPath(); 60 basePath.pop_back(); // Base node is one up from found node 61 // Mark base path nodes as not drawn 62 for (auto& node: basePath) node.SetDrawn(false); 63 fFindings.push_back 64 (Findings 65 (fpSearchVolumesModel->GetTopPhysicalVolume(), 66 pCurrentPV, 67 copyNo, 68 fpSearchVolumesModel->GetCurrentDepth(), 69 basePath, 70 fpSearchVolumesModel->GetFullPVPath(), 71 *fpCurrentObjectTransformation)); 72 } 73 } 74 } 75 76 G4PhysicalVolumesSearchScene::Matcher::Matcher(const G4String& requiredMatch) 77 : fRegexFlag(false) 78 { 79 if (requiredMatch.size()) { 80 std::size_t last = requiredMatch.size() - 1; 81 // If required name begins and ends with '/', treat as a regular expression. 82 // 0 causes a conversion ambiguity that upsets the Windows compiler, so use 0U. 83 if (requiredMatch[0U] == '/' && requiredMatch[(G4int)last] == '/') { 84 if (last > 1) { // Non-null regexp 85 // regex match required 86 fRegexFlag = true; 87 // Extract the required regex 88 fRequiredMatch = requiredMatch.substr(1,last-1); 89 } 90 } else { 91 // Exact match required 92 fRequiredMatch = requiredMatch; 93 } 94 } 95 if (fRequiredMatch.empty()) { 96 G4Exception 97 ("G4PhysicalVolumesSearchScene::Matcher::Matcher", 98 "modeling0013", JustWarning, "Required match is null"); 99 } 100 } 101 102 G4bool G4PhysicalVolumesSearchScene::Matcher::Match(const G4String& s) 103 // Match the string with the required match. The latter can be of the form 104 // "/regexp/", where regexp is a regular expression (see C++ regex), 105 // or a plain string, in which case there must be an exact match. 106 { 107 G4bool found = false; 108 if (fRequiredMatch.size()) { 109 if (fRegexFlag) { // Use extracted regex 110 std::regex requiredRegex(fRequiredMatch); 111 std::cmatch match; 112 std::regex_search(s.c_str(), match, requiredRegex); 113 if (match.size() > 0) found = true; 114 } else { // Require complete match 115 if (s == fRequiredMatch) found = true; 116 } 117 } 118 return found; 119 } 120