70 using CLHEP::perMillion;
 
   86   for (
G4int k=0; k<4; k++) {
 
   87     ostr << 
" " << facet.edge[k].v << 
"/" << facet.edge[k].f;
 
   94   ostr << 
"Nverteces=" << ph.
nvert << 
", Nfacets=" << ph.
nface << std::endl;
 
   96   for (i=1; i<=ph.
nvert; i++) {
 
   97      ostr << 
"xyz(" << i << 
")=" 
   98           << ph.
pV[i].
x() << 
' ' << ph.
pV[i].
y() << 
' ' << ph.
pV[i].
z()
 
  101   for (i=1; i<=ph.
nface; i++) {
 
  102     ostr << 
"face(" << i << 
")=" << ph.
pF[i] << std::endl;
 
  114 : nvert(0), nface(0), pV(0), pF(0)
 
  151   for (i=0; i<4; i++) {
 
  152     if (iNode == std::abs(pF[iFace].edge[i].
v)) 
break;
 
  156       << 
"HepPolyhedron::FindNeighbour: face " << iFace
 
  157       << 
" has no node " << iNode
 
  163     if (pF[iFace].edge[i].
v == 0) i = 2;
 
  165   return (pF[iFace].edge[i].
v > 0) ? 0 : pF[iFace].edge[i].f;
 
  179   G4int          k = iFace, iOrder = 1, 
n = 1;
 
  182     k = FindNeighbour(k, iNode, iOrder);
 
  183     if (k == iFace) 
break; 
 
  186       normal += GetUnitNormal(k);
 
  188       if (iOrder < 0) 
break;
 
  193   return normal.
unit();
 
  219   const G4int nMin = 3;
 
  222       << 
"HepPolyhedron::SetNumberOfRotationSteps: attempt to set the\n" 
  223       << 
"number of steps per circle < " << nMin << 
"; forced to " << nMin
 
  258   if (
pV != 0) 
delete [] 
pV;
 
  259   if (
pF != 0) 
delete [] 
pF;
 
  260   if (Nvert > 0 && Nface > 0) {
 
  280   enum {DUMMY, BOTTOM, 
LEFT, BACK, 
RIGHT, FRONT, TOP};
 
  283   pF[2] = 
G4Facet(5,TOP,   8,BACK,  4,BOTTOM, 1,FRONT);
 
  285   pF[4] = 
G4Facet(7,TOP,   6,FRONT, 2,BOTTOM, 3,BACK);
 
  312   if (r1 == 0. && r2 == 0) 
return;
 
  317   G4int ii1 = ifWholeCircle ? i1 : i1+nds;
 
  318   G4int ii2 = ifWholeCircle ? i2 : i2+nds;
 
  319   G4int vv  = ifWholeCircle ? vEdge : 1;
 
  323       pF[kface++]   = 
G4Facet(i1,0,    v2*i2,0, (i2+1),0);
 
  324     }
else if (r2 == 0.) {
 
  325       pF[kface++]   = 
G4Facet(i1,0,    i2,0,    v1*(i1+1),0);
 
  327       pF[kface++]   = 
G4Facet(i1,0,    v2*i2,0, (i2+1),0, v1*(i1+1),0);
 
  331       pF[kface++]   = 
G4Facet(vv*i1,0,    v2*i2,0, vEdge*(i2+1),0);
 
  332       for (i2++,i=1; i<nds-1; i2++,i++) {
 
  333         pF[kface++] = 
G4Facet(vEdge*i1,0, v2*i2,0, vEdge*(i2+1),0);
 
  335       pF[kface++]   = 
G4Facet(vEdge*i1,0, v2*i2,0, vv*ii2,0);
 
  336     }
else if (r2 == 0.) {
 
  337       pF[kface++]   = 
G4Facet(vv*i1,0,    vEdge*i2,0, v1*(i1+1),0);
 
  338       for (i1++,i=1; i<nds-1; i1++,i++) {
 
  339         pF[kface++] = 
G4Facet(vEdge*i1,0, vEdge*i2,0, v1*(i1+1),0);
 
  341       pF[kface++]   = 
G4Facet(vEdge*i1,0, vv*i2,0,    v1*ii1,0);
 
  343       pF[kface++]   = 
G4Facet(vv*i1,0,    v2*i2,0, vEdge*(i2+1),0,v1*(i1+1),0);
 
  344       for (i1++,i2++,i=1; i<nds-1; i1++,i2++,i++) {
 
  345         pF[kface++] = 
G4Facet(vEdge*i1,0, v2*i2,0, vEdge*(i2+1),0,v1*(i1+1),0);
 
  347       pF[kface++]   = 
G4Facet(vEdge*i1,0, v2*i2,0, vv*ii2,0,      v1*ii1,0);
 
  372   G4int k1, k2, k3, k4;
 
  375     for (
G4int i=0; i<4; i++) {
 
  377       k2 = (i == 3) ? ii[0] : ii[i+1];
 
  378       if (r[k1] == 0. && r[k2] == 0.) vv[i] = -1;      
 
  382   if (ii[1] == ii[2]) {
 
  386     pF[kface++] = 
G4Facet(vv[0]*k1,0, vv[2]*k2,0, vv[3]*k3,0);
 
  387     if (r[ii[0]] != 0.) k1 += nds;
 
  388     if (r[ii[2]] != 0.) k2 += nds;
 
  389     if (r[ii[3]] != 0.) k3 += nds;
 
  390     pF[kface++] = 
G4Facet(vv[2]*k3,0, vv[0]*k2,0, vv[3]*k1,0);
 
  391   }
else if (kk[ii[0]] == kk[ii[1]]) {
 
  395     pF[kface++] = 
G4Facet(vv[1]*k1,0, vv[2]*k2,0, vv[3]*k3,0);
 
  396     if (r[ii[0]] != 0.) k1 += nds;
 
  397     if (r[ii[2]] != 0.) k2 += nds;
 
  398     if (r[ii[3]] != 0.) k3 += nds;
 
  399     pF[kface++] = 
G4Facet(vv[2]*k3,0, vv[1]*k2,0, vv[3]*k1,0);
 
  400   }
else if (kk[ii[2]] == kk[ii[3]]) {
 
  404     pF[kface++] = 
G4Facet(vv[0]*k1,0, vv[1]*k2,0, vv[3]*k3,0);
 
  405     if (r[ii[0]] != 0.) k1 += nds;
 
  406     if (r[ii[1]] != 0.) k2 += nds;
 
  407     if (r[ii[2]] != 0.) k3 += nds;
 
  408     pF[kface++] = 
G4Facet(vv[1]*k3,0, vv[0]*k2,0, vv[3]*k1,0);
 
  414     pF[kface++] = 
G4Facet(vv[0]*k1,0, vv[1]*k2,0, vv[2]*k3,0, vv[3]*k4,0);
 
  415     if (r[ii[0]] != 0.) k1 += nds;
 
  416     if (r[ii[1]] != 0.) k2 += nds;
 
  417     if (r[ii[2]] != 0.) k3 += nds;
 
  418     if (r[ii[3]] != 0.) k4 += nds;
 
  419     pF[kface++] = 
G4Facet(vv[2]*k4,0, vv[1]*k3,0, vv[0]*k2,0, vv[3]*k1,0);
 
  453   G4bool ifWholeCircle = (std::abs(dphi-wholeCircle) < 
perMillion) ? 
true : 
false;
 
  454   G4double   delPhi  = ifWholeCircle ? wholeCircle : dphi;  
 
  455   G4int        nSphi    = (nstep > 0) ?
 
  457   if (nSphi == 0) nSphi = 1;
 
  458   G4int        nVphi    = ifWholeCircle ? nSphi : nSphi+1;
 
  459   G4bool ifClosed = np1 > 0 ? 
false : 
true;
 
  463   G4int absNp1 = std::abs(np1);
 
  464   G4int absNp2 = std::abs(np2);
 
  466   G4int i1end = absNp1-1;
 
  467   G4int i2beg = absNp1;
 
  468   G4int i2end = absNp1+absNp2-1; 
 
  471   for(i=i1beg; i<=i2end; i++) {
 
  476   for (i=i1beg; i<=i1end; i++) {
 
  477     j += (r[i] == 0.) ? 1 : nVphi;
 
  483   if (r[i2beg] != r[i1beg] || z[i2beg] != z[i1beg]) {
 
  484     j += (r[i2beg] == 0.) ? 1 : nVphi;
 
  488   for(i=i2beg+1; i<i2end; i++) {
 
  489     j += (r[i] == 0.) ? 1 : nVphi;
 
  492   if (r[i2end] != r[i1end] || z[i2end] != z[i1end]) {
 
  493     if (absNp2 > 1) j += (r[i2end] == 0.) ? 1 : nVphi;
 
  499   k = ifClosed ? absNp1*nSphi : (absNp1-1)*nSphi;       
 
  502     for(i=i2beg; i<i2end; i++) {
 
  503       if (r[i] > 0. || r[i+1] > 0.)       k += nSphi;
 
  507       if (r[i2end] > 0. || r[i2beg] > 0.) k += nSphi;
 
  512     if (ifSide1 && (r[i1beg] > 0. || r[i2beg] > 0.)) k += nSphi;
 
  513     if (ifSide2 && (r[i1end] > 0. || r[i2end] > 0.)) k += nSphi;
 
  516   if (!ifWholeCircle) {                                 
 
  517     k += ifClosed ? 2*absNp1 : 2*(absNp1-1);
 
  527   kk = 
new G4int[absNp1+absNp2];
 
  530   for(i=i1beg; i<=i1end; i++) {
 
  533     { 
pV[k++] = 
G4Point3D(0, 0, z[i]); } 
else { k += nVphi; }
 
  540     { 
pV[k++] = 
G4Point3D(0, 0, z[i]); } 
else { k += nVphi; }
 
  545   for(i=i2beg+1; i<i2end; i++) {
 
  548     { 
pV[k++] = 
G4Point3D(0, 0, z[i]); } 
else { k += nVphi; }
 
  563   for(j=0; j<nVphi; j++) {
 
  564     cosPhi = std::cos(phi+j*delPhi/nSphi);
 
  565     sinPhi = std::sin(phi+j*delPhi/nSphi);
 
  566     for(i=i1beg; i<=i2end; i++) {
 
  568         pV[kk[i]+j] = 
G4Point3D(r[i]*cosPhi,r[i]*sinPhi,z[i]);
 
  577   v2 = ifClosed ? nodeVis : 1;
 
  578   for(i=i1beg; i<i1end; i++) {
 
  580     if (!ifClosed && i == i1end-1) {
 
  583       v2 = (r[i] == r[i+1] && r[i+1] == r[i+2]) ? -1 : nodeVis;
 
  585     RotateEdge(kk[i], kk[i+1], r[i], r[i+1], v1, v2,
 
  586                edgeVis, ifWholeCircle, nSphi, k);
 
  589     RotateEdge(kk[i1end], kk[i1beg], r[i1end],r[i1beg], nodeVis, nodeVis,
 
  590                edgeVis, ifWholeCircle, nSphi, k);
 
  596     v2 = ifClosed ? nodeVis : 1;
 
  597     for(i=i2beg; i<i2end; i++) {
 
  599       if (!ifClosed && i==i2end-1) {
 
  602         v2 = (r[i] == r[i+1] && r[i+1] == r[i+2]) ? -1 :  nodeVis;
 
  604       RotateEdge(kk[i+1], kk[i], r[i+1], r[i], v2, v1,
 
  605                  edgeVis, ifWholeCircle, nSphi, k);
 
  608       RotateEdge(kk[i2beg], kk[i2end], r[i2beg], r[i2end], nodeVis, nodeVis,
 
  609                  edgeVis, ifWholeCircle, nSphi, k);
 
  617       RotateEdge(kk[i2beg], kk[i1beg], r[i2beg], r[i1beg], 1, 1,
 
  618                  -1, ifWholeCircle, nSphi, k);
 
  621       RotateEdge(kk[i1end], kk[i2end], r[i1end], r[i2end], 1, 1,
 
  622                  -1, ifWholeCircle, nSphi, k);
 
  628   if (!ifWholeCircle) {
 
  633       for (i=i1beg; i<=i1end; i++) {
 
  635         ii[3] = (i == i1end) ? i1beg : i+1;
 
  636         ii[1] = (absNp2 == 1) ? i2beg : ii[0]+absNp1;
 
  637         ii[2] = (absNp2 == 1) ? i2beg : ii[3]+absNp1;
 
  645       for (i=i1beg; i<i1end; i++) {
 
  648         ii[1] = (absNp2 == 1) ? i2beg : ii[0]+absNp1;
 
  649         ii[2] = (absNp2 == 1) ? i2beg : ii[3]+absNp1;
 
  650         vv[0] = (i == i1beg)   ? 1 : -1;
 
  652         vv[2] = (i == i1end-1) ? 1 : -1;
 
  663       << 
"Polyhedron::RotateAroundZ: number of generated faces (" 
  664       << k-1 << 
") is not equal to the number of allocated faces (" 
  680   if (
nface <= 0) 
return;
 
  682   struct edgeListMember {
 
  683     edgeListMember *next;
 
  687   } *edgeList, *freeList, **headList;
 
  692   edgeList = 
new edgeListMember[2*
nface];
 
  693   headList = 
new edgeListMember*[
nvert];
 
  696   for (i=0; i<
nvert; i++) {
 
  700   for (i=0; i<2*
nface-1; i++) {
 
  701     edgeList[i].next = &edgeList[i+1];
 
  703   edgeList[2*nface-1].next = 0;
 
  707   G4int iface, iedge, nedge, i1, i2, k1, k2;
 
  708   edgeListMember *prev, *cur;
 
  710   for(iface=1; iface<=
nface; iface++) {
 
  711     nedge = (
pF[iface].edge[3].v == 0) ? 3 : 4;
 
  712     for (iedge=0; iedge<nedge; iedge++) {
 
  714       i2 = (iedge < nedge-1) ? iedge+1 : 0;
 
  715       i1 = std::abs(
pF[iface].edge[i1].
v);
 
  716       i2 = std::abs(
pF[iface].edge[i2].v);
 
  717       k1 = (i1 < i2) ? i1 : i2;          
 
  718       k2 = (i1 > i2) ? i1 : i2;          
 
  723         headList[k1] = freeList;
 
  724         freeList = freeList->next;
 
  734         headList[k1] = cur->next;
 
  735         cur->next = freeList;
 
  737         pF[iface].edge[iedge].f = cur->iface;
 
  738         pF[cur->iface].edge[cur->iedge].f = iface;
 
  739         i1 = (
pF[iface].edge[iedge].v < 0) ? -1 : 1;
 
  740         i2 = (
pF[cur->iface].edge[cur->iedge].v < 0) ? -1 : 1;
 
  743             << 
"Polyhedron::SetReferences: different edge visibility " 
  744             << iface << 
"/" << iedge << 
"/" 
  745             << 
pF[iface].edge[iedge].v << 
" and " 
  746             << cur->iface << 
"/" << cur->iedge << 
"/" 
  747             << 
pF[cur->iface].edge[cur->iedge].v
 
  758           prev->next = freeList;
 
  759           freeList = freeList->next;
 
  769           prev->next = cur->next;
 
  770           cur->next = freeList;
 
  772           pF[iface].edge[iedge].f = cur->iface;
 
  773           pF[cur->iface].edge[cur->iedge].f = iface;
 
  774           i1 = (
pF[iface].edge[iedge].v < 0) ? -1 : 1;
 
  775           i2 = (
pF[cur->iface].edge[cur->iedge].v < 0) ? -1 : 1;
 
  778                 << 
"Polyhedron::SetReferences: different edge visibility " 
  779                 << iface << 
"/" << iedge << 
"/" 
  780                 << 
pF[iface].edge[iedge].v << 
" and " 
  781                 << cur->iface << 
"/" << cur->iedge << 
"/" 
  782                 << 
pF[cur->iface].edge[cur->iedge].v
 
  793   for (i=0; i<
nvert; i++) {
 
  794     if (headList[i] != 0) {
 
  796         << 
"Polyhedron::SetReferences: List " << i << 
" is not empty" 
  817   if (
nface <= 0) 
return;
 
  819   for (i=1; i<=
nface; i++) {
 
  820     nnode =  (
pF[i].edge[3].v == 0) ? 3 : 4;
 
  821     for (k=0; k<nnode; k++) {
 
  822       v[k] = (k+1 == nnode) ? 
pF[i].edge[0].v : 
pF[i].edge[k+1].v;
 
  823       if (v[k] * 
pF[i].edge[k].v < 0) v[k] = -v[k];
 
  824       f[k] = 
pF[i].edge[k].f;
 
  826     for (k=0; k<nnode; k++) {
 
  827       pF[i].edge[nnode-1-k].v = v[k];
 
  828       pF[i].edge[nnode-1-k].f = f[k];
 
  868   static G4int iFace = 1;
 
  869   static G4int iQVertex = 0;
 
  870   G4int vIndex = pF[iFace].edge[iQVertex].v;
 
  872   edgeFlag = (vIndex > 0) ? 1 : 0;
 
  873   index = std::abs(vIndex);
 
  875   if (iQVertex >= 3 || pF[iFace].edge[iQVertex+1].
v == 0) {
 
  877     if (++iFace > nface) iFace = 1;
 
  895   if (index <= 0 || index > nvert) {
 
  897       << 
"HepPolyhedron::GetVertex: irrelevant index " << 
index 
  918   G4bool rep = GetNextVertexIndex(index, edgeFlag);
 
  936   static G4int iFace = 1;
 
  937   static G4int iNode = 0;
 
  939   if (nface == 0) 
return false;  
 
  941   G4int k = pF[iFace].edge[iNode].v;
 
  942   if (k > 0) { edgeFlag = 1; } 
else { edgeFlag = -1; k = -k; }
 
  944   normal = FindNodeNormal(iFace,k);
 
  945   if (iNode >= 3 || pF[iFace].edge[iNode+1].
v == 0) {
 
  947     if (++iFace > nface) iFace = 1;
 
  968   static G4int iFace    = 1;
 
  969   static G4int iQVertex = 0;
 
  970   static G4int iOrder   = 1;
 
  971   G4int  k1, k2, kflag, kface1, kface2;
 
  973   if (iFace == 1 && iQVertex == 0) {
 
  974     k2 = pF[nface].edge[0].v;
 
  975     k1 = pF[nface].edge[3].v;
 
  976     if (k1 == 0) k1 = pF[nface].edge[2].v;
 
  977     if (std::abs(k1) > std::abs(k2)) iOrder = -1;
 
  981     k1     = pF[iFace].edge[iQVertex].v;
 
  985     kface2 = pF[iFace].edge[iQVertex].f;
 
  986     if (iQVertex >= 3 || pF[iFace].edge[iQVertex+1].
v == 0) {
 
  988       k2 = std::abs(pF[iFace].edge[iQVertex].
v);
 
  992       k2 = std::abs(pF[iFace].edge[iQVertex].
v);
 
  994   } 
while (iOrder*k1 > iOrder*k2);
 
  996   i1 = k1; i2 = k2; edgeFlag = (kflag > 0) ? 1 : 0;
 
  997   iface1 = kface1; iface2 = kface2; 
 
 1000     iFace  = 1; iOrder = 1;
 
 1019   G4int kface1, kface2;
 
 1020   return GetNextEdgeIndeces(i1, i2, edgeFlag, kface1, kface2);
 
 1026                            G4int &edgeFlag) 
const 
 1038   G4bool rep = GetNextEdgeIndeces(i1,i2,edgeFlag);
 
 1059   G4bool rep = GetNextEdgeIndeces(i1,i2,edgeFlag,iface1,iface2);
 
 1076   if (iFace < 1 || iFace > nface) {
 
 1078       << 
"HepPolyhedron::GetFacet: irrelevant index " << iFace
 
 1083     for (i=0; i<4; i++) { 
 
 1084       k = pF[iFace].edge[i].v;
 
 1086       if (iFaces != 0) iFaces[i] = pF[iFace].edge[i].f;
 
 1089         if (edgeFlags != 0) edgeFlags[i] = 1;
 
 1092         if (edgeFlags != 0) edgeFlags[i] = -1;
 
 1111   GetFacet(
index, 
n, iNodes, edgeFlags);
 
 1113     for (
G4int i=0; i<
n; i++) {
 
 1114       nodes[i] = pV[iNodes[i]];
 
 1115       if (normals != 0) normals[i] = FindNodeNormal(
index,iNodes[i]);
 
 1133   static G4int iFace = 1;
 
 1135   if (edgeFlags == 0) {
 
 1136     GetFacet(iFace, 
n, nodes);
 
 1137   }
else if (normals == 0) {
 
 1138     GetFacet(iFace, 
n, nodes, edgeFlags);
 
 1140     GetFacet(iFace, 
n, nodes, edgeFlags, normals);
 
 1143   if (++iFace > nface) {
 
 1161   if (iFace < 1 || iFace > nface) {
 
 1163       << 
"HepPolyhedron::GetNormal: irrelevant index " << iFace 
 
 1168   G4int i0  = std::abs(pF[iFace].edge[0].
v);
 
 1169   G4int i1  = std::abs(pF[iFace].edge[1].v);
 
 1170   G4int i2  = std::abs(pF[iFace].edge[2].v);
 
 1171   G4int i3  = std::abs(pF[iFace].edge[3].v);
 
 1172   if (i3 == 0) i3 = i0;
 
 1173   return (pV[i2] - pV[i0]).cross(pV[i3] - pV[i1]);
 
 1186   if (iFace < 1 || iFace > nface) {
 
 1188       << 
"HepPolyhedron::GetUnitNormal: irrelevant index " << iFace
 
 1193   G4int i0  = std::abs(pF[iFace].edge[0].
v);
 
 1194   G4int i1  = std::abs(pF[iFace].edge[1].v);
 
 1195   G4int i2  = std::abs(pF[iFace].edge[2].v);
 
 1196   G4int i3  = std::abs(pF[iFace].edge[3].v);
 
 1197   if (i3 == 0) i3 = i0;
 
 1198   return ((pV[i2] - pV[i0]).cross(pV[i3] - pV[i1])).unit();
 
 1212   static G4int iFace = 1;
 
 1213   normal = GetNormal(iFace);
 
 1214   if (++iFace > nface) {
 
 1233   G4bool rep = GetNextNormal(normal);
 
 1234   normal = normal.unit();
 
 1250     G4int i0 = std::abs(
pF[iFace].edge[0].
v);
 
 1251     G4int i1 = std::abs(
pF[iFace].edge[1].v);
 
 1252     G4int i2 = std::abs(
pF[iFace].edge[2].v);
 
 1253     G4int i3 = std::abs(
pF[iFace].edge[3].v);
 
 1254     if (i3 == 0) i3 = i0;
 
 1255     srf += ((
pV[i2] - 
pV[i0]).cross(
pV[i3] - 
pV[i1])).mag();
 
 1272     G4int i0 = std::abs(
pF[iFace].edge[0].v);
 
 1273     G4int i1 = std::abs(
pF[iFace].edge[1].v);
 
 1274     G4int i2 = std::abs(
pF[iFace].edge[2].v);
 
 1275     G4int i3 = std::abs(
pF[iFace].edge[3].v);
 
 1279       pt = (
pV[i0]+
pV[i1]+
pV[i2]) * (1./3.);
 
 1281       pt = (
pV[i0]+
pV[i1]+
pV[i2]+
pV[i3]) * 0.25;
 
 1283     v += ((
pV[i2] - 
pV[i0]).cross(
pV[i3] - 
pV[i1])).dot(pt);
 
 1323   enum {DUMMY, BOTTOM,
 
 1324         LEFT_BOTTOM,  LEFT_FRONT,   LEFT_TOP,  LEFT_BACK,
 
 1325         BACK_BOTTOM,  BACK_LEFT,    BACK_TOP,  BACK_RIGHT,
 
 1326         RIGHT_BOTTOM, RIGHT_BACK,   RIGHT_TOP, RIGHT_FRONT,
 
 1327         FRONT_BOTTOM, FRONT_RIGHT,  FRONT_TOP, FRONT_LEFT,
 
 1330   pF[ 1]=
G4Facet(1,LEFT_BOTTOM, 4,BACK_BOTTOM, 3,RIGHT_BOTTOM, 2,FRONT_BOTTOM);
 
 1332   pF[ 2]=
G4Facet(4,BOTTOM,     -1,LEFT_FRONT,  -12,LEFT_BACK,    0,0);
 
 1333   pF[ 3]=
G4Facet(1,FRONT_LEFT, -5,LEFT_TOP,    -12,LEFT_BOTTOM,  0,0);
 
 1334   pF[ 4]=
G4Facet(5,TOP,        -8,LEFT_BACK,   -12,LEFT_FRONT,   0,0);
 
 1335   pF[ 5]=
G4Facet(8,BACK_LEFT,  -4,LEFT_BOTTOM, -12,LEFT_TOP,     0,0);
 
 1337   pF[ 6]=
G4Facet(3,BOTTOM,     -4,BACK_LEFT,   -11,BACK_RIGHT,   0,0);
 
 1338   pF[ 7]=
G4Facet(4,LEFT_BACK,  -8,BACK_TOP,    -11,BACK_BOTTOM,  0,0);
 
 1339   pF[ 8]=
G4Facet(8,TOP,        -7,BACK_RIGHT,  -11,BACK_LEFT,    0,0);
 
 1340   pF[ 9]=
G4Facet(7,RIGHT_BACK, -3,BACK_BOTTOM, -11,BACK_TOP,     0,0);
 
 1342   pF[10]=
G4Facet(2,BOTTOM,     -3,RIGHT_BACK,  -10,RIGHT_FRONT,  0,0);
 
 1343   pF[11]=
G4Facet(3,BACK_RIGHT, -7,RIGHT_TOP,   -10,RIGHT_BOTTOM, 0,0);
 
 1344   pF[12]=
G4Facet(7,TOP,        -6,RIGHT_FRONT, -10,RIGHT_BACK,   0,0);
 
 1345   pF[13]=
G4Facet(6,FRONT_RIGHT,-2,RIGHT_BOTTOM,-10,RIGHT_TOP,    0,0);
 
 1347   pF[14]=
G4Facet(1,BOTTOM,     -2,FRONT_RIGHT,  -9,FRONT_LEFT,   0,0);
 
 1348   pF[15]=
G4Facet(2,RIGHT_FRONT,-6,FRONT_TOP,    -9,FRONT_BOTTOM, 0,0);
 
 1349   pF[16]=
G4Facet(6,TOP,        -5,FRONT_LEFT,   -9,FRONT_RIGHT,  0,0);
 
 1350   pF[17]=
G4Facet(5,LEFT_FRONT, -1,FRONT_BOTTOM, -9,FRONT_TOP,    0,0);
 
 1352   pF[18]=
G4Facet(5,FRONT_TOP, 6,RIGHT_TOP, 7,BACK_TOP, 8,LEFT_TOP);
 
 1360                                 const G4int  faces[][4])
 
 1376   if (
nvert == 0) 
return 1;
 
 1378   for (
G4int i=0; i<Nnodes; i++) {
 
 1379     pV[i+1] = 
G4Point3D(xyz[i][0], xyz[i][1], xyz[i][2]);
 
 1381   for (
G4int k=0; k<Nfaces; k++) {
 
 1382     pF[k+1] = 
G4Facet(faces[k][0],0,faces[k][1],0,faces[k][2],0,faces[k][3],0);
 
 1467   G4double DzTthetaCphi = Dz*std::tan(Theta)*std::cos(Phi);
 
 1468   G4double DzTthetaSphi = Dz*std::tan(Theta)*std::sin(Phi);
 
 1469   G4double Dy1Talp1 = Dy1*std::tan(Alp1);
 
 1470   G4double Dy2Talp2 = Dy2*std::tan(Alp2);
 
 1474   pV[1] = 
G4Point3D(-DzTthetaCphi-Dy1Talp1-Dx1,-DzTthetaSphi-Dy1,-Dz);
 
 1475   pV[2] = 
G4Point3D(-DzTthetaCphi-Dy1Talp1+Dx1,-DzTthetaSphi-Dy1,-Dz);
 
 1476   pV[3] = 
G4Point3D(-DzTthetaCphi+Dy1Talp1+Dx2,-DzTthetaSphi+Dy1,-Dz);
 
 1477   pV[4] = 
G4Point3D(-DzTthetaCphi+Dy1Talp1-Dx2,-DzTthetaSphi+Dy1,-Dz);
 
 1478   pV[5] = 
G4Point3D( DzTthetaCphi-Dy2Talp2-Dx3, DzTthetaSphi-Dy2, Dz);
 
 1479   pV[6] = 
G4Point3D( DzTthetaCphi-Dy2Talp2+Dx3, DzTthetaSphi-Dy2, Dz);
 
 1480   pV[7] = 
G4Point3D( DzTthetaCphi+Dy2Talp2+Dx4, DzTthetaSphi+Dy2, Dz);
 
 1481   pV[8] = 
G4Point3D( DzTthetaCphi+Dy2Talp2-Dx4, DzTthetaSphi+Dy2, Dz);
 
 1491   : 
HepPolyhedronTrap(Dz, Theta, Phi, Dy, Dx, Dx, Alpha, Dy, Dx, Dx, Alpha) {}
 
 1520   if (r1 < 0. || r2 <= 0.)        k = 1;
 
 1522   if (dz <= 0.) k += 2;
 
 1528     phi2 = sPhi; phi1 = phi2 + dPhi;
 
 1532     phi1 = sPhi; phi2 = phi1 + wholeCircle;
 
 1536     phi1 = sPhi; phi2 = phi1 + dPhi;
 
 1540   if (std::abs(dphi-wholeCircle) < 
perMillion) dphi = wholeCircle;
 
 1541   if (dphi > wholeCircle) k += 4; 
 
 1544     std::cerr << 
"HepPolyhedronParaboloid: error in input parameters";
 
 1545     if ((k & 1) != 0) std::cerr << 
" (radiuses)";
 
 1546     if ((k & 2) != 0) std::cerr << 
" (half-length)";
 
 1547     if ((k & 4) != 0) std::cerr << 
" (angles)";
 
 1548     std::cerr << std::endl;
 
 1549     std::cerr << 
" r1=" << r1;
 
 1550     std::cerr << 
" r2=" << r2;
 
 1551     std::cerr << 
" dz=" << dz << 
" sPhi=" << sPhi << 
" dPhi=" << dPhi
 
 1560   G4double k1 = (r2*r2 - r1*r1) / 2 / dz;
 
 1568   for(
G4int i = 1; i < n - 1; i++)
 
 1570     rr[i] = rr[i-1] - dl;
 
 1571     zz[i] = (rr[i]*rr[i] - k2) / k1;
 
 1624   if (r2 < 0. || r1 < 0. )        k = 1;
 
 1625   if (r1 > r2 )                   k = 1;
 
 1626   if (r1 == r2)                   k = 1;
 
 1628   if (halfZ <= 0.) k += 2;
 
 1630   if (sqrtan1<0.||sqrtan2<0.) k += 4;  
 
 1634     std::cerr << 
"HepPolyhedronHype: error in input parameters";
 
 1635     if ((k & 1) != 0) std::cerr << 
" (radiuses)";
 
 1636     if ((k & 2) != 0) std::cerr << 
" (half-length)";
 
 1637     if ((k & 4) != 0) std::cerr << 
" (angles)";
 
 1638     std::cerr << std::endl;
 
 1639     std::cerr << 
" r1=" << r1 << 
" r2=" << r2;
 
 1640     std::cerr << 
" halfZ=" << halfZ << 
" sqrTan1=" << sqrtan1
 
 1641               << 
" sqrTan2=" << sqrtan2
 
 1656   rr[0] = std::sqrt(sqrtan2*halfZ*halfZ+k2);
 
 1658   for(
G4int i = 1; i < n-1; i++)
 
 1660     zz[i] = zz[i-1] - dz;
 
 1661     rr[i] =std::sqrt(sqrtan2*zz[i]*zz[i]+k2);
 
 1668   rr[
n] =  std::sqrt(sqrtan1*halfZ*halfZ+k1);
 
 1670   for(
G4int i = n+1; i < n+
n; i++)
 
 1672     zz[i] = zz[i-1] - dz;
 
 1673     rr[i] =std::sqrt(sqrtan1*zz[i]*zz[i]+k1);
 
 1716   if (Rmn1 < 0. || Rmx1 < 0. || Rmn2 < 0. || Rmx2 < 0.)        k = 1;
 
 1717   if (Rmn1 > Rmx1 || Rmn2 > Rmx2)                              k = 1;
 
 1718   if (Rmn1 == Rmx1 && Rmn2 == Rmx2)                            k = 1;
 
 1720   if (Dz <= 0.) k += 2;
 
 1724     phi2 = Phi1; phi1 = phi2 - Dphi;
 
 1725   }
else if (Dphi == 0.) {
 
 1726     phi1 = Phi1; phi2 = phi1 + wholeCircle;
 
 1728     phi1 = Phi1; phi2 = phi1 + Dphi;
 
 1731   if (std::abs(dphi-wholeCircle) < 
perMillion) dphi = wholeCircle;
 
 1732   if (dphi > wholeCircle) k += 4; 
 
 1735     std::cerr << 
"HepPolyhedronCone(s)/Tube(s): error in input parameters";
 
 1736     if ((k & 1) != 0) std::cerr << 
" (radiuses)";
 
 1737     if ((k & 2) != 0) std::cerr << 
" (half-length)";
 
 1738     if ((k & 4) != 0) std::cerr << 
" (angles)";
 
 1739     std::cerr << std::endl;
 
 1740     std::cerr << 
" Rmn1=" << Rmn1 << 
" Rmx1=" << Rmx1;
 
 1741     std::cerr << 
" Rmn2=" << Rmn2 << 
" Rmx2=" << Rmx2;
 
 1742     std::cerr << 
" Dz=" << Dz << 
" Phi1=" << Phi1 << 
" Dphi=" << Dphi
 
 1813   if (dphi <= 0. || dphi > 
twopi) {
 
 1815       << 
"HepPolyhedronPgon/Pcon: wrong delta phi = " << dphi
 
 1822       << 
"HepPolyhedronPgon/Pcon: number of z-planes less than two = " << nz
 
 1829       << 
"HepPolyhedronPgon/Pcon: error in number of phi-steps =" << npdv
 
 1835   for (i=0; i<nz; i++) {
 
 1836     if (rmin[i] < 0. || rmax[i] < 0. || rmin[i] > rmax[i]) {
 
 1838         << 
"HepPolyhedronPgon: error in radiuses rmin[" << i << 
"]=" 
 1839         << rmin[i] << 
" rmax[" << i << 
"]=" << rmax[i]
 
 1851   if (z[0] > z[nz-1]) {
 
 1852     for (i=0; i<nz; i++) {
 
 1859     for (i=0; i<nz; i++) {
 
 1861       rr[i]    = rmax[nz-i-1];
 
 1862       zz[i+nz] = z[nz-i-1];
 
 1863       rr[i+nz] = rmin[nz-i-1];
 
 1869   RotateAroundZ(npdv, phi, dphi, nz, nz, zz, rr, -1, (npdv == 0) ? -1 : 1); 
 
 1907   if (dphi <= 0. || dphi > 
twopi) {
 
 1909       << 
"HepPolyhedronSphere: wrong delta phi = " << dphi
 
 1914   if (the < 0. || the > 
pi) {
 
 1916       << 
"HepPolyhedronSphere: wrong theta = " << the
 
 1921   if (dthe <= 0. || dthe > pi) {
 
 1923       << 
"HepPolyhedronSphere: wrong delta theta = " << dthe
 
 1928   if (the+dthe > pi) {
 
 1930       << 
"HepPolyhedronSphere: wrong theta + delta theta = " 
 1931       << the << 
" " << dthe
 
 1936   if (rmin < 0. || rmin >= rmax) {
 
 1938       << 
"HepPolyhedronSphere: error in radiuses" 
 1939       << 
" rmin=" << rmin << 
" rmax=" << rmax
 
 1948   if (np1 <= 1) np1 = 2;
 
 1957   for (
G4int i=0; i<np1; i++) {
 
 1958     cosa  = std::cos(the+i*a);
 
 1959     sina  = std::sin(the+i*a);
 
 1963       zz[i+np1] = rmin*cosa;
 
 1964       rr[i+np1] = rmin*sina;
 
 2005   if (dphi <= 0. || dphi > 
twopi) {
 
 2007       << 
"HepPolyhedronTorus: wrong delta phi = " << dphi
 
 2012   if (rmin < 0. || rmin >= rmax || rmax >= rtor) {
 
 2014       << 
"HepPolyhedronTorus: error in radiuses" 
 2015       << 
" rmin=" << rmin << 
" rmax=" << rmax << 
" rtorus=" << rtor
 
 2031   for (
G4int i=0; i<np1; i++) {
 
 2032     cosa  = std::cos(i*a);
 
 2033     sina  = std::sin(i*a);
 
 2035     rr[i] = rtor+rmax*sina;
 
 2037       zz[i+np1] = rmin*cosa;
 
 2038       rr[i+np1] = rtor+rmin*sina;
 
 2078   if (zCut1 >= cz || zCut2 <= -cz || zCut1 > zCut2) {
 
 2079     std::cerr << 
"HepPolyhedronEllipsoid: wrong zCut1 = " << zCut1
 
 2080            << 
" zCut2 = " << zCut2
 
 2081            << 
" for given cz = " << cz << std::endl;
 
 2085     std::cerr << 
"HepPolyhedronEllipsoid: bad z semi-axis: cz = " << cz
 
 2100       sthe= std::acos(zCut2/cz);
 
 2109       dthe= std::acos(zCut1/cz)-sthe;
 
 2124       G4Exception(
"HepPolyhedronEllipsoid::HepPolyhedronEllipsoid",
 
 2137   for (
G4int i=0; i<np1-cutflag; i++) {
 
 2138     cosa  = std::cos(sthe+i*a);
 
 2139     sina  = std::sin(sthe+i*a);
 
 2152       std::cerr << 
"Logic error in HepPolyhedronEllipsoid, memory corrupted!" 
 2157       std::cerr << 
"Warning: logic error in HepPolyhedronEllipsoid." 
 2177       p->
setX( p->
x() * ax/cz );
 
 2178       p->
setY( p->
y() * by/cz );
 
 2205   if ( (ax <= 0.) || (ay <= 0.) || (h <= 0.) || (zTopCut <= 0.) ) { k = 1; }
 
 2208     std::cerr << 
"HepPolyhedronCone: error in input parameters";
 
 2209     std::cerr << std::endl;
 
 2215   zTopCut = (h >= zTopCut ? zTopCut : h);
 
 2224   rr[0] =  (h-zTopCut);
 
 2225   rr[1] =  (h+zTopCut);
 
 2241      p->
setX( p->
x() * ax );
 
 2242      p->
setY( p->
y() * ay );
 
 2259 #include "BooleanProcessor.src" 
 2273   return processor.execute(OP_UNION, *
this, 
p,ierr);
 
 2288   return processor.execute(OP_INTERSECTION, *
this, 
p,ierr);
 
 2303   return processor.execute(OP_SUBTRACTION, *
this, 
p,ierr);
 
 2311 #include "HepPolyhedronProcessor.src"