1 #ifndef RECOPIXELVERTEXING_PIXELTRIPLETS_CACELL_h
2 #define RECOPIXELVERTEXING_PIXELTRIPLETS_CACELL_h
18 CACell(
const HitDoublets* doublets,
int doubletId,
const unsigned int cellId,
const int innerHitId,
const int outerHitId) :
89 for (
unsigned int i = 0;
i < numberOfNeighbors; ++
i) {
103 const float region_origin_y,
const float region_origin_radius,
const float thetaCut,
104 const float phiCut,
const float hardPtCut) {
108 region_origin_radius, phiCut, hardPtCut)) {
115 const float ptmin,
const float region_origin_x,
const float region_origin_y,
116 const float region_origin_radius,
const float thetaCut,
const float phiCut,
117 const float hardPtCut) {
121 region_origin_radius, phiCut, hardPtCut)) {
135 float distance_13_squared = radius_diff*radius_diff + (z1 -
theOuterZ)*(z1 -
theOuterZ);
140 return tan_12_13_half_mul_distance_13_squared * pMin <= thetaCut * distance_13_squared * radius_diff;
154 const float region_origin_x,
const float region_origin_y,
const float region_origin_radius,
const float phiCut,
const float hardPtCut)
const
167 float distance_13_squared = (x1 - x3)*(x1 - x3) + (y1 - y3)*(y1 - y3);
168 float tan_12_13_half_mul_distance_13_squared =
std::abs(y1 * (x2 - x3) + y2 * (x3 - x1) + y3 * (x1 - x2)) ;
169 if(tan_12_13_half_mul_distance_13_squared * ptmin <= 1.0
e-4
f*distance_13_squared)
172 float distance_3_beamspot_squared = (x3-region_origin_x) * (x3-region_origin_x) + (y3-region_origin_y) * (y3-region_origin_y);
174 float dot_bs3_13 = ((x1 - x3)*( region_origin_x - x3) + (y1 - y3) * (region_origin_y-y3));
175 float proj_bs3_on_13_squared = dot_bs3_13*dot_bs3_13/distance_13_squared;
177 float distance_13_beamspot_squared = distance_3_beamspot_squared - proj_bs3_on_13_squared;
179 if(distance_13_beamspot_squared > (region_origin_radius+phiCut)*(region_origin_radius+phiCut) )
189 float minRadius = hardPtCut*87.f;
191 auto det = (x1 - x2) * (y2 - y3) - (x2 - x3) * (y1 - y2);
194 auto offset = x2 * x2 + y2*y2;
196 auto bc = (x1 * x1 + y1 * y1 -
offset)*0.5
f;
198 auto cd = (
offset - x3 * x3 - y3 * y3)*0.5
f;
202 auto idet = 1.f / det;
204 auto x_center = (bc * (y2 - y3) - cd * (y1 - y2)) * idet;
205 auto y_center = (cd * (x1 - x2) - bc * (x2 - x3)) * idet;
207 auto radius =
std::sqrt((x2 - x_center)*(x2 - x_center) + (y2 - y_center)*(y2 - y_center));
211 auto centers_distance_squared = (x_center - region_origin_x)*(x_center - region_origin_x) + (y_center - region_origin_y)*(y_center - region_origin_y);
212 auto region_origin_radius_plus_tolerance = region_origin_radius + phiCut;
213 auto minimumOfIntersectionRange = (
radius - region_origin_radius_plus_tolerance)*(
radius - region_origin_radius_plus_tolerance);
215 if (centers_distance_squared >= minimumOfIntersectionRange) {
216 auto maximumOfIntersectionRange = (
radius + region_origin_radius_plus_tolerance)*(
radius + region_origin_radius_plus_tolerance);
217 return centers_distance_squared <= maximumOfIntersectionRange;
242 void findNtuplets(std::vector<CAntuplet>& foundNtuplets,
CAntuplet& tmpNtuplet,
const unsigned int minHitsPerNtuplet)
const {
249 if (tmpNtuplet.size() == minHitsPerNtuplet - 1)
251 foundNtuplets.push_back(tmpNtuplet);
262 for (
unsigned int i = 0;
i < numberOfOuterNeighbors; ++
i) {
265 tmpNtuplet.pop_back();
const HitDoublets * theDoublets
const unsigned int theInnerHitId
float x(int i, layer l) const
void tagAsOuterNeighbor(CACell *otherCell)
bool isRootCell(const unsigned int minimumCAState) const
unsigned int getCAState() const
float getOuterPhi() const
Hit const & getInnerHit() const
bool areAlignedRZ(const CACell *otherCell, const float ptmin, const float thetaCut) const
std::vector< CACell * > theInnerNeighbors
bool haveSimilarCurvature(const CACell *otherCell, const float ptmin, const float region_origin_x, const float region_origin_y, const float region_origin_radius, const float phiCut, const float hardPtCut) const
Abs< T >::type abs(const T &t)
void tagAsInnerNeighbor(CACell *otherCell)
unsigned int getCellId() const
float y(int i, layer l) const
void checkAlignmentAndTag(CACell *innerCell, const float ptmin, const float region_origin_x, const float region_origin_y, const float region_origin_radius, const float thetaCut, const float phiCut, const float hardPtCut)
float getInnerPhi() const
Hit const & getOuterHit() const
BaseTrackerRecHit const * Hit
void findNtuplets(std::vector< CAntuplet > &foundNtuplets, CAntuplet &tmpNtuplet, const unsigned int minHitsPerNtuplet) const
unsigned int getInnerHitId() const
float phi(int i, layer l) const
const unsigned int theCellId
unsigned int getOuterHitId() const
CACell(const HitDoublets *doublets, int doubletId, const unsigned int cellId, const int innerHitId, const int outerHitId)
Hit const & hit(int i, layer l) const
void checkAlignmentAndPushTriplet(CACell *innerCell, std::vector< CACell::CAntuplet > &foundTriplets, const float ptmin, const float region_origin_x, const float region_origin_y, const float region_origin_radius, const float thetaCut, const float phiCut, const float hardPtCut)
unsigned int hasSameStateNeighbors
std::vector< CACell * > CAntuplet
std::vector< CACell * > theOuterNeighbors
const unsigned int theOuterHitId