Import Geant4 9.2.0 source tree

This commit is contained in:
Gabriele Cosmo
2016-06-09 15:58:43 +02:00
parent 96c8bcd0af
commit b79225fb37
7544 changed files with 245407 additions and 91099 deletions
+195 -187
View File
@@ -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
//