CMS 3D CMS Logo

List of all members | Public Types | Public Member Functions | Private Attributes
CACell Class Reference

#include <CACell.h>

Public Types

using CAColl = std::vector< CACell >
 
using CAntuple = std::vector< unsigned int >
 
using CAntuplet = std::vector< unsigned int >
 
using CAStatusColl = std::vector< CACellStatus >
 
using Hit = RecHitsSortedInPhi::Hit
 

Public Member Functions

int areAlignedRZ (float r1, float z1, float ro, float zo, const float ptmin, const float thetaCut) const
 
 CACell (const HitDoublets *doublets, int doubletId, const int innerHitId, const int outerHitId)
 
void checkAlignmentAndAct (CAColl &allCells, CAntuple &innerCells, 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, std::vector< CACell::CAntuplet > *foundTriplets)
 
void checkAlignmentAndPushTriplet (CAColl &allCells, CAntuple &innerCells, 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)
 
void checkAlignmentAndTag (CAColl &allCells, CAntuple &innerCells, 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)
 
void evolve (unsigned int me, CAStatusColl &allStatus)
 
void findNtuplets (CAColl &allCells, std::vector< CAntuplet > &foundNtuplets, CAntuplet &tmpNtuplet, const unsigned int minHitsPerNtuplet) const
 
Hit const & getInnerHit () const
 
float getInnerPhi () const
 
float getInnerR () const
 
float getInnerX () const
 
float getInnerY () const
 
float getInnerZ () const
 
Hit const & getOuterHit () const
 
float getOuterPhi () const
 
float getOuterR () const
 
float getOuterX () const
 
float getOuterY () const
 
float getOuterZ () const
 
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
 
void tagAsOuterNeighbor (unsigned int otherCell)
 

Private Attributes

const int theDoubletId
 
const HitDoubletstheDoublets
 
const float theInnerR
 
const float theInnerZ
 
CAntuple theOuterNeighbors
 

Detailed Description

Definition at line 36 of file CACell.h.

Member Typedef Documentation

using CACell::CAColl = std::vector<CACell>

Definition at line 41 of file CACell.h.

using CACell::CAntuple = std::vector<unsigned int>

Definition at line 39 of file CACell.h.

using CACell::CAntuplet = std::vector<unsigned int>

Definition at line 40 of file CACell.h.

using CACell::CAStatusColl = std::vector<CACellStatus>

Definition at line 42 of file CACell.h.

Definition at line 38 of file CACell.h.

Constructor & Destructor Documentation

CACell::CACell ( const HitDoublets doublets,
int  doubletId,
const int  innerHitId,
const int  outerHitId 
)
inline

Definition at line 45 of file CACell.h.

45  :
46  theDoublets(doublets), theDoubletId(doubletId)
47  ,theInnerR(doublets->rv(doubletId, HitDoublets::inner))
48  ,theInnerZ(doublets->z(doubletId, HitDoublets::inner))
49  {}
const float theInnerZ
Definition: CACell.h:296
const HitDoublets * theDoublets
Definition: CACell.h:292
const int theDoubletId
Definition: CACell.h:293
float z(int i, layer l) const
const float theInnerR
Definition: CACell.h:295
float rv(int i, layer l) const

Member Function Documentation

int CACell::areAlignedRZ ( float  r1,
float  z1,
float  ro,
float  zo,
const float  ptmin,
const float  thetaCut 
) const
inline

Definition at line 174 of file CACell.h.

References funct::abs(), ALCARECOTkAlMinBias_cff::pMin, and mathSSE::sqrt().

175  {
176  float radius_diff = std::abs(r1 - ro);
177  float distance_13_squared = radius_diff*radius_diff + (z1 - zo)*(z1 - zo);
178 
179  float pMin = ptmin*std::sqrt(distance_13_squared); //this needs to be divided by radius_diff later
180 
181  float tan_12_13_half_mul_distance_13_squared = fabs(z1 * (getInnerR() - ro) + getInnerZ() * (ro - r1) + zo * (r1 - getInnerR())) ;
182  return tan_12_13_half_mul_distance_13_squared * pMin <= thetaCut * distance_13_squared * radius_diff;
183  }
float getInnerZ() const
Definition: CACell.h:78
T sqrt(T t)
Definition: SSEVec.h:18
float getInnerR() const
Definition: CACell.h:86
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
void CACell::checkAlignmentAndAct ( CAColl allCells,
CAntuple innerCells,
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,
std::vector< CACell::CAntuplet > *  foundTriplets 
)
inline

Definition at line 120 of file CACell.h.

References constexpr, mps_fire::i, heppy_loop::loop, convertSQLiteXML::ok, and diffTwoXMLs::r1.

122  {
123  int ncells = innerCells.size();
124  int constexpr VSIZE = 16;
125  int ok[VSIZE];
126  float r1[VSIZE];
127  float z1[VSIZE];
128  auto ro = getOuterR();
129  auto zo = getOuterZ();
130  unsigned int cellId = this - &allCells.front();
131  auto loop = [&](int i, int vs) {
132  for (int j=0;j<vs; ++j) {
133  auto koc = innerCells[i+j];
134  auto & oc = allCells[koc];
135  r1[j] = oc.getInnerR();
136  z1[j] = oc.getInnerZ();
137  }
138  // this vectorize!
139  for (int j=0;j<vs; ++j) ok[j] = areAlignedRZ(r1[j], z1[j], ro, zo, ptmin, thetaCut);
140  for (int j=0;j<vs; ++j) {
141  auto koc = innerCells[i+j];
142  auto & oc = allCells[koc];
143  if (ok[j]&&haveSimilarCurvature(oc,ptmin, region_origin_x, region_origin_y,
144  region_origin_radius, phiCut, hardPtCut)) {
145  if (foundTriplets) foundTriplets->emplace_back(CACell::CAntuplet{koc,cellId});
146  else {
147  oc.tagAsOuterNeighbor(cellId);
148  }
149  }
150  }
151  };
152  auto lim = VSIZE*(ncells/VSIZE);
153  for (int i=0; i<lim; i+=VSIZE) loop(i, VSIZE);
154  loop(lim, ncells-lim);
155 
156  }
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
Definition: CACell.h:192
float getOuterR() const
Definition: CACell.h:90
#define constexpr
float getOuterZ() const
Definition: CACell.h:82
int areAlignedRZ(float r1, float z1, float ro, float zo, const float ptmin, const float thetaCut) const
Definition: CACell.h:174
std::vector< unsigned int > CAntuplet
Definition: CACell.h:40
void CACell::checkAlignmentAndPushTriplet ( CAColl allCells,
CAntuple innerCells,
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 
)
inline

Definition at line 165 of file CACell.h.

168  {
169  checkAlignmentAndAct(allCells, innerCells, ptmin, region_origin_x, region_origin_y, region_origin_radius, thetaCut,
170  phiCut, hardPtCut, &foundTriplets);
171  }
void checkAlignmentAndAct(CAColl &allCells, CAntuple &innerCells, 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, std::vector< CACell::CAntuplet > *foundTriplets)
Definition: CACell.h:120
void CACell::checkAlignmentAndTag ( CAColl allCells,
CAntuple innerCells,
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 
)
inline

Definition at line 158 of file CACell.h.

160  {
161  checkAlignmentAndAct(allCells, innerCells, ptmin, region_origin_x, region_origin_y, region_origin_radius, thetaCut,
162  phiCut, hardPtCut, nullptr);
163 
164  }
void checkAlignmentAndAct(CAColl &allCells, CAntuple &innerCells, 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, std::vector< CACell::CAntuplet > *foundTriplets)
Definition: CACell.h:120
void CACell::evolve ( unsigned int  me,
CAStatusColl allStatus 
)
inline

Definition at line 102 of file CACell.h.

References CACellStatus::getCAState().

102  {
103 
104  allStatus[me].hasSameStateNeighbors = 0;
105  auto mystate = allStatus[me].theCAState;
106 
107  for (auto oc : theOuterNeighbors ) {
108 
109  if (allStatus[oc].getCAState() == mystate) {
110 
111  allStatus[me].hasSameStateNeighbors = 1;
112 
113  break;
114  }
115  }
116 
117  }
CAntuple theOuterNeighbors
Definition: CACell.h:290
void CACell::findNtuplets ( CAColl allCells,
std::vector< CAntuplet > &  foundNtuplets,
CAntuplet tmpNtuplet,
const unsigned int  minHitsPerNtuplet 
) const
inline

Definition at line 264 of file CACell.h.

References mps_fire::i.

264  {
265 
266  // the building process for a track ends if:
267  // it has no outer neighbor
268  // it has no compatible neighbor
269  // the ntuplets is then saved if the number of hits it contains is greater than a threshold
270 
271  if (tmpNtuplet.size() == minHitsPerNtuplet - 1)
272  {
273  foundNtuplets.push_back(tmpNtuplet);
274  }
275  else
276  {
277  unsigned int numberOfOuterNeighbors = theOuterNeighbors.size();
278  for (unsigned int i = 0; i < numberOfOuterNeighbors; ++i) {
279  tmpNtuplet.push_back((theOuterNeighbors[i]));
280  allCells[theOuterNeighbors[i]].findNtuplets(allCells,foundNtuplets, tmpNtuplet, minHitsPerNtuplet);
281  tmpNtuplet.pop_back();
282  }
283  }
284 
285  }
CAntuple theOuterNeighbors
Definition: CACell.h:290
Hit const& CACell::getInnerHit ( ) const
inline

Definition at line 53 of file CACell.h.

References HitDoublets::inner.

53  {
55  }
const HitDoublets * theDoublets
Definition: CACell.h:292
const int theDoubletId
Definition: CACell.h:293
Hit const & hit(int i, layer l) const
float CACell::getInnerPhi ( ) const
inline

Definition at line 94 of file CACell.h.

References HitDoublets::inner.

94  {
96  }
const HitDoublets * theDoublets
Definition: CACell.h:292
const int theDoubletId
Definition: CACell.h:293
float phi(int i, layer l) const
float CACell::getInnerR ( ) const
inline

Definition at line 86 of file CACell.h.

86  {
87  return theInnerR;
88  }
const float theInnerR
Definition: CACell.h:295
float CACell::getInnerX ( ) const
inline

Definition at line 62 of file CACell.h.

References HitDoublets::inner.

Referenced by haveSimilarCurvature().

62  {
64  }
const HitDoublets * theDoublets
Definition: CACell.h:292
float x(int i, layer l) const
const int theDoubletId
Definition: CACell.h:293
float CACell::getInnerY ( ) const
inline

Definition at line 70 of file CACell.h.

References HitDoublets::inner.

Referenced by haveSimilarCurvature().

70  {
72  }
const HitDoublets * theDoublets
Definition: CACell.h:292
const int theDoubletId
Definition: CACell.h:293
float y(int i, layer l) const
float CACell::getInnerZ ( ) const
inline

Definition at line 78 of file CACell.h.

78  {
79  return theInnerZ;
80  }
const float theInnerZ
Definition: CACell.h:296
Hit const& CACell::getOuterHit ( ) const
inline

Definition at line 57 of file CACell.h.

References HitDoublets::outer.

57  {
59  }
const HitDoublets * theDoublets
Definition: CACell.h:292
const int theDoubletId
Definition: CACell.h:293
Hit const & hit(int i, layer l) const
float CACell::getOuterPhi ( ) const
inline

Definition at line 98 of file CACell.h.

References HitDoublets::outer.

98  {
100  }
const HitDoublets * theDoublets
Definition: CACell.h:292
const int theDoubletId
Definition: CACell.h:293
float phi(int i, layer l) const
float CACell::getOuterR ( ) const
inline

Definition at line 90 of file CACell.h.

References HitDoublets::outer.

90  {
92  }
const HitDoublets * theDoublets
Definition: CACell.h:292
const int theDoubletId
Definition: CACell.h:293
float rv(int i, layer l) const
float CACell::getOuterX ( ) const
inline

Definition at line 66 of file CACell.h.

References HitDoublets::outer.

66  {
68  }
const HitDoublets * theDoublets
Definition: CACell.h:292
float x(int i, layer l) const
const int theDoubletId
Definition: CACell.h:293
float CACell::getOuterY ( ) const
inline

Definition at line 74 of file CACell.h.

References HitDoublets::outer.

74  {
76  }
const HitDoublets * theDoublets
Definition: CACell.h:292
const int theDoubletId
Definition: CACell.h:293
float y(int i, layer l) const
float CACell::getOuterZ ( ) const
inline

Definition at line 82 of file CACell.h.

References HitDoublets::outer.

82  {
84  }
const HitDoublets * theDoublets
Definition: CACell.h:292
const int theDoubletId
Definition: CACell.h:293
float z(int i, layer l) const
bool CACell::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
inline

Definition at line 192 of file CACell.h.

References funct::abs(), MillePedeFileConverter_cfg::e, f, getInnerX(), getInnerY(), PFRecoTauDiscriminationByIsolation_cfi::offset, TCMET_cfi::radius, and mathSSE::sqrt().

194  {
195 
196 
197  auto x1 = otherCell.getInnerX();
198  auto y1 = otherCell.getInnerY();
199 
200  auto x2 = getInnerX();
201  auto y2 = getInnerY();
202 
203  auto x3 = getOuterX();
204  auto y3 = getOuterY();
205 
206  float distance_13_squared = (x1 - x3)*(x1 - x3) + (y1 - y3)*(y1 - y3);
207  float tan_12_13_half_mul_distance_13_squared = std::abs(y1 * (x2 - x3) + y2 * (x3 - x1) + y3 * (x1 - x2)) ;
208  // high pt : just straight
209  if(tan_12_13_half_mul_distance_13_squared * ptmin <= 1.0e-4f*distance_13_squared)
210  {
211 
212  float distance_3_beamspot_squared = (x3-region_origin_x) * (x3-region_origin_x) + (y3-region_origin_y) * (y3-region_origin_y);
213 
214  float dot_bs3_13 = ((x1 - x3)*( region_origin_x - x3) + (y1 - y3) * (region_origin_y-y3));
215  float proj_bs3_on_13_squared = dot_bs3_13*dot_bs3_13/distance_13_squared;
216 
217  float distance_13_beamspot_squared = distance_3_beamspot_squared - proj_bs3_on_13_squared;
218 
219  return distance_13_beamspot_squared < (region_origin_radius+phiCut)*(region_origin_radius+phiCut);
220  }
221 
222  //87 cm/GeV = 1/(3.8T * 0.3)
223 
224  //take less than radius given by the hardPtCut and reject everything below
225  float minRadius = hardPtCut*87.f; // FIXME move out and use real MagField
226 
227  auto det = (x1 - x2) * (y2 - y3) - (x2 - x3) * (y1 - y2);
228 
229 
230  auto offset = x2 * x2 + y2*y2;
231 
232  auto bc = (x1 * x1 + y1 * y1 - offset)*0.5f;
233 
234  auto cd = (offset - x3 * x3 - y3 * y3)*0.5f;
235 
236 
237 
238  auto idet = 1.f / det;
239 
240  auto x_center = (bc * (y2 - y3) - cd * (y1 - y2)) * idet;
241  auto y_center = (cd * (x1 - x2) - bc * (x2 - x3)) * idet;
242 
243  auto radius = std::sqrt((x2 - x_center)*(x2 - x_center) + (y2 - y_center)*(y2 - y_center));
244 
245  if(radius < minRadius) return false; // hard cut on pt
246 
247  auto centers_distance_squared = (x_center - region_origin_x)*(x_center - region_origin_x) + (y_center - region_origin_y)*(y_center - region_origin_y);
248  auto region_origin_radius_plus_tolerance = region_origin_radius + phiCut;
249  auto minimumOfIntersectionRange = (radius - region_origin_radius_plus_tolerance)*(radius - region_origin_radius_plus_tolerance);
250 
251  if (centers_distance_squared >= minimumOfIntersectionRange) {
252  auto maximumOfIntersectionRange = (radius + region_origin_radius_plus_tolerance)*(radius + region_origin_radius_plus_tolerance);
253  return centers_distance_squared <= maximumOfIntersectionRange;
254  }
255 
256  return false;
257 
258  }
float getInnerY() const
Definition: CACell.h:70
T sqrt(T t)
Definition: SSEVec.h:18
float getOuterX() const
Definition: CACell.h:66
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double f[11][100]
float getInnerX() const
Definition: CACell.h:62
float getOuterY() const
Definition: CACell.h:74
void CACell::tagAsOuterNeighbor ( unsigned int  otherCell)
inline

Definition at line 186 of file CACell.h.

187  {
188  theOuterNeighbors.push_back(otherCell);
189  }
CAntuple theOuterNeighbors
Definition: CACell.h:290

Member Data Documentation

const int CACell::theDoubletId
private

Definition at line 293 of file CACell.h.

const HitDoublets* CACell::theDoublets
private

Definition at line 292 of file CACell.h.

const float CACell::theInnerR
private

Definition at line 295 of file CACell.h.

const float CACell::theInnerZ
private

Definition at line 296 of file CACell.h.

CAntuple CACell::theOuterNeighbors
private

Definition at line 290 of file CACell.h.