Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/geometry/volumes/src/G4PVParameterised.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /geometry/volumes/src/G4PVParameterised.cc (Version 11.3.0) and /geometry/volumes/src/G4PVParameterised.cc (Version 7.1.p1)


  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 // ********************************************************************
                                                   >>  22 //
                                                   >>  23 //
                                                   >>  24 // $Id: G4PVParameterised.cc,v 1.2 2003/11/02 16:06:06 gcosmo Exp $
                                                   >>  25 // GEANT4 tag $Name: geant4-07-00-patch-01 $
                                                   >>  26 //
 25 //                                                 27 // 
 26 // class G4PVParameterised implementation      <<  28 // class G4PVParameterised
                                                   >>  29 //
                                                   >>  30 // Implementation
 27 //                                                 31 //
 28 // 29.07.95, P.Kent - first non-stub version   << 
 29 // -------------------------------------------     32 // ----------------------------------------------------------------------
 30                                                    33 
 31 #include "G4PVParameterised.hh"                    34 #include "G4PVParameterised.hh"
 32 #include "G4VPVParameterisation.hh"            << 
 33 #include "G4AffineTransform.hh"                << 
 34 #include "G4UnitsTable.hh"                     << 
 35 #include "G4VSolid.hh"                         << 
 36 #include "G4LogicalVolume.hh"                  << 
 37                                                    35 
 38 // ------------------------------------------- << 
 39 // Constructor                                 << 
 40 //                                             << 
 41 G4PVParameterised::G4PVParameterised( const G4     36 G4PVParameterised::G4PVParameterised( const G4String& pName,
 42                                             G4     37                                             G4LogicalVolume* pLogical,
 43                                             G4 <<  38                                             G4VPhysicalVolume* pMother,
 44                                       const EA     39                                       const EAxis pAxis,
 45                                       const G4     40                                       const G4int nReplicas,
 46                                             G4 <<  41                                             G4VPVParameterisation *pParam)
 47                                             G4 <<  42   : G4PVReplica(pName, pLogical, pMother, pAxis, nReplicas, 0, 0),
 48 : G4PVReplica(pName, nReplicas, pAxis, pLogica << 
 49               pMotherPhysical != nullptr ? pMo << 
 50     fparam(pParam)                                 43     fparam(pParam)
 51 {                                                  44 {
 52   G4LogicalVolume* motherLogical= pMotherPhysi << 
 53       pMotherPhysical->GetLogicalVolume() : nu << 
 54                                                << 
 55   SetMotherLogical( motherLogical );           << 
 56   if( motherLogical != nullptr )               << 
 57   {                                            << 
 58     // Registration moved here to ensure that  << 
 59     motherLogical->AddDaughter(this);          << 
 60   }                                            << 
 61                                                << 
 62 #ifdef G4VERBOSE                                   45 #ifdef G4VERBOSE  
 63   if ((pMotherPhysical != nullptr) && (pMother <<  46   if ((pMother) && (pMother->IsParameterised()))
 64   {                                                47   {
 65     std::ostringstream message, hint;          <<  48     G4cout << "WARNING - G4PVParameterised::G4PVParameterised()" << G4endl
 66     message << "A parameterised volume is bein <<  49            << "          A parameterised volume is being placed" << G4endl
 67             << "inside another parameterised v <<  50            << "          inside another parameterised volume !" << G4endl
 68     hint << "To make sure that no overlaps are <<  51            << "          To make sure that no overlaps are generated," << G4endl
 69          << "you should verify the mother repl <<  52            << "          you should verify the mother replicated shapes" << G4endl
 70          << "are of the same type and dimensio <<  53            << "          are of the same type and dimensions." << G4endl
 71          << "   Mother physical volume: " << p <<  54            << "             Mother physical volume: " << pMother->GetName() << G4endl
 72          << "   Parameterised volume: " << pNa <<  55            << "             Parameterised volume: " << pName << G4endl
 73          << "  (To switch this warning off, co <<  56            << "  (To switch this warning off, compile with G4_NO_VERBOSE)" << G4endl;
 74     G4Exception("G4PVParameterised::G4PVParame << 
 75                 JustWarning, message, G4String << 
 76   }                                                57   }
 77 #endif                                             58 #endif
 78   if (pSurfChk) { CheckOverlaps(); }           << 
 79 }                                                  59 }
 80                                                    60 
 81 // ------------------------------------------- << 
 82 // Constructor                                 << 
 83 //                                             << 
 84 G4PVParameterised::G4PVParameterised( const G4     61 G4PVParameterised::G4PVParameterised( const G4String& pName,
 85                                             G4     62                                             G4LogicalVolume* pLogical,
 86                                             G4     63                                             G4LogicalVolume* pMotherLogical,
 87                                       const EA     64                                       const EAxis pAxis,
 88                                       const G4     65                                       const G4int nReplicas,
 89                                             G4 <<  66                                             G4VPVParameterisation *pParam)
 90                                             G4 <<  67   : G4PVReplica(pName, pLogical, pMotherLogical, pAxis, nReplicas, 0, 0),
 91   : G4PVReplica(pName, nReplicas, pAxis, pLogi << 
 92     fparam(pParam)                                 68     fparam(pParam)
 93 {                                                  69 {
 94   SetMotherLogical( pMotherLogical );          << 
 95   if( pMotherLogical != nullptr )              << 
 96   {                                            << 
 97     // Registration moved here to ensure that  << 
 98     pMotherLogical->AddDaughter(this);         << 
 99   }                                            << 
100   if (pSurfChk) { CheckOverlaps(); }           << 
101 }                                                  70 }
102                                                    71 
103 // ------------------------------------------- <<  72 G4PVParameterised::~G4PVParameterised()
104 // Fake default constructor - sets only member << 
105 //                            for usage restri << 
106 //                                             << 
107 G4PVParameterised::G4PVParameterised( __void__ << 
108   : G4PVReplica(a)                             << 
109 {                                                  73 {
110 }                                                  74 }
111                                                    75 
112 // ------------------------------------------- << 
113 // Destructor                                  << 
114 //                                             << 
115 G4PVParameterised::~G4PVParameterised() = defa << 
116                                                << 
117 // ------------------------------------------- << 
118 // GetParameterisation                         << 
119 //                                             << 
120 G4VPVParameterisation* G4PVParameterised::GetP     76 G4VPVParameterisation* G4PVParameterised::GetParameterisation() const
121 {                                                  77 {
122   return fparam;                                   78   return fparam;
123 }                                                  79 }
124                                                    80 
125 // ------------------------------------------- << 
126 // IsParameterised                             << 
127 //                                             << 
128 G4bool G4PVParameterised::IsParameterised() co     81 G4bool G4PVParameterised::IsParameterised() const
129 {                                                  82 {
130   return true;                                     83   return true;
131 }                                                  84 }
132                                                    85 
133 // ------------------------------------------- << 
134 // VolumeType                                  << 
135 //                                             << 
136 EVolume G4PVParameterised::VolumeType() const  << 
137 {                                              << 
138   return kParameterised;                       << 
139 }                                              << 
140                                                << 
141 // ------------------------------------------- << 
142 // GetReplicationData                          << 
143 //                                             << 
144 void G4PVParameterised::GetReplicationData( EA     86 void G4PVParameterised::GetReplicationData( EAxis& axis,
145                                             G4     87                                             G4int& nReplicas,
146                                             G4     88                                             G4double& width,
147                                             G4     89                                             G4double& offset,
148                                             G4     90                                             G4bool& consuming) const
149 {                                                  91 {
150   axis = faxis;                                    92   axis = faxis;
151   nReplicas = fnReplicas;                          93   nReplicas = fnReplicas;
152   width = fwidth;                                  94   width = fwidth;
153   offset = foffset;                                95   offset = foffset;
154   consuming = false;                               96   consuming = false;
155 }                                              << 
156                                                << 
157 // ------------------------------------------- << 
158 // SetRegularStructureId                       << 
159 //                                             << 
160 void  G4PVParameterised::SetRegularStructureId << 
161 {                                              << 
162   G4PVReplica::SetRegularStructureId( code );  << 
163   // To undertake additional preparation, a de << 
164   // redefine this method, while calling also  << 
165 }                                              << 
166                                                << 
167                                                << 
168 // ------------------------------------------- << 
169 // CheckOverlaps                               << 
170 //                                             << 
171 G4bool                                         << 
172 G4PVParameterised::CheckOverlaps(G4int res, G4 << 
173                                  G4bool verbos << 
174 {                                              << 
175   if (res<=0) { return false; }                << 
176                                                << 
177   G4int trials = 0;                            << 
178   G4bool retval = false;                       << 
179   G4VSolid *solidA = nullptr, *solidB = nullpt << 
180   G4LogicalVolume* motherLog = GetMotherLogica << 
181   G4VSolid *motherSolid = motherLog->GetSolid( << 
182   std::vector<G4ThreeVector> points;           << 
183                                                << 
184   if (verbose)                                 << 
185   {                                            << 
186     G4cout << "Checking overlaps for parameter << 
187            << GetName() << " ... ";            << 
188   }                                            << 
189                                                << 
190   for (auto i=0; i<GetMultiplicity(); ++i)     << 
191   {                                            << 
192     solidA = fparam->ComputeSolid(i, this);    << 
193     solidA->ComputeDimensions(fparam, i, this) << 
194     fparam->ComputeTransformation(i, this);    << 
195                                                << 
196     // Create the transformation from daughter << 
197     //                                         << 
198     G4AffineTransform Tm( GetRotation(), GetTr << 
199                                                << 
200     // Generate random points on surface accor << 
201     // transform them to the mother's coordina << 
202     // with the mother volume, cache them in a << 
203     // the daughters                           << 
204     //                                         << 
205     for (auto n=0; n<res; ++n)                 << 
206     {                                          << 
207       G4ThreeVector mp = Tm.TransformPoint(sol << 
208                                                << 
209       // Checking overlaps with the mother vol << 
210       //                                       << 
211       if (motherSolid->Inside(mp)==kOutside)   << 
212       {                                        << 
213         G4double distin = motherSolid->Distanc << 
214         if (distin > tol)                      << 
215         {                                      << 
216           ++trials; retval = true;             << 
217           std::ostringstream message;          << 
218           message << "Overlap with mother volu << 
219                   << "         Overlap is dete << 
220                   << GetName() << ", parameter << 
221                   << "          with its mothe << 
222                   << motherLog->GetName() << G << 
223                   << "          at mother loca << 
224                   << "overlapping by at least: << 
225                   << G4BestUnit(distin, "Lengt << 
226           if (trials>=maxErr)                  << 
227           {                                    << 
228             message << G4endl                  << 
229                     << "NOTE: Reached maximum  << 
230                     << "- of overlaps reports  << 
231           }                                    << 
232           G4Exception("G4PVParameterised::Chec << 
233                       "GeomVol1002", JustWarni << 
234           if (trials>=maxErr)  { return true;  << 
235         }                                      << 
236       }                                        << 
237       points.push_back(mp);                    << 
238     }                                          << 
239                                                << 
240     // Checking overlaps with each other param << 
241     //                                         << 
242     for (auto j=i+1; j<GetMultiplicity(); ++j) << 
243     {                                          << 
244       solidB = fparam->ComputeSolid(j,this);   << 
245       solidB->ComputeDimensions(fparam, j, thi << 
246       fparam->ComputeTransformation(j, this);  << 
247                                                << 
248       // Create the transformation for daughte << 
249       //                                       << 
250       G4AffineTransform Td( GetRotation(), Get << 
251                                                << 
252       for (const auto & point : points)        << 
253       {                                        << 
254         // Transform each point according to d << 
255         //                                     << 
256         G4ThreeVector md = Td.InverseTransform << 
257                                                << 
258         if (solidB->Inside(md)==kInside)       << 
259         {                                      << 
260           G4double distout = solidB->DistanceT << 
261           if (distout > tol)                   << 
262           {                                    << 
263             ++trials; retval = true;           << 
264             std::ostringstream message;        << 
265             message << "Overlap within paramet << 
266                     << "          Overlap is d << 
267                     << GetName() << ", paramet << 
268                     << "          with paramet << 
269                     << G4endl                  << 
270                     << "          at local poi << 
271                     << "overlapping by at leas << 
272                     << G4BestUnit(distout, "Le << 
273                     << ", related to volume in << 
274             if (trials>=maxErr)                << 
275             {                                  << 
276               message << G4endl                << 
277                       << "NOTE: Reached maximu << 
278                       << "- of overlaps report << 
279             }                                  << 
280             G4Exception("G4PVParameterised::Ch << 
281                         "GeomVol1002", JustWar << 
282             if (trials>=maxErr)  { return true << 
283           }                                    << 
284         }                                      << 
285       }                                        << 
286     }                                          << 
287   }                                            << 
288   if (verbose)                                 << 
289   {                                            << 
290     G4cout << "OK! " << G4endl;                << 
291   }                                            << 
292                                                << 
293   return retval;                               << 
294 }                                                  97 }
295                                                    98