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 35 of file CACell.h.

Member Typedef Documentation

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

Definition at line 40 of file CACell.h.

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

Definition at line 38 of file CACell.h.

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

Definition at line 39 of file CACell.h.

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

Definition at line 41 of file CACell.h.

Definition at line 37 of file CACell.h.

Constructor & Destructor Documentation

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

Definition at line 44 of file CACell.h.

44  :
45  theDoublets(doublets), theDoubletId(doubletId)
46  ,theInnerR(doublets->rv(doubletId, HitDoublets::inner))
47  ,theInnerZ(doublets->z(doubletId, HitDoublets::inner))
48  {}
const float theInnerZ
Definition: CACell.h:295
const HitDoublets * theDoublets
Definition: CACell.h:291
const int theDoubletId
Definition: CACell.h:292
float z(int i, layer l) const
const float theInnerR
Definition: CACell.h:294
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 173 of file CACell.h.

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

174  {
175  float radius_diff = std::abs(r1 - ro);
176  float distance_13_squared = radius_diff*radius_diff + (z1 - zo)*(z1 - zo);
177 
178  float pMin = ptmin*std::sqrt(distance_13_squared); //this needs to be divided by radius_diff later
179 
180  float tan_12_13_half_mul_distance_13_squared = fabs(z1 * (getInnerR() - ro) + getInnerZ() * (ro - r1) + zo * (r1 - getInnerR())) ;
181  return tan_12_13_half_mul_distance_13_squared * pMin <= thetaCut * distance_13_squared * radius_diff;
182  }
float getInnerZ() const
Definition: CACell.h:77
T sqrt(T t)
Definition: SSEVec.h:18
float getInnerR() const
Definition: CACell.h:85
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double ptmin
Definition: HydjetWrapper.h:90
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 119 of file CACell.h.

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

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

167  {
168  checkAlignmentAndAct(allCells, innerCells, ptmin, region_origin_x, region_origin_y, region_origin_radius, thetaCut,
169  phiCut, hardPtCut, &foundTriplets);
170  }
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:119
double ptmin
Definition: HydjetWrapper.h:90
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 157 of file CACell.h.

159  {
160  checkAlignmentAndAct(allCells, innerCells, ptmin, region_origin_x, region_origin_y, region_origin_radius, thetaCut,
161  phiCut, hardPtCut, nullptr);
162 
163  }
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:119
double ptmin
Definition: HydjetWrapper.h:90
void CACell::evolve ( unsigned int  me,
CAStatusColl allStatus 
)
inline

Definition at line 101 of file CACell.h.

References CACellStatus::getCAState().

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

Definition at line 263 of file CACell.h.

References mps_fire::i.

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

Definition at line 52 of file CACell.h.

References HitDoublets::inner.

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

Definition at line 93 of file CACell.h.

References HitDoublets::inner.

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

Definition at line 85 of file CACell.h.

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

Definition at line 61 of file CACell.h.

References HitDoublets::inner.

Referenced by haveSimilarCurvature().

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

Definition at line 69 of file CACell.h.

References HitDoublets::inner.

Referenced by haveSimilarCurvature().

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

Definition at line 77 of file CACell.h.

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

Definition at line 56 of file CACell.h.

References HitDoublets::outer.

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

Definition at line 97 of file CACell.h.

References HitDoublets::outer.

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

Definition at line 89 of file CACell.h.

References HitDoublets::outer.

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

Definition at line 65 of file CACell.h.

References HitDoublets::outer.

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

Definition at line 73 of file CACell.h.

References HitDoublets::outer.

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

Definition at line 81 of file CACell.h.

References HitDoublets::outer.

81  {
83  }
const HitDoublets * theDoublets
Definition: CACell.h:291
const int theDoubletId
Definition: CACell.h:292
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 191 of file CACell.h.

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

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

Definition at line 185 of file CACell.h.

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

Member Data Documentation

const int CACell::theDoubletId
private

Definition at line 292 of file CACell.h.

const HitDoublets* CACell::theDoublets
private

Definition at line 291 of file CACell.h.

const float CACell::theInnerR
private

Definition at line 294 of file CACell.h.

const float CACell::theInnerZ
private

Definition at line 295 of file CACell.h.

CAntuple CACell::theOuterNeighbors
private

Definition at line 289 of file CACell.h.