ProcessHitsMethod.
Process a single energy spot from a frozen shower. The appropriate region of the sensitive detector is calculated and a LArIdentifier is constructed
43 {
44
45
47
50
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();
56
57 bool implementWaves=true;
58
61 const EMBDetectorRegion *region = *
e;
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();
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());
75
80 unsigned int phiIndex =
int((
phi - phiBinning.getStart())/phiBinning.getDelta()) + phiBinning.getFirstDivisionNumber();
81
82
83 if (samplingIndex!=0) {
85
86 double delta=-2.0*
M_PI/1024/2;
87
88 double phiLocalUpper=cellPtr->getPhiLocalUpper()-delta;
89 double phiLocalLower=cellPtr->getPhiLocalLower()-delta;
90
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;
95
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;
98
99 Point3D<double> A0 =
102
103 Point3D<double> A1=
106
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 ;
109
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;
113 } else {
119
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;
127 }
128 } else {
134
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;
142 }
143 }
144 }
145 }
146 }
147
148
151 << 1
153 << samplingIndex
154 << regionIndex
155 << etaIndex
156 << phiIndex;
157
159
160 return;
161 }
162 }
163 }
164
165}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
Eigen::Affine3d Transform3D
GeoIntrusivePtr< const EMBCell > EMBCellConstLink
LArG4Identifier m_larID
My LAr identifier.
const CellBinning & getPhiBinning() const
The Binning in Phi.
const CellBinning & getEtaBinning() const
The Binning in Eta.
std::vector< constEMBDetectorRegion * >::const_iterator DetectorRegionConstIterator
const EMBDetDescr * getDescriptor() const
Returns the Descriptor for this region.
EMBCellConstLink getEMBCell(unsigned int ieta, unsigned int iphi) const
Access to Cells.
unsigned int getSamplingIndex() const
Returns the Sampling Layer Index.
EMBDetectorRegion::DetectorSide getEndcapIndex() const
The endcap index.
unsigned int getRegionIndex() const
Returns the Region Index.
G4ThreeVector GetPosition() const
G4double GetEnergy() const
G4bool SimpleHit(const LArG4Identifier &lar_id, G4double time, G4double energy)
First method translates to this - also for fast sims.
HepGeom::Transform3D EigenTransformToCLHEP(const Amg::Transform3D &eigenTransf)
Converts an Eigen-based Amg::Transform3D into a CLHEP-based HepGeom::Transform3D.
@ u
Enums for curvilinear frames.
unsigned int phiIndex(float phi, float binsize)
calculate phi index for a given phi