source: trunk/source/g3tog4/src/G3toG4MANY.cc @ 817

Last change on this file since 817 was 817, checked in by garnier, 16 years ago

import all except CVS

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