Import Geant4 9.2.0 source tree
This commit is contained in:
@@ -24,8 +24,8 @@
|
||||
// ********************************************************************
|
||||
//
|
||||
//
|
||||
// $Id: G4Polyhedra.cc,v 1.36 2007/07/12 15:52:21 gcosmo Exp $
|
||||
// GEANT4 tag $Name: geant4-09-01 $
|
||||
// $Id: G4Polyhedra.cc,v 1.42 2008/05/15 13:45:15 gcosmo Exp $
|
||||
// GEANT4 tag $Name: geant4-09-02 $
|
||||
//
|
||||
//
|
||||
// --------------------------------------------------------------------
|
||||
@@ -673,210 +673,218 @@ G4ThreeVector G4Polyhedra::GetPointOnTriangle(G4ThreeVector p1,
|
||||
//
|
||||
G4ThreeVector G4Polyhedra::GetPointOnSurface() const
|
||||
{
|
||||
G4int j, numPlanes = original_parameters->Num_z_planes, Flag=0;
|
||||
G4double chose, totArea=0., Achose1, Achose2,
|
||||
rad1, rad2, sinphi1, sinphi2, cosphi1, cosphi2;
|
||||
G4double a, b, l2, rang,
|
||||
totalPhi,ksi,
|
||||
area, aTop=0., aBottom=0.,zVal=0.;
|
||||
G4ThreeVector p0, p1, p2, p3;
|
||||
std::vector<G4double> aVector1;
|
||||
std::vector<G4double> aVector2;
|
||||
std::vector<G4double> aVector3;
|
||||
if( !genericPgon ) // Polyhedra by faces
|
||||
{
|
||||
G4int j, numPlanes = original_parameters->Num_z_planes, Flag=0;
|
||||
G4double chose, totArea=0., Achose1, Achose2,
|
||||
rad1, rad2, sinphi1, sinphi2, cosphi1, cosphi2;
|
||||
G4double a, b, l2, rang, totalPhi, ksi,
|
||||
area, aTop=0., aBottom=0., zVal=0.;
|
||||
|
||||
totalPhi= (phiIsOpen) ? (endPhi-startPhi) : twopi;
|
||||
ksi = totalPhi/numSide;
|
||||
G4double cosksi = std::cos(ksi/2.);
|
||||
G4ThreeVector p0, p1, p2, p3;
|
||||
std::vector<G4double> aVector1;
|
||||
std::vector<G4double> aVector2;
|
||||
std::vector<G4double> aVector3;
|
||||
|
||||
// below we generate the areas relevant to our solid
|
||||
//
|
||||
for(j=0; j<numPlanes-1; j++)
|
||||
{
|
||||
a = original_parameters->Rmax[j+1];
|
||||
b = original_parameters->Rmax[j];
|
||||
l2 = sqr(original_parameters->Z_values[j]
|
||||
-original_parameters->Z_values[j+1]) + sqr(b-a);
|
||||
area = std::sqrt(l2-sqr((a-b)*cosksi))*(a+b)*cosksi;
|
||||
aVector1.push_back(area);
|
||||
}
|
||||
|
||||
for(j=0; j<numPlanes-1; j++)
|
||||
{
|
||||
a = original_parameters->Rmin[j+1];//*cosksi;
|
||||
b = original_parameters->Rmin[j];//*cosksi;
|
||||
l2 = sqr(original_parameters->Z_values[j]
|
||||
-original_parameters->Z_values[j+1]) + sqr(b-a);
|
||||
area = std::sqrt(l2-sqr((a-b)*cosksi))*(a+b)*cosksi;
|
||||
aVector2.push_back(area);
|
||||
}
|
||||
|
||||
for(j=0; j<numPlanes-1; j++)
|
||||
{
|
||||
if(phiIsOpen == true)
|
||||
totalPhi= (phiIsOpen) ? (endPhi-startPhi) : twopi;
|
||||
ksi = totalPhi/numSide;
|
||||
G4double cosksi = std::cos(ksi/2.);
|
||||
|
||||
// Below we generate the areas relevant to our solid
|
||||
//
|
||||
for(j=0; j<numPlanes-1; j++)
|
||||
{
|
||||
aVector3.push_back(0.5*(original_parameters->Rmax[j]
|
||||
-original_parameters->Rmin[j]
|
||||
+original_parameters->Rmax[j+1]
|
||||
-original_parameters->Rmin[j+1])
|
||||
*std::fabs(original_parameters->Z_values[j+1]
|
||||
-original_parameters->Z_values[j]));
|
||||
a = original_parameters->Rmax[j+1];
|
||||
b = original_parameters->Rmax[j];
|
||||
l2 = sqr(original_parameters->Z_values[j]
|
||||
-original_parameters->Z_values[j+1]) + sqr(b-a);
|
||||
area = std::sqrt(l2-sqr((a-b)*cosksi))*(a+b)*cosksi;
|
||||
aVector1.push_back(area);
|
||||
}
|
||||
else { aVector3.push_back(0.); }
|
||||
}
|
||||
|
||||
for(j=0; j<numPlanes-1; j++)
|
||||
{
|
||||
totArea += numSide*(aVector1[j]+aVector2[j])+2.*aVector3[j];
|
||||
}
|
||||
|
||||
// must include top and bottom areas
|
||||
if(original_parameters->Rmax[numPlanes-1] != 0.)
|
||||
{
|
||||
a = original_parameters->Rmax[numPlanes-1];
|
||||
b = original_parameters->Rmin[numPlanes-1];
|
||||
l2 = sqr(a-b);
|
||||
aTop = std::sqrt(l2-sqr((a-b)*cosksi))*(a+b)*cosksi;
|
||||
}
|
||||
|
||||
if(original_parameters->Rmax[0] != 0.)
|
||||
{
|
||||
a = original_parameters->Rmax[0];
|
||||
b = original_parameters->Rmin[0];
|
||||
l2 = sqr(a-b);
|
||||
aBottom = std::sqrt(l2-sqr((a-b)*cosksi))*(a+b)*cosksi;
|
||||
}
|
||||
|
||||
Achose1 = 0.;
|
||||
Achose2 = numSide*(aVector1[0]+aVector2[0])+2.*aVector3[0];
|
||||
|
||||
chose = RandFlat::shoot(0.,totArea+aTop+aBottom);
|
||||
if( (chose >= 0.) && (chose < aTop + aBottom) )
|
||||
{
|
||||
|
||||
chose = RandFlat::shoot(startPhi,startPhi+totalPhi);
|
||||
rang = std::floor((chose-startPhi)/ksi-0.01);
|
||||
if(rang<0)rang=0;
|
||||
rang = std::fabs(rang);
|
||||
sinphi1 = std::sin(startPhi+rang*ksi);
|
||||
sinphi2 = std::sin(startPhi+(rang+1)*ksi);
|
||||
cosphi1 = std::cos(startPhi+rang*ksi);
|
||||
cosphi2 = std::cos(startPhi+(rang+1)*ksi);
|
||||
chose = RandFlat::shoot(0., aTop + aBottom);
|
||||
if(chose>=0. && chose<aTop)
|
||||
for(j=0; j<numPlanes-1; j++)
|
||||
{
|
||||
rad1 = original_parameters->Rmin[numPlanes-1];
|
||||
rad2 = original_parameters->Rmax[numPlanes-1];
|
||||
zVal = original_parameters->Z_values[numPlanes-1];
|
||||
a = original_parameters->Rmin[j+1];//*cosksi;
|
||||
b = original_parameters->Rmin[j];//*cosksi;
|
||||
l2 = sqr(original_parameters->Z_values[j]
|
||||
-original_parameters->Z_values[j+1]) + sqr(b-a);
|
||||
area = std::sqrt(l2-sqr((a-b)*cosksi))*(a+b)*cosksi;
|
||||
aVector2.push_back(area);
|
||||
}
|
||||
else
|
||||
{
|
||||
rad1 = original_parameters->Rmin[0];
|
||||
rad2 = original_parameters->Rmax[0];
|
||||
zVal = original_parameters->Z_values[0];
|
||||
}
|
||||
p0 = G4ThreeVector(rad1*cosphi1,rad1*sinphi1,zVal);
|
||||
p1 = G4ThreeVector(rad2*cosphi1,rad2*sinphi1,zVal);
|
||||
p2 = G4ThreeVector(rad2*cosphi2,rad2*sinphi2,zVal);
|
||||
p3 = G4ThreeVector(rad1*cosphi2,rad1*sinphi2,zVal);
|
||||
return GetPointOnPlane(p0,p1,p2,p3);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (j=0; j< numPlanes-1; j++)
|
||||
{
|
||||
if(chose>=Achose1 && chose < Achose2){ Flag = j; }
|
||||
Achose1 += numSide*(aVector1[j]+aVector2[j])+2.*aVector3[j];
|
||||
Achose2 = Achose1 + numSide*(aVector1[j+1]+aVector2[j+1])
|
||||
+ 2.*aVector3[j+1];
|
||||
}
|
||||
}
|
||||
|
||||
// at this point we have chosen a subsection
|
||||
// between to adjacent plane cuts...
|
||||
|
||||
j = Flag;
|
||||
|
||||
totArea = numSide*(aVector1[j]+aVector2[j])+2.*aVector3[j];
|
||||
chose = RandFlat::shoot(0.,totArea);
|
||||
|
||||
if( (chose>=0.) && (chose<numSide*aVector1[j]) )
|
||||
{
|
||||
chose = RandFlat::shoot(startPhi,startPhi+totalPhi);
|
||||
rang = std::floor((chose-startPhi)/ksi-0.01);
|
||||
if(rang<0)rang=0;
|
||||
rang = std::fabs(rang);
|
||||
rad1 = original_parameters->Rmax[j];
|
||||
rad2 = original_parameters->Rmax[j+1];
|
||||
sinphi1 = std::sin(startPhi+rang*ksi);
|
||||
sinphi2 = std::sin(startPhi+(rang+1)*ksi);
|
||||
cosphi1 = std::cos(startPhi+rang*ksi);
|
||||
cosphi2 = std::cos(startPhi+(rang+1)*ksi);
|
||||
zVal = original_parameters->Z_values[j];
|
||||
|
||||
p0 = G4ThreeVector(rad1*cosphi1,rad1*sinphi1,zVal);
|
||||
p1 = G4ThreeVector(rad1*cosphi2,rad1*sinphi2,zVal);
|
||||
for(j=0; j<numPlanes-1; j++)
|
||||
{
|
||||
if(phiIsOpen == true)
|
||||
{
|
||||
aVector3.push_back(0.5*(original_parameters->Rmax[j]
|
||||
-original_parameters->Rmin[j]
|
||||
+original_parameters->Rmax[j+1]
|
||||
-original_parameters->Rmin[j+1])
|
||||
*std::fabs(original_parameters->Z_values[j+1]
|
||||
-original_parameters->Z_values[j]));
|
||||
}
|
||||
else { aVector3.push_back(0.); }
|
||||
}
|
||||
|
||||
for(j=0; j<numPlanes-1; j++)
|
||||
{
|
||||
totArea += numSide*(aVector1[j]+aVector2[j])+2.*aVector3[j];
|
||||
}
|
||||
|
||||
// Must include top and bottom areas
|
||||
//
|
||||
if(original_parameters->Rmax[numPlanes-1] != 0.)
|
||||
{
|
||||
a = original_parameters->Rmax[numPlanes-1];
|
||||
b = original_parameters->Rmin[numPlanes-1];
|
||||
l2 = sqr(a-b);
|
||||
aTop = std::sqrt(l2-sqr((a-b)*cosksi))*(a+b)*cosksi;
|
||||
}
|
||||
|
||||
zVal = original_parameters->Z_values[j+1];
|
||||
if(original_parameters->Rmax[0] != 0.)
|
||||
{
|
||||
a = original_parameters->Rmax[0];
|
||||
b = original_parameters->Rmin[0];
|
||||
l2 = sqr(a-b);
|
||||
aBottom = std::sqrt(l2-sqr((a-b)*cosksi))*(a+b)*cosksi;
|
||||
}
|
||||
|
||||
p2 = G4ThreeVector(rad2*cosphi2,rad2*sinphi2,zVal);
|
||||
p3 = G4ThreeVector(rad2*cosphi1,rad2*sinphi1,zVal);
|
||||
return GetPointOnPlane(p0,p1,p2,p3);
|
||||
}
|
||||
else if ( (chose >= numSide*aVector1[j])
|
||||
&& (chose <= numSide*(aVector1[j]+aVector2[j])) )
|
||||
{
|
||||
Achose1 = 0.;
|
||||
Achose2 = numSide*(aVector1[0]+aVector2[0])+2.*aVector3[0];
|
||||
|
||||
chose = RandFlat::shoot(0.,totArea+aTop+aBottom);
|
||||
if( (chose >= 0.) && (chose < aTop + aBottom) )
|
||||
{
|
||||
chose = RandFlat::shoot(startPhi,startPhi+totalPhi);
|
||||
rang = std::floor((chose-startPhi)/ksi-0.01);
|
||||
if(rang<0) { rang=0; }
|
||||
rang = std::fabs(rang);
|
||||
sinphi1 = std::sin(startPhi+rang*ksi);
|
||||
sinphi2 = std::sin(startPhi+(rang+1)*ksi);
|
||||
cosphi1 = std::cos(startPhi+rang*ksi);
|
||||
cosphi2 = std::cos(startPhi+(rang+1)*ksi);
|
||||
chose = RandFlat::shoot(0., aTop + aBottom);
|
||||
if(chose>=0. && chose<aTop)
|
||||
{
|
||||
rad1 = original_parameters->Rmin[numPlanes-1];
|
||||
rad2 = original_parameters->Rmax[numPlanes-1];
|
||||
zVal = original_parameters->Z_values[numPlanes-1];
|
||||
}
|
||||
else
|
||||
{
|
||||
rad1 = original_parameters->Rmin[0];
|
||||
rad2 = original_parameters->Rmax[0];
|
||||
zVal = original_parameters->Z_values[0];
|
||||
}
|
||||
p0 = G4ThreeVector(rad1*cosphi1,rad1*sinphi1,zVal);
|
||||
p1 = G4ThreeVector(rad2*cosphi1,rad2*sinphi1,zVal);
|
||||
p2 = G4ThreeVector(rad2*cosphi2,rad2*sinphi2,zVal);
|
||||
p3 = G4ThreeVector(rad1*cosphi2,rad1*sinphi2,zVal);
|
||||
return GetPointOnPlane(p0,p1,p2,p3);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (j=0; j<numPlanes-1; j++)
|
||||
{
|
||||
if( ((chose >= Achose1) && (chose < Achose2)) || (j == numPlanes-2) )
|
||||
{
|
||||
Flag = j; break;
|
||||
}
|
||||
Achose1 += numSide*(aVector1[j]+aVector2[j])+2.*aVector3[j];
|
||||
Achose2 = Achose1 + numSide*(aVector1[j+1]+aVector2[j+1])
|
||||
+ 2.*aVector3[j+1];
|
||||
}
|
||||
}
|
||||
|
||||
// At this point we have chosen a subsection
|
||||
// between to adjacent plane cuts...
|
||||
|
||||
j = Flag;
|
||||
|
||||
chose = RandFlat::shoot(startPhi,startPhi+totalPhi);
|
||||
rang = std::floor((chose-startPhi)/ksi-0.01);
|
||||
if(rang<0)rang=0;
|
||||
rang = std::fabs(rang);
|
||||
rad1 = original_parameters->Rmin[j];
|
||||
totArea = numSide*(aVector1[j]+aVector2[j])+2.*aVector3[j];
|
||||
chose = RandFlat::shoot(0.,totArea);
|
||||
|
||||
if( (chose>=0.) && (chose<numSide*aVector1[j]) )
|
||||
{
|
||||
chose = RandFlat::shoot(startPhi,startPhi+totalPhi);
|
||||
rang = std::floor((chose-startPhi)/ksi-0.01);
|
||||
if(rang<0) { rang=0; }
|
||||
rang = std::fabs(rang);
|
||||
rad1 = original_parameters->Rmax[j];
|
||||
rad2 = original_parameters->Rmax[j+1];
|
||||
sinphi1 = std::sin(startPhi+rang*ksi);
|
||||
sinphi2 = std::sin(startPhi+(rang+1)*ksi);
|
||||
cosphi1 = std::cos(startPhi+rang*ksi);
|
||||
cosphi2 = std::cos(startPhi+(rang+1)*ksi);
|
||||
zVal = original_parameters->Z_values[j];
|
||||
|
||||
p0 = G4ThreeVector(rad1*cosphi1,rad1*sinphi1,zVal);
|
||||
p1 = G4ThreeVector(rad1*cosphi2,rad1*sinphi2,zVal);
|
||||
|
||||
zVal = original_parameters->Z_values[j+1];
|
||||
|
||||
p2 = G4ThreeVector(rad2*cosphi2,rad2*sinphi2,zVal);
|
||||
p3 = G4ThreeVector(rad2*cosphi1,rad2*sinphi1,zVal);
|
||||
return GetPointOnPlane(p0,p1,p2,p3);
|
||||
}
|
||||
else if ( (chose >= numSide*aVector1[j])
|
||||
&& (chose <= numSide*(aVector1[j]+aVector2[j])) )
|
||||
{
|
||||
chose = RandFlat::shoot(startPhi,startPhi+totalPhi);
|
||||
rang = std::floor((chose-startPhi)/ksi-0.01);
|
||||
if(rang<0) { rang=0; }
|
||||
rang = std::fabs(rang);
|
||||
rad1 = original_parameters->Rmin[j];
|
||||
rad2 = original_parameters->Rmin[j+1];
|
||||
sinphi1 = std::sin(startPhi+rang*ksi);
|
||||
sinphi2 = std::sin(startPhi+(rang+1)*ksi);
|
||||
cosphi1 = std::cos(startPhi+rang*ksi);
|
||||
cosphi2 = std::cos(startPhi+(rang+1)*ksi);
|
||||
zVal = original_parameters->Z_values[j];
|
||||
|
||||
p0 = G4ThreeVector(rad1*cosphi1,rad1*sinphi1,zVal);
|
||||
p1 = G4ThreeVector(rad1*cosphi2,rad1*sinphi2,zVal);
|
||||
|
||||
zVal = original_parameters->Z_values[j+1];
|
||||
|
||||
p2 = G4ThreeVector(rad2*cosphi2,rad2*sinphi2,zVal);
|
||||
p3 = G4ThreeVector(rad2*cosphi1,rad2*sinphi1,zVal);
|
||||
return GetPointOnPlane(p0,p1,p2,p3);
|
||||
}
|
||||
|
||||
chose = RandFlat::shoot(0.,2.2);
|
||||
if( (chose>=0.) && (chose < 1.) )
|
||||
{
|
||||
rang = startPhi;
|
||||
}
|
||||
else
|
||||
{
|
||||
rang = endPhi;
|
||||
}
|
||||
|
||||
cosphi1 = std::cos(rang); rad1 = original_parameters->Rmin[j];
|
||||
sinphi1 = std::sin(rang); rad2 = original_parameters->Rmax[j];
|
||||
|
||||
p0 = G4ThreeVector(rad1*cosphi1,rad1*sinphi1,
|
||||
original_parameters->Z_values[j]);
|
||||
p1 = G4ThreeVector(rad2*cosphi1,rad2*sinphi1,
|
||||
original_parameters->Z_values[j]);
|
||||
|
||||
rad1 = original_parameters->Rmax[j+1];
|
||||
rad2 = original_parameters->Rmin[j+1];
|
||||
sinphi1 = std::sin(startPhi+rang*ksi);
|
||||
sinphi2 = std::sin(startPhi+(rang+1)*ksi);
|
||||
cosphi1 = std::cos(startPhi+rang*ksi);
|
||||
cosphi2 = std::cos(startPhi+(rang+1)*ksi);
|
||||
zVal = original_parameters->Z_values[j];
|
||||
|
||||
p0 = G4ThreeVector(rad1*cosphi1,rad1*sinphi1,zVal);
|
||||
p1 = G4ThreeVector(rad1*cosphi2,rad1*sinphi2,zVal);
|
||||
|
||||
zVal = original_parameters->Z_values[j+1];
|
||||
|
||||
p2 = G4ThreeVector(rad2*cosphi2,rad2*sinphi2,zVal);
|
||||
p3 = G4ThreeVector(rad2*cosphi1,rad2*sinphi1,zVal);
|
||||
p2 = G4ThreeVector(rad1*cosphi1,rad1*sinphi1,
|
||||
original_parameters->Z_values[j+1]);
|
||||
p3 = G4ThreeVector(rad2*cosphi1,rad2*sinphi1,
|
||||
original_parameters->Z_values[j+1]);
|
||||
return GetPointOnPlane(p0,p1,p2,p3);
|
||||
}
|
||||
|
||||
chose = RandFlat::shoot(0.,2.2);
|
||||
if( (chose>=0.) && (chose < 1.) )
|
||||
else // Generic polyhedra
|
||||
{
|
||||
rang = startPhi;
|
||||
return GetPointOnSurfaceGeneric();
|
||||
}
|
||||
else
|
||||
{
|
||||
rang = endPhi;
|
||||
}
|
||||
|
||||
cosphi1 = std::cos(rang); rad1 = original_parameters->Rmin[j];
|
||||
sinphi1 = std::sin(rang); rad2 = original_parameters->Rmax[j];
|
||||
|
||||
p0 = G4ThreeVector(rad1*cosphi1,rad1*sinphi1,
|
||||
original_parameters->Z_values[j]);
|
||||
p1 = G4ThreeVector(rad2*cosphi1,rad2*sinphi1,
|
||||
original_parameters->Z_values[j]);
|
||||
|
||||
rad1 = original_parameters->Rmax[j+1];
|
||||
rad2 = original_parameters->Rmin[j+1];
|
||||
|
||||
p2 = G4ThreeVector(rad1*cosphi1,rad1*sinphi1,
|
||||
original_parameters->Z_values[j+1]);
|
||||
p3 = G4ThreeVector(rad2*cosphi1,rad2*sinphi1,
|
||||
original_parameters->Z_values[j+1]);
|
||||
return GetPointOnPlane(p0,p1,p2,p3);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// CreatePolyhedron
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user