CMS 3D CMS Logo

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

#include <HGCDoublet.h>

Public Types

using HGCntuplet = std::vector< unsigned int >
 

Public Member Functions

int areAligned (double xi, double yi, double zi, double xo, double yo, double zo, float minCosTheta, float minCosPointing, const GlobalVector &refDir, bool debug=false) const
 
bool checkCompatibilityAndTag (std::vector< HGCDoublet > &allDoublets, const std::vector< int > &innerDoublets, const GlobalVector &refDir, float minCosTheta, float minCosPointing=1., bool debug=false)
 
void findNtuplets (std::vector< HGCDoublet > &allDoublets, HGCntuplet &tmpNtuplet, int seedIndex, const bool outInDFS, const unsigned int outInHops, const unsigned int maxOutInHops, std::vector< std::pair< unsigned int, unsigned int > > &outInToVisit)
 
 HGCDoublet (const int innerClusterId, const int outerClusterId, const int doubletId, const std::vector< reco::CaloCluster > *layerClusters, const int seedIndex)
 
int innerClusterId () const
 
double innerR () const
 
double innerX () const
 
double innerY () const
 
double innerZ () const
 
int outerClusterId () const
 
double outerR () const
 
double outerX () const
 
double outerY () const
 
double outerZ () const
 
int seedIndex () const
 
void setVisited (bool visited)
 
void tagAsInnerNeighbor (unsigned int otherDoublet)
 
void tagAsOuterNeighbor (unsigned int otherDoublet)
 

Private Attributes

bool alreadyVisited_
 
const int innerClusterId_
 
std::vector< int > innerNeighbors_
 
const double innerR_
 
const double innerX_
 
const double innerY_
 
const double innerZ_
 
const std::vector< reco::CaloCluster > * layerClusters_
 
const int outerClusterId_
 
std::vector< int > outerNeighbors_
 
const double outerR_
 
const double outerX_
 
const double outerY_
 
const double outerZ_
 
int seedIndex_
 
const int theDoubletId_
 

Detailed Description

Definition at line 14 of file HGCDoublet.h.

Member Typedef Documentation

◆ HGCntuplet

using HGCDoublet::HGCntuplet = std::vector<unsigned int>

Definition at line 16 of file HGCDoublet.h.

Constructor & Destructor Documentation

◆ HGCDoublet()

HGCDoublet::HGCDoublet ( const int  innerClusterId,
const int  outerClusterId,
const int  doubletId,
const std::vector< reco::CaloCluster > *  layerClusters,
const int  seedIndex 
)
inline

Member Function Documentation

◆ areAligned()

int HGCDoublet::areAligned ( double  xi,
double  yi,
double  zi,
double  xo,
double  yo,
double  zo,
float  minCosTheta,
float  minCosPointing,
const GlobalVector refDir,
bool  debug = false 
) const

Definition at line 64 of file HGCDoublet.cc.

73  {
74  auto dx1 = xo - xi;
75  auto dy1 = yo - yi;
76  auto dz1 = zo - zi;
77 
78  auto dx2 = innerX() - xi;
79  auto dy2 = innerY() - yi;
80  auto dz2 = innerZ() - zi;
81 
82  // inner product
83  auto dot = dx1 * dx2 + dy1 * dy2 + dz1 * dz2;
84  auto dotsq = dot * dot;
85  // magnitudes
86  auto mag1sq = dx1 * dx1 + dy1 * dy1 + dz1 * dz1;
87  auto mag2sq = dx2 * dx2 + dy2 * dy2 + dz2 * dz2;
88 
89  auto minCosTheta_sq = minCosTheta * minCosTheta;
90  bool isWithinLimits = (dotsq > minCosTheta_sq * mag1sq * mag2sq);
91 
92  if (debug) {
93  LogDebug("HGCDoublet") << "-- Are Aligned -- dotsq: " << dotsq << " mag1sq: " << mag1sq << " mag2sq: " << mag2sq
94  << "minCosTheta_sq:" << minCosTheta_sq << " isWithinLimits: " << isWithinLimits << std::endl;
95  }
96 
97  // Now check the compatibility with the pointing origin.
98  // Pointing origin is a vector obtained by the seed (track extrapolation i.e.)
99  // or the direction wrt (0,0,0)
100  // The compatibility is checked only for the innermost doublets: the
101  // one with the outer doublets comes in by the alignment requirement of
102  // the doublets themeselves
103 
104  const GlobalVector firstDoublet(dx2, dy2, dz2);
105  const GlobalVector pointingDir = (seedIndex_ == -1) ? GlobalVector(innerX(), innerY(), innerZ()) : refDir;
106 
107  auto dot_pointing = pointingDir.dot(firstDoublet);
108  auto dot_pointing_sq = dot_pointing * dot_pointing;
109  auto mag_pointing_sq = pointingDir.mag2();
110  auto minCosPointing_sq = minCosPointing * minCosPointing;
111  bool isWithinLimitsPointing = (dot_pointing_sq > minCosPointing_sq * mag_pointing_sq * mag2sq);
112  if (debug) {
113  LogDebug("HGCDoublet") << "Pointing direction: " << pointingDir << std::endl;
114  LogDebug("HGCDoublet") << "-- Are Aligned -- dot_pointing_sq: " << dot_pointing_sq
115  << " mag_pointing_sq: " << mag_pointing_sq << " mag2sq: " << mag2sq
116  << " isWithinLimitsPointing: " << isWithinLimitsPointing << std::endl;
117  }
118  // by squaring cosTheta and multiplying by the squares of the magnitudes
119  // an equivalent comparison is made without the division and square root which are costly FP ops.
120  return isWithinLimits && isWithinLimitsPointing;
121 }

References debug, Vector3DBase< T, FrameTag >::dot(), dot(), innerX(), innerY(), innerZ(), LogDebug, PV3DBase< T, PVType, FrameType >::mag2(), seedIndex_, and protons_cff::xi.

Referenced by checkCompatibilityAndTag().

◆ checkCompatibilityAndTag()

bool HGCDoublet::checkCompatibilityAndTag ( std::vector< HGCDoublet > &  allDoublets,
const std::vector< int > &  innerDoublets,
const GlobalVector refDir,
float  minCosTheta,
float  minCosPointing = 1.,
bool  debug = false 
)

Definition at line 3 of file HGCDoublet.cc.

8  {
9  int nDoublets = innerDoublets.size();
10  int constexpr VSIZE = 4;
11  int ok[VSIZE];
12  double xi[VSIZE];
13  double yi[VSIZE];
14  double zi[VSIZE];
15  int seedi[VSIZE];
16  auto xo = outerX();
17  auto yo = outerY();
18  auto zo = outerZ();
19  unsigned int doubletId = theDoubletId_;
20 
21  auto loop = [&](int i, int vs) {
22  for (int j = 0; j < vs; ++j) {
23  auto otherDoubletId = innerDoublets[i + j];
24  auto &otherDoublet = allDoublets[otherDoubletId];
25  xi[j] = otherDoublet.innerX();
26  yi[j] = otherDoublet.innerY();
27  zi[j] = otherDoublet.innerZ();
28  seedi[j] = otherDoublet.seedIndex();
29  if (debug) {
30  LogDebug("HGCDoublet") << i + j << " is doublet " << otherDoubletId << std::endl;
31  }
32  }
33  for (int j = 0; j < vs; ++j) {
34  if (seedi[j] != seedIndex_) {
35  ok[j] = 0;
36  continue;
37  }
38  ok[j] = areAligned(xi[j], yi[j], zi[j], xo, yo, zo, minCosTheta, minCosPointing, refDir, debug);
39  if (debug) {
40  LogDebug("HGCDoublet") << "Are aligned for InnerDoubletId: " << i + j << " is " << ok[j] << std::endl;
41  }
42  }
43  for (int j = 0; j < vs; ++j) {
44  auto otherDoubletId = innerDoublets[i + j];
45  auto &otherDoublet = allDoublets[otherDoubletId];
46  if (ok[j]) {
47  otherDoublet.tagAsOuterNeighbor(doubletId);
48  allDoublets[doubletId].tagAsInnerNeighbor(otherDoubletId);
49  }
50  }
51  };
52  auto lim = VSIZE * (nDoublets / VSIZE);
53  for (int i = 0; i < lim; i += VSIZE)
54  loop(i, VSIZE);
55  loop(lim, nDoublets - lim);
56 
57  if (debug) {
58  LogDebug("HGCDoublet") << "Found " << innerNeighbors_.size() << " compatible doublets out of " << nDoublets
59  << " considered" << std::endl;
60  }
61  return innerNeighbors_.empty();
62 }

References areAligned(), debug, mps_fire::i, innerNeighbors_, dqmiolumiharvest::j, LogDebug, heppy_loop::loop, convertSQLiteXML::ok, outerX(), outerY(), outerZ(), seedIndex_, theDoubletId_, and protons_cff::xi.

◆ findNtuplets()

void HGCDoublet::findNtuplets ( std::vector< HGCDoublet > &  allDoublets,
HGCntuplet tmpNtuplet,
int  seedIndex,
const bool  outInDFS,
const unsigned int  outInHops,
const unsigned int  maxOutInHops,
std::vector< std::pair< unsigned int, unsigned int > > &  outInToVisit 
)

Definition at line 123 of file HGCDoublet.cc.

129  {
130  if (!alreadyVisited_ && seedIndex == seedIndex_) {
131  alreadyVisited_ = true;
132  tmpNtuplet.push_back(theDoubletId_);
133  unsigned int numberOfOuterNeighbors = outerNeighbors_.size();
134  for (unsigned int i = 0; i < numberOfOuterNeighbors; ++i) {
135  allDoublets[outerNeighbors_[i]].findNtuplets(
136  allDoublets, tmpNtuplet, seedIndex, outInDFS, outInHops, maxOutInHops, outInToVisit);
137  }
138  if (outInDFS && outInHops < maxOutInHops) {
139  for (auto inN : innerNeighbors_) {
140  outInToVisit.emplace_back(inN, outInHops + 1);
141  }
142  }
143  }
144 }

References alreadyVisited_, mps_fire::i, innerNeighbors_, outerNeighbors_, seedIndex(), seedIndex_, and theDoubletId_.

◆ innerClusterId()

int HGCDoublet::innerClusterId ( ) const
inline

Definition at line 56 of file HGCDoublet.h.

56 { return innerClusterId_; }

References innerClusterId_.

◆ innerR()

double HGCDoublet::innerR ( ) const
inline

Definition at line 50 of file HGCDoublet.h.

50 { return innerR_; }

References innerR_.

◆ innerX()

double HGCDoublet::innerX ( ) const
inline

Definition at line 38 of file HGCDoublet.h.

38 { return innerX_; }

References innerX_.

Referenced by areAligned().

◆ innerY()

double HGCDoublet::innerY ( ) const
inline

Definition at line 42 of file HGCDoublet.h.

42 { return innerY_; }

References innerY_.

Referenced by areAligned().

◆ innerZ()

double HGCDoublet::innerZ ( ) const
inline

Definition at line 46 of file HGCDoublet.h.

46 { return innerZ_; }

References innerZ_.

Referenced by areAligned().

◆ outerClusterId()

int HGCDoublet::outerClusterId ( ) const
inline

Definition at line 58 of file HGCDoublet.h.

58 { return outerClusterId_; }

References outerClusterId_.

◆ outerR()

double HGCDoublet::outerR ( ) const
inline

Definition at line 52 of file HGCDoublet.h.

52 { return outerZ_; }

References outerZ_.

◆ outerX()

double HGCDoublet::outerX ( ) const
inline

Definition at line 40 of file HGCDoublet.h.

40 { return outerX_; }

References outerX_.

Referenced by checkCompatibilityAndTag().

◆ outerY()

double HGCDoublet::outerY ( ) const
inline

Definition at line 44 of file HGCDoublet.h.

44 { return outerY_; }

References outerY_.

Referenced by checkCompatibilityAndTag().

◆ outerZ()

double HGCDoublet::outerZ ( ) const
inline

Definition at line 48 of file HGCDoublet.h.

48 { return outerZ_; }

References outerZ_.

Referenced by checkCompatibilityAndTag().

◆ seedIndex()

int HGCDoublet::seedIndex ( ) const
inline

Definition at line 54 of file HGCDoublet.h.

54 { return seedIndex_; }

References seedIndex_.

Referenced by findNtuplets().

◆ setVisited()

void HGCDoublet::setVisited ( bool  visited)
inline

Definition at line 90 of file HGCDoublet.h.

References alreadyVisited_, and class-composition::visited.

◆ tagAsInnerNeighbor()

void HGCDoublet::tagAsInnerNeighbor ( unsigned int  otherDoublet)
inline

Definition at line 62 of file HGCDoublet.h.

62 { innerNeighbors_.push_back(otherDoublet); }

References innerNeighbors_.

◆ tagAsOuterNeighbor()

void HGCDoublet::tagAsOuterNeighbor ( unsigned int  otherDoublet)
inline

Definition at line 60 of file HGCDoublet.h.

60 { outerNeighbors_.push_back(otherDoublet); }

References outerNeighbors_.

Member Data Documentation

◆ alreadyVisited_

bool HGCDoublet::alreadyVisited_
private

Definition at line 110 of file HGCDoublet.h.

Referenced by findNtuplets(), and setVisited().

◆ innerClusterId_

const int HGCDoublet::innerClusterId_
private

Definition at line 98 of file HGCDoublet.h.

Referenced by innerClusterId().

◆ innerNeighbors_

std::vector<int> HGCDoublet::innerNeighbors_
private

Definition at line 95 of file HGCDoublet.h.

Referenced by checkCompatibilityAndTag(), findNtuplets(), and tagAsInnerNeighbor().

◆ innerR_

const double HGCDoublet::innerR_
private

Definition at line 101 of file HGCDoublet.h.

Referenced by innerR().

◆ innerX_

const double HGCDoublet::innerX_
private

Definition at line 103 of file HGCDoublet.h.

Referenced by innerX().

◆ innerY_

const double HGCDoublet::innerY_
private

Definition at line 105 of file HGCDoublet.h.

Referenced by innerY().

◆ innerZ_

const double HGCDoublet::innerZ_
private

Definition at line 107 of file HGCDoublet.h.

Referenced by innerZ().

◆ layerClusters_

const std::vector<reco::CaloCluster>* HGCDoublet::layerClusters_
private

Definition at line 93 of file HGCDoublet.h.

◆ outerClusterId_

const int HGCDoublet::outerClusterId_
private

Definition at line 99 of file HGCDoublet.h.

Referenced by outerClusterId().

◆ outerNeighbors_

std::vector<int> HGCDoublet::outerNeighbors_
private

Definition at line 94 of file HGCDoublet.h.

Referenced by findNtuplets(), and tagAsOuterNeighbor().

◆ outerR_

const double HGCDoublet::outerR_
private

Definition at line 102 of file HGCDoublet.h.

◆ outerX_

const double HGCDoublet::outerX_
private

Definition at line 104 of file HGCDoublet.h.

Referenced by outerX().

◆ outerY_

const double HGCDoublet::outerY_
private

Definition at line 106 of file HGCDoublet.h.

Referenced by outerY().

◆ outerZ_

const double HGCDoublet::outerZ_
private

Definition at line 108 of file HGCDoublet.h.

Referenced by outerR(), and outerZ().

◆ seedIndex_

int HGCDoublet::seedIndex_
private

Definition at line 109 of file HGCDoublet.h.

Referenced by areAligned(), checkCompatibilityAndTag(), findNtuplets(), and seedIndex().

◆ theDoubletId_

const int HGCDoublet::theDoubletId_
private

Definition at line 97 of file HGCDoublet.h.

Referenced by checkCompatibilityAndTag(), and findNtuplets().

dot
T dot(const Basic3DVector &v) const
Scalar product, or "dot" product, with a vector of same type.
Definition: Basic3DVectorLD.h:212
Vector3DBase
Definition: Vector3DBase.h:8
DDAxes::y
HGCDoublet::innerX
double innerX() const
Definition: HGCDoublet.h:38
mps_fire.i
i
Definition: mps_fire.py:428
HGCDoublet::theDoubletId_
const int theDoubletId_
Definition: HGCDoublet.h:97
HGCDoublet::outerClusterId
int outerClusterId() const
Definition: HGCDoublet.h:58
HGCDoublet::outerX_
const double outerX_
Definition: HGCDoublet.h:104
DDAxes::x
GlobalVector
Global3DVector GlobalVector
Definition: GlobalVector.h:10
HGCDoublet::innerClusterId_
const int innerClusterId_
Definition: HGCDoublet.h:98
PV3DBase::mag2
T mag2() const
Definition: PV3DBase.h:63
convertSQLiteXML.ok
bool ok
Definition: convertSQLiteXML.py:98
HGCDoublet::outerClusterId_
const int outerClusterId_
Definition: HGCDoublet.h:99
HGCDoublet::outerZ
double outerZ() const
Definition: HGCDoublet.h:48
debug
#define debug
Definition: HDRShower.cc:19
HGCDoublet::innerX_
const double innerX_
Definition: HGCDoublet.h:103
HGCDoublet::seedIndex
int seedIndex() const
Definition: HGCDoublet.h:54
DDAxes::z
HGCDoublet::innerY_
const double innerY_
Definition: HGCDoublet.h:105
HGCDoublet::alreadyVisited_
bool alreadyVisited_
Definition: HGCDoublet.h:110
class-composition.visited
visited
Definition: class-composition.py:74
HLTEgPhaseIITestSequence_cff.layerClusters
layerClusters
Definition: HLTEgPhaseIITestSequence_cff.py:2506
HGCDoublet::outerX
double outerX() const
Definition: HGCDoublet.h:40
HGCDoublet::outerY
double outerY() const
Definition: HGCDoublet.h:44
HGCDoublet::innerClusterId
int innerClusterId() const
Definition: HGCDoublet.h:56
LogDebug
#define LogDebug(id)
Definition: MessageLogger.h:233
HGCDoublet::layerClusters_
const std::vector< reco::CaloCluster > * layerClusters_
Definition: HGCDoublet.h:93
heppy_loop.loop
loop
Definition: heppy_loop.py:28
position
static int position[264][3]
Definition: ReadPGInfo.cc:289
HGCDoublet::outerR_
const double outerR_
Definition: HGCDoublet.h:102
HGCDoublet::innerZ_
const double innerZ_
Definition: HGCDoublet.h:107
HGCDoublet::innerY
double innerY() const
Definition: HGCDoublet.h:42
Vector3DBase::dot
PreciseFloatType< T, U >::Type dot(const Vector3DBase< U, FrameTag > &v) const
Definition: Vector3DBase.h:99
HGCDoublet::outerNeighbors_
std::vector< int > outerNeighbors_
Definition: HGCDoublet.h:94
alignCSCRings.r
r
Definition: alignCSCRings.py:93
HGCDoublet::outerY_
const double outerY_
Definition: HGCDoublet.h:106
HGCDoublet::areAligned
int areAligned(double xi, double yi, double zi, double xo, double yo, double zo, float minCosTheta, float minCosPointing, const GlobalVector &refDir, bool debug=false) const
Definition: HGCDoublet.cc:64
HGCDoublet::seedIndex_
int seedIndex_
Definition: HGCDoublet.h:109
protons_cff.xi
xi
Definition: protons_cff.py:35
HGCDoublet::innerR_
const double innerR_
Definition: HGCDoublet.h:101
HGCDoublet::innerNeighbors_
std::vector< int > innerNeighbors_
Definition: HGCDoublet.h:95
dqmiolumiharvest.j
j
Definition: dqmiolumiharvest.py:66
HGCDoublet::outerZ_
const double outerZ_
Definition: HGCDoublet.h:108
HGCDoublet::innerZ
double innerZ() const
Definition: HGCDoublet.h:46