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