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