Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // 27 // 28 // 29 // John Allison 5th September 2018, based on 30 // An artificial scene to find physical volume 31 // first occurrence (G4PhysicalVolumeSearchSce 32 // 's' in the name of this class) returns a ve 33 34 #include "G4PhysicalVolumesSearchScene.hh" 35 36 #include <regex> 37 38 G4PhysicalVolumesSearchScene::G4PhysicalVolume 39 (G4PhysicalVolumeModel* pSearchVolumesModel, 40 const G4String& requiredPhysicalVolume 41 G4int requiredCopyNo) 42 : fpSearchVolumesModel (pSearchVolumesModel) 43 , fMatcher (requiredPhysicalVolum 44 , fRequiredCopyNo (requiredCopyNo) 45 {} 46 47 void G4PhysicalVolumesSearchScene::ProcessVolu 48 { 49 G4VPhysicalVolume* pCurrentPV = fpSearchVolu 50 const G4String& name = pCurrentPV->GetName() 51 G4int copyNo = fpSearchVolumesModel->GetCurr 52 53 // Match the name with the required physical 54 // the form "/regexp/", where regexp is a re 55 // or a plain name, in which case there must 56 if (fMatcher.Match(name)) { 57 if ((fRequiredCopyNo < 0 || // I.e., igno 58 fRequiredCopyNo == copyNo)) { 59 auto basePath = fpSearchVolumesModel->Ge 60 basePath.pop_back(); // Base node is on 61 // Mark base path nodes as not drawn 62 for (auto& node: basePath) node.SetDrawn 63 fFindings.push_back 64 (Findings 65 (fpSearchVolumesModel->GetTopPhysicalVo 66 pCurrentPV, 67 copyNo, 68 fpSearchVolumesModel->GetCurrentDepth( 69 basePath, 70 fpSearchVolumesModel->GetFullPVPath(), 71 *fpCurrentObjectTransformation)); 72 } 73 } 74 } 75 76 G4PhysicalVolumesSearchScene::Matcher::Matcher 77 : fRegexFlag(false) 78 { 79 if (requiredMatch.size()) { 80 std::size_t last = requiredMatch.size() - 81 // If required name begins and ends with ' 82 // 0 causes a conversion ambiguity that up 83 if (requiredMatch[0U] == '/' && requiredMa 84 if (last > 1) { // Non-null regexp 85 // regex match required 86 fRegexFlag = true; 87 // Extract the required regex 88 fRequiredMatch = requiredMatch.substr( 89 } 90 } else { 91 // Exact match required 92 fRequiredMatch = requiredMatch; 93 } 94 } 95 if (fRequiredMatch.empty()) { 96 G4Exception 97 ("G4PhysicalVolumesSearchScene::Matcher::M 98 "modeling0013", JustWarning, "Required ma 99 } 100 } 101 102 G4bool G4PhysicalVolumesSearchScene::Matcher:: 103 // Match the string with the required match. T 104 // "/regexp/", where regexp is a regular expre 105 // or a plain string, in which case there must 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, requ 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