Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/g3tog4/src/G3NegVolPars.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 ]

  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 //
 28 // modified by I. Hrivnacova, 13.10.99 
 29 
 30 #include "globals.hh"
 31 #include "G3VolTable.hh"
 32 #include "G4VSolid.hh"
 33 #include "G3toG4.hh"
 34 #include <cmath>
 35 
 36 G4bool G3CalcParamsFn(G4double *rpar, G4int npar, G4double *rparm,
 37                       G4String shape, G4String shapem)
 38   // Returns true only in case the parameters *after* processing
 39   // this method remain negative.
 40 {
 41   G4bool NegPresent = FALSE;
 42   // for normal single volume positioning, just substitute for the
 43   // negative parameters
 44   // treat only the legal cases
 45   if (shapem == shape) {
 46     if (shape == "BOX" || shape == "TRD1" || shape == "TRD2" || 
 47         shape == "ELTU") {
 48       for (G4int i=0;i<npar;i++) {
 49         if (rpar[i] < 0) {
 50           if (rparm != 0) rpar[i] = rparm[i];
 51     if (rpar[i] < 0) NegPresent = TRUE;
 52         }
 53       }
 54     }
 55     if (shape == "TRAP") {
 56       for (G4int i=0;i<11;i++) {
 57         if (i != 1 && i != 2 && i != 6 && i != 10) {
 58           if (rpar[i]<0) {
 59             if (rparm != 0) rpar[i] = rparm[i];
 60       if (rpar[i] < 0) NegPresent = TRUE;
 61     }  
 62         }
 63       }
 64     }
 65     if (shape == "TUBE" || shape == "TUBS" || shape == "PARA") {
 66       for (G4int i=0;i<3;i++) {
 67         if (rpar[i] < 0) {
 68           if (rparm != 0) rpar[i] = rparm[i];
 69     if (rpar[i] < 0) NegPresent = TRUE;
 70         }
 71       }
 72     }
 73     if (shape == "CONE" || shape == "CONS") {
 74       for (G4int i=0;i<5;i++) {
 75         if (rpar[i] < 0) {
 76           if (rparm != 0) rpar[i] = rparm[i];
 77     if (rpar[i] < 0) NegPresent = TRUE;
 78         }
 79       }
 80     }
 81     if (shape == "SPHE") {
 82       for (G4int i=0;i<2;i++) {
 83         if (rpar[i] < 0) {
 84           if (rparm != 0) rpar[i] = rparm[i];
 85     if (rpar[i] < 0) NegPresent = TRUE;
 86         }
 87       }
 88     }
 89     if (shape == "PGON") {
 90       G4int nz = G4int(rpar[3]);
 91       G4int ipl;
 92       for (G4int i=0;i<nz;i++) {
 93         ipl = 5 + i*3;
 94         if (rpar[ipl] < 0) {
 95           if (rparm != 0) rpar[ipl] = rparm[ipl];
 96     if (rpar[ipl] < 0) NegPresent = TRUE;
 97         }
 98         if (rpar[ipl+1] < 0) {
 99           if (rparm != 0)  rpar[ipl] = rparm[ipl];
100     if (rpar[ipl] < 0) NegPresent = TRUE;
101         }
102       }
103     }
104     if (shape == "PCON") {
105       G4int nz = G4int(rpar[2]);
106       G4int ipl;
107       for (G4int i=0;i<nz;i++) {
108         ipl = 4 + i*3;
109         if (rpar[ipl] < 0) {
110           if (rparm != 0) rpar[ipl] = rparm[ipl];
111     if (rpar[ipl] < 0) NegPresent = TRUE;
112         }
113         if (rpar[ipl+1] < 0) {
114           // TO DO
115     // check - folowing argument might be ipl+1
116           if (rparm != 0) rpar[ipl] = rparm[ipl];
117     if (rpar[ipl] < 0) NegPresent = TRUE;
118         }
119       }
120     }
121   }
122 
123   if (shape == "BOX") {
124     if (shapem == "TRD1") {
125       if (rpar[1] < 0) {
126         if (rparm != 0) rpar[1] = rparm[2];
127   if (rpar[1] < 0) NegPresent = TRUE;
128       }
129       if (rpar[2] < 0) {
130         if (rparm != 0) rpar[2] = rparm[3];
131   if (rpar[2] < 0) NegPresent = TRUE;
132       }
133       if (rpar[0] < 0) {
134         if (rparm != 0) rpar[0] = std::min(rparm[0],rparm[1]) +
135                                   std::abs(rparm[0]-rparm[1])*.5*rpar[2]/rparm[3];
136   if (rpar[0] < 0) NegPresent = TRUE;
137       }
138     }
139     if (shapem == "TRD2") {
140       if (rpar[2] < 0) {
141         if (rparm != 0) rpar[2] = rparm[4];
142         if (rpar[2]<0) NegPresent = TRUE;
143       }
144       if (rpar[0] < 0) {
145         if (rparm != 0) rpar[0] = std::min(rparm[0],rparm[1]) +
146                                   std::abs(rparm[0]-rparm[1])*.5*rpar[2]/rparm[4];
147         if (rpar[0]<0) NegPresent = TRUE;
148       }
149       if (rpar[1] < 0) {
150         if (rparm != 0) rpar[1] = std::min(rparm[2],rparm[3]) +
151                                   std::abs(rparm[2]-rparm[3])*.5*rpar[2]/rparm[4];
152         if (rpar[1]<0) NegPresent = TRUE;
153       }
154     }
155     if (shapem == "TRAP") {
156       if (rpar[2] < 0) {
157         if (rparm != 0) rpar[2] = rparm[0];
158         if (rpar[2] < 0) NegPresent = TRUE;
159       }
160       if (rpar[0] < 0) {
161         if (rparm != 0) {
162           G4double xlo = std::min(rparm[4],rparm[8]) +
163             std::abs(rparm[4]-rparm[8])*.5*rpar[2]/rparm[0];
164           G4double xhi = std::min(rparm[5],rparm[9]) +
165             std::abs(rparm[5]-rparm[9])*.5*rpar[2]/rparm[0];
166           rpar[0] = std::min(xlo,xhi);
167         }
168         if (rpar[0] < 0) NegPresent = TRUE;
169       }
170       if (rpar[1] < 0) {
171         if (rparm != 0) rpar[1] = std::min(rparm[3],rparm[7]) +
172                         std::abs(rparm[3]-rparm[7])*.5*rpar[2]/rparm[0];
173         if (rpar[1] < 0) NegPresent = TRUE;
174       }
175     }
176   }
177   return NegPresent;
178 }
179 
180 G4bool G3NegVolPars(G4double pars[], G4int *nparpt,
181                     G3VolTableEntry* vte,
182                     G3VolTableEntry* mvte, const char routine[])
183 {
184   G4bool NegPresent = FALSE;
185 
186   // retrieve parameters 
187 
188   // the volume
189   G4String shape = vte->GetShape();
190   G4double* rpar = vte->GetRpar();
191   G4int npar = vte->GetNpar();  
192   if (npar ==0) {
193     // no solid parameters are defined in vte
194     npar = *nparpt;
195     rpar = pars;
196   }
197   else {  
198     // solid parameters are already defined in vte
199     // pars[], nparpt are ignored
200     // TO DO: check if g3 ignores them too or resets
201     // vte parameters according to this new ones !!
202   }  
203       
204   // mother
205   G4String shapem = mvte->GetShape();
206   G4double* rparm = mvte->GetRpar();
207 
208   if (strcmp(routine,"GSPOS") == 0 || strcmp(routine,"GSVOLU") == 0) {
209     NegPresent = G3CalcParamsFn(rpar,npar,rparm,shape,shapem);
210   }
211   if (strcmp(routine,"GSDVN") == 0) {
212     // just set the flag. The parametrization function figures out
213     // what to do.
214     for (G4int i=0;i<npar;i++) {
215       if (rpar[i] < 0) {
216         NegPresent = TRUE;
217       }
218     }
219   }
220   return NegPresent;
221 }
222