Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer << 3 // * DISCLAIMER * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th << 5 // * The following disclaimer summarizes all the specific disclaimers * 6 // * the Geant4 Collaboration. It is provided << 6 // * of contributors to this software. The specific disclaimers,which * 7 // * conditions of the Geant4 Software License << 7 // * govern, are listed with their locations in: * 8 // * LICENSE and available at http://cern.ch/ << 8 // * http://cern.ch/geant4/license * 9 // * include a list of copyright holders. << 10 // * 9 // * * 11 // * Neither the authors of this software syst 10 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 11 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 12 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 13 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file << 14 // * use. * 16 // * for the full disclaimer and the limitatio << 17 // * 15 // * * 18 // * This code implementation is the result << 16 // * This code implementation is the intellectual property of the * 19 // * technical work of the GEANT4 collaboratio << 17 // * GEANT4 collaboration. * 20 // * By using, copying, modifying or distri << 18 // * By copying, distributing or modifying the Program (or any work * 21 // * any work based on the software) you ag << 19 // * based on the Program) you indicate your acceptance of this * 22 // * use in resulting scientific publicati << 20 // * statement, and all its terms. * 23 // * acceptance of all terms of the Geant4 Sof << 24 // ******************************************* 21 // ******************************************************************** 25 // 22 // 26 // 23 // >> 24 // $Id: G3NegVolPars.cc,v 1.10 2003/06/16 16:50:50 gunter Exp $ >> 25 // GEANT4 tag $Name: geant4-05-02 $ 27 // 26 // 28 // modified by I. Hrivnacova, 13.10.99 27 // modified by I. Hrivnacova, 13.10.99 29 28 30 #include "globals.hh" 29 #include "globals.hh" 31 #include "G3VolTable.hh" 30 #include "G3VolTable.hh" 32 #include "G4VSolid.hh" 31 #include "G4VSolid.hh" 33 #include "G3toG4.hh" 32 #include "G3toG4.hh" 34 #include <cmath> << 33 #include <math.h> 35 34 36 G4bool G3CalcParamsFn(G4double *rpar, G4int np << 35 G4bool G3CalcParamsFn(G4double *Rpar, G4int npar, G4double *Rparm, 37 G4String shape, G4String 36 G4String shape, G4String shapem) 38 // Returns true only in case the parameters 37 // Returns true only in case the parameters *after* processing 39 // this method remain negative. 38 // this method remain negative. 40 { 39 { 41 G4bool NegPresent = FALSE; 40 G4bool NegPresent = FALSE; 42 // for normal single volume positioning, jus 41 // for normal single volume positioning, just substitute for the 43 // negative parameters 42 // negative parameters 44 // treat only the legal cases 43 // treat only the legal cases 45 if (shapem == shape) { 44 if (shapem == shape) { 46 if (shape == "BOX" || shape == "TRD1" || s 45 if (shape == "BOX" || shape == "TRD1" || shape == "TRD2" || 47 shape == "ELTU") { 46 shape == "ELTU") { 48 for (G4int i=0;i<npar;i++) { 47 for (G4int i=0;i<npar;i++) { 49 if (rpar[i] < 0) { << 48 if (Rpar[i] < 0) { 50 if (rparm != 0) rpar[i] = rparm[i]; << 49 if (Rparm != 0) Rpar[i] = Rparm[i]; 51 if (rpar[i] < 0) NegPresent = TRUE; << 50 if (Rpar[i] < 0) NegPresent = TRUE; 52 } 51 } 53 } 52 } 54 } 53 } 55 if (shape == "TRAP") { 54 if (shape == "TRAP") { 56 for (G4int i=0;i<11;i++) { 55 for (G4int i=0;i<11;i++) { 57 if (i != 1 && i != 2 && i != 6 && i != 56 if (i != 1 && i != 2 && i != 6 && i != 10) { 58 if (rpar[i]<0) { << 57 if (Rpar[i]<0) { 59 if (rparm != 0) rpar[i] = rparm[i] << 58 if (Rparm != 0) Rpar[i] = Rparm[i]; 60 if (rpar[i] < 0) NegPresent = TRUE; << 59 if (Rpar[i] < 0) NegPresent = TRUE; 61 } 60 } 62 } 61 } 63 } 62 } 64 } 63 } 65 if (shape == "TUBE" || shape == "TUBS" || 64 if (shape == "TUBE" || shape == "TUBS" || shape == "PARA") { 66 for (G4int i=0;i<3;i++) { 65 for (G4int i=0;i<3;i++) { 67 if (rpar[i] < 0) { << 66 if (Rpar[i] < 0) { 68 if (rparm != 0) rpar[i] = rparm[i]; << 67 if (Rparm != 0) Rpar[i] = Rparm[i]; 69 if (rpar[i] < 0) NegPresent = TRUE; << 68 if (Rpar[i] < 0) NegPresent = TRUE; 70 } 69 } 71 } 70 } 72 } 71 } 73 if (shape == "CONE" || shape == "CONS") { 72 if (shape == "CONE" || shape == "CONS") { 74 for (G4int i=0;i<5;i++) { 73 for (G4int i=0;i<5;i++) { 75 if (rpar[i] < 0) { << 74 if (Rpar[i] < 0) { 76 if (rparm != 0) rpar[i] = rparm[i]; << 75 if (Rparm != 0) Rpar[i] = Rparm[i]; 77 if (rpar[i] < 0) NegPresent = TRUE; << 76 if (Rpar[i] < 0) NegPresent = TRUE; 78 } 77 } 79 } 78 } 80 } 79 } 81 if (shape == "SPHE") { 80 if (shape == "SPHE") { 82 for (G4int i=0;i<2;i++) { 81 for (G4int i=0;i<2;i++) { 83 if (rpar[i] < 0) { << 82 if (Rpar[i] < 0) { 84 if (rparm != 0) rpar[i] = rparm[i]; << 83 if (Rparm != 0) Rpar[i] = Rparm[i]; 85 if (rpar[i] < 0) NegPresent = TRUE; << 84 if (Rpar[i] < 0) NegPresent = TRUE; 86 } 85 } 87 } 86 } 88 } 87 } 89 if (shape == "PGON") { 88 if (shape == "PGON") { 90 G4int nz = G4int(rpar[3]); << 89 G4int nz = int(Rpar[3]); 91 G4int ipl; 90 G4int ipl; 92 for (G4int i=0;i<nz;i++) { 91 for (G4int i=0;i<nz;i++) { 93 ipl = 5 + i*3; 92 ipl = 5 + i*3; 94 if (rpar[ipl] < 0) { << 93 if (Rpar[ipl] < 0) { 95 if (rparm != 0) rpar[ipl] = rparm[ip << 94 if (Rparm != 0) Rpar[ipl] = Rparm[ipl]; 96 if (rpar[ipl] < 0) NegPresent = TRUE; << 95 if (Rpar[ipl] < 0) NegPresent = TRUE; 97 } << 96 } 98 if (rpar[ipl+1] < 0) { << 97 if (Rpar[ipl+1] < 0) { 99 if (rparm != 0) rpar[ipl] = rparm[i << 98 if (Rparm != 0) Rpar[ipl] = Rparm[ipl]; 100 if (rpar[ipl] < 0) NegPresent = TRUE; << 99 if (Rpar[ipl] < 0) NegPresent = TRUE; 101 } 100 } 102 } 101 } 103 } 102 } 104 if (shape == "PCON") { 103 if (shape == "PCON") { 105 G4int nz = G4int(rpar[2]); << 104 G4int nz = int(Rpar[2]); 106 G4int ipl; 105 G4int ipl; 107 for (G4int i=0;i<nz;i++) { 106 for (G4int i=0;i<nz;i++) { 108 ipl = 4 + i*3; 107 ipl = 4 + i*3; 109 if (rpar[ipl] < 0) { << 108 if (Rpar[ipl] < 0) { 110 if (rparm != 0) rpar[ipl] = rparm[ip << 109 if (Rparm != 0) Rpar[ipl] = Rparm[ipl]; 111 if (rpar[ipl] < 0) NegPresent = TRUE; << 110 if (Rpar[ipl] < 0) NegPresent = TRUE; 112 } 111 } 113 if (rpar[ipl+1] < 0) { << 112 if (Rpar[ipl+1] < 0) { 114 // TO DO 113 // TO DO 115 // check - folowing argument might be ipl+ 114 // check - folowing argument might be ipl+1 116 if (rparm != 0) rpar[ipl] = rparm[ip << 115 if (Rparm != 0) Rpar[ipl] = Rparm[ipl]; 117 if (rpar[ipl] < 0) NegPresent = TRUE; << 116 if (Rpar[ipl] < 0) NegPresent = TRUE; 118 } 117 } 119 } 118 } 120 } 119 } 121 } 120 } 122 121 123 if (shape == "BOX") { 122 if (shape == "BOX") { 124 if (shapem == "TRD1") { 123 if (shapem == "TRD1") { 125 if (rpar[1] < 0) { << 124 if (Rpar[1] < 0) { 126 if (rparm != 0) rpar[1] = rparm[2]; << 125 if (Rparm != 0) Rpar[1] = Rparm[2]; 127 if (rpar[1] < 0) NegPresent = TRUE; << 126 if (Rpar[1] < 0) NegPresent = TRUE; 128 } << 127 } 129 if (rpar[2] < 0) { << 128 if (Rpar[2] < 0) { 130 if (rparm != 0) rpar[2] = rparm[3]; << 129 if (Rparm != 0) Rpar[2] = Rparm[3]; 131 if (rpar[2] < 0) NegPresent = TRUE; << 130 if (Rpar[2] < 0) NegPresent = TRUE; 132 } << 131 } 133 if (rpar[0] < 0) { << 132 if (Rpar[0] < 0) { 134 if (rparm != 0) rpar[0] = std::min(rpa << 133 if (Rparm != 0) Rpar[0] = std::min(Rparm[0],Rparm[1]) + 135 std::abs(rpa << 134 abs(Rparm[0]-Rparm[1])*.5*Rpar[2]/Rparm[3]; 136 if (rpar[0] < 0) NegPresent = TRUE; << 135 if (Rpar[0] < 0) NegPresent = TRUE; 137 } 136 } 138 } 137 } 139 if (shapem == "TRD2") { 138 if (shapem == "TRD2") { 140 if (rpar[2] < 0) { << 139 if (Rpar[2] < 0) { 141 if (rparm != 0) rpar[2] = rparm[4]; << 140 if (Rparm != 0) Rpar[2] = Rparm[4]; 142 if (rpar[2]<0) NegPresent = TRUE; << 141 if (Rpar[2]<0) NegPresent = TRUE; 143 } << 142 } 144 if (rpar[0] < 0) { << 143 if (Rpar[0] < 0) { 145 if (rparm != 0) rpar[0] = std::min(rpa << 144 if (Rparm != 0) Rpar[0] = std::min(Rparm[0],Rparm[1]) + 146 std::abs(rpa << 145 abs(Rparm[0]-Rparm[1])*.5*Rpar[2]/Rparm[4]; 147 if (rpar[0]<0) NegPresent = TRUE; << 146 if (Rpar[0]<0) NegPresent = TRUE; 148 } << 147 } 149 if (rpar[1] < 0) { << 148 if (Rpar[1] < 0) { 150 if (rparm != 0) rpar[1] = std::min(rpa << 149 if (Rparm != 0) Rpar[1] = std::min(Rparm[2],Rparm[3]) + 151 std::abs(rpa << 150 abs(Rparm[2]-Rparm[3])*.5*Rpar[2]/Rparm[4]; 152 if (rpar[1]<0) NegPresent = TRUE; << 151 if (Rpar[1]<0) NegPresent = TRUE; 153 } 152 } 154 } 153 } 155 if (shapem == "TRAP") { 154 if (shapem == "TRAP") { 156 if (rpar[2] < 0) { << 155 if (Rpar[2] < 0) { 157 if (rparm != 0) rpar[2] = rparm[0]; << 156 if (Rparm != 0) Rpar[2] = Rparm[0]; 158 if (rpar[2] < 0) NegPresent = TRUE; << 157 if (Rpar[2] < 0) NegPresent = TRUE; 159 } << 158 } 160 if (rpar[0] < 0) { << 159 if (Rpar[0] < 0) { 161 if (rparm != 0) { << 160 if (Rparm != 0) { 162 G4double xlo = std::min(rparm[4],rpa << 161 G4double xlo = std::min(Rparm[4],Rparm[8]) + 163 std::abs(rparm[4]-rparm[8])*.5*rpa << 162 abs(Rparm[4]-Rparm[8])*.5*Rpar[2]/Rparm[0]; 164 G4double xhi = std::min(rparm[5],rpa << 163 G4double xhi = std::min(Rparm[5],Rparm[9]) + 165 std::abs(rparm[5]-rparm[9])*.5*rpa << 164 abs(Rparm[5]-Rparm[9])*.5*Rpar[2]/Rparm[0]; 166 rpar[0] = std::min(xlo,xhi); << 165 Rpar[0] = std::min(xlo,xhi); 167 } << 166 } 168 if (rpar[0] < 0) NegPresent = TRUE; << 167 if (Rpar[0] < 0) NegPresent = TRUE; 169 } << 168 } 170 if (rpar[1] < 0) { << 169 if (Rpar[1] < 0) { 171 if (rparm != 0) rpar[1] = std::min(rpa << 170 if (Rparm != 0) Rpar[1] = std::min(Rparm[3],Rparm[7]) + 172 std::abs(rparm[3]-rpar << 171 abs(Rparm[3]-Rparm[7])*.5*Rpar[2]/Rparm[0]; 173 if (rpar[1] < 0) NegPresent = TRUE; << 172 if (Rpar[1] < 0) NegPresent = TRUE; 174 } 173 } 175 } 174 } 176 } 175 } 177 return NegPresent; 176 return NegPresent; 178 } 177 } 179 178 180 G4bool G3NegVolPars(G4double pars[], G4int *np 179 G4bool G3NegVolPars(G4double pars[], G4int *nparpt, 181 G3VolTableEntry* vte, 180 G3VolTableEntry* vte, 182 G3VolTableEntry* mvte, con 181 G3VolTableEntry* mvte, const char routine[]) 183 { 182 { 184 G4bool NegPresent = FALSE; 183 G4bool NegPresent = FALSE; 185 184 186 // retrieve parameters 185 // retrieve parameters 187 186 188 // the volume 187 // the volume 189 G4String shape = vte->GetShape(); 188 G4String shape = vte->GetShape(); 190 G4double* rpar = vte->GetRpar(); << 189 G4double* Rpar = vte->GetRpar(); 191 G4int npar = vte->GetNpar(); 190 G4int npar = vte->GetNpar(); 192 if (npar ==0) { 191 if (npar ==0) { 193 // no solid parameters are defined in vte 192 // no solid parameters are defined in vte 194 npar = *nparpt; 193 npar = *nparpt; 195 rpar = pars; << 194 Rpar = pars; 196 } 195 } 197 else { 196 else { 198 // solid parameters are already defined in 197 // solid parameters are already defined in vte 199 // pars[], nparpt are ignored 198 // pars[], nparpt are ignored 200 // TO DO: check if g3 ignores them too or 199 // TO DO: check if g3 ignores them too or resets 201 // vte parameters according to this new on 200 // vte parameters according to this new ones !! 202 } 201 } 203 202 204 // mother 203 // mother 205 G4String shapem = mvte->GetShape(); 204 G4String shapem = mvte->GetShape(); 206 G4double* rparm = mvte->GetRpar(); << 205 G4double* Rparm = mvte->GetRpar(); 207 206 208 if (strcmp(routine,"GSPOS") == 0 || strcmp(r 207 if (strcmp(routine,"GSPOS") == 0 || strcmp(routine,"GSVOLU") == 0) { 209 NegPresent = G3CalcParamsFn(rpar,npar,rpar << 208 NegPresent = G3CalcParamsFn(Rpar,npar,Rparm,shape,shapem); 210 } 209 } 211 if (strcmp(routine,"GSDVN") == 0) { 210 if (strcmp(routine,"GSDVN") == 0) { 212 // just set the flag. The parametrization 211 // just set the flag. The parametrization function figures out 213 // what to do. 212 // what to do. 214 for (G4int i=0;i<npar;i++) { 213 for (G4int i=0;i<npar;i++) { 215 if (rpar[i] < 0) { << 214 if (Rpar[i] < 0) { 216 NegPresent = TRUE; 215 NegPresent = TRUE; 217 } 216 } 218 } 217 } 219 } 218 } 220 return NegPresent; 219 return NegPresent; 221 } 220 } 222 221