51 Point3D<double> localPosition = globalPosition.z()<0 ? xfNeg*globalPosition : xfPos*globalPosition;
52 int zIndex = globalPosition.z() <0 ? 0:1;
53 double eta = localPosition.getEta();
54 double phi = localPosition.getPhi();
55 double r = localPosition.perp();
57 bool implementWaves=
true;
64 const CellBinning & etaBinning=regionDescriptor->
getEtaBinning();
65 if (
eta>etaBinning.getStart() &&
eta<etaBinning.getEnd()) {
66 unsigned int etaIndex = int((
eta - etaBinning.getStart())/etaBinning.getDelta()) + etaBinning.getFirstDivisionNumber();
67 unsigned int phiIndex = 0;
71 if (
r>rmin &&
r<rmax) {
72 const CellBinning & phiBinning=regionDescriptor->
getPhiBinning();
73 double minPhi=std::min(phiBinning.getStart(), phiBinning.getEnd());
74 double maxPhi=std::max(phiBinning.getStart(), phiBinning.getEnd());
80 unsigned int phiIndex = int((
phi - phiBinning.getStart())/phiBinning.getDelta()) + phiBinning.getFirstDivisionNumber();
83 if (samplingIndex!=0) {
86 double delta=-2.0*
M_PI/1024/2;
88 double phiLocalUpper=cellPtr->getPhiLocalUpper()-delta;
89 double phiLocalLower=cellPtr->getPhiLocalLower()-delta;
91 while (phiLocalLower<0) phiLocalLower += 2.0*
M_PI;
92 while (phiLocalUpper<0) phiLocalUpper += 2.0*
M_PI;
93 while (phiLocalLower>2*
M_PI) phiLocalLower -= 2.0*
M_PI;
94 while (phiLocalUpper>2*
M_PI) phiLocalUpper -= 2.0*
M_PI;
96 int accordionIndexUpper=int(phiLocalUpper/(2*
M_PI)*1024+0.25);
if (accordionIndexUpper==1024) accordionIndexUpper=0;
97 int accordionIndexLower=int(phiLocalLower/(2*
M_PI)*1024+0.25);
if (accordionIndexLower==1024) accordionIndexLower=0;
107 Point3D<double> P0=Point3D<double>(localPosition.x(), localPosition.y(),0)-A0;
108 int stackIndex=int(A1.dot(P0)/A1.mag2()*22.0 + 3.0)/2 ;
110 if (stackIndex<0 || stackIndex>13) {
111 G4cout <<
"Warning, bad stack index " << stackIndex <<
' ' << rmin <<
' ' <<
r <<
' ' << A0.perp() <<
' ' << A0 <<
' ' << A1 <<
' ' << P0 << G4endl;
112 if (implementWaves)
return;
120 Point3D<double> u(xcent-halfLength*cosU, ycent-halfLength*sinU,0);
121 Point3D<double> v(xcent+halfLength*cosU, ycent+halfLength*sinU,0);
122 Point3D<double>
x=v-u,
y=Hep3Vector(localPosition.x(),localPosition.y(),0)-u;
123 if ((zIndex==0 &&
x.cross(
y).z()>0) || (zIndex==1&&
x.cross(
y).z()<0)) {
124 if (implementWaves) {
125 if (phiIndex==0) phiIndex=phiBinning.getNumDivisions()-1;
135 Point3D<double> u(xcent-halfLength*cosU, ycent-halfLength*sinU,0);
136 Point3D<double> v(xcent+halfLength*cosU, ycent+halfLength*sinU,0);
137 Point3D<double>
x=v-u,
y=Hep3Vector(localPosition.x(),localPosition.y(),0)-u;
138 if ((zIndex==0 &&
x.cross(
y).z()<0) || (zIndex==1 &&
x.cross(
y).z()>0)) {
139 if (implementWaves) {
140 if (phiIndex==phiBinning.getNumDivisions()-1) phiIndex=0;
152 << ((zIndex==0) ? -1:1)