Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/g3tog4/src/G3toG4MANY.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 /g3tog4/src/G3toG4MANY.cc (Version 11.3.0) and /g3tog4/src/G3toG4MANY.cc (Version 11.1.1)


  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 //                                                 26 //
 27 //                                                 27 //
 28 // By I. Hrivnacova, 22.10.01                      28 // By I. Hrivnacova, 22.10.01 
 29                                                    29 
 30 //#define G3G4DEBUG 1                              30 //#define G3G4DEBUG 1
 31                                                    31 
 32 #include "globals.hh"                              32 #include "globals.hh"
 33 #include "G3toG4MANY.hh"                           33 #include "G3toG4MANY.hh"
 34 #include "G3Pos.hh"                                34 #include "G3Pos.hh"
 35 #include "G3RotTable.hh"                           35 #include "G3RotTable.hh"
 36 #include "G4SubtractionSolid.hh"                   36 #include "G4SubtractionSolid.hh"
 37                                                    37 
 38 void G3toG4MANY(G3VolTableEntry* curVTE)           38 void G3toG4MANY(G3VolTableEntry* curVTE)
 39 {                                                  39 {
 40   if (curVTE->GetNoOverlaps() > 0) {               40   if (curVTE->GetNoOverlaps() > 0) {
 41                                                    41   
 42     // check consistency                           42     // check consistency 
 43     if (!curVTE->HasMANY()) {                      43     if (!curVTE->HasMANY()) { 
 44       G4String text = "G3toG4MANY: volume ";       44       G4String text = "G3toG4MANY: volume ";
 45       text = text + curVTE->GetName() + " has      45       text = text + curVTE->GetName() + " has specified overlaps \n";
 46       text = text + " but is not defined as MA     46       text = text + " but is not defined as MANY.";
 47       G4Exception("G3toG4MANY()", "G3toG40009"     47       G4Exception("G3toG4MANY()", "G3toG40009",
 48                   FatalException, text);           48                   FatalException, text);
 49       return;                                      49       return;
 50     }                                              50     }  
 51                                                    51 
 52     // only MANY volumes with one position are     52     // only MANY volumes with one position are supported
 53     if (curVTE->NPCopies() != 1) {                 53     if (curVTE->NPCopies() != 1) {
 54       G4String text = "G3toG4MANY: volume ";       54       G4String text = "G3toG4MANY: volume ";
 55       text = text + curVTE->GetName() + " whic     55       text = text + curVTE->GetName() + " which has MANY has not just one position.";
 56       G4Exception("G3toG4MANY()", "G3toG40010"     56       G4Exception("G3toG4MANY()", "G3toG40010",
 57                   FatalException, text);           57                   FatalException, text);
 58       return;                                      58       return;
 59     }                                              59     }  
 60                                                    60 
 61     #ifdef G3G4DEBUG                               61     #ifdef G3G4DEBUG
 62     G4cout << "G3toG4MANY  " << curVTE->GetNam     62     G4cout << "G3toG4MANY  " << curVTE->GetName() << " boolean" << G4endl;
 63     #endif                                         63     #endif
 64                                                    64 
 65     G4Transform3D transform = GetTransform3D(c     65     G4Transform3D transform = GetTransform3D(curVTE->GetG3PosCopy(0)); 
 66                                                    66     
 67     MakeBooleanSolids(curVTE, curVTE->GetOverl     67     MakeBooleanSolids(curVTE, curVTE->GetOverlaps(), transform.inverse());
 68   }                                                68   }
 69                                                    69 
 70   // process daughters                             70   // process daughters
 71   for (G4int i=0; i<curVTE->GetNoDaughters();      71   for (G4int i=0; i<curVTE->GetNoDaughters(); i++)
 72     G3toG4MANY(curVTE->GetDaughter(i));            72     G3toG4MANY(curVTE->GetDaughter(i));
 73 }                                                  73 }
 74                                                    74 
 75 void MakeBooleanSolids(G3VolTableEntry* curVTE     75 void MakeBooleanSolids(G3VolTableEntry* curVTE, G3VolTableEntryVector* overlaps,
 76            const G4Transform3D& transform)         76            const G4Transform3D& transform)
 77 {                                                  77 {          
 78   // loop over overlap VTEs                        78   // loop over overlap VTEs
 79   for (size_t i=0; i<overlaps->size(); i++){       79   for (size_t i=0; i<overlaps->size(); i++){
 80                                                    80    
 81     G3VolTableEntry* overlapVTE = (*overlaps)[     81     G3VolTableEntry* overlapVTE = (*overlaps)[i]; 
 82                                                    82 
 83      // loop over clone VTEs                       83      // loop over clone VTEs
 84     for (G4int ij=0; ij<overlapVTE->GetMasterC     84     for (G4int ij=0; ij<overlapVTE->GetMasterClone()->GetNoClones(); ij++){
 85                                                    85     
 86       G3VolTableEntry* cloneVTE = overlapVTE->     86       G3VolTableEntry* cloneVTE = overlapVTE->GetMasterClone()->GetClone(ij);   
 87                                                    87    
 88       // loop over clone positions                 88       // loop over clone positions
 89       for (G4int j=0; j<cloneVTE->NPCopies();      89       for (G4int j=0; j<cloneVTE->NPCopies(); j++){
 90                                                    90 
 91         #ifdef G3G4DEBUG                           91         #ifdef G3G4DEBUG
 92         G4cout << "From '" << curVTE->GetName(     92         G4cout << "From '" << curVTE->GetName() << "' "
 93          << "cut '" << cloneVTE->GetName() <<      93          << "cut '" << cloneVTE->GetName() << "' :"
 94          << i  << "th overlap (from " << overl     94          << i  << "th overlap (from " << overlaps->size() << ") "
 95          << ij << "th clone (from " << overlap     95          << ij << "th clone (from " << overlapVTE->GetMasterClone()->GetNoClones() << ") "
 96          << j  << "th copy (from " << cloneVTE     96          << j  << "th copy (from " << cloneVTE->NPCopies() << ")  "
 97          << G4endl;                                97          << G4endl;
 98         #endif                                     98         #endif
 99                                                    99 
100         SubstractSolids(curVTE, cloneVTE, j, t    100         SubstractSolids(curVTE, cloneVTE, j, transform); 
101       }                                           101       }
102     }                                             102     }    
103   }                                               103   }         
104 }                                                 104 }     
105                                                   105 
106 void SubstractSolids(G3VolTableEntry* vte1, G3    106 void SubstractSolids(G3VolTableEntry* vte1, G3VolTableEntry* vte2,
107                G4int copy, const G4Transform3D    107                G4int copy, const G4Transform3D& transform)
108 {                                                 108 {          
109   // vte2 transformation                          109   // vte2 transformation
110   G4Transform3D transform2 = GetTransform3D(vt    110   G4Transform3D transform2 = GetTransform3D(vte2->GetG3PosCopy(copy));
111                                                   111    
112   // compose new name                             112   // compose new name 
113   G4String newName = vte1->GetSolid()->GetName    113   G4String newName = vte1->GetSolid()->GetName();
114   newName = newName + "-" + vte2->GetSolid()->    114   newName = newName + "-" + vte2->GetSolid()->GetName();   
115                                                   115 
116   #ifdef G3G4DEBUG                                116   #ifdef G3G4DEBUG
117   G4cout << "   " << newName << G4endl;           117   G4cout << "   " << newName << G4endl; 
118   #endif                                          118   #endif
119                                                   119 
120   G4VSolid* newSolid                              120   G4VSolid* newSolid 
121     = new G4SubtractionSolid(newName, vte1->Ge    121     = new G4SubtractionSolid(newName, vte1->GetSolid(), vte2->GetSolid(),
122                              transform*transfo    122                              transform*transform2);
123                                                   123          
124   // update vte1                                  124   // update vte1
125   vte1->SetSolid(newSolid);                       125   vte1->SetSolid(newSolid);
126                                                   126 
127   // process daughters                            127   // process daughters
128   for (G4int k=0; k<vte1->GetNoDaughters(); k+    128   for (G4int k=0; k<vte1->GetNoDaughters(); k++){
129                                                   129           
130     G3VolTableEntry* dVTE = vte1->GetDaughter(    130     G3VolTableEntry* dVTE = vte1->GetDaughter(k);       
131                                                   131    
132     if (dVTE->NPCopies() != 1) {                  132     if (dVTE->NPCopies() != 1) {
133       G4String text = "G3toG4MANY: volume ";      133       G4String text = "G3toG4MANY: volume ";
134       text = text + dVTE->GetName() + " which     134       text = text + dVTE->GetName() + " which has MANY has not just one position.";
135       G4Exception("G3toG4MANY()", "G3toG40011"    135       G4Exception("G3toG4MANY()", "G3toG40011",
136                   FatalException, text);          136                   FatalException, text);
137       return;                                     137       return;
138     }                                             138     }
139                                                   139     
140     G4Transform3D dt = GetTransform3D(dVTE->Ge    140     G4Transform3D dt = GetTransform3D(dVTE->GetG3PosCopy(0)); 
141     SubstractSolids(dVTE, vte2, copy, dt.inver    141     SubstractSolids(dVTE, vte2, copy, dt.inverse()*transform);
142   }                                               142   } 
143 }                                                 143 }     
144                                                   144 
145 G4Transform3D GetTransform3D(G3Pos* g3pos)        145 G4Transform3D GetTransform3D(G3Pos* g3pos)
146 {                                                 146 {
147   G4int irot = g3pos->GetIrot();                  147   G4int irot = g3pos->GetIrot();
148   G4RotationMatrix* theMatrix = 0;                148   G4RotationMatrix* theMatrix = 0;
149   if (irot>0) theMatrix = G3Rot.Get(irot);        149   if (irot>0) theMatrix = G3Rot.Get(irot);
150                                                   150   
151   G4Rotate3D rotation;                            151   G4Rotate3D rotation;
152   if (theMatrix) {                                152   if (theMatrix) {            
153      rotation = G4Rotate3D(*theMatrix);           153      rotation = G4Rotate3D(*theMatrix);
154   }                                               154   }
155                                                   155 
156   G4Translate3D translation(*(g3pos->GetPos())    156   G4Translate3D translation(*(g3pos->GetPos()));
157   G4Transform3D transform3D = translation * (r    157   G4Transform3D transform3D = translation * (rotation.inverse());
158                                                   158   
159   return transform3D;                             159   return transform3D;
160 }                                                 160 }
161                                                   161 
162                                                   162 
163                                                   163