ATLAS Offline Software
List of all members
ITk::SiSpacePointsSeedMaker Class Referencefinal

#include <ITkSiSpacePointsSeedMaker.h>

Inheritance diagram for ITk::SiSpacePointsSeedMaker:
Collaboration diagram for ITk::SiSpacePointsSeedMaker:

Public Member Functions

Standard tool methods
 SiSpacePointsSeedMaker (const std::string &, const std::string &, const IInterface *)
 
virtual ~SiSpacePointsSeedMaker ()=default
 
virtual StatusCode initialize () override
 
virtual StatusCode finalize () override
 
Methods to initialize tool for new event or region
virtual void newEvent (const EventContext &ctx, EventData &data, int iteration) const override
 
virtual void newRegion (const EventContext &ctx, EventData &data, const std::vector< IdentifierHash > &vPixel, const std::vector< IdentifierHash > &vStrip) const override
 
virtual void newRegion (const EventContext &ctx, EventData &data, const std::vector< IdentifierHash > &vPixel, const std::vector< IdentifierHash > &vStrip, const IRoiDescriptor &iRD) const override
 
Methods to initilize different strategies of seeds production
virtual void find2Sp (EventData &data, const std::list< Trk::Vertex > &lv) const override
 with two space points with or without vertex constraint More...
 
virtual void find3Sp (const EventContext &ctx, EventData &data, const std::list< Trk::Vertex > &lv) const override
 with three space points with or without vertex constraint More...
 
virtual void find3Sp (const EventContext &ctx, EventData &data, const std::list< Trk::Vertex > &lv, const double *zVertex) const override
 with three space points with or without vertex constraint with information about min and max Z of the vertex More...
 
virtual void findVSp (const EventContext &ctx, EventData &data, const std::list< Trk::Vertex > &lv) const override
 with variable number space points with or without vertex constraint Variable means (2,3,4,....) any number space points More...
 
Iterator through seeds pseudo collection

produced accordingly methods find

virtual const InDet::SiSpacePointsSeednext (const EventContext &ctx, EventData &data) const override
 
virtual void writeNtuple (const InDet::SiSpacePointsSeed *seed, const Trk::Track *track, int seedType, long eventNumber) const override
 
virtual bool getWriteNtupleBoolProperty () const override
 

Private Attributes

Data handles
SG::ReadHandleKey< SpacePointContainerm_spacepointsStrip {this, "SpacePointsStripName", "ITkStripSpacePoints", "Strip space points container"}
 
SG::ReadHandleKey< SpacePointContainerm_spacepointsPixel {this, "SpacePointsPixelName", "ITkPixelSpacePoints", "Pixel space points container"}
 
SG::ReadHandleKey< SpacePointOverlapCollectionm_spacepointsOverlap {this, "SpacePointsOverlapName", "OverlapSpacePoints"}
 
SG::ReadHandleKey< Trk::PRDtoTrackMapm_prdToTrackMap {this,"PRDtoTrackMap","","option PRD-to-track association"}
 
SG::ReadCondHandleKey< InDet::BeamSpotDatam_beamSpotKey {this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot"}
 
SG::ReadCondHandleKey< AtlasFieldCacheCondObjm_fieldCondObjInputKey
 
Properties, which will not be changed after construction
BooleanProperty m_pixel {this, "usePixel", true}
 
BooleanProperty m_strip {this, "useStrip", true}
 
BooleanProperty m_useOverlap {this, "useOverlapSpCollection", true}
 
IntegerProperty m_maxsize {this, "maxSize", 10000}
 
IntegerProperty m_maxsizeSP {this, "maxSizeSP", 4096}
 
IntegerProperty m_maxOneSize {this, "maxSeedsForSpacePoint", 5}
 
FloatProperty m_etamax {this, "etaMax", 2.7}
 
FloatProperty m_r1minv {this, "minVRadius1", 0.}
 
FloatProperty m_r1maxv {this, "maxVRadius1", 60.}
 
FloatProperty m_r2minv {this, "minVRadius2", 70.}
 
FloatProperty m_r2maxv {this, "maxVRadius2", 200.}
 
FloatProperty m_drmin {this, "mindRadius", 5.}
 
FloatProperty m_drmax {this, "maxdRadius", 300.}
 
FloatProperty m_zmin {this, "minZ", -250.}
 
FloatProperty m_zmax {this , "maxZ", +250.}
 
FloatProperty m_r_rmin {this, "radMin", 0.}
 
FloatProperty m_binSizeR {this, "radStep", 2.}
 
FloatProperty m_dzver {this, "maxdZver", 5.}
 
FloatProperty m_dzdrver {this, "maxdZdRver", 0.02}
 
FloatProperty m_maxdImpact {this, "maxdImpact", 10.}
 
FloatProperty m_maxdImpactSSS {this, "maxdImpactSSS", 20.}
 
FloatProperty m_dzmaxPPP {this, "dZmaxForPPPSeeds", 600.}
 
FloatProperty m_maxScore {this, "maximumAcceptedSeedScore", 100.}
 
IntegerProperty m_maxOneSizeSSS {this, "maxSeedsForSpacePointStrips", 5}
 
IntegerProperty m_maxOneSizePPP {this, "maxSeedsForSpacePointPixels", 5}
 
BooleanProperty m_alwaysKeepConfirmedPixelSeeds {this, "alwaysKeepConfirmedPixelSeeds", false}
 
BooleanProperty m_alwaysKeepConfirmedStripSeeds {this, "alwaysKeepConfirmedStripSeeds", false}
 
BooleanProperty m_fastTracking {this, "useFastTracking", false}
 
FloatProperty m_seedScoreBonusPPP {this, "seedScoreBonusPPP", -200.}
 
FloatProperty m_seedScoreBonusSSS {this, "seedScoreBonusSSS", -400.}
 
BooleanProperty m_optimisePhiBinning {this, "optimisePhiBinning", true}
 
FloatProperty m_rminSSS {this, "radMinSSS", 400.}
 
FloatProperty m_rmaxSSS {this, "radMaxSSS", 1000.}
 
BooleanProperty m_isLRT {this, "isLRT", false}
 
FloatProperty m_drminPPP {this, "mindRadiusPPP", 6.}
 
FloatProperty m_drmaxPPP {this, "maxdRadiusPPP", 150.}
 
FloatProperty m_zmaxPPP {this, "maxZPPP", 2700.}
 
FloatProperty m_drminSSS {this, "mindRadiusSSS", 20.}
 
FloatProperty m_drmaxSSS {this, "maxdRadiusSSS", 300.}
 
FloatProperty m_zmaxSSS {this, "maxZSSS", 2700.}
 
FloatProperty m_dImpactCutSlopeUnconfirmedSSS {this, "dImpactCutSlopeUnconfirmedSSS", 1.0}
 
FloatProperty m_dImpactCutSlopeUnconfirmedPPP {this, "dImpactCutSlopeUnconfirmedPPP", 0.}
 
FloatProperty m_seedScoreBonusConfirmationSeed {this, "seedScoreBonusConfirmationSeed", -200.}
 
BooleanProperty m_useSeedConfirmation {this, "useSeedConfirmation", false}
 
Properties, which will be updated in initialize
FloatProperty m_etamin {this, "etaMin", 0.}
 
FloatProperty m_r_rmax {this, "radMax", 1100.}
 
FloatProperty m_ptmin {this, "pTmin", 500.}
 
FloatProperty m_umax {this, "minSeedsQuality", 0.}
 
Properties, which will be updated in event methods, checketa is prepared in EventData.
BooleanProperty m_checketa {this, "checkEta", false}
 
Data members, which are updated only in initialize
int m_outputlevel {0}
 
float m_dzdrmin0 {0.}
 
float m_dzdrmax0 {0.}
 
float m_ipt {0.}
 
float m_ipt2 {0.}
 
float m_COF {134 * .05f * 9}
 
float m_dzMaxFast {200.}
 
float m_R2MaxFast {2500.}
 
float m_rmaxPPP {140.}
 
float m_dzmaxSSS {900.}
 
float m_drminSeedConf {5.}
 
Properties of writeNTuple for validation purpose
Gaudi::Property< bool > m_writeNtuple {this, "WriteNtuple", false, "Flag to write Validation Ntuples"}
 
ServiceHandle< ITHistSvc > m_thistSvc
 Flag to write validation ntuples. Turned off by default. More...
 
TTree * m_outputTree
 
std::mutex m_mutex
 
std::string m_treeName ATLAS_THREAD_SAFE
 
TString m_treeFolder ATLAS_THREAD_SAFE
 
float m_d0 ATLAS_THREAD_SAFE = 0
 
float m_z0 ATLAS_THREAD_SAFE = 0
 
float m_pt ATLAS_THREAD_SAFE = 0
 
float m_eta ATLAS_THREAD_SAFE = 0
 
double m_x1 ATLAS_THREAD_SAFE = 0
 
double m_x2 ATLAS_THREAD_SAFE = 0
 
double m_x3 ATLAS_THREAD_SAFE = 0
 
double m_y1 ATLAS_THREAD_SAFE = 0
 
double m_y2 ATLAS_THREAD_SAFE = 0
 
double m_y3 ATLAS_THREAD_SAFE = 0
 
double m_z1 ATLAS_THREAD_SAFE = 0
 
double m_z2 ATLAS_THREAD_SAFE = 0
 
double m_z3 ATLAS_THREAD_SAFE = 0
 
double m_r1 ATLAS_THREAD_SAFE = 0
 
double m_r2 ATLAS_THREAD_SAFE = 0
 
double m_r3 ATLAS_THREAD_SAFE = 0
 
float m_quality ATLAS_THREAD_SAFE = 0
 
int m_type ATLAS_THREAD_SAFE = 0
 
double m_dzdr_t ATLAS_THREAD_SAFE = 0
 
double m_dzdr_b ATLAS_THREAD_SAFE = 0
 
bool m_givesTrack ATLAS_THREAD_SAFE = 0
 
float m_trackPt ATLAS_THREAD_SAFE = 0
 
float m_trackEta ATLAS_THREAD_SAFE = 0
 
long m_eventNumber ATLAS_THREAD_SAFE = 0
 
Binning parameters
int m_nBinsR {0}
 number of bins in the radial coordinate More...
 
int m_maxPhiBinPPP {0}
 number of bins in phi More...
 
float m_inverseBinSizePhiPPP {0}
 cache the inverse bin size in phi which we use - needed to evaluate phi bin locations More...
 
int m_maxPhiBinSSS {0}
 
float m_inverseBinSizePhiSSS {0}
 
int m_maxBinPhiVertex {0}
 
float m_inverseBinSizePhiVertex {0}
 
float m_seedScoreThresholdPPPConfirmationSeed {0.}
 Seed score thresholds defined based on the modifiers defined as configurables above. More...
 
float m_seedScoreThresholdSSSConfirmationSeed {0.}
 max (score is assigned negative sign) score for SSS seeds with confirmation seed requirement. More...
 
std::array< int, arraySizePhiZm_nNeighbourCellsBottomPPP {}
 arrays associating bins to each other for SP formation More...
 
std::array< int, arraySizePhiZm_nNeighbourCellsTopPPP {}
 number of neighbouring phi-z bins to consider when looking for "top SP" candidates for each phi-z bin More...
 
std::array< std::array< int, arraySizeNeighbourBins >, arraySizePhiZm_neighbourCellsBottomPPP {}
 mapping of neighbour cells in the 2D phi-z binning to consider for the "bottom SP" search for central SPs in each phi-z bin. Number of valid entries stored in m_nNeighboursPhiZbottom More...
 
std::array< std::array< int, arraySizeNeighbourBins >, arraySizePhiZm_neighbourCellsTopPPP {}
 mapping of neighbour cells in the 2D phi-z binning to consider for the "top SP" search for central SPs in each phi-z bin. Number of valid entries stored in m_nNeighboursPhiZtop More...
 
std::array< int, arraySizePhiZm_nNeighbourCellsBottomSSS {}
 
std::array< int, arraySizePhiZm_nNeighbourCellsTopSSS {}
 
std::array< std::array< int, arraySizeNeighbourBins >, arraySizePhiZm_neighbourCellsBottomSSS {}
 
std::array< std::array< int, arraySizeNeighbourBins >, arraySizePhiZm_neighbourCellsTopSSS {}
 
std::array< int, arraySizePhiZVm_nNeighboursVertexPhiZ {}
 
std::array< std::array< int, arraySizeNeighbourBinsVertex >, arraySizePhiZVm_neighboursVertexPhiZ {}
 

Print internal tool parameters and status

enum  Size {
  arraySizePhi =200, arraySizeZ =11, arraySizePhiZ =arraySizePhi*arraySizeZ, arraySizeNeighbourBins =9,
  arraySizePhiV =100, arraySizeZV =3, arraySizePhiZV =arraySizePhiV*arraySizeZV, arraySizeNeighbourBinsVertex =6
}
 enum for array sizes Note that this stores the maximum capacities, the actual binnings do not always use the full size. More...
 
virtual MsgStream & dump (EventData &data, MsgStream &out) const override
 

Disallow default instantiation, copy, assignment

 SiSpacePointsSeedMaker ()=delete
 
 SiSpacePointsSeedMaker (const SiSpacePointsSeedMaker &)=delete
 
SiSpacePointsSeedMakeroperator= (const SiSpacePointsSeedMaker &)=delete
 
MsgStream & dumpConditions (EventData &data, MsgStream &out) const
 
void buildFrameWork ()
 
void buildBeamFrameWork (EventData &data) const
 
SiSpacePointForSeednewSpacePoint (EventData &data, const Trk::SpacePoint *const &sp) const
 Create a SiSpacePointForSeed from the space point. More...
 
SiSpacePointForSeednewSpacePoint (EventData &data, const Trk::SpacePoint *const &sp, float *r, bool usePixStripInform=false) const
 
void newOneSeed (EventData &data, SiSpacePointForSeed *&, SiSpacePointForSeed *&, SiSpacePointForSeed *&, float, float) const
 
void newOneSeedQ (EventData &data, SiSpacePointForSeed *&, SiSpacePointForSeed *&, SiSpacePointForSeed *&, float, float) const
 
void newOneSeedWithCurvaturesComparison (EventData &data, SiSpacePointForSeed *&, SiSpacePointForSeed *&, float) const
 
void fillLists (EventData &data) const
 
void production2Sp (EventData &data) const
 
void production3Sp (EventData &data) const
 
void production3SpSSS (EventData &data, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &iter_bottomCands, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &iter_endBottomCands, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &iter_topCands, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &iter_endTopCands, const int numberBottomCells, const int numberTopCells, int &nseed) const
 : Seed production from space points. More...
 
void production3SpPPP (EventData &data, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &iter_bottomCands, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &iter_endBottomCands, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &iter_topCands, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &iter_endTopCands, const int numberBottomCells, const int numberTopCells, int &nseed) const
 
void production3SpTrigger (EventData &, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &, const int, const int, int &) const
 as above, but for the trigger More...
 
void newOneSeedWithCurvaturesComparisonSSS (EventData &data, SiSpacePointForSeed *&SPb, SiSpacePointForSeed *&SP0, float Zob) const
 This creates all possible seeds with the passed central and bottom SP, using all top SP candidates which are stored in the data.CmSp member. More...
 
void newOneSeedWithCurvaturesComparisonPPP (EventData &data, SiSpacePointForSeed *&SPb, SiSpacePointForSeed *&SP0, float Zob) const
 
void newOneSeedWithCurvaturesComparisonSeedConfirmation (EventData &data, SiSpacePointForSeed *&SPb, SiSpacePointForSeed *&SP0, float Zob) const
 
bool isConfirmedSeed (const SiSpacePointForSeed *bottomSP, const SiSpacePointForSeed *topSP, float quality) const
 Helper method to determine if a seed is 'confirmed' - this means that a second seed exists with compatible curvature, the same bottom and central SP, but a different third SP. More...
 
void sort (std::vector< InDet::FloatInt > &s, int start, int size) const
 
bool newVertices (EventData &data, const std::list< Trk::Vertex > &) const
 
void findNext (EventData &data) const
 
bool isZCompatible (EventData &data, float Zv, float R, float T) const
 
bool isUsed (const Trk::SpacePoint *, const Trk::PRDtoTrackMap &prd_to_track_map) const
 
void initializeEventData (EventData &data, const EventContext &ctx) const
 
static MsgStream & dumpEvent (EventData &data, MsgStream &out)
 
static void buildConnectionMaps (std::array< int, arraySizePhiZ > &nNeighbourCellsBottom, std::array< int, arraySizePhiZ > &nNeighbourCellsTop, std::array< std::array< int, arraySizeNeighbourBins >, arraySizePhiZ > &neighbourCellsBottom, std::array< std::array< int, arraySizeNeighbourBins >, arraySizePhiZ > &neighbourCellsTop, int maxPhiBin, bool isSSS)
 
static void buildConnectionMapsVertex (std::array< int, arraySizePhiZV > &nNeighbourCells, std::array< std::array< int, arraySizeNeighbourBinsVertex >, arraySizePhiZV > &neighbourCells, int maxPhiBin)
 Build maps for radius-azimuthal-Z sorted collections for Z Similar logic to the above, just simplified as only 3 regions in z exist! More...
 
static float azimuthalStep (const float pTmin, const float maxd0, const float Rmin, const float Rmax)
 Determine the expected azimuthal trajectory displacement in phi in presence of the magnetic field for a particle with momentum pTmin and impact parameter maxd0, moving from a radial coordinate Rmin outward to Rmax. More...
 
static void newSeed (EventData &data, SiSpacePointForSeed *&, SiSpacePointForSeed *&, float)
 
static void fillSeeds (EventData &data)
 
static void pixInform (const Trk::SpacePoint *sp, float *r)
 
static void stripInform (EventData &data, const Trk::SpacePoint *sp, float *r)
 
static void erase (EventData &data)
 
static void convertToBeamFrameWork (EventData &data, const Trk::SpacePoint *const &, float *)
 

Detailed Description

Class for track candidates generation using space points information for standard Atlas geometry

In AthenaMT, event dependent cache inside ITk::SiSpacePointsSeedMaker is not preferred. SiSpacePointsSeedMakerEventData = EventData class holds event dependent data for ITk::SiSpacePointsSeedMaker. Its object is instantiated in SiSPSeededTrackFinder::execute.

Definition at line 76 of file ITkSiSpacePointsSeedMaker.h.

Member Enumeration Documentation

◆ Size

enum for array sizes Note that this stores the maximum capacities, the actual binnings do not always use the full size.

See data members below for the actual binning paramaters, which are determined in buildFramework.

Enumerator
arraySizePhi 

capacity of the 1D phi arrays

arraySizeZ 

capacity of the 1D z arrays

arraySizePhiZ 

capacity for the 2D phi-z arrays

arraySizeNeighbourBins 

array size to store neighbouring phi-z-regions in the seed finding

arraySizePhiV 

array size in phi for vertexing

arraySizeZV 

array size in z for vertexing

arraySizePhiZV 

array size in phi-Z 2D for the vertexing

arraySizeNeighbourBinsVertex 

Definition at line 151 of file ITkSiSpacePointsSeedMaker.h.

Constructor & Destructor Documentation

◆ SiSpacePointsSeedMaker() [1/3]

ITk::SiSpacePointsSeedMaker::SiSpacePointsSeedMaker ( const std::string &  t,
const std::string &  n,
const IInterface *  p 
)

Definition at line 37 of file ITkSiSpacePointsSeedMaker.cxx.

38  : base_class(t, n, p),
39  m_thistSvc("THistSvc", n),
40  m_outputTree(nullptr),
41  m_treeName(""),
42  m_treeFolder("/valNtuples/")
43 {
44  if (m_maxOneSize > 0)
45  {
48  }
49 }

◆ ~SiSpacePointsSeedMaker()

virtual ITk::SiSpacePointsSeedMaker::~SiSpacePointsSeedMaker ( )
virtualdefault

◆ SiSpacePointsSeedMaker() [2/3]

ITk::SiSpacePointsSeedMaker::SiSpacePointsSeedMaker ( )
privatedelete

◆ SiSpacePointsSeedMaker() [3/3]

ITk::SiSpacePointsSeedMaker::SiSpacePointsSeedMaker ( const SiSpacePointsSeedMaker )
privatedelete

Member Function Documentation

◆ azimuthalStep()

float ITk::SiSpacePointsSeedMaker::azimuthalStep ( const float  pTmin,
const float  maxd0,
const float  Rmin,
const float  Rmax 
)
staticprivate

Determine the expected azimuthal trajectory displacement in phi in presence of the magnetic field for a particle with momentum pTmin and impact parameter maxd0, moving from a radial coordinate Rmin outward to Rmax.

This method is used to determine the optimal binning of the phi-z regions we consider in the seed making, to ensure we contain the hits from our softest tracks in a set of consecutive bins.

Parameters
[in]pTminminimum pt cut applied in MeV
[in]maxD0maximum d0 allowed
[in]Rminstarting radius for trajectory displacement
[in]Rmaxend radius for trajectory displacement

here we approximate the largest curvature that can be expected for the seeds we build using R[mm] ~ pT[MeV] / (0.3 * B[T]), with B == 2T

for LRT, the maximum allowed d0 may be larger than the radius at which the innermost hit is possible. In that case, our "worst case" trajectory generating the largest phi displacement will be the one with a hit at Rmin and d0 == Rmin.

Definition at line 1131 of file ITkSiSpacePointsSeedMaker.cxx.

1132 {
1136  float Rm = pTmin / .6;
1137 
1144  float worstCaseD0 = maxd0;
1145  if (maxd0 > Rmin)
1146  worstCaseD0 = Rmin;
1147 
1148  float sI = std::abs(std::asin(worstCaseD0 / Rmin) - std::asin(worstCaseD0 / Rmax));
1149  float sF = std::abs(std::asin(std::min(1., Rmax / (2. * Rm))) -
1150  std::asin(std::min(1., Rmin / (2. * Rm))));
1151  return sI + sF;
1152 }

◆ buildBeamFrameWork()

void ITk::SiSpacePointsSeedMaker::buildBeamFrameWork ( EventData data) const
private

Definition at line 1158 of file ITkSiSpacePointsSeedMaker.cxx.

1159 {
1161 
1162  const Amg::Vector3D &cb = beamSpotHandle->beamPos();
1163  double tx = std::tan(beamSpotHandle->beamTilt(0));
1164  double ty = std::tan(beamSpotHandle->beamTilt(1));
1165 
1166  double phi = std::atan2(ty, tx);
1167  double theta = std::acos(1. / std::sqrt(1. + tx * tx + ty * ty));
1168  double sinTheta = std::sin(theta);
1169  double cosTheta = std::cos(theta);
1170  double sinPhi = std::sin(phi);
1171  double cosPhi = std::cos(phi);
1172 
1173  data.xbeam[0] = static_cast<float>(cb.x());
1174  data.xbeam[1] = static_cast<float>(cosTheta * cosPhi * cosPhi + sinPhi * sinPhi);
1175  data.xbeam[2] = static_cast<float>(cosTheta * sinPhi * cosPhi - sinPhi * cosPhi);
1176  data.xbeam[3] = -static_cast<float>(sinTheta * cosPhi);
1177 
1178  data.ybeam[0] = static_cast<float>(cb.y());
1179  data.ybeam[1] = static_cast<float>(cosTheta * cosPhi * sinPhi - sinPhi * cosPhi);
1180  data.ybeam[2] = static_cast<float>(cosTheta * sinPhi * sinPhi + cosPhi * cosPhi);
1181  data.ybeam[3] = -static_cast<float>(sinTheta * sinPhi);
1182 
1183  data.zbeam[0] = static_cast<float>(cb.z());
1184  data.zbeam[1] = static_cast<float>(sinTheta * cosPhi);
1185  data.zbeam[2] = static_cast<float>(sinTheta * sinPhi);
1186  data.zbeam[3] = static_cast<float>(cosTheta);
1187 }

◆ buildConnectionMaps()

void ITk::SiSpacePointsSeedMaker::buildConnectionMaps ( std::array< int, arraySizePhiZ > &  nNeighbourCellsBottom,
std::array< int, arraySizePhiZ > &  nNeighbourCellsTop,
std::array< std::array< int, arraySizeNeighbourBins >, arraySizePhiZ > &  neighbourCellsBottom,
std::array< std::array< int, arraySizeNeighbourBins >, arraySizePhiZ > &  neighbourCellsTop,
int  maxPhiBin,
bool  isSSS 
)
staticprivate

Build maps for radius-azimuthal-Z sorted collections. Here, we associate which bins are 'connected' to a given phi-Z bin for the seeding

< loop around at edges of range

< loop around at edges of range

For each azimuthal region loop through all Z regions

we always include the two neighbouring phi bins for the top / bottom space point search

in addition, we usually add at least one neighbouring slice in Z. This depends on where we are in the detector. Guide for the following: z == 5: central z region, |z|<250mm 0 1 2 3 4 5 6 7 8 9 10 z bin index -----------------------------------—> Z[mm] Z=-2500 IP,Z=0 Z=+2500

for the top SP search in positive z, if we are not in the outermost z region, we include the neighbouring Z region on the right (away from the IP). In z = 10, the most forward, we do not have such a 'right side' neighbour we can add

for the bottom SP in negative non-central z, we include the neighbouring z region on the right (towards the IP) in the bottom neighbour search

z bins 3 / 7: 450mm < |z| < 925mm.: also include the central z region in the bottom SP search.
likely for PPP seeds with hits in pixel barrel + endcaps

Only used for strip seeds

Definition at line 947 of file ITkSiSpacePointsSeedMaker.cxx.

952 {
953 
957 
958  for (int phiBin = 0; phiBin <= maxPhiBin; ++phiBin)
959  {
960 
961  int phiBelow = phiBin - 1;
962  if (phiBelow < 0) phiBelow = maxPhiBin;
963 
964  int phiAbove = phiBin + 1;
965  if (phiAbove > maxPhiBin) phiAbove = 0;
966 
968  for (int z = 0; z < arraySizeZ; ++z) {
969 
972 
973  int twoDbinSamePhi = phiBin * arraySizeZ + z;
974  int twoDbinLowerPhi = phiBelow * arraySizeZ + z;
975  int twoDbinHigherPhi = phiAbove * arraySizeZ + z;
976 
977  nNeighbourCellsBottom[twoDbinSamePhi] = 3;
978  nNeighbourCellsTop[twoDbinSamePhi] = 3;
979 
980  neighbourCellsBottom[twoDbinSamePhi][0] = twoDbinSamePhi;
981  neighbourCellsTop[twoDbinSamePhi][0] = twoDbinSamePhi;
982 
983  neighbourCellsBottom[twoDbinSamePhi][1] = twoDbinLowerPhi;
984  neighbourCellsTop[twoDbinSamePhi][1] = twoDbinLowerPhi;
985 
986  neighbourCellsBottom[twoDbinSamePhi][2] = twoDbinHigherPhi;
987  neighbourCellsTop[twoDbinSamePhi][2] = twoDbinHigherPhi;
988 
997  if (z == 5)
998  {
999  nNeighbourCellsTop[twoDbinSamePhi] = 9;
1000  // in the central z region, we include the two neighbouring
1001  // z slices for the top neighbour search
1002 
1003  neighbourCellsTop[twoDbinSamePhi][3] = twoDbinSamePhi + 1;
1004  neighbourCellsTop[twoDbinSamePhi][4] = twoDbinLowerPhi + 1;
1005  neighbourCellsTop[twoDbinSamePhi][5] = twoDbinHigherPhi + 1;
1006  neighbourCellsTop[twoDbinSamePhi][6] = twoDbinSamePhi - 1;
1007  neighbourCellsTop[twoDbinSamePhi][7] = twoDbinLowerPhi - 1;
1008  neighbourCellsTop[twoDbinSamePhi][8] = twoDbinHigherPhi - 1;
1009  }
1010  // z > 5: positive z values, |z| > 250mm
1011  else if (z > 5)
1012  {
1013  // for the bottom SP search in positive non-central z, we include the
1014  // neighbouring Z region on the left (towards the IP) in the bottom
1015  // neighbour search
1016  nNeighbourCellsBottom[twoDbinSamePhi] = 6;
1017  neighbourCellsBottom[twoDbinSamePhi][3] = twoDbinSamePhi - 1;
1018  neighbourCellsBottom[twoDbinSamePhi][4] = twoDbinLowerPhi - 1;
1019  neighbourCellsBottom[twoDbinSamePhi][5] = twoDbinHigherPhi - 1;
1020 
1021  if (z < 10)
1022  {
1028  nNeighbourCellsTop[twoDbinSamePhi] = 6;
1029  neighbourCellsTop[twoDbinSamePhi][3] = twoDbinSamePhi + 1;
1030  neighbourCellsTop[twoDbinSamePhi][4] = twoDbinLowerPhi + 1;
1031  neighbourCellsTop[twoDbinSamePhi][5] = twoDbinHigherPhi + 1;
1032  }
1033  }
1034  // z < 5: negative z values, |z| > 250mm
1035  else
1036  {
1041  nNeighbourCellsBottom[twoDbinSamePhi] = 6;
1042  neighbourCellsBottom[twoDbinSamePhi][3] = twoDbinSamePhi + 1;
1043  neighbourCellsBottom[twoDbinSamePhi][4] = twoDbinLowerPhi + 1;
1044  neighbourCellsBottom[twoDbinSamePhi][5] = twoDbinHigherPhi + 1;
1045 
1046  if (z > 0)
1047  {
1048  // if there is a z region on the left (away from the IP), we include it in the top
1049  // neighbour search
1050  nNeighbourCellsTop[twoDbinSamePhi] = 6;
1051  neighbourCellsTop[twoDbinSamePhi][3] = twoDbinSamePhi - 1;
1052  neighbourCellsTop[twoDbinSamePhi][4] = twoDbinLowerPhi - 1;
1053  neighbourCellsTop[twoDbinSamePhi][5] = twoDbinHigherPhi - 1;
1054  }
1055  }
1056 
1062  if (isSSS)
1064  {
1065  if (z == 3)
1066  {
1067  nNeighbourCellsBottom[twoDbinSamePhi] = 9;
1068  neighbourCellsBottom[twoDbinSamePhi][6] = twoDbinSamePhi + 2;
1069  neighbourCellsBottom[twoDbinSamePhi][7] = twoDbinLowerPhi + 2;
1070  neighbourCellsBottom[twoDbinSamePhi][8] = twoDbinHigherPhi + 2;
1071  }
1072  else if (z == 7)
1073  {
1074  nNeighbourCellsBottom[twoDbinSamePhi] = 9;
1075  neighbourCellsBottom[twoDbinSamePhi][6] = twoDbinSamePhi - 2;
1076  neighbourCellsBottom[twoDbinSamePhi][7] = twoDbinLowerPhi - 2;
1077  neighbourCellsBottom[twoDbinSamePhi][8] = twoDbinHigherPhi - 2;
1078  }
1079  }
1080  }
1081  }
1082 }

◆ buildConnectionMapsVertex()

void ITk::SiSpacePointsSeedMaker::buildConnectionMapsVertex ( std::array< int, arraySizePhiZV > &  nNeighbourCells,
std::array< std::array< int, arraySizeNeighbourBinsVertex >, arraySizePhiZV > &  neighbourCells,
int  maxPhiBin 
)
staticprivate

Build maps for radius-azimuthal-Z sorted collections for Z Similar logic to the above, just simplified as only 3 regions in z exist!

For each azimuthal region loop through central Z regions

always include the two neighbour bins in phi

for the positive z bin, include the central z slice as well

for the negative z bin, include the central z slice as well

Definition at line 1088 of file ITkSiSpacePointsSeedMaker.cxx.

1091 {
1092  for (int phiBin=0; phiBin<=maxPhiBin; ++phiBin) {
1093 
1094  int phiBinBelow = phiBin-1;
1095  if (phiBinBelow<0) phiBinBelow=maxPhiBin;
1096 
1097  int phiBinTop = phiBin+1;
1098  if (phiBinTop>maxPhiBin) phiBinTop=0;
1099 
1101  for (int zbin=0; zbin<arraySizeZV; ++zbin) {
1102 
1103  int twoDbinSamePhi = phiBin*arraySizeZV+zbin;
1104  int twoDbinLowerPhi = phiBinBelow*arraySizeZV+zbin;
1105  int twoDbinHigherPhi = phiBinTop*arraySizeZV+zbin;
1106 
1108  nNeighbourCells[twoDbinSamePhi] = 3;
1109  neighbourCells[twoDbinSamePhi][0] = twoDbinSamePhi;
1110  neighbourCells[twoDbinSamePhi][1] = twoDbinLowerPhi;
1111  neighbourCells[twoDbinSamePhi][2] = twoDbinHigherPhi;
1112 
1114  if (zbin>1) {
1115  nNeighbourCells[twoDbinSamePhi] = 6;
1116  neighbourCells[twoDbinSamePhi][3] = twoDbinSamePhi-1;
1117  neighbourCells[twoDbinSamePhi][4] = twoDbinLowerPhi-1;
1118  neighbourCells[twoDbinSamePhi][5] = twoDbinHigherPhi-1;
1119  }
1121  else if (zbin<1) {
1122  nNeighbourCells[twoDbinSamePhi] = 6;
1123  neighbourCells[twoDbinSamePhi][3] = twoDbinSamePhi+1;
1124  neighbourCells[twoDbinSamePhi][4] = twoDbinLowerPhi+1;
1125  neighbourCells[twoDbinSamePhi][5] = twoDbinHigherPhi+1;
1126  }
1127  }
1128  }
1129 }

◆ buildFrameWork()

void ITk::SiSpacePointsSeedMaker::buildFrameWork ( )
private

ensure consistency in the transverse IP cuts

symmetrise eta cut if eta min not explicitly set

set dz/dr cut values based on eta cuts

cache inverse pt cuts

set up the score thresholds based on the user-supplied properties The score of any seeds will always be >= the bonus applied, since the starting value is |d0|. Hence, by subtracting one, we get all seeds which have received an additional bonus in addition to the PPP/SSS one, which is the confirmation one by construction.

Build radius sorted containers

Now we construct the radius-azimuthal sorted containers. Binning is determined semi-dynamically based on the tool config

determine the phi binning

The max Nb. of bins possible is given by the binning enum

< for run-3: 200 : 6.28 ~ 31.8, bin size 0.0314

derive the optimum bin size in phi for our needs. We do this by checking the size needed for each of the passes we run, and then pick the larger one (more conservative). This is slightly less optimal than using separate settings per pass, but avoids having to book and store in memory two distinct R-phi-Z maps.

case 1: PPP seeds, if we use them

approximate lowest R location of pixel hits (driven by barrel)

approximate largest R location of pixel hits (driven by endcap)

case 2: SSS seeds, if we use them

this is the default phi binning as operated in release 21 - optimised for a trajectory with 400 MeV, from the origin, and Rmin = 0 / Rmax = 600mm float ptm = 400.;

if we cut below 400 MeV, adapt the ptm

truncate the bin size to fall within our thresholds

now we can determine the number of bins by dividing the interval by the bin size

additional protection against too many bins. Should not happen given constraints above

recompute inverse bin size, taking into account rounding + truncation

same logic as for the space points above

Definition at line 829 of file ITkSiSpacePointsSeedMaker.cxx.

830 {
831  m_ptmin = std::abs(m_ptmin);
832 
833  if (m_ptmin < 100.)
834  m_ptmin = 100.;
835 
839 
841  if (std::abs(m_etamin) < .1)
842  m_etamin = -m_etamax;
846 
848  m_ipt = 1. / std::abs(m_ptmin);
849  m_ipt2 = m_ipt * m_ipt;
850 
859 
861  m_nBinsR = static_cast<int>((m_r_rmax + .1) / m_binSizeR);
862 
868  constexpr float twoPi = 2. * M_PI;
870 
872  const int nPhiBinsMax = arraySizePhi;
873  const float inverseSizePhiMax = static_cast<float>(nPhiBinsMax) / twoPi;
874  constexpr float inverseSizePhiMin = 10. / twoPi;
875 
881 
883  {
885  const float radiusPixelStart = m_fastTracking ? 50. : 40.;
886  const float radiusPixelEnd = m_fastTracking ? 250. : 320.;
887  const float binSizePhi_PPP = m_pixel ? azimuthalStep(m_ptmin, m_maxdImpact, radiusPixelStart, radiusPixelEnd) / 3.f : 1.f;
889  const float binSizePhi_SSS = m_strip ? azimuthalStep(m_ptmin, m_maxdImpactSSS, m_rminSSS, m_rmaxSSS) / 3.f : 1.f;
890  m_inverseBinSizePhiPPP = 1. / binSizePhi_PPP;
891  m_inverseBinSizePhiSSS = 1. / binSizePhi_SSS;
892  }
893  else
894  {
897  float ptm = 400.;
899  if (m_ptmin < ptm)
900  ptm = m_ptmin;
902  }
903 
905  if (m_inverseBinSizePhiPPP > inverseSizePhiMax)
906  m_inverseBinSizePhiPPP = inverseSizePhiMax;
907  else if (m_inverseBinSizePhiPPP < inverseSizePhiMin)
908  m_inverseBinSizePhiPPP = inverseSizePhiMin;
909  if (m_inverseBinSizePhiSSS > inverseSizePhiMax)
910  m_inverseBinSizePhiSSS = inverseSizePhiMax;
911  else if (m_inverseBinSizePhiSSS < inverseSizePhiMin)
912  m_inverseBinSizePhiSSS = inverseSizePhiMin;
913 
915  m_maxPhiBinPPP = static_cast<int>(twoPi * m_inverseBinSizePhiPPP);
917  if (m_maxPhiBinPPP >= nPhiBinsMax) m_maxPhiBinPPP = nPhiBinsMax - 1;
918  m_maxPhiBinSSS = static_cast<int>(twoPi * m_inverseBinSizePhiSSS);
919  if (m_maxPhiBinSSS >= nPhiBinsMax) m_maxPhiBinSSS = nPhiBinsMax - 1;
921  m_inverseBinSizePhiPPP = ( m_maxPhiBinPPP + 1 ) / twoPi;
922  m_inverseBinSizePhiSSS = ( m_maxPhiBinSSS + 1 ) / twoPi;
923 
924  // Build radius-azimuthal-Z sorted containers for Z-vertices
926  const int nPhiBinsVertexMax = arraySizePhiV;
927  const float inverseBinSizePhiVertexMax = static_cast<float>(nPhiBinsVertexMax)/twoPi;
929  if (m_inverseBinSizePhiVertex > inverseBinSizePhiVertexMax) m_inverseBinSizePhiVertex = inverseBinSizePhiVertexMax;
930  m_maxBinPhiVertex = static_cast<int>(twoPi*m_inverseBinSizePhiVertex);
931  if (m_maxBinPhiVertex>=nPhiBinsVertexMax) m_maxBinPhiVertex = nPhiBinsVertexMax-1;
932 
935  m_maxPhiBinPPP, false);
936 
939  m_maxPhiBinSSS, true);
940 
944 
945 }

◆ convertToBeamFrameWork()

void ITk::SiSpacePointsSeedMaker::convertToBeamFrameWork ( EventData data,
const Trk::SpacePoint *const sp,
float *  r 
)
staticprivate

Definition at line 1192 of file ITkSiSpacePointsSeedMaker.cxx.

1193 {
1194  r[0] = static_cast<float>(sp->globalPosition().x()) - data.xbeam[0];
1195  r[1] = static_cast<float>(sp->globalPosition().y()) - data.ybeam[0];
1196  r[2] = static_cast<float>(sp->globalPosition().z()) - data.zbeam[0];
1197 }

◆ dump()

MsgStream & ITk::SiSpacePointsSeedMaker::dump ( EventData data,
MsgStream &  out 
) const
overridevirtual

Definition at line 615 of file ITkSiSpacePointsSeedMaker.cxx.

616 {
617  if (data.nprint)
618  return dumpEvent(data, out);
619  return dumpConditions(data, out);
620 }

◆ dumpConditions()

MsgStream & ITk::SiSpacePointsSeedMaker::dumpConditions ( EventData data,
MsgStream &  out 
) const
private

Definition at line 626 of file ITkSiSpacePointsSeedMaker.cxx.

627 {
628  int n = 42-m_spacepointsPixel.key().size();
629  std::string s2;
630  for (int i=0; i<n; ++i) s2.append(" ");
631  s2.append("|");
632  n = 42-m_spacepointsStrip.key().size();
633  std::string s3;
634  for (int i=0; i<n; ++i) s3.append(" ");
635  s3.append("|");
636  n = 42-m_spacepointsOverlap.key().size();
637  std::string s4;
638  for (int i=0; i<n; ++i) s4.append(" ");
639  s4.append("|");
640  n = 42-m_beamSpotKey.key().size();
641  std::string s5;
642  for (int i=0; i<n; ++i) s5.append(" ");
643  s5.append("|");
644 
645  out<<"|---------------------------------------------------------------------|"
646  <<endmsg;
647  out<<"| Pixel space points | "<<m_spacepointsPixel.key() <<s2
648  <<endmsg;
649  out<<"| Strip space points | "<<m_spacepointsStrip.key()<<s3
650  <<endmsg;
651  out<<"| Overlap space points | "<<m_spacepointsOverlap.key()<<s4
652  <<endmsg;
653  out<<"| BeamConditionsService | "<<m_beamSpotKey.key()<<s5
654  <<endmsg;
655  out<<"| usePixel | "
656  <<std::setw(12)<<m_pixel
657  <<" |"<<endmsg;
658  out<<"| useStrip | "
659  <<std::setw(12)<<m_strip
660  <<" |"<<endmsg;
661  out<<"| maxSize | "
662  <<std::setw(12)<<m_maxsize
663  <<" |"<<endmsg;
664  out<<"| maxSizeSP | "
665  <<std::setw(12)<<m_maxsizeSP
666  <<" |"<<endmsg;
667  out<<"| pTmin (mev) | "
668  <<std::setw(12)<<std::setprecision(5)<<m_ptmin
669  <<" |"<<endmsg;
670  out<<"| max radius SP | "
671  <<std::setw(12)<<std::setprecision(5)<<m_r_rmax
672  <<" |"<<endmsg;
673  out<<"| radius step | "
674  <<std::setw(12)<<std::setprecision(5)<<m_binSizeR
675  <<" |"<<endmsg;
676  out<<"| min Z-vertex position | "
677  <<std::setw(12)<<std::setprecision(5)<<m_zmin
678  <<" |"<<endmsg;
679  out<<"| max Z-vertex position | "
680  <<std::setw(12)<<std::setprecision(5)<<m_zmax
681  <<" |"<<endmsg;
682  out<<"| min space points dR SSS | "
683  <<std::setw(12)<<std::setprecision(5)<<m_drminSSS
684  <<" |"<<std::endl;
685  out<<"| max space points dR SSS | "
686  <<std::setw(12)<<std::setprecision(5)<<m_drmaxSSS
687  <<" |"<<std::endl;
688  out<<"| min space points dR PPP | "
689  <<std::setw(12)<<std::setprecision(5)<<m_drminPPP
690  <<" |"<<std::endl;
691  out<<"| max space points dR PPP | "
692  <<std::setw(12)<<std::setprecision(5)<<m_drmaxPPP
693  <<" |"<<std::endl;
694  out<<"| max dZ impact | "
695  <<std::setw(12)<<std::setprecision(5)<<m_dzver
696  <<" |"<<endmsg;
697  out<<"| max dZ/dR impact | "
698  <<std::setw(12)<<std::setprecision(5)<<m_dzdrver
699  <<" |"<<endmsg;
700  out<<"| max impact | "
701  <<std::setw(12)<<std::setprecision(5)<<m_maxdImpact
702  <<" |"<<endmsg;
703  out<<"| max impact sss | "
704  <<std::setw(12)<<std::setprecision(5)<<m_maxdImpactSSS
705  <<" |"<<endmsg;
706  out<<"|---------------------------------------------------------------------|"
707  <<endmsg;
708  out<<"| Beam X center | "
709  <<std::setw(12)<<std::setprecision(5)<<data.xbeam[0]
710  <<" |"<<endmsg;
711  out<<"| Beam Y center | "
712  <<std::setw(12)<<std::setprecision(5)<<data.ybeam[0]
713  <<" |"<<endmsg;
714  out<<"| Beam Z center | "
715  <<std::setw(12)<<std::setprecision(5)<<data.zbeam[0]
716  <<" |"<<endmsg;
717  out<<"| Beam X-axis direction | "
718  <<std::setw(12)<<std::setprecision(5)<<data.xbeam[1]
719  <<std::setw(12)<<std::setprecision(5)<<data.xbeam[2]
720  <<std::setw(12)<<std::setprecision(5)<<data.xbeam[3]
721  <<" |"<<endmsg;
722  out<<"| Beam Y-axis direction | "
723  <<std::setw(12)<<std::setprecision(5)<<data.ybeam[1]
724  <<std::setw(12)<<std::setprecision(5)<<data.ybeam[2]
725  <<std::setw(12)<<std::setprecision(5)<<data.ybeam[3]
726  <<" |"<<endmsg;
727  out<<"| Beam Z-axis direction | "
728  <<std::setw(12)<<std::setprecision(5)<<data.zbeam[1]
729  <<std::setw(12)<<std::setprecision(5)<<data.zbeam[2]
730  <<std::setw(12)<<std::setprecision(5)<<data.zbeam[3]
731  <<" |"<<endmsg;
732  out<<"|---------------------------------------------------------------------|"
733  <<endmsg;
734  return out;
735 
736 
737 }

◆ dumpEvent()

MsgStream & ITk::SiSpacePointsSeedMaker::dumpEvent ( EventData data,
MsgStream &  out 
)
staticprivate

Definition at line 743 of file ITkSiSpacePointsSeedMaker.cxx.

744 {
745  out<<"|---------------------------------------------------------------------|"
746  <<endmsg;
747  out<<"| ns | "
748  <<std::setw(12)<<data.ns
749  <<" |"<<endmsg;
750  out<<"| nsaz | "
751  <<std::setw(12)<<data.nsaz
752  <<" |"<<endmsg;
753  out<<"| nsazv | "
754  <<std::setw(12)<<data.nsazv
755  <<" |"<<endmsg;
756  out<<"| seeds | "
757  <<std::setw(12)<<data.i_ITkSeeds.size()
758  <<" |"<<endmsg;
759  out<<"|---------------------------------------------------------------------|"
760  <<endmsg;
761  return out;
762 
763 }

◆ erase()

void ITk::SiSpacePointsSeedMaker::erase ( EventData data)
staticprivate

Definition at line 1410 of file ITkSiSpacePointsSeedMaker.cxx.

1411 {
1412  for (int i = 0; i < data.nrfz; ++i)
1413  {
1414  int n = data.rfz_index[i];
1415  data.rfz_map[n] = 0;
1416  data.rfz_ITkSorted[n].clear();
1417  }
1418 
1419  for (int i = 0; i < data.nrfzv; ++i)
1420  {
1421  int n = data.rfzv_index[i];
1422  data.rfzv_map[n] = 0;
1423  data.rfzv_ITkSorted[n].clear();
1424  }
1425 
1426  for (int i = 0; i < data.nr; ++i) {
1427  int n = data.r_index[i];
1428  data.r_map[n] = 0;
1429  data.r_ITkSorted[n].clear();
1430  }
1431 
1432  data.state = 0;
1433  data.nsaz = 0;
1434  data.nsazv = 0;
1435  data.nrfz = 0;
1436  data.nrfzv = 0;
1437  data.ns = 0;
1438  data.nr = 0;
1439 }

◆ fillLists()

void ITk::SiSpacePointsSeedMaker::fillLists ( EventData data) const
private

The following is done separately for each iteration. We sort the hits in our radially sorted lists into the z-phi binning, keeping only those we want to consider to reduce combinatorics

Note that the use of r_first to start the loop is what ensures that the first iteration is a pure SSS pass. In newEvent, r_first is set to the bin after the last radial bin containing Pixel space points. For the second iteration, we reset it to zero and thus start in the pixels.

< if we encounter Si hits at z > +100m, we are probably not in ATLAS anymore...

skip empty radial bins

remember the first non-empty bin we encounter

Azimuthal angle sort find the bin by dividing phi in 0...2pi by the bin size

handle overflows

z-coordinate sort. Here, we have a variable bin size. Use a map to replace 5 levels of nested ternaries for a somewhat more readable notation while retaining a logN lookup speed

some protection in case things go REALLY wrong

< z beyond the max: return last bin

2D bin index - computed from the 1D using standard 2D array bin arithmetics

increment total counter of space points. This is not reset between iterations.

the conditional seems to always be true. The rfz_index vector stores the 2D bin for each SP in the radius-sorted map. This way, we obtain effectively a 3D binning in r(via the r-sorted vector), phi and z (via the 2D index)

Definition at line 1203 of file ITkSiSpacePointsSeedMaker.cxx.

1204 {
1205  constexpr float twoPi = 2. * M_PI;
1206 
1207  int firstRadialBin = 0;
1208  int lastRadialBin = 0;
1209  bool endcap = false;
1210 
1224  const std::map<float, int> ztoBin{
1225  {-2500., 0},
1226  {-1400., 1},
1227  {-925., 2},
1228  {-500., 3},
1229  {-250., 4},
1230  {250., 5},
1231  {500., 6},
1232  {925., 7},
1233  {1400, 8},
1234  {2500, 9},
1235  {100000, 10},
1236  };
1237 
1238  bool isPixel = (m_fastTracking && m_pixel) || data.iteration == 1;
1239 
1240  int nPhiBins = isPixel ? m_maxPhiBinPPP : m_maxPhiBinSSS;
1241  float inverseBinSizePhi = isPixel ? m_inverseBinSizePhiPPP : m_inverseBinSizePhiSSS;
1242 
1243  for (int radialBin = data.r_first; radialBin < m_nBinsR; ++radialBin)
1244  {
1246  if (!data.r_map[radialBin])
1247  continue;
1248 
1249  // Stop when we reach strip SP in PPP iteration #1
1250  std::vector<SiSpacePointForSeed *>::iterator SP_first = data.r_ITkSorted[radialBin].begin();
1251  if (isPixel && (*SP_first)->spacepoint->clusterList().second)
1252  break;
1253 
1255  if (firstRadialBin == 0)
1256  firstRadialBin = radialBin;
1257  lastRadialBin = radialBin;
1258 
1259  // loop over the space points in the r-bin and sort them into the 2d phi-z binning
1260  for (SiSpacePointForSeed *SP : data.r_ITkSorted[radialBin])
1261  {
1262 
1265  float Phi = SP->phi();
1266  if (Phi < 0.)
1267  Phi += twoPi; // phi is defined in [0..2pi] for the binning
1268  int phiBin = static_cast<int>(Phi * inverseBinSizePhi);
1270  if (phiBin < 0)
1271  {
1272  phiBin = nPhiBins;
1273  }
1274  else if (phiBin > nPhiBins)
1275  {
1276  phiBin = 0;
1277  }
1278 
1279  float Z = SP->z();
1280  endcap = (std::abs(Z) > 1490);
1287  int zBin{0};
1288  auto bound = ztoBin.lower_bound(Z);
1290  if (bound == ztoBin.end())
1291  {
1292  --bound;
1293  }
1294  zBin = bound->second;
1295 
1297  int twoDbin = phiBin * arraySizeZ + zBin;
1300  ++data.nsaz;
1301  // push our space point into the 2D binned array
1302  data.rfz_ITkSorted[twoDbin].push_back(SP);
1303 
1307  if (!data.rfz_map[twoDbin]++)
1308  data.rfz_index[data.nrfz++] = twoDbin;
1309  }
1310  }
1311 
1312  data.state = 0;
1313 
1314  if (m_fastTracking) {
1315  // Loop through all RZ collections and sort them in radius order
1316  //
1317  for (int twoDbin(0); twoDbin != arraySizePhiZ; ++twoDbin) {
1318  if (data.rfz_ITkSorted[twoDbin].size() > 1) {
1319  std::sort(data.rfz_ITkSorted[twoDbin].begin(), data.rfz_ITkSorted[twoDbin].end(), SiSpacePointsComparison_R());
1320  }
1321  }
1322 
1323  if (m_strip) {
1324  data.RTmin = m_rminSSS ;
1325  data.RTmax = m_rmaxSSS ;
1326  }
1327 
1328  } else {
1329  if (isPixel) { // PPP
1330  data.RTmin = m_binSizeR*firstRadialBin+10. ;
1331  data.RTmax = m_binSizeR*lastRadialBin-10.;
1332  } else { //SSS
1333  if (endcap and m_isLRT) {
1334  data.RTmin = m_binSizeR*firstRadialBin+10. ;
1335  data.RTmax = m_binSizeR*lastRadialBin-10.;
1336  } else {
1337  data.RTmin = m_binSizeR*firstRadialBin+30. ;
1338  data.RTmax = m_binSizeR*lastRadialBin-150.;
1339  }
1340  }
1341  }
1342 
1343 }

◆ fillSeeds()

void ITk::SiSpacePointsSeedMaker::fillSeeds ( EventData data)
staticprivate

no seeds - nothing to do.

loop over the seed candidates we have stored in the event data

quality score of the seed, lower = better, list is sorted by quality

this will set the quality member of all points on the seed to the quality score of this candidate

if we have space, write the seed directly into an existing slot

otherwise, extend the seed list and update the iterators

Definition at line 2744 of file ITkSiSpacePointsSeedMaker.cxx.

2745 {
2746  data.fillOneSeeds = 0;
2747 
2748  std::multimap<float, SiSpacePointsProSeed *>::iterator it_seedCandidate = data.ITkMapOneSeeds.begin();
2749  std::multimap<float, SiSpacePointsProSeed *>::iterator it_endSeedCandidates = data.ITkMapOneSeeds.end();
2750 
2751  if (data.nOneSeedsQ){
2752  it_seedCandidate = data.ITkMapOneSeedsQ.begin();
2753  it_endSeedCandidates = data.ITkMapOneSeedsQ.end();
2754  }
2755 
2757  if (it_seedCandidate == it_endSeedCandidates)
2758  return;
2759 
2760  SiSpacePointsProSeed *theSeed{nullptr};
2761 
2763  for (; it_seedCandidate != it_endSeedCandidates; ++it_seedCandidate)
2764  {
2765 
2767  float quality = (*it_seedCandidate).first;
2768  theSeed = (*it_seedCandidate).second;
2769 
2771  if (!theSeed->setQuality(quality))
2772  continue;
2773 
2775  if (data.i_ITkSeedEnd != data.i_ITkSeeds.end())
2776  {
2777  theSeed = &(*data.i_ITkSeedEnd++);
2778  *theSeed = *(*it_seedCandidate).second;
2779  }
2780  else
2781  {
2783  data.i_ITkSeeds.emplace_back(*(*it_seedCandidate).second);
2784  theSeed = &(data.i_ITkSeeds.back());
2785  data.i_ITkSeedEnd = data.i_ITkSeeds.end();
2786  }
2787 
2788  ++data.fillOneSeeds;
2789  }
2790 }

◆ finalize()

StatusCode ITk::SiSpacePointsSeedMaker::finalize ( )
overridevirtual

Definition at line 130 of file ITkSiSpacePointsSeedMaker.cxx.

131 {
132  return AlgTool::finalize();
133 }

◆ find2Sp()

void ITk::SiSpacePointsSeedMaker::find2Sp ( EventData data,
const std::list< Trk::Vertex > &  lv 
) const
overridevirtual

with two space points with or without vertex constraint

Definition at line 454 of file ITkSiSpacePointsSeedMaker.cxx.

455 {
456  ATH_MSG_WARNING("ITk::SiSpacePointsSeedMaker::find2Sp not implemented!");
457 }

◆ find3Sp() [1/2]

void ITk::SiSpacePointsSeedMaker::find3Sp ( const EventContext &  ctx,
EventData data,
const std::list< Trk::Vertex > &  lv 
) const
overridevirtual

with three space points with or without vertex constraint

call fillLists to repopulate the candidate space points

reset the Z interval stored in the data object

mode 2 if we have no vertices in the list, otherwise mode 3

copy the vertices into the data object, if we have any. Note that by construction, newv will ALWAYS be false, also if we pass vertices.

update the data object's config

< This performs the actual seed finding

reset the i_ITkSeed iterator - this is used to return the seeds to the consumer when they call next()

Definition at line 464 of file ITkSiSpacePointsSeedMaker.cxx.

465 {
466  if (not data.initialized)
468 
470  fillLists(data);
471 
473  data.zminU = m_zmin;
474  data.zmaxU = m_zmax;
476  int mode = 2;
477  if (lv.begin() != lv.end())
478  mode = 3;
483  bool newv = newVertices(data, lv);
485  if (newv || !data.state || data.nspoint != 3 || data.mode != mode || data.nlist)
486  {
487  data.i_ITkSeedEnd = data.i_ITkSeeds.begin();
488  data.state = 1;
489  data.nspoint = 3;
490  data.nlist = 0;
491  data.mode = mode;
492  data.endlist = true;
493  data.fvNmin = 0;
494  data.fNmin = 0;
495  data.zMin = 0;
497  }
498 
501  data.i_ITkSeed = data.i_ITkSeeds.begin();
502 
503  if (msgLvl(MSG::DEBUG))
504  {
505  data.nprint = 1;
506  dump(data, msg(MSG::DEBUG));
507  }
508 }

◆ find3Sp() [2/2]

void ITk::SiSpacePointsSeedMaker::find3Sp ( const EventContext &  ctx,
EventData data,
const std::list< Trk::Vertex > &  lv,
const double *  zVertex 
) const
overridevirtual

with three space points with or without vertex constraint with information about min and max Z of the vertex

call fillLists to repopulate the candidate space points

Update the data object's Z interval based on the interval passed as arg to this function.

< don't go beyond user-specified intervals

< don't go beyond user-specified intervals

mode 2 when working with the Z constraint

copy the vertices into the data object, if we have any. Note that by construction, newv will ALWAYS be false, also if we pass vertices.

update the data object's config

< This performs the actual seed finding

reset the i_ITkSeed iterator - this is used to return the seeds to the consumer when they call next()

Definition at line 515 of file ITkSiSpacePointsSeedMaker.cxx.

516 {
517  if (not data.initialized)
519 
521  fillLists(data);
522 
525  data.zminU = ZVertex[0];
526  if (data.zminU < m_zmin)
527  data.zminU = m_zmin;
528  data.zmaxU = ZVertex[1];
529  if (data.zmaxU > m_zmax)
530  data.zmaxU = m_zmax;
531 
533  int mode = 2;
534  if (lv.begin() != lv.end())
535  mode = 3;
540  bool newv = newVertices(data, lv);
542  if (newv || !data.state || data.nspoint != 3 || data.mode != mode || data.nlist)
543  {
544  data.i_ITkSeedEnd = data.i_ITkSeeds.begin();
545  data.state = 1;
546  data.nspoint = 3;
547  data.nlist = 0;
548  data.mode = mode;
549  data.endlist = true;
550  data.fvNmin = 0;
551  data.fNmin = 0;
552  data.zMin = 0;
554  }
557  data.i_ITkSeed = data.i_ITkSeeds.begin();
558 
559  if (msgLvl(MSG::DEBUG))
560  {
561  data.nprint = 1;
562  dump(data, msg(MSG::DEBUG));
563  }
564 }

◆ findNext()

void ITk::SiSpacePointsSeedMaker::findNext ( EventData data) const
private

Definition at line 769 of file ITkSiSpacePointsSeedMaker.cxx.

770 {
771  if (data.endlist)
772  return;
773 
774  data.i_ITkSeedEnd = data.i_ITkSeeds.begin();
775 
776  if (data.mode == 2 || data.mode == 3 || data.mode == 5 || data.mode == 6)
778 
779  data.i_ITkSeed = data.i_ITkSeeds.begin();
780  ++data.nlist;
781 }

◆ findVSp()

void ITk::SiSpacePointsSeedMaker::findVSp ( const EventContext &  ctx,
EventData data,
const std::list< Trk::Vertex > &  lv 
) const
overridevirtual

with variable number space points with or without vertex constraint Variable means (2,3,4,....) any number space points

call fillLists to repopulate the candidate space points

Definition at line 572 of file ITkSiSpacePointsSeedMaker.cxx.

573 {
574 
575  if (not data.initialized)
577 
579  fillLists(data);
580 
581  data.zminU = m_zmin;
582  data.zmaxU = m_zmax;
583 
584  int mode = 5;
585  if (lv.begin() != lv.end())
586  mode = 6;
587  bool newv = newVertices(data, lv);
588 
589  if (newv || !data.state || data.nspoint != 4 || data.mode != mode || data.nlist)
590  {
591  data.i_ITkSeedEnd = data.i_ITkSeeds.begin();
592  data.state = 1;
593  data.nspoint = 4;
594  data.nlist = 0;
595  data.mode = mode;
596  data.endlist = true;
597  data.fvNmin = 0;
598  data.fNmin = 0;
599  data.zMin = 0;
601  }
602  data.i_ITkSeed = data.i_ITkSeeds.begin();
603 
604  if (msgLvl(MSG::DEBUG))
605  {
606  data.nprint = 1;
607  dump(data, msg(MSG::DEBUG));
608  }
609 }

◆ getWriteNtupleBoolProperty()

bool ITk::SiSpacePointsSeedMaker::getWriteNtupleBoolProperty ( ) const
overridevirtual

Definition at line 3413 of file ITkSiSpacePointsSeedMaker.cxx.

3414 {
3415  return m_writeNtuple;
3416 }

◆ initialize()

StatusCode ITk::SiSpacePointsSeedMaker::initialize ( )
overridevirtual

Definition at line 55 of file ITkSiSpacePointsSeedMaker.cxx.

56 {
58 
62 
63  // Get beam geometry
64  //
66 
68 
69  // PRD-to-track association (optional)
71 
72  // Build framework
73  //
75 
76  // Get output print level
77  //
78  m_outputlevel = msg().level() - MSG::DEBUG;
79 
80  m_umax = 100. - std::abs(m_umax) * 300.;
81 
82  if (m_writeNtuple) {
83 
84  ATH_CHECK( m_thistSvc.retrieve() );
85 
86  m_treeName = (std::string("SeedTree_")+name());
87  std::replace( m_treeName.begin(), m_treeName.end(), '.', '_' );
88 
89  m_outputTree = new TTree( m_treeName.c_str() , "SeedMakerValTool");
90 
91  m_outputTree->Branch("eventNumber", &m_eventNumber,"eventNumber/L");
92  m_outputTree->Branch("d0", &m_d0);
93  m_outputTree->Branch("z0", &m_z0);
94  m_outputTree->Branch("pt", &m_pt);
95  m_outputTree->Branch("eta", &m_eta);
96  m_outputTree->Branch("x1", &m_x1);
97  m_outputTree->Branch("x2", &m_x2);
98  m_outputTree->Branch("x3", &m_x3);
99  m_outputTree->Branch("y1", &m_y1);
100  m_outputTree->Branch("y2", &m_y2);
101  m_outputTree->Branch("y3", &m_y3);
102  m_outputTree->Branch("z1", &m_z1);
103  m_outputTree->Branch("z2", &m_z2);
104  m_outputTree->Branch("z3", &m_z3);
105  m_outputTree->Branch("r1", &m_r1);
106  m_outputTree->Branch("r2", &m_r2);
107  m_outputTree->Branch("r3", &m_r3);
108  m_outputTree->Branch("quality", &m_quality);
109  m_outputTree->Branch("seedType", &m_type);
110  m_outputTree->Branch("givesTrack", &m_givesTrack);
111  m_outputTree->Branch("dzdr_b", &m_dzdr_b);
112  m_outputTree->Branch("dzdr_t", &m_dzdr_t);
113  m_outputTree->Branch("track_pt", &m_trackPt);
114  m_outputTree->Branch("track_eta", &m_trackEta);
115 
116  TString fullTreeName = m_treeFolder + m_treeName;
117 
118  ATH_CHECK( m_thistSvc->regTree( fullTreeName.Data(), m_outputTree ) );
119 
120  }
121 
122 
123  return sc;
124 }

◆ initializeEventData()

void ITk::SiSpacePointsSeedMaker::initializeEventData ( EventData data,
const EventContext &  ctx 
) const
private

maxsize not used

sizeRF not used

Read the field information

retrieve field

Knowing the field (note that the field cache returns the field in units of kiloTesla!) allows to set the circle-radius to pT conversion factor.

See for example ATLAS-CONF-2010-072 R[mm] =pT[GeV] / (3·10−4×B[T]) = pT[MeV] / (300 *Bz[kT])

We actually estimate the circle diameter, 2R, in the seeding. So what we want is: 2R = pT[MeV] x 2 / (300 x Bz) = K x pT[MeV].

helper variables allowing us to directly apply our pt cut on the variables available at seed level. ipt2K is 1 / (K * 0.9 * pt cut)²

related to the mysterious magic number, m_COF{134*.05*9}

save magnetic field used for later

Definition at line 2947 of file ITkSiSpacePointsSeedMaker.cxx.

2948 {
2949  int seedArrayPerSPSize = (m_maxOneSizePPP > m_maxOneSizeSSS ? m_maxOneSizePPP : m_maxOneSizeSSS);
2951  seedArrayPerSPSize = 50;
2952  data.initialize(EventData::ToolType::ITk,
2953  m_maxsizeSP,
2954  seedArrayPerSPSize,
2955  0,
2956  m_nBinsR,
2957  0,
2958  arraySizePhiZ,
2960  m_checketa);
2961 
2963 
2965  double magField[3]{0, 0, 0};
2966  double globalPos[3] = {10., 10., 0.};
2967 
2968  MagField::AtlasFieldCache fieldCache;
2970  const AtlasFieldCacheCondObj *fieldCondObj{*readHandle};
2971  if (fieldCondObj == nullptr) {
2972  ATH_MSG_ERROR("ITk::SiSpacePointsSeedMaker: Failed to retrieve AtlasFieldCacheCondObj with key " << m_fieldCondObjInputKey.key());
2973  return;
2974  }
2975 
2976  fieldCondObj->getInitializedCache(fieldCache);
2977 
2978  if (fieldCache.solenoidOn()) {
2980  fieldCache.getFieldZR(globalPos, magField);
2991  data.K = 2. / (300. * magField[2]);
2992  } else {
2993  data.K = 2. / (300. * 5.);
2994  }
2995 
3000  data.ipt2K = m_ipt2 / (data.K * data.K);
3002  data.ipt2C = m_ipt2 * m_COF;
3003  data.COFK = m_COF * (data.K * data.K);
3005  data.bField[0] = magField[0];
3006  data.bField[1] = magField[1];
3007  data.bField[2] = magField[2];
3008 
3009 }

◆ isConfirmedSeed()

bool ITk::SiSpacePointsSeedMaker::isConfirmedSeed ( const SiSpacePointForSeed bottomSP,
const SiSpacePointForSeed topSP,
float  quality 
) const
private

Helper method to determine if a seed is 'confirmed' - this means that a second seed exists with compatible curvature, the same bottom and central SP, but a different third SP.

This information is stored in a modification of the seed quality, which we check here.

Parameters
[in]bottomSPbottom space point
[in]topSPtop space point
[in]qualityseed quality
Returns
true if the seed is confirmed, false otherwise

SSS seeds

PPP seeds

PPS: the confirmation is the only quality modifier applied

Definition at line 3351 of file ITkSiSpacePointsSeedMaker.cxx.

3353 {
3354 
3356  if (bottomSP->spacepoint->clusterList().second)
3357  {
3358  return (quality < m_seedScoreThresholdSSSConfirmationSeed);
3359  }
3361  else if (!topSP->spacepoint->clusterList().second)
3362  {
3363  return (quality < m_seedScoreThresholdPPPConfirmationSeed);
3364  }
3366  else
3367  return (quality < 0.);
3368 }

◆ isUsed()

bool ITk::SiSpacePointsSeedMaker::isUsed ( const Trk::SpacePoint sp,
const Trk::PRDtoTrackMap prd_to_track_map 
) const
inlineprivate

Definition at line 519 of file ITkSiSpacePointsSeedMaker.h.

520  {
521  const Trk::PrepRawData* d = sp->clusterList().first;
522  if (!d || !prd_to_track_map.isUsed(*d)) return false;
523 
524  d = sp->clusterList().second;
525  if (!d || prd_to_track_map.isUsed(*d)) return true;
526 
527  return false;
528  }

◆ isZCompatible()

bool ITk::SiSpacePointsSeedMaker::isZCompatible ( EventData data,
float  Zv,
float  R,
float  T 
) const
private

Definition at line 2837 of file ITkSiSpacePointsSeedMaker.cxx.

2839 {
2840  if (Zv < data.zminU || Zv > data.zmaxU)
2841  return false;
2842  if (!data.isvertex)
2843  return true;
2844 
2845  float dZmin = std::numeric_limits<float>::max();
2846  for (const float &v : data.l_vertex)
2847  {
2848  float dZ = std::abs(v - Zv);
2849  if (dZ >= dZmin)
2850  break;
2851  dZmin = dZ;
2852  }
2853  return dZmin < (m_dzver + m_dzdrver * R) * sqrt(1. + T * T);
2854 }

◆ newEvent()

void ITk::SiSpacePointsSeedMaker::newEvent ( const EventContext &  ctx,
EventData data,
int  iteration 
) const
overridevirtual

if not done so, book the arrays etc inside the event data object

Erase any existing entries in the data object

pass the iteration info into our data object

< max score, where low scores are "better".

build the r-binning.

set the spacepoint iterator to the beginning of the space-point list

as for the pixel, veto already used SP if we are using the PRD to track map in laterpasses of track finding. Also, veto SP outside the maximum and minimum radii

create a space point and write it into the data object's list of points

Determine the radial bin

again store the SP in the r-binned vectors

update the count of SP in the given bin

update the r_index map and data.nr if needed

and increment the SP count too.

Get strip overlap space points containers from store gate

usual rejection of SP used in previous track finding passes if we run with the PRT to track map + check of the max and min radii

SP creation, entry into list of the data object

radial bin determination

insert into the "histogram" vector

update the counter for each bin content

update the bin index list and occupied bin counter

and the total SP count too.

loop over the pixel space points

if we use the PRD to track map and this SP has already been used in a track, bail out also skip any SP outside the r binning

create a SiSpacePointForSeed from the space point. This will also add the point to the l_spforseed list and update the i_spforseed iterator

this can occur if we fail the eta cut

determine the r-bin of this SP. done by dividing the radius by the bin size.

catch outliers

now add the SP to the r-binned vector

increment the counter for this bin

if this is the first time we see this bin in use, we update the index map for this bin to the radius bin index

update the space point counter

Definition at line 139 of file ITkSiSpacePointsSeedMaker.cxx.

140 {
141  if (!m_pixel && !m_strip)
142  return;
143 
145  if (not data.initialized)
147 
149  erase(data);
150  data.trigger = false;
152  data.iteration = iteration;
153  if (iteration <= 0)
154  data.iteration = 0;
155  data.dzdrmin = m_dzdrmin0;
156  data.checketa = data.dzdrmin > 1.;
157  data.dzdrmax = m_dzdrmax0;
158  data.maxScore = m_maxScore;
159  data.r_first = 0;
160 
162  float oneOverBinSizeR = 1. / m_binSizeR;
163  int maxBinR = m_nBinsR - 1;
164 
166  data.i_ITkSpacePointForSeed = data.l_ITkSpacePointForSeed.begin();
167 
168  bool isPixel = (m_fastTracking && m_pixel) || data.iteration == 1;
169 
170  if (not isPixel)
171  {
172  // Now, we will populate the space point list in the event data object.
173 
174  // Set the seed multiplicity strategy of the event data to the one configured
175  // by the user for strip seeds
176  data.maxSeedsPerSP = m_maxOneSizeSSS;
177  data.keepAllConfirmedSeeds = m_alwaysKeepConfirmedStripSeeds;
178 
179  SG::ReadHandle<Trk::PRDtoTrackMap> prd_to_track_map;
180  const Trk::PRDtoTrackMap *prd_to_track_map_cptr = nullptr;
181  if (!m_prdToTrackMap.key().empty()) {
182  prd_to_track_map = SG::ReadHandle<Trk::PRDtoTrackMap>(m_prdToTrackMap, ctx);
183  if (!prd_to_track_map.isValid()) {
184  ATH_MSG_ERROR("Failed to read PRD to track association map: " << m_prdToTrackMap.key());
185  }
186  prd_to_track_map_cptr = prd_to_track_map.cptr();
187  }
188 
190  if (spacepointsStrip.isValid()) {
191  for (const SpacePointCollection *spc : *spacepointsStrip) {
192  for (const Trk::SpacePoint *sp : *spc) {
195  if ((prd_to_track_map_cptr && isUsed(sp, *prd_to_track_map_cptr)) || sp->r() > m_r_rmax || sp->r() < m_r_rmin)
196  continue;
198  SiSpacePointForSeed *sps = newSpacePoint(data, sp);
199  if (!sps)
200  continue;
201 
203  int radiusBin = static_cast<int>(sps->radius() * oneOverBinSizeR);
204  if (radiusBin > maxBinR)
205  radiusBin = maxBinR;
207  data.r_ITkSorted[radiusBin].push_back(sps);
209  ++data.r_map[radiusBin];
211  if (data.r_map[radiusBin] == 1)
212  data.r_index[data.nr++] = radiusBin;
214  ++data.ns;
215  }
216  }
217  }
219  if (m_useOverlap && !data.checketa) {
221  if (spacepointsOverlap.isValid()) {
222  for (const Trk::SpacePoint *sp : *spacepointsOverlap) {
224  if ((prd_to_track_map_cptr && isUsed(sp, *prd_to_track_map_cptr)) || sp->r() > m_r_rmax || sp->r() < m_r_rmin)
225  continue;
226 
228  SiSpacePointForSeed *sps = newSpacePoint(data, sp);
229  if (!sps)
230  continue;
231 
233  int radiusBin = static_cast<int>(sps->radius() * oneOverBinSizeR);
234  if (radiusBin > maxBinR)
235  radiusBin = maxBinR;
237  data.r_ITkSorted[radiusBin].push_back(sps);
239  ++data.r_map[radiusBin];
241  if (data.r_map[radiusBin] == 1)
242  data.r_index[data.nr++] = radiusBin;
244  ++data.ns;
245  }
246  }
247  }
248  } else {
249 
250  // Now, we will populate the space point list in the event data object.
251 
252  // Set the seed multiplicity strategy of the event data to the one configured
253  // by the user for pixel seeds
254  data.maxSeedsPerSP = m_maxOneSizePPP;
255  data.keepAllConfirmedSeeds = m_alwaysKeepConfirmedPixelSeeds;
256 
257  SG::ReadHandle<Trk::PRDtoTrackMap> prd_to_track_map;
258  const Trk::PRDtoTrackMap *prd_to_track_map_cptr = nullptr;
259  if (!m_prdToTrackMap.key().empty()) {
260  prd_to_track_map = SG::ReadHandle<Trk::PRDtoTrackMap>(m_prdToTrackMap, ctx);
261  if (!prd_to_track_map.isValid()) {
262  ATH_MSG_ERROR("Failed to read PRD to track association map: " << m_prdToTrackMap.key());
263  }
264  prd_to_track_map_cptr = prd_to_track_map.cptr();
265  }
266 
268  if (spacepointsPixel.isValid()) {
270  for (const SpacePointCollection *spc : *spacepointsPixel) {
271  for (const Trk::SpacePoint *sp : *spc) {
274  if ((prd_to_track_map_cptr && isUsed(sp, *prd_to_track_map_cptr)) || sp->r() > m_r_rmax || sp->r() < m_r_rmin)
275  continue;
276 
281  SiSpacePointForSeed *sps = newSpacePoint(data, sp);
283  if (!sps)
284  continue;
285 
288  int radiusBin = static_cast<int>(sps->radius() * oneOverBinSizeR);
290  if (radiusBin > maxBinR)
291  radiusBin = maxBinR;
292 
294  data.r_ITkSorted[radiusBin].push_back(sps);
296  ++data.r_map[radiusBin];
299  if (data.r_map[radiusBin] == 1)
300  data.r_index[data.nr++] = radiusBin;
302  ++data.ns;
303  }
304  }
305  }
306  }
307 }

◆ newOneSeed()

void ITk::SiSpacePointsSeedMaker::newOneSeed ( EventData data,
SiSpacePointForSeed *&  p1,
SiSpacePointForSeed *&  p2,
SiSpacePointForSeed *&  p3,
float  z,
float  seedCandidateQuality 
) const
private

get the worst seed so far

There are three cases where we simply add our new seed to the list and push it into the map: a) we have not yet reached our max number of seeds

b) we have reached the max number but always want to keep confirmed seeds and the new seed is a confirmed one, with worse quality than the worst one so far

c) we have reached the max number but always want to keep confirmed seeds and the new seed of higher quality than the worst one so far, with the latter however being confirmed

otherwise, we check if there is a poorer-quality seed that we can kick out

Overwrite the parameters of the worst seed with the new one

re-insert it with its proper quality to make sure it ends up in the right place

and remove the entry with the old quality to avoid duplicates

Definition at line 2555 of file ITkSiSpacePointsSeedMaker.cxx.

2558 {
2560  float worstQualityInMap = std::numeric_limits<float>::min();
2561  SiSpacePointsProSeed *worstSeedSoFar = nullptr;
2562  if (!data.ITkMapOneSeeds.empty())
2563  {
2564  std::multimap<float, SiSpacePointsProSeed *>::reverse_iterator l = data.ITkMapOneSeeds.rbegin();
2565  worstQualityInMap = (*l).first;
2566  worstSeedSoFar = (*l).second;
2567  }
2570  if (data.nOneSeeds < data.maxSeedsPerSP
2573  || (m_useSeedConfirmation && data.keepAllConfirmedSeeds && worstQualityInMap <= seedCandidateQuality && isConfirmedSeed(p1, p3, seedCandidateQuality) && data.nOneSeeds < data.seedPerSpCapacity)
2576  || (m_useSeedConfirmation && data.keepAllConfirmedSeeds && worstQualityInMap > seedCandidateQuality && isConfirmedSeed(worstSeedSoFar->spacepoint0(), worstSeedSoFar->spacepoint2(), worstQualityInMap) && data.nOneSeeds < data.seedPerSpCapacity))
2577  {
2578  data.ITkOneSeeds[data.nOneSeeds].set(p1, p2, p3, z);
2579  data.ITkMapOneSeeds.insert(std::make_pair(seedCandidateQuality, &data.ITkOneSeeds[data.nOneSeeds]));
2580  ++data.nOneSeeds;
2581  }
2582 
2584  else if (worstQualityInMap > seedCandidateQuality)
2585  {
2587  worstSeedSoFar->set(p1, p2, p3, z);
2590  i = data.ITkMapOneSeeds.insert(std::make_pair(seedCandidateQuality, worstSeedSoFar));
2592  for (++i; i != data.ITkMapOneSeeds.end(); ++i)
2593  {
2594  if ((*i).second == worstSeedSoFar)
2595  {
2596  data.ITkMapOneSeeds.erase(i);
2597  return;
2598  }
2599  }
2600  }
2601 }

◆ newOneSeedQ()

void ITk::SiSpacePointsSeedMaker::newOneSeedQ ( EventData data,
SiSpacePointForSeed *&  p1,
SiSpacePointForSeed *&  p2,
SiSpacePointForSeed *&  p3,
float  z,
float  seedCandidateQuality 
) const
private

get the worst seed so far

There are three cases where we simply add our new seed to the list and push it into the map: a) we have not yet reached our max number of seeds

b) we have reached the max number but always want to keep confirmed seeds and the new seed is a confirmed one, with worse quality than the worst one so far

c) we have reached the max number but always want to keep confirmed seeds and the new seed of higher quality than the worst one so far, with the latter however being confirmed

otherwise, we check if there is a poorer-quality seed that we can kick out

Overwrite the parameters of the worst seed with the new one

re-insert it with its proper quality to make sure it ends up in the right place

and remove the entry with the old quality to avoid duplicates

Definition at line 2604 of file ITkSiSpacePointsSeedMaker.cxx.

2607 {
2609  float worstQualityInMap = std::numeric_limits<float>::min();
2610  SiSpacePointsProSeed *worstSeedSoFar = nullptr;
2611  if (!data.ITkMapOneSeedsQ.empty())
2612  {
2613  std::multimap<float, SiSpacePointsProSeed *>::reverse_iterator l = data.ITkMapOneSeedsQ.rbegin();
2614  worstQualityInMap = (*l).first;
2615  worstSeedSoFar = (*l).second;
2616  }
2619  if (data.nOneSeedsQ < data.maxSeedsPerSP
2622  || (m_useSeedConfirmation && data.keepAllConfirmedSeeds && worstQualityInMap <= seedCandidateQuality && isConfirmedSeed(p1, p3, seedCandidateQuality) && data.nOneSeedsQ < data.seedPerSpCapacity)
2625  || (m_useSeedConfirmation && data.keepAllConfirmedSeeds && worstQualityInMap > seedCandidateQuality && isConfirmedSeed(worstSeedSoFar->spacepoint0(), worstSeedSoFar->spacepoint2(), worstQualityInMap) && data.nOneSeedsQ < data.seedPerSpCapacity))
2626  {
2627  data.ITkOneSeedsQ[data.nOneSeedsQ].set(p1, p2, p3, z);
2628  data.ITkMapOneSeedsQ.insert(std::make_pair(seedCandidateQuality, &data.ITkOneSeedsQ[data.nOneSeedsQ]));
2629  ++data.nOneSeedsQ;
2630  }
2631 
2633  else if (worstQualityInMap > seedCandidateQuality)
2634  {
2636  worstSeedSoFar->set(p1, p2, p3, z);
2639  i = data.ITkMapOneSeedsQ.insert(std::make_pair(seedCandidateQuality, worstSeedSoFar));
2641  for (++i; i != data.ITkMapOneSeedsQ.end(); ++i)
2642  {
2643  if ((*i).second == worstSeedSoFar)
2644  {
2645  data.ITkMapOneSeedsQ.erase(i);
2646  return;
2647  }
2648  }
2649  }
2650 }

◆ newOneSeedWithCurvaturesComparison()

void ITk::SiSpacePointsSeedMaker::newOneSeedWithCurvaturesComparison ( EventData data,
SiSpacePointForSeed *&  SPb,
SiSpacePointForSeed *&  SP0,
float  Zob 
) const
private

Definition at line 2658 of file ITkSiSpacePointsSeedMaker.cxx.

2659 {
2660  const float dC = .00003;
2661 
2662  bool pixb = !SPb->spacepoint->clusterList().second;
2663 
2664  std::sort(data.ITkCmSp.begin(), data.ITkCmSp.end(), comCurvature());
2665  std::vector<std::pair<float, SiSpacePointForSeed *>>::iterator j, jn, i = data.ITkCmSp.begin(), ie = data.ITkCmSp.end();
2666  jn = i;
2667 
2668  for (; i != ie; ++i)
2669  {
2670  float u = (*i).second->param();
2671  bool pixt = !(*i).second->spacepoint->clusterList().second;
2672  if (pixt && std::abs(SPb->z() - (*i).second->z()) > m_dzmaxPPP)
2673  continue;
2674 
2675  const Trk::Surface *Sui = (*i).second->sur();
2676  float Ri = (*i).second->radius();
2677  float Ci1 = (*i).first - dC;
2678  float Ci2 = (*i).first + dC;
2679  float Rmi = 0.;
2680  float Rma = 0.;
2681  bool in = false;
2682 
2683  if (!pixb)
2684  u -= 400.;
2685  else if (pixt)
2686  u -= 200.;
2687 
2688  for (j = jn; j != ie; ++j)
2689  {
2690  if (j == i)
2691  continue;
2692  if ((*j).first < Ci1)
2693  {
2694  jn = j;
2695  ++jn;
2696  continue;
2697  }
2698  if ((*j).first > Ci2)
2699  break;
2700  if ((*j).second->sur() == Sui)
2701  continue;
2702 
2703  float Rj = (*j).second->radius();
2704  if (std::abs(Rj - Ri) < m_drmin)
2705  continue;
2706 
2707  if (in)
2708  {
2709  if (Rj > Rma)
2710  Rma = Rj;
2711  else if (Rj < Rmi)
2712  Rmi = Rj;
2713  else
2714  continue;
2715  if ((Rma - Rmi) > 20.)
2716  {
2717  u -= 200.;
2718  break;
2719  }
2720  }
2721  else
2722  {
2723  in = true;
2724  Rma = Rmi = Rj;
2725  u -= 200.;
2726  }
2727  }
2728  if (u > m_umax)
2729  continue;
2730 
2731  newOneSeed(data, SPb, SP0, (*i).second, Zob, u);
2732  }
2733  data.ITkCmSp.clear();
2734 }

◆ newOneSeedWithCurvaturesComparisonPPP()

void ITk::SiSpacePointsSeedMaker::newOneSeedWithCurvaturesComparisonPPP ( EventData data,
SiSpacePointForSeed *&  SPb,
SiSpacePointForSeed *&  SP0,
float  Zob 
) const
private

sort common SP by curvature

check all possible common top SP

form a curvature interval cut

Now we look at the other SP candidates and try to find a confirmation seed, including the same centre/lower SP and giving a compatible curvature, but with the top SP in a different layer

if we are looking at the same SP, skip it

if we have a lower curvature than the minimum, skip - and remember to not bother with this candidate again later, as the vectors are curvature-sorted

abort once the the curvature gets too large

Definition at line 3102 of file ITkSiSpacePointsSeedMaker.cxx.

3104 {
3105 
3107  {
3109  }
3110 
3111  else
3112  {
3113 
3114  static const float curvatureInterval = .00003;
3115 
3117  if (data.ITkCmSp.size() > 2)
3118  std::sort(data.ITkCmSp.begin(), data.ITkCmSp.end(), comCurvature());
3119 
3120  std::vector<std::pair<float, SiSpacePointForSeed *>>::iterator it_otherSP;
3121  std::vector<std::pair<float, SiSpacePointForSeed *>>::iterator it_commonTopSP = data.ITkCmSp.begin(), ie = data.ITkCmSp.end();
3122  std::vector<std::pair<float, SiSpacePointForSeed *>>::iterator it_startInnerLoop = it_commonTopSP;
3123 
3124  float Lt[4];
3125 
3126  float Qmin = 1.e20;
3127  float Rb = 2. * SPb->radius();
3128  int NTc(2);
3129  if (Rb > 280.) {
3130  NTc = 1;
3131  }
3132 
3133  SiSpacePointForSeed *SPmin = nullptr;
3134  bool Qm = Rb < 120. || std::abs(Zob) > 150.;
3135 
3137  for (; it_commonTopSP != ie; ++it_commonTopSP)
3138  {
3139 
3140  SiSpacePointForSeed *SPt = (*it_commonTopSP).second;
3141  int NT = 1;
3142  Lt[0] = SPt->dR();
3143  float seedIP = SPt->param();
3144 
3146  float minCurvature = (*it_commonTopSP).first - curvatureInterval;
3147  float maxCurvature = (*it_commonTopSP).first + curvatureInterval;
3148 
3155  for (it_otherSP = it_startInnerLoop; it_otherSP != ie; ++it_otherSP)
3156  {
3158  if (it_otherSP == it_commonTopSP)
3159  continue;
3162  if ((*it_otherSP).first < minCurvature)
3163  {
3164  it_startInnerLoop = it_otherSP;
3165  ++it_startInnerLoop;
3166  continue;
3167  }
3169  if ((*it_otherSP).first > maxCurvature)
3170  break;
3171 
3172  float L = (*it_otherSP).second->dR();
3173 
3174  int k = 0;
3175  for (; k != NT; ++k)
3176  {
3177  if (std::abs(L - Lt[k]) < 20.)
3178  break;
3179  }
3180  if (k == NT)
3181  {
3182  Lt[NT] = L;
3183  if (++NT == 4)
3184  break;
3185  }
3186  }
3187 
3188  int dN = NT - NTc;
3189  if (dN < 0 || (data.nOneSeedsQ && !dN))
3190  continue;
3191  if (Qm && !dN && seedIP > 1.)
3192  continue;
3193 
3194  // ITk seed quality used so far
3195  float Q = 100. * seedIP + (std::abs(Zob) - float(NT) * 100.);
3196  if (Q > SPb->quality() && Q > SP0->quality() && Q > SPt->quality())
3197  continue;
3198 
3199  if (dN)
3200  newOneSeedQ(data, SPb, SP0, SPt, Zob, Q);
3201  else if (Q < Qmin)
3202  {
3203  Qmin = Q;
3204  SPmin = SPt;
3205  }
3206  }
3207  if (SPmin && !data.nOneSeedsQ)
3208  newOneSeed(data, SPb, SP0, SPmin, Zob, Qmin);
3209  data.ITkCmSp.clear();
3210  }
3211 }

◆ newOneSeedWithCurvaturesComparisonSeedConfirmation()

void ITk::SiSpacePointsSeedMaker::newOneSeedWithCurvaturesComparisonSeedConfirmation ( EventData data,
SiSpacePointForSeed *&  SPb,
SiSpacePointForSeed *&  SP0,
float  Zob 
) const
private

sort common SP by curvature

check all possible common top SP

the seed quality is set to d0 initially

check the surface the hit is on

form a curvature interval cut

Note: The score modifiers used here have the purpose of separating the candidates into classes / groups disjoint from each other. So the score increment (200 by default) should exceed the maximum |d0| (base score) we expect to encounter to avoid overlap. For LRT, we may want to tune this!

if we have a SSS seed, boost the quality score by 400

if we have a PPP, boost the quality by 200

Now we look at the other SP candidates and try to find a confirmation seed, including the same centre/lower SP and giving a compatible curvature, but with the top SP in a different layer

if we are looking at the same SP, skip it

if we have a lower curvature than the minimum, skip - and remember to not bother with this candidate again later, as the vectors are curvature-sorted

abort once the the curvature gets too large

if both SP are on the surface, skip it

if the other SP is too close to the current top one, skip

kick this seed candidate if the score is too high (lower values = better)

if we have PPS seeds and no confirmation SP exists (which would give the -200 bonus) or the hits on this seed were already used on a higher quality PPP/SSS seed, kick this one

If we have a non-confirmed seed, apply a stricter d0 cut. This, is determined using the original cut and the score penalty modifier.

PPP seeds

SSS seeds

this is a good seed, save it (unless we have too many seeds per SP)

Definition at line 3213 of file ITkSiSpacePointsSeedMaker.cxx.

3215 {
3216  static const float curvatureInterval = .00003;
3217  bool bottomSPisPixel = !SPb->spacepoint->clusterList().second;
3218  float bottomSPQuality = SPb->quality();
3219  float centralSPQuality = SP0->quality();
3220 
3222  if (data.ITkCmSp.size() > 2)
3223  std::sort(data.ITkCmSp.begin(), data.ITkCmSp.end(), comCurvature());
3224 
3225  float bottomR = SPb->radius();
3226  float bottomZ = SPb->z();
3227 
3228  std::vector<std::pair<float, SiSpacePointForSeed *>>::iterator it_otherSP;
3229  std::vector<std::pair<float, SiSpacePointForSeed *>>::iterator it_commonTopSP = data.ITkCmSp.begin(), ie = data.ITkCmSp.end();
3230  std::vector<std::pair<float, SiSpacePointForSeed *>>::iterator it_startInnerLoop = it_commonTopSP;
3231 
3233  for (; it_commonTopSP != ie; ++it_commonTopSP)
3234  {
3235 
3236  SiSpacePointForSeed *SPt = (*it_commonTopSP).second;
3238  float seedIP = SPt->param();
3239  float seedQuality = seedIP + SPt->scorePenalty();
3240  float originalSeedQuality = seedQuality;
3241 
3242  if (m_maxdImpact > 50)
3243  { //This only applies to LRT
3244 
3245  float topR = SPt->radius();
3246  float topZ = SPt->z();
3247 
3248  float Zot = std::abs(topR - bottomR) > 10e-9 ? bottomZ - (bottomR - originalSeedQuality) * ((topZ - bottomZ) / (topR - bottomR)) : bottomZ;
3249 
3250  float theta1 = std::abs(topR - bottomR) > 10e-9 ? std::atan2(topR - bottomR, topZ - bottomZ) : 0.;
3251  float eta1 = theta1 > 0 ? -std::log(std::tan(.5 * theta1)) : 0.;
3252 
3253  float theta0 = seedIP > 0 ? std::atan2(seedIP, Zot) : 0;
3254  float eta0 = theta0 > 0 ? -std::log(std::tan(.5 * theta0)) : 0.;
3255 
3256  float deltaEta = std::abs(eta1 - eta0); //For LLP daughters, the direction of the track is correlated with the direction of the LLP (which is correlated with the direction of the point of closest approach
3257  //calculate weighted average of d0 and deltaEta, normalized by their maximum values
3258  float f = std::min(0.5, originalSeedQuality / 200.); //0.5 and 200 are parameters chosen from a grid scan to optimize efficiency
3259  seedQuality *= (1 - f) / 300.;
3260  seedQuality += f * deltaEta / 2.5;
3261  }
3262 
3263  bool topSPisPixel = !SPt->spacepoint->clusterList().second;
3264 
3266  const Trk::Surface *surfaceTopSP = SPt->sur();
3267  float radiusTopSP = SPt->radius();
3269  float minCurvature = (*it_commonTopSP).first - curvatureInterval;
3270  float maxCurvature = (*it_commonTopSP).first + curvatureInterval;
3271 
3279  if (!bottomSPisPixel)
3281  seedQuality += m_seedScoreBonusSSS;
3283  else if (topSPisPixel)
3284  seedQuality += m_seedScoreBonusPPP;
3285 
3292  for (it_otherSP = it_startInnerLoop; it_otherSP != ie; ++it_otherSP)
3293  {
3295  if (it_otherSP == it_commonTopSP)
3296  continue;
3299  if ((*it_otherSP).first < minCurvature)
3300  {
3301  it_startInnerLoop = it_otherSP;
3302  ++it_startInnerLoop;
3303  continue;
3304  }
3306  if ((*it_otherSP).first > maxCurvature)
3307  break;
3309  if ((*it_otherSP).second->sur() == surfaceTopSP)
3310  continue;
3312  float radiusOtherSP = (*it_otherSP).second->radius();
3313  if (std::abs(radiusOtherSP - radiusTopSP) < m_drminSeedConf)
3314  continue;
3315  // if we have a confirmation seed, we improve the score of the seed.
3316  seedQuality += m_seedScoreBonusConfirmationSeed;
3317  // apply confirmation bonus only once
3318  break;
3319  }
3320 
3322  if (seedQuality > data.maxScore)
3323  continue;
3324 
3327  if (bottomSPisPixel != topSPisPixel)
3328  {
3329  if (seedQuality > 0. ||
3330  (seedQuality > bottomSPQuality && seedQuality > centralSPQuality && seedQuality > SPt->quality()))
3331  continue;
3332  }
3335  if (!isConfirmedSeed(SPb, SPt, seedQuality))
3336  {
3338  double maxdImpact = m_maxdImpact - (m_dImpactCutSlopeUnconfirmedPPP * SPt->scorePenalty());
3340  if (!bottomSPisPixel)
3341  maxdImpact = m_maxdImpactSSS - (m_dImpactCutSlopeUnconfirmedSSS * SPt->scorePenalty());
3342  if (seedIP > maxdImpact)
3343  continue;
3344  }
3346  newOneSeed(data, SPb, SP0, SPt, Zob, seedQuality);
3347  }
3348  data.ITkCmSp.clear();
3349 }

◆ newOneSeedWithCurvaturesComparisonSSS()

void ITk::SiSpacePointsSeedMaker::newOneSeedWithCurvaturesComparisonSSS ( EventData data,
SiSpacePointForSeed *&  SPb,
SiSpacePointForSeed *&  SP0,
float  Zob 
) const
private

This creates all possible seeds with the passed central and bottom SP, using all top SP candidates which are stored in the data.CmSp member.

Seeds are scored by a quality score seeded by abs(d0), and modified if there is a second-seed confirmation or in case of PPP/SSS topologies. Then, they are written out via the newOneSeed method.

Parameters
[in]SPbBottom Space point for the seed creation
[in]SP0Central Space point for the seed creation
[in]Zobz0 estimate

sort common SP by curvature

check all possible common top SP

form a curvature interval cut

Now we look at the other SP candidates and try to find a confirmation seed, including the same centre/lower SP and giving a compatible curvature, but with the top SP in a different layer

if we are looking at the same SP, skip it

if we have a lower curvature than the minimum, skip - and remember to not bother with this candidate again later, as the vectors are curvature-sorted

abort once the the curvature gets too large

this is a good seed, save it (unless we have too many seeds per SP)

Definition at line 3015 of file ITkSiSpacePointsSeedMaker.cxx.

3017 {
3018 
3020  {
3022  }
3023 
3024  else
3025  {
3026 
3027  static const float curvatureInterval = .00003;
3028 
3030  if (data.ITkCmSp.size() > 2)
3031  std::sort(data.ITkCmSp.begin(), data.ITkCmSp.end(), comCurvature());
3032 
3033  std::vector<std::pair<float, SiSpacePointForSeed *>>::iterator it_otherSP;
3034  std::vector<std::pair<float, SiSpacePointForSeed *>>::iterator it_commonTopSP = data.ITkCmSp.begin(), ie = data.ITkCmSp.end();
3035  std::vector<std::pair<float, SiSpacePointForSeed *>>::iterator it_startInnerLoop = it_commonTopSP;
3036 
3037  float Lt[4];
3038 
3040  for (; it_commonTopSP != ie; ++it_commonTopSP)
3041  {
3042 
3043  SiSpacePointForSeed *SPt = (*it_commonTopSP).second;
3044  int NT = 1;
3045  Lt[0] = SPt->dR();
3046  float seedIP = SPt->param();
3047 
3049  float minCurvature = (*it_commonTopSP).first - curvatureInterval;
3050  float maxCurvature = (*it_commonTopSP).first + curvatureInterval;
3051 
3058  for (it_otherSP = it_startInnerLoop; it_otherSP != ie; ++it_otherSP)
3059  {
3061  if (it_otherSP == it_commonTopSP)
3062  continue;
3065  if ((*it_otherSP).first < minCurvature)
3066  {
3067  it_startInnerLoop = it_otherSP;
3068  ++it_startInnerLoop;
3069  continue;
3070  }
3072  if ((*it_otherSP).first > maxCurvature)
3073  break;
3074 
3075  float L = (*it_otherSP).second->dR();
3076 
3077  int k = 0;
3078  for (; k != NT; ++k)
3079  {
3080  if (std::abs(L - Lt[k]) < 20.)
3081  break;
3082  }
3083  if (k == NT)
3084  {
3085  Lt[NT] = L;
3086  if (++NT == 4)
3087  break;
3088  }
3089  }
3090 
3091  // ITk seed quality used so far
3092  float Q = seedIP - float(NT) * 100.;
3093  if (NT > 2)
3094  Q -= 100000.;
3096  newOneSeed(data, SPb, SP0, SPt, Zob, Q);
3097  }
3098  data.ITkCmSp.clear();
3099  }
3100 }

◆ newRegion() [1/2]

void ITk::SiSpacePointsSeedMaker::newRegion ( const EventContext &  ctx,
EventData data,
const std::vector< IdentifierHash > &  vPixel,
const std::vector< IdentifierHash > &  vStrip 
) const
overridevirtual

build the r-binning.

set the spacepoint iterator to the beginning of the space-point list

Definition at line 313 of file ITkSiSpacePointsSeedMaker.cxx.

315 {
316  if (!m_pixel && !m_strip)
317  return;
318 
319  if (not data.initialized)
321  erase(data);
322  data.iteration = 0;
323  data.trigger = false;
324  data.dzdrmin = m_dzdrmin0;
325  data.dzdrmax = m_dzdrmax0;
326  data.maxScore = m_maxScore;
327  data.r_first = 0;
328  data.checketa = false;
329 
331  float oneOverBinSizeR = 1. / m_binSizeR; //was float irstep = 1.f/m_binSizeR;
332  int maxBinR = m_nBinsR - 1; //was int irmax = m_nBinsR-1;
333 
335  data.i_ITkSpacePointForSeed = data.l_ITkSpacePointForSeed.begin();
336 
337  SG::ReadHandle<Trk::PRDtoTrackMap> prd_to_track_map;
338  const Trk::PRDtoTrackMap *prd_to_track_map_cptr = nullptr;
339  if (!m_prdToTrackMap.key().empty())
340  {
341  prd_to_track_map = SG::ReadHandle<Trk::PRDtoTrackMap>(m_prdToTrackMap, ctx);
342  if (!prd_to_track_map.isValid())
343  {
344  ATH_MSG_ERROR("Failed to read PRD to track association map: " << m_prdToTrackMap.key());
345  }
346  prd_to_track_map_cptr = prd_to_track_map.cptr();
347  }
348 
349  // Get pixels space points containers from store gate
350  //
351  if (m_pixel && !vPixel.empty())
352  {
353 
355  if (spacepointsPixel.isValid())
356  {
357  data.maxSeedsPerSP = m_maxOneSizePPP;
358 
359  // Loop through all trigger collections
360  //
361  for (const IdentifierHash &l : vPixel)
362  {
363  const auto *w = spacepointsPixel->indexFindPtr(l);
364  if (w == nullptr)
365  continue;
366  for (const Trk::SpacePoint *sp : *w)
367  {
368  float r = sp->r();
369  if ((prd_to_track_map_cptr && isUsed(sp, *prd_to_track_map_cptr)) || r > m_r_rmax || r < m_r_rmin)
370  continue;
371  SiSpacePointForSeed *sps = newSpacePoint(data, sp);
372  int ir = static_cast<int>(sps->radius() * oneOverBinSizeR);
373  if (ir > maxBinR)
374  ir = maxBinR;
375  data.r_ITkSorted[ir].push_back(sps);
376  ++data.r_map[ir];
377  if (data.r_map[ir] == 1)
378  data.r_index[data.nr++] = ir;
379  ++data.ns;
380  }
381  }
382  }
383  }
384 
385  // Get strip space points containers from store gate
386  //
387  if (m_strip && !vStrip.empty())
388  {
389  data.maxSeedsPerSP = m_maxOneSizeSSS;
390 
392  if (spacepointsStrip.isValid())
393  {
394 
395  // Loop through all trigger collections
396  //
397  for (const IdentifierHash &l : vStrip)
398  {
399  const auto *w = spacepointsStrip->indexFindPtr(l);
400  if (w == nullptr)
401  continue;
402  for (const Trk::SpacePoint *sp : *w)
403  {
404  float r = sp->r();
405  if ((prd_to_track_map_cptr && isUsed(sp, *prd_to_track_map_cptr)) || r > m_r_rmax || r < m_r_rmin)
406  continue;
407  SiSpacePointForSeed *sps = newSpacePoint(data, sp);
408  int ir = static_cast<int>(sps->radius() * oneOverBinSizeR);
409  if (ir > maxBinR)
410  ir = maxBinR;
411  data.r_ITkSorted[ir].push_back(sps);
412  ++data.r_map[ir];
413  if (data.r_map[ir] == 1)
414  data.r_index[data.nr++] = ir;
415  ++data.ns;
416  }
417  }
418  }
419  }
420 }

◆ newRegion() [2/2]

void ITk::SiSpacePointsSeedMaker::newRegion ( const EventContext &  ctx,
EventData data,
const std::vector< IdentifierHash > &  vPixel,
const std::vector< IdentifierHash > &  vStrip,
const IRoiDescriptor iRD 
) const
overridevirtual

Definition at line 425 of file ITkSiSpacePointsSeedMaker.cxx.

427 {
428  constexpr float twoPi = 2. * M_PI;
429 
430  newRegion(ctx, data, vPixel, vStrip);
431  data.trigger = true;
432 
433  double dzdrmin = 1. / std::tan(2. * std::atan(std::exp(-IRD.etaMinus())));
434  double dzdrmax = 1. / std::tan(2. * std::atan(std::exp(-IRD.etaPlus())));
435 
436  data.zminB = IRD.zedMinus() - data.zbeam[0]; // min bottom Z
437  data.zmaxB = IRD.zedPlus() - data.zbeam[0]; // max bottom Z
438  data.zminU = data.zminB + 550. * dzdrmin;
439  data.zmaxU = data.zmaxB + 550. * dzdrmax;
440  double fmax = IRD.phiPlus();
441  double fmin = IRD.phiMinus();
442  if (fmin > fmax)
443  fmin -= twoPi;
444  data.ftrig = (fmin + fmax) * .5;
445  data.ftrigW = (fmax - fmin) * .5;
446 }

◆ newSeed()

void ITk::SiSpacePointsSeedMaker::newSeed ( EventData data,
SiSpacePointForSeed *&  p1,
SiSpacePointForSeed *&  p2,
float  z 
)
staticprivate

Definition at line 2930 of file ITkSiSpacePointsSeedMaker.cxx.

2932 {
2933  SiSpacePointForSeed *p3 = nullptr;
2934 
2935  if (data.i_ITkSeedEnd != data.i_ITkSeeds.end())
2936  {
2937  SiSpacePointsProSeed *s = &(*data.i_ITkSeedEnd++);
2938  s->set(p1, p2, p3, z);
2939  }
2940  else
2941  {
2942  data.i_ITkSeeds.emplace_back(p1, p2, p3, z);
2943  data.i_ITkSeedEnd = data.i_ITkSeeds.end();
2944  }
2945 }

◆ newSpacePoint() [1/2]

SiSpacePointForSeed * ITk::SiSpacePointsSeedMaker::newSpacePoint ( EventData data,
const Trk::SpacePoint *const sp 
) const
private

Create a SiSpacePointForSeed from the space point.

This will also add the point to the data object's l_spforseed list and update its i_spforseed iterator to point to the entry after the new SP for further additions. Returns a nullptr if the SP fails the eta cut, should we apply one

Parameters
[in,out]dataProvides beam spot location, receives updates to the l_spforseed and i_spforseed members
[in]spInput space point.

Definition at line 2860 of file ITkSiSpacePointsSeedMaker.cxx.

2861 {
2862  float r[15];
2863  return newSpacePoint(data, sp, r, true);
2864 }

◆ newSpacePoint() [2/2]

SiSpacePointForSeed * ITk::SiSpacePointsSeedMaker::newSpacePoint ( EventData data,
const Trk::SpacePoint *const sp,
float *  r,
bool  usePixStripInform = false 
) const
private

r will store the coordinates of the space point relative to the beam spot

if needed, apply eta criterion

If we have previously populated the list and just reset the iterator when re-initialising the data object, then we re-use existing entries

re-use existing entry at the current location

and then update the existing entry with the new SP and location. Unfortunately, set still relies on C-arrays...

otherwise, the list needs to grow

set our return pointer

and make sure to update the iterator

Definition at line 2866 of file ITkSiSpacePointsSeedMaker.cxx.

2867 {
2868 
2869  SiSpacePointForSeed *sps = nullptr;
2870 
2874 
2876  if (data.checketa)
2877  {
2878  float z = (std::abs(r[2]) + m_zmax);
2879  float x = r[0] * data.dzdrmin;
2880  float y = r[1] * data.dzdrmin;
2881  if ((z * z) < (x * x + y * y))
2882  return sps;
2883  }
2884 
2885  if (m_fastTracking)
2886  {
2887  float R2 = r[0] * r[0] + r[1] * r[1];
2888  if (std::abs(r[2]) > m_dzMaxFast && R2 < m_R2MaxFast)
2889  return nullptr;
2890  if (std::abs(r[2]) - m_zmax > data.dzdrmax * std::sqrt(R2))
2891  return nullptr;
2892  }
2893 
2894  if (usePixStripInform)
2895  {
2896  if (!sp->clusterList().second)
2897  pixInform(sp, r);
2898  else
2899  stripInform(data, sp, r);
2900  }
2901 
2905  if (data.i_ITkSpacePointForSeed != data.l_ITkSpacePointForSeed.end())
2906  {
2908  sps = &(*data.i_ITkSpacePointForSeed++);
2911  sps->set(sp, r);
2912  }
2913  else
2914  {
2916  data.l_ITkSpacePointForSeed.emplace_back(sp, &(r[0]));
2918  sps = &(data.l_ITkSpacePointForSeed.back());
2920  data.i_ITkSpacePointForSeed = data.l_ITkSpacePointForSeed.end();
2921  }
2922 
2923  return sps;
2924 }

◆ newVertices()

bool ITk::SiSpacePointsSeedMaker::newVertices ( EventData data,
const std::list< Trk::Vertex > &  lV 
) const
private

reset the isvertex flag

if we had no vertices before and have none now, we can exit right away

clean up the vertex list

if we have no vertices now, we can exit

otherwise, update the data with the new vertices

and also update the z interval, adding 20mm before/after the first/last vertex in z make sure not to extend the interval beyond the user-configured z interval.

Definition at line 787 of file ITkSiSpacePointsSeedMaker.cxx.

788 {
789 
790  unsigned int s1 = data.l_vertex.size();
791  unsigned int s2 = lV.size();
792 
794  data.isvertex = false;
797  if (s1 == 0 && s2 == 0)
798  return false;
799 
801  data.l_vertex.clear();
803  if (s2 == 0)
804  return false;
805 
807  data.isvertex = true;
808  for (const Trk::Vertex &v : lV)
809  {
810  data.l_vertex.insert(static_cast<float>(v.position().z()));
811  }
812 
815  data.zminU = (*data.l_vertex.begin()) - 20.;
816  if (data.zminU < m_zmin)
817  data.zminU = m_zmin;
818  data.zmaxU = (*data.l_vertex.rbegin()) + 20.;
819  if (data.zmaxU > m_zmax)
820  data.zmaxU = m_zmax;
821 
822  return false;
823 }

◆ next()

const InDet::SiSpacePointsSeed * ITk::SiSpacePointsSeedMaker::next ( const EventContext &  ctx,
EventData data 
) const
overridevirtual

This only holds if we call next() without manually calling newEvent/find3Sp

If we are out of seeds, call findNext to see if we can find more.

findNext will call production3Sp again IF data.endlist is false, which is only the case if the last run of production3Sp did not run to the end or if we did not run seed finding before For run-3 offline, this will not do anything.

if no new seeds were found, exit

iterate until we find a valid seed satisfying certain quality cuts in set3

then return this next seed candidate

same as above for 2SP

Definition at line 2792 of file ITkSiSpacePointsSeedMaker.cxx.

2793 {
2795  if (not data.initialized)
2796  initializeEventData(data, ctx);
2797 
2798  if (data.nspoint == 3)
2799  {
2800  do
2801  {
2803  if (data.i_ITkSeed == data.i_ITkSeedEnd)
2804  {
2809  findNext(data);
2811  //cppcheck-suppress identicalInnerCondition
2812  if (data.i_ITkSeed == data.i_ITkSeedEnd)
2813  return nullptr;
2814  }
2815 
2817  } while (!(*data.i_ITkSeed++).set3(data.seedOutput, 1./(1000. * data.K)));
2819  return &data.seedOutput;
2820  }
2821  else
2822  {
2824  if (data.i_ITkSeed == data.i_ITkSeedEnd)
2825  {
2826  findNext(data);
2827  //cppcheck-suppress identicalInnerCondition
2828  if (data.i_ITkSeed == data.i_ITkSeedEnd)
2829  return nullptr;
2830  }
2831  (*data.i_ITkSeed++).set2(data.seedOutput);
2832  return &data.seedOutput;
2833  }
2834  return nullptr;
2835 }

◆ operator=()

SiSpacePointsSeedMaker& ITk::SiSpacePointsSeedMaker::operator= ( const SiSpacePointsSeedMaker )
privatedelete

◆ pixInform()

void ITk::SiSpacePointsSeedMaker::pixInform ( const Trk::SpacePoint sp,
float *  r 
)
staticprivate

Definition at line 1349 of file ITkSiSpacePointsSeedMaker.cxx.

1350 {
1351  const InDet::SiCluster *cl = static_cast<const InDet::SiCluster *>(sp->clusterList().first);
1352  const InDetDD::SiDetectorElement *de = cl->detectorElement();
1353  const Amg::Transform3D &Tp = de->surface().transform();
1354  r[3] = float(Tp(0, 2));
1355  r[4] = float(Tp(1, 2));
1356  r[5] = float(Tp(2, 2));
1357 }

◆ production2Sp()

void ITk::SiSpacePointsSeedMaker::production2Sp ( EventData data) const
private

Definition at line 1445 of file ITkSiSpacePointsSeedMaker.cxx.

1446 {
1447  ATH_MSG_WARNING("ITk::SiSpacePointsSeedMaker::production2Sp not implemented!");
1448 }

◆ production3Sp()

void ITk::SiSpacePointsSeedMaker::production3Sp ( EventData data) const
private

we need at least 3 SP in our phi-z binning, otherwise can't build 3-SP seeds

This method will run a separate seed formation round for each phi-Z region, taking the central SP from there and allowing the top/bottom SP to come from either the same or certain neighbouring bins.

The search in each region is performed in the overload of this method with the extended signature below. Here, we implement the loop over the 2D regions

Order how we walk across z. 0-4 are negative z, 5 is central z, 6-10 are positive z. 0 1 2 3 4 5 6 7 8 9 10 z bin index -----------------------------------—> Z[mm] Z=-2500 IP,Z=0 Z=+2500

prepare arrays to store the iterators over the SP containers for all neighbouring cells we wish to consider in the seed formation

counter for the found

prevent another pass from being run when we run out of Seeds

Loop through all azimuthal regions

For each azimuthal region loop through all Z regions

If we had to abort a previous run, continue where we left off

note that this loop follows the order within 'zBinIndex', not the ascending order of z regions. We start in the centre, not at -2500 mm, and then move outward.

can skip the rest if this particular 2D bin is empty

count how many non-emtpy cells should be searched for the top and bottom neighbour

walk through the cells in phi-z we wish to consider for the bottom SP search. Typically, this will be 3 adjacent phi bins (including the one of the central SP) and possibly neighbours in z on side towards the IP or on both sides, depdending on the z region we are in

only do something if this cell is populated

plug the begin and end iterators to the SP in the cell into our array

walk through the cells in phi-z we wish to consider for the top SP search. Typically, this will be 3 adjacent phi bins (including the one of the central SP) and possibly neighbours in z on the side opposed to the IP or on both sides, depdending on the z region we are in

only do something if this cell is populated

plug the begin and end iterators to the SP in the cell into our array

now run the seed search for the current phi-z bin.

If we exceed the seed capacity, we stop here. Save where we were in z and phi, and set endlist to false. This will trigger another run of production3Sp when The client calls next() after processing all vertices seen so far (freeing up capacity).

Processed all seeds there are without aborting - no re-run needed!

Definition at line 1454 of file ITkSiSpacePointsSeedMaker.cxx.

1455 {
1457  if (data.nsaz < 3)
1458  return;
1459 
1478  const std::array<int, arraySizeZ> zBinIndex_SSS{5, 6, 4, 7, 3, 8, 2, 9, 1, 10, 0};
1479  const std::array<int, arraySizeZ> zBinIndex_PPP_fast{0, 10, 1, 9, 2, 8, 5, 3, 7, 4, 6};
1480  const std::array<int, arraySizeZ> zBinIndex_PPP_long{0, 1, 2, 3, 10, 9, 8, 7, 5, 4, 6};
1481  const auto zBinIndex_PPP = m_fastTracking ? zBinIndex_PPP_fast : zBinIndex_PPP_long;
1482  // Fast tracking runs a single iteration, either pixel or strip
1483  // Default tracking runs a 0-th iteration for strip then a 1-st for pixel
1484  bool isPixel = (m_fastTracking && m_pixel) || data.iteration == 1;
1485  const auto zBinIndex = isPixel ? zBinIndex_PPP : zBinIndex_SSS;
1486 
1487  const float RTmax[11] = { 80., 200., 200., 200., 250., 250., 250., 200., 200., 200., 80.};
1488  const float RTmin[11] = { 40., 40., 70., 70., 70., 70., 70., 70., 70., 40., 40.};
1489 
1496 
1497  int nPhiBins;
1498  std::array<int, arraySizePhiZ> nNeighbourCellsBottom{};
1499  std::array<int, arraySizePhiZ> nNeighbourCellsTop{};
1500  std::array<std::array<int, arraySizeNeighbourBins>, arraySizePhiZ> neighbourCellsBottom{};
1501  std::array<std::array<int, arraySizeNeighbourBins>, arraySizePhiZ> neighbourCellsTop{};
1502 
1503  if (isPixel)
1504  {
1506  nNeighbourCellsBottom = m_nNeighbourCellsBottomPPP;
1507  nNeighbourCellsTop = m_nNeighbourCellsTopPPP;
1508  neighbourCellsBottom = m_neighbourCellsBottomPPP;
1509  neighbourCellsTop = m_neighbourCellsTopPPP;
1510  }
1511  else
1512  {
1514  nNeighbourCellsBottom = m_nNeighbourCellsBottomSSS;
1515  nNeighbourCellsTop = m_nNeighbourCellsTopSSS;
1516  neighbourCellsBottom = m_neighbourCellsBottomSSS;
1517  neighbourCellsTop = m_neighbourCellsTopSSS;
1518  }
1519 
1521  int nseed = 0;
1523  data.endlist = true;
1524 
1526  for (int phiBin = data.fNmin; phiBin <= nPhiBins; ++phiBin)
1527  {
1528 
1530  int z = (m_fastTracking && m_pixel) ? 2 : 0;
1532  if (!data.endlist)
1533  z = data.zMin;
1534 
1538  for (; z < arraySizeZ; ++z)
1539  {
1540 
1541  if (m_fastTracking && m_pixel)
1542  {
1543  data.RTmax = RTmax[ zBinIndex[z] ];
1544  data.RTmin = RTmin[ zBinIndex[z] ];
1545  }
1546 
1547  int phiZbin = phiBin * arraySizeZ + zBinIndex[z];
1548 
1550  if (!data.rfz_map[phiZbin])
1551  continue;
1552 
1555  int numberBottomCells = 0;
1556  int numberTopCells = 0;
1557 
1562  for (int neighbourCellNumber = 0; neighbourCellNumber < nNeighbourCellsBottom[phiZbin]; ++neighbourCellNumber)
1563  {
1564 
1565  int theNeighbourCell = neighbourCellsBottom[phiZbin][neighbourCellNumber];
1567  if (!data.rfz_map[theNeighbourCell])
1568  continue;
1570  iter_bottomCands[numberBottomCells] = data.rfz_ITkSorted[theNeighbourCell].begin();
1571  iter_endBottomCands[numberBottomCells++] = data.rfz_ITkSorted[theNeighbourCell].end();
1572  }
1573 
1578  for (int neighbourCellNumber = 0; neighbourCellNumber < nNeighbourCellsTop[phiZbin]; ++neighbourCellNumber)
1579  {
1580 
1581  int theNeighbourCell = neighbourCellsTop[phiZbin][neighbourCellNumber];
1583  if (!data.rfz_map[theNeighbourCell])
1584  continue;
1586  iter_topCands[numberTopCells] = data.rfz_ITkSorted[theNeighbourCell].begin();
1587  iter_endTopCands[numberTopCells++] = data.rfz_ITkSorted[theNeighbourCell].end();
1588  }
1589 
1591  if (!data.trigger)
1592  {
1593  if (isPixel)
1594  production3SpPPP(data, iter_bottomCands, iter_endBottomCands, iter_topCands, iter_endTopCands, numberBottomCells, numberTopCells, nseed);
1595  else
1596  production3SpSSS(data, iter_bottomCands, iter_endBottomCands, iter_topCands, iter_endTopCands, numberBottomCells, numberTopCells, nseed);
1597  }
1598  else
1599  production3SpTrigger(data, iter_bottomCands, iter_endBottomCands, iter_topCands, iter_endTopCands, numberBottomCells, numberTopCells, nseed);
1600  }
1601 
1608  if (nseed >= m_maxsize)
1609  {
1610  data.endlist = false;
1611  data.fNmin = phiBin + 1;
1612  return;
1613  }
1614  }
1615 
1617  data.endlist = true;
1618 }

◆ production3SpPPP()

void ITk::SiSpacePointsSeedMaker::production3SpPPP ( EventData data,
std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &  iter_bottomCands,
std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &  iter_endBottomCands,
std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &  iter_topCands,
std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &  iter_endTopCands,
const int  numberBottomCells,
const int  numberTopCells,
int &  nseed 
) const
private

This method implements the seed search for a single phi-Z region of the detector. The central SP is taken from the region, while the top and bottom SP are allowed to come from either the same or a range of neighbouring cells.

iterator across the candidates for the central space point.

Next, we work out where we are within the ATLAS geometry. This will help us identify which space-points we need to consider as potential central points of a seed.

find the first central SP candidate above the minimum radius.

for the top candidates in the central phi-Z bin, we do not need to start at a smaller radius than the lowest-r valid central SP candidate

prepare cut values

keep track of the SP storace capacity. Extend it needed (should rarely be the case)

Loop through all central space point candidates

global coordinates of the central SP

for the central SP, we veto locations on the last disk - there would be no "outer" hits to complete a seed.

initialise a counter for found bottom links This also serves as an index in the data.SP vector

Top links production Loop over all the cells where we expect to find such SP

loop over each SP in each cell

evaluate the radial distance,

Comparison with vertices Z coordinates straight line extrapolation to r=0

this is effectively a segment-level eta cut - exclude too shallow seed segments

add SP to the list

< inverse distance to central SP

< transformed U coordinate

< transformed V coordinate

<squared Error on 1/tan theta coming from the space-point position errors

if we are exceeding the SP capacity of our data object, make it resize its vectors. Will add 50 slots by default, so rarely should happen more than once per event.

now continue with the bottom SP search. Make the counter start at Nt, as this serves as a running index in the SP list for this seed.

Bottom links production Loop over all the cells where we expect to find such SP

in each cell, loop over the space points

evaluate the radial distance between the central and bottom SP

if the points are too close in r, abort (future ones will be even closer).

Comparison with vertices Z coordinates straight line extrapolation to r=0

this is effectively a segment-level eta cut - exclude too shallow seed segments

add SP to the list

< inverse distance to central SP

< transformed U coordinate

< transformed V coordinate

<squared Error on 1/tan theta coming from the space-point position errors

if we are exceeding the SP capacity of our data object, make it resize its vectors. Will add 50 slots by default, so rarely should happen more than once per event.

if we found no bottom candidates (remember, Nb starts counting at Nt), abort

Three space points comparison first, loop over the bottom point candidates

retrieve the geometrical paranmeters w.r.t the central SP for this candidate

< 1/tanTheta estimate from central+bottom SP

bottom seed index after sorting

< this is the uncertainty in 1/tanTheta on the bottom segment resulting from the position errors in the 2 SP

< v-coordinate of bottom SP

< u-coordinate of bottom SP

< 1+1/tan²theta - converts transverse to total squared pt

< sqrt (1+1/tan²theta) - used to convert pt to |p|

< this, when divided by the 2R², yields an approximated multiple scattering term assuming the measured pt.

< this is an approximate worst case multiple scattering term assuming the lowest pt we allow and the estimated theta angle

max IP

inner loop over the top point candidates

Apply a cut on the compatibility between the r-z slope of the two seed segments. This is done by comparing the squared difference between slopes, and comparing to the squared uncertainty in this difference - we keep a seed if the difference is compatible within the assumed uncertainties.

average value of 1/tan(theta), approximate the slope at the location of the central space point

squared error on the difference in tan(theta) due to space point position errors.

pre-computed individual squared errors on 1/tan(theta) for the two segments

mixed term with z-uncertainty on central SP

start out by subtracting from the squared difference in 1/tanTheta the space-point-related squared error

First, we test using a generous scattering term calculated assuming the minimum pt we expect to reconstruct.

The following exploits the transformation u:=x/(x²+y²); v:=y/(x²+y²); This is applied on the x,y coordinates in the frame described above, where the origin is put in the central SP and the x axis defined to point directly away from the IP.

In this transformed u,v frame, what would be our circle in x-y space takes the form of
a linear function V = (-x0/y0) x U + 1/(2y0) =: A x U + B/2. Here, x0 and y0 describe the center point of the circle in the x-y frame. As the origin of the x-y frame (the middle space point of our seed) is on the circle, we have x0²+y0²=R² with circle radius R.

For our seed, we can experimentally obtain A as the slope of the linear function, delta V / delta U, estimated using the delta U and delta V between the top and bottom space point.

B is then obtained by inserting the obtained A into the linear equation for the bottom SP, A x U + B/2 = V --> B = 2(V - A x U0

With x0²+y0²=R², and x0=-A/B and y0=1/B, the radius of the circle is then obtained as R²=(1+A²)/B².

With this radius (and pT) estimate, we can apply our pt cut. Reminder, ipt2K is 1 / (K x 0.9 x pt-cut)², where K translates pt into 2R. So here we can apply the pt cut directly on the (2R)² estimate without the extra overhead of conversion / division. The second check is a refinement of the above Tz compatibility cut, replacing the sigmaSquaredScatteringMinPt scattering contribution which assumes the lowest pt by one based on the actual estimated pt.

The second term in this if-statement applies a second version of the 1/tan(theta) compatibility, this time using a scattering term scaled by the actual measured pt. This refines the cut applied above, following the same logic ("delta² - sigma² ?<=0")

This is an estimate of the transverse impact parameter. The reasoning is that, in the x-y frame with the central SP as origin and the x axis pointing away from the IP, we have for the distance between the IP and the middle of the circle: (x0 - r_central)²+y0² = (R + d0)², with R being the circle radius and r_central the radial location of the central SP, placing the IP at IP at (-r_central, 0).

First simplify using R² =x0²+y0², then apply the approximation d0²/R² ~ 0.

Finally, consider that locally close to the central SP, the circle is parallel to the x axis, so A = 0 --> expand (2R)²=(1+A²)/B² around this point to obtain d0 = r_central x (r_central x B - A). Note that below, the variable R is the radial coordinate fo the central SP, corresponding to r_central in the notation above.

apply d0 cut to seed

evaluate distance the two closest-by SP in this seed candidate

obtain a quality score - start from the d0 estimate, and add a penalty term corresponding to how far the seed segments deviate from a straight line in r-z

record one possible seed candidate, sort by the curvature

store the transverse IP, will later be used as a quality estimator

now apply further cleaning on the seed candidates for this central+bottom pair.

cleared in newOneSeedWithCurvaturesComparisonPPP but need to also be cleared in case previous conditional statement isn't fulfilled

record seeds found in this run

Definition at line 1624 of file ITkSiSpacePointsSeedMaker.cxx.

1630 {
1631 
1638  std::vector<SiSpacePointForSeed *>::iterator iter_centralSP = iter_bottomCands[0];
1640 
1647  for (; iter_centralSP != iter_endBottomCands[0]; ++iter_centralSP)
1649  {
1650  if((*iter_centralSP)->radius() > data.RTmin) break;
1651  }
1652 
1655  iter_topCands[0] = iter_centralSP;
1656  ++iter_topCands[0];
1657 
1659  const float &ipt2K = data.ipt2K;
1660  const float &ipt2C = data.ipt2C;
1661  const float &COFK = data.COFK;
1662  const float &maxd0cut = m_maxdImpact;
1663  const float &zmax = data.zmaxU;
1664  const float &dzdrmax = data.dzdrmax;
1665  data.ITkCmSp.clear();
1666 
1669  size_t SPcapacity = data.ITkSP.size();
1670 
1672  for (; iter_centralSP != iter_endBottomCands[0]; ++iter_centralSP)
1673  {
1674  const float &R = (*iter_centralSP)->radius();
1675 
1676  if(R > data.RTmax)
1677  break;
1678 
1680  const float &X = (*iter_centralSP)->x();
1681  const float &Y = (*iter_centralSP)->y();
1682  const float &Z = (*iter_centralSP)->z();
1683 
1686  double absZ = std::abs(Z);
1687  if (!m_fastTracking && absZ > m_zmaxPPP)
1688  continue;
1689 
1690  float covr0 = (*iter_centralSP)->covr();
1691  float covz0 = (*iter_centralSP)->covz();
1692  float Ri = 1. / R;
1693  float ax = X * Ri;
1694  float ay = Y * Ri;
1695  float VR = maxd0cut / (R * R);
1696  size_t Ntm = 2;
1697  if (R > m_rmaxPPP)
1698  Ntm = 1;
1699 
1702  size_t Nt = 0;
1703 
1706  for (int cell = 0; cell < numberTopCells; ++cell)
1707  {
1708  std::vector<SiSpacePointForSeed *>::iterator iter_otherSP = iter_topCands[cell], iter_otherSPend = iter_endTopCands[cell];
1709  if (iter_otherSP == iter_otherSPend) continue;
1710 
1711  for(; iter_otherSP!=iter_otherSPend; ++iter_otherSP) {
1712  if(( (*iter_otherSP)->radius()- R ) >= m_drminPPP) break;
1713  }
1714  iter_topCands[cell]=iter_otherSP;
1715 
1717  for (; iter_otherSP != iter_endTopCands[cell]; ++iter_otherSP)
1718  {
1720  float Rt = (*iter_otherSP)->radius();
1721  float dR = Rt - R;
1722 
1723  const float dz = (*iter_otherSP)->z() - Z;
1724  const float dZdR = dz / dR;
1727  const float z0 = Z - R * dZdR;
1728  if (std::abs(z0) > zmax)
1729  continue;
1730 
1731  float dx = (*iter_otherSP)->x() - X;
1732  float dy = (*iter_otherSP)->y() - Y;
1733  float x = dx * ax + dy * ay;
1734  float y = dy * ax - dx * ay;
1735  float dxy = x * x + y * y;
1736  float r2 = 1. / dxy;
1737  float u = x * r2;
1738  float v = y * r2;
1739 
1740  if (std::abs(R * y) > maxd0cut * x)
1741  {
1742  float V0;
1743  y < 0. ? V0 = VR : V0 = -VR;
1744  float A = (v - V0) / (u + 1. / R);
1745  float B = V0 + A / R;
1746  if ((B * B) > (ipt2K * (1. + A * A)))
1747  continue;
1748  }
1749 
1750  const float dr = std::sqrt(r2);
1751  const float tz = dz * dr;
1753  if (std::abs(tz) > dzdrmax)
1754  continue;
1755 
1757  data.ITkSP[Nt] = (*iter_otherSP);
1758  data.R[Nt] = dr;
1759  data.U[Nt] = u;
1760  data.V[Nt] = v;
1761  data.Er[Nt] = ((covz0 + (*iter_otherSP)->covz()) + (tz * tz) * (covr0 + (*iter_otherSP)->covr())) * r2;
1762  data.ITkSP[Nt]->setDR(std::sqrt(dxy + dz * dz));
1763  data.ITkSP[Nt]->setDZDR(dZdR);
1764  data.Tn[Nt].Fl = tz;
1765  data.Tn[Nt].In = Nt;
1766 
1770  if (++Nt == SPcapacity)
1771  {
1772  size_t increment = 50;
1774  SPcapacity = data.ITkSP.size();
1775  }
1776  }
1777  }
1778 
1779  if (Nt < Ntm)
1780  continue;
1781 
1785  size_t Nb = Nt;
1786 
1789  for (int cell = 0; cell < numberBottomCells; ++cell)
1790  {
1791 
1792  std::vector<SiSpacePointForSeed*>::iterator iter_otherSP = iter_bottomCands[cell];
1793 
1794  for(; iter_otherSP!=iter_endBottomCands[cell]; ++iter_otherSP) {
1795  if( (R - (*iter_otherSP)->radius()) <= m_drmaxPPP) break;
1796  }
1797  iter_bottomCands[cell]=iter_otherSP;
1798 
1800  for (; iter_otherSP != iter_endBottomCands[cell]; ++iter_otherSP)
1801  {
1803  const float &Rb = (*iter_otherSP)->radius();
1804  float dR = R - Rb;
1805 
1807  if (dR < m_drminPPP)
1808  break;
1809 
1810  const float dz = Z - (*iter_otherSP)->z();
1811  const float dZdR = dz / dR;
1814  const float z0 = Z - R * dZdR;
1815  if (std::abs(z0) > zmax)
1816  continue;
1817 
1818  float dx = (*iter_otherSP)->x() - X;
1819  float dy = (*iter_otherSP)->y() - Y;
1820  float x = dx * ax + dy * ay;
1821  float y = dy * ax - dx * ay;
1822  float dxy = ( x * x + y * y );
1823  float r2 = 1. / dxy;
1824  float u = x * r2;
1825  float v = y * r2;
1826 
1827  if (std::abs(R * y) > -maxd0cut * x)
1828  {
1829  float V0;
1830  y > 0. ? V0 = VR : V0 = -VR;
1831  float A = (v - V0) / (u + 1. / R);
1832  float B = V0 + A / R;
1833  if ((B * B) > (ipt2K * (1. + A * A)))
1834  continue;
1835  }
1836 
1837  const float dr = std::sqrt(r2);
1838  const float tz = dz * dr;
1840  if (std::abs(tz) > dzdrmax)
1841  continue;
1842  if (m_fastTracking && (*iter_otherSP)->radius() < 50. && std::abs(tz) > 1.5)
1843  continue;
1844 
1846  data.ITkSP[Nb] = (*iter_otherSP);
1847  data.R[Nb] = dr;
1848  data.U[Nb] = u;
1849  data.V[Nb] = v;
1850  data.Er[Nb] = ((covz0 + (*iter_otherSP)->covz()) + (tz * tz) * (covr0 + (*iter_otherSP)->covr())) * r2;
1851  data.ITkSP[Nb]->setDR(std::sqrt(dxy + dz * dz));
1852  data.ITkSP[Nb]->setDZDR(dZdR);
1853  data.Tn[Nb].Fl = tz;
1854  data.Tn[Nb].In = Nb;
1855 
1859  if (++Nb == SPcapacity)
1860  {
1861  size_t increment = 50;
1863  SPcapacity = data.ITkSP.size();
1864  }
1865 
1866  }
1867  }
1868 
1870  if (!(Nb - Nt))
1871  continue;
1872 
1873  sort(data.Tn,0,Nt);
1874  sort(data.Tn,Nt,Nb-Nt);
1875 
1876  data.nOneSeeds = 0;
1877  data.nOneSeedsQ = 0;
1878  data.ITkMapOneSeeds.clear();
1879  data.ITkMapOneSeedsQ.clear();
1880 
1883  size_t it0 = 0;
1884  for (size_t ib = Nt; ib < Nb; ++ib)
1885  {
1886 
1887  if (it0 == Nt)
1888  break;
1889 
1891  float Tzb = data.Tn[ib].Fl;
1892  int b = data.Tn[ib].In;
1893 
1894  float Rb2r = data.R[b] * covr0;
1895  float Rb2z = data.R[b] * covz0;
1896  float Erb = data.Er[b];
1897  float Vb = data.V[b];
1898  float Ub = data.U[b];
1899  float Tzb2 = (1. + Tzb * Tzb);
1900  float sTzb2 = std::sqrt(Tzb2);
1901 
1902  float sigmaSquaredScatteringPtDependent = Tzb2 * COFK;
1903  float sigmaSquaredScatteringMinPt = Tzb2 * ipt2C;
1904  float d0max = maxd0cut;
1907 
1908  size_t Nc = 1;
1909  if (data.ITkSP[b]->radius() > m_rmaxPPP){
1910  Nc = 0;
1911  }
1912  if (data.nOneSeedsQ)
1913  ++Nc;
1914 
1916  for (size_t it = it0; it < Nt; ++it)
1917  {
1918 
1919  int t = data.Tn[it].In; // index of top seed after sorting
1920  float Tzt = data.Tn[it].Fl;
1921 
1926 
1928  float meanOneOverTanThetaSquare = Tzb * Tzt; // SSS uses arithmetic average, PPP geometric average
1929 
1931  float sigmaSquaredSpacePointErrors = Erb + data.Er[t]
1932  + 2 * Rb2z * data.R[t]
1933  + 2 * Rb2r * data.R[t] * meanOneOverTanThetaSquare; // mixed term with r-uncertainy on central SP
1934 
1936  float remainingSquaredDelta = (Tzb - Tzt) * (Tzb - Tzt) - sigmaSquaredSpacePointErrors;
1937 
1940  if (remainingSquaredDelta - sigmaSquaredScatteringMinPt > 0)
1941  {
1942  if (Tzb - Tzt < 0.)
1943  break;
1944  it0 = it + 1 ;
1945  continue;
1946  }
1947 
1970  float dU = data.U[t] - Ub;
1971  if (dU == 0.)
1972  continue;
1973  float A = (data.V[t] - Vb) / dU;
1974  float onePlusAsquare = 1. + A * A;
1975  float B = Vb - A * Ub;
1976  float BSquare = B * B;
1977 
1990  if (BSquare > ipt2K * onePlusAsquare)
1991  continue;
1992  if (remainingSquaredDelta * onePlusAsquare > BSquare * sigmaSquaredScatteringPtDependent)
1993  {
1994  if (Tzb - Tzt < 0.)
1995  break;
1996  it0 = it;
1997  continue;
1998  }
1999 
2016  float d0 = std::abs((A - B * R) * R);
2017 
2019  if (d0 <= d0max)
2020  {
2022  float dr = data.R[b];
2023  if (data.R[t] < data.R[b])
2024  dr = data.R[t];
2028  data.ITkSP[t]->setScorePenalty(std::abs((Tzb - Tzt) / (dr * sTzb2)));
2029  data.ITkSP[t]->setParam(d0);
2030 
2032  data.ITkCmSp.emplace_back(B / std::sqrt(onePlusAsquare), data.ITkSP[t]);
2034  if (data.ITkCmSp.size() == 500)
2035  break;
2036  }
2037 
2038  }
2039 
2041  if (data.ITkCmSp.size() > Nc)
2042  {
2043  newOneSeedWithCurvaturesComparisonPPP(data, data.ITkSP[b], (*iter_centralSP), Z - R * Tzb);
2044  }
2045  data.ITkCmSp.clear();
2046  }
2047  fillSeeds(data);
2049  nseed += data.fillOneSeeds;
2050 
2051  }
2052 }

◆ production3SpSSS()

void ITk::SiSpacePointsSeedMaker::production3SpSSS ( EventData data,
std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &  iter_bottomCands,
std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &  iter_endBottomCands,
std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &  iter_topCands,
std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &  iter_endTopCands,
const int  numberBottomCells,
const int  numberTopCells,
int &  nseed 
) const
private

: Seed production from space points.

Production 3 space points seeds for full scan.

This method will try to find 3-SP combinations within a local phi-z region in the detector.

The central SP of the seed will be taken from this region (technically via the first entry of the bottom candidate array, which always points to the phi-z bin of interest itself).

The top SP is allowed to come from the same or one of several close-by phi-Z bins, as is the bottom SP.

All SP collections are expected to be internally sorted in the radial coordinate.

Parameters
[in,out]dataEvent data
[in,out]iter_bottomCandscollection of iterators over SP collections for up to 9 phi-z cells to consider for the bottom space-point search
[in,out]iter_endBottomCandscollection of end-iterators over the SP collections for up to 9 phi-z cells to consider for the bottom space-point search
[in,out]iter_topCandscollection of iterators over SP collections for up to 9 phi-z cells to consider for the top space-point search
[in,out]iter_endTopCandscollection of end-iterators over the SP collections for up to 9 phi-z cells to consider for the top space-point search
[in]numberBottomCellsNumber of bottom cells to consider. Determines how many entries in iter_(end)bottomCands are expected to be valid.
[in]numberTopCellsNumber of top cells to consider.Determines how many entries in iter_(end)topCands are expected to be valid.
[out]nseedNumber of seeds found

This method implements the seed search for a single phi-Z region of the detector. The central SP is taken from the region, while the top and bottom SP are allowed to come from either the same or a range of neighbouring cells.

iterator across the candidates for the central space point.

< will be used for iterating over top/bottom SP

Next, we work out where we are within the ATLAS geometry. This will help us identify which space-points we need to consider as potential central points of a seed.

find the first central SP candidate above the minimum radius.

for the top candidates in the central phi-Z bin, we do not need to start at a smaller radius than the lowest-r valid central SP candidate

prepare cut values

keep track of the SP storace capacity. Extend it needed (should rarely be the case)

Loop through all central space point candidates

< stop if we have moved outside our radial region of interest.

global coordinates of the central SP

for the central SP, we veto locations on the last disk - there would be no "outer" hits to complete a seed.

veto the last strip disk

initialise a counter for found bottom links This also serves as an index in the data.SP vector

Top links production Loop over all the cells where we expect to find such SP

evaluate the radial distance,

loop over each SP in each cell

evaluate the radial distance,

if we are to far, the next ones will be even farther, so abort

Comparison with vertices Z coordinates straight line extrapolation to r=0

for LRT: Before adding top SP to the list, apply a cut for LRT

add SP to the list

if we are exceeding the SP capacity of our data object, make it resize its vectors. Will add 50 slots by default, so rarely should happen more than once per event.

if we did not find ANY top SP, or if we exceed the storage capacity, we abort this seed candidate.

now continue with the bottom SP search. Make the counter start at Nt, as this serves as a running index in the SP list for this seed.

Bottom links production Loop over all the cells where we expect to find such SP

in each cell, loop over the space points

evaluate the radial distance between the central and bottom SP

if the points are too close in r, abort (future ones will be even closer).

Comparison with vertices Z coordinates straight line extrapolation to r=0

for LRT: Before adding top SP to the list, apply a cut for LRT

found a bottom SP candidate, write it into the data object

if we are exceeding the SP capacity of our data object, make it resize its vectors. Will add 50 slots by default, so rarely should happen more than once per event.

if we found no bottom candidates (remember, Nb starts counting at Nt), abort

get covariance on r and z for the central SP

build a unit direction vector pointing from the IP to the central SP

check all SP candidates we found during our loop and compute geometrical variables w.r.t the central point.

transform the space point coordinates into a frame centered around the middle SP, where the x axis points away from the detector frame origin

inverse square distance of the candidate space point to the central point

inverse distance of the candidate space point to the central point

estimate slope in z - distance traveled in transverse plane vs z direction. rough estimate of 1/tan theta from 2 points

if we are looking at a bottom SP candidate, flip the sign to account for different direction of flight (from bottom to central)

save this into our data object

< 1/ tan theta

< z0 estimate.

< inverse distance to central SP

< transformed U coordinate

< transformed V coordinate

<squared Error on 1/tan theta coming from the space-point position errors

Three space points comparison first, loop over the bottom point candidates

retrieve the geometrical paranmeters w.r.t the central SP for this candidate

< z0 estimate from central+bottom SP

< 1/tanTheta estimate from central+bottom SP

< this is the uncertainty in 1/tanTheta on the bottom segment resulting from the position errors in the 2 SP

< v-coordinate of bottom SP

< u-coordinate of bottom SP

< 1+1/tan²theta - converts transverse to total squared pt

< sqrt (1+1/tan²theta) - used to convert pt to |p|

< this, when divided by the 2R², yields an approximated multiple scattering term assuming the measured pt.

< this is an approximate worst case multiple scattering term assuming the lowest pt we allow and the estimated theta angle

max IP

inner loop over the top point candidates

The following exploits the transformation u:=x/(x²+y²); v:=y/(x²+y²); This is applied on the x,y coordinates in the frame described above, where the origin is put in the central SP and the x axis defined to point directly away from the IP.

In this transformed u,v frame, what would be our circle in x-y space takes the form of
a linear function V = (-x0/y0) x U + 1/(2y0) =: A x U + B/2. Here, x0 and y0 describe the center point of the circle in the x-y frame. As the origin of the x-y frame (the middle space point of our seed) is on the circle, we have x0²+y0²=R² with circle radius R.

For our seed, we can experimentally obtain A as the slope of the linear function, delta V / delta U, estimated using the delta U and delta V between the top and bottom space point.

B is then obtained by inserting the obtained A into the linear equation for the bottom SP, A x U + B/2 = V --> B = 2(V - A x U0

With x0²+y0²=R², and x0=-A/B and y0=1/B, the radius of the circle is then obtained as R²=(1+A²)/B².

Apply a cut on the compatibility between the r-z slope of the two seed segments. This is done by comparing the squared difference between slopes, and comparing to the squared uncertainty in this difference - we keep a seed if the difference is compatible within the assumed uncertainties.

average value of 1/tan(theta), approximate the slope at the location of the central space point

squared error on the difference in tan(theta) due to space point position errors.

pre-computed individual squared errors on 1/tan(theta) for the two segments

mixed term with z-uncertainty on central SP

start out by subtracting from the squared difference in 1/tanTheta the space-point-related squared error

First, we test using a generous scattering term calculated assuming the minimum pt we expect to reconstruct.

With this radius (and pT) estimate, we can apply our pt cut. Reminder, ipt2K is 1 / (K x 0.9 x pt-cut)², where K translates pt into 2R. So here we can apply the pt cut directly on the (2R)² estimate without the extra overhead of conversion / division. The second check is a refinement of the above Tz compatibility cut, replacing the sigmaSquaredScatteringMinPt scattering contribution which assumes the lowest pt by one based on the actual estimated pt.

The second term in this if-statement applies a second version of the 1/tan(theta) compatibility, this time using a scattering term scaled by the actual measured pt. This refines the cut applied above, following the same logic ("delta² - sigma² ?<=0")

This is an estimate of the transverse impact parameter. The reasoning is that, in the x-y frame with the central SP as origin and the x axis pointing away from the IP, we have for the distance between the IP and the middle of the circle: (x0 - r_central)²+y0² = (R + d0)², with R being the circle radius and r_central the radial location of the central SP, placing the IP at IP at (-r_central, 0).

First simplify using R² =x0²+y0², then apply the approximation d0²/R² ~ 0.

Finally, consider that locally close to the central SP, the circle is parallel to the x axis, so A = 0 --> expand (2R)²=(1+A²)/B² around this point to obtain d0 = r_central x (r_central x B - A). Note that below, the variable R is the radial coordinate fo the central SP, corresponding to r_central in the notation above.

apply d0 cut to seed

evaluate distance the two closest-by SP in this seed candidate

obtain a quality score - start from the d0 estimate, and add a penalty term corresponding to how far the seed segments deviate from a straight line in r-z

record one possible seed candidate, sort by the curvature

store the transverse IP, will later be used as a quality estimator

now apply further cleaning on the seed candidates for this central+bottom pair.

record seeds found in this run

Definition at line 2058 of file ITkSiSpacePointsSeedMaker.cxx.

2064 {
2065 
2072  std::vector<SiSpacePointForSeed *>::iterator iter_centralSP = iter_bottomCands[0];
2075 
2082  for (; iter_centralSP != iter_endBottomCands[0]; ++iter_centralSP)
2084  {
2085  if((*iter_centralSP)->radius() > data.RTmin) break;
2086  }
2087 
2090  iter_topCands[0] = iter_centralSP;
2091  ++iter_topCands[0];
2092 
2094  const float ipt2K = data.ipt2K;
2095  const float ipt2C = data.ipt2C;
2096  const float COFK = data.COFK;
2097  const float maxd0cut = m_maxdImpactSSS;
2098  const float zmax = data.zmaxU;
2099  data.ITkCmSp.clear();
2100 
2103  size_t SPcapacity = data.ITkSP.size();
2104 
2106  for (; iter_centralSP != iter_endBottomCands[0]; ++iter_centralSP)
2107  {
2108 
2109  const float &R = (*iter_centralSP)->radius();
2110 
2111  if(R > data.RTmax) break;
2112 
2114  const float &X = (*iter_centralSP)->x();
2115  const float &Y = (*iter_centralSP)->y();
2116  const float &Z = (*iter_centralSP)->z();
2117 
2120  double absZ = std::abs(Z);
2122  if (absZ > m_zmaxSSS)
2123  continue;
2124 
2127  size_t Nt = 0;
2128 
2131  for (int cell = 0; cell < numberTopCells; ++cell)
2132  {
2133 
2134  for (iter_otherSP = iter_topCands[cell]; iter_otherSP != iter_endTopCands[cell]; ++iter_otherSP)
2135  {
2137  float Rt = (*iter_otherSP)->radius();
2138  float dR = Rt - R;
2139  if (dR >= m_drminSSS)
2140  break;
2141  }
2142  iter_topCands[cell] = iter_otherSP;
2143 
2145  for (iter_otherSP = iter_topCands[cell]; iter_otherSP != iter_endTopCands[cell]; ++iter_otherSP)
2146  {
2147 
2149  float Rt = (*iter_otherSP)->radius();
2150  float dR = Rt - R;
2152  if (dR > m_drmaxSSS)
2153  break;
2154 
2155  const float dz = (*iter_otherSP)->z() - Z;
2156  const float dZdR = dz / dR;
2157 
2160  const float z0 = Z - R * dZdR;
2161  if (std::abs(dz) > m_dzmaxSSS || std::abs(z0) > zmax)
2162  continue;
2163 
2165  if(m_isLRT){
2166  float Ri = 1./R;
2167  const float ax = X*Ri;
2168  const float ay = Y*Ri;
2169  float VR = m_maxdImpact*Ri*Ri ;
2170  float dx = (*iter_otherSP)->x() - X;
2171  float dy = (*iter_otherSP)->y() - Y;
2172  float x = dx * ax + dy * ay;
2173  float y = dy * ax - dx * ay;
2174 
2175  if(std::abs(R*y) > maxd0cut * x) {
2176  float r2 = 1. / (x * x + y * y);
2177  float u = x*r2 ;
2178  float v = y*r2 ;
2179  const float V0 = (y < 0.) ? VR: -VR;
2180  float A = (v-V0)/(u+Ri) ;
2181  float B = V0+A*Ri ;
2182  if((B*B) > (ipt2K*(1.+A*A))) continue;
2183  }
2184  }
2185 
2187  data.ITkSP[Nt] = (*iter_otherSP);
2188  data.ITkSP[Nt]->setDZDR(dZdR);
2192  if (++Nt == SPcapacity)
2193  {
2194  data.resizeSPCont();
2195  SPcapacity = data.ITkSP.size();
2196  }
2197  }
2198  }
2199 
2201  if (!Nt)
2202  continue;
2203 
2207  size_t Nb = Nt;
2208 
2211  for (int cell = 0; cell < numberBottomCells; ++cell)
2212  {
2213 
2214  for(iter_otherSP=iter_bottomCands[cell]; iter_otherSP!=iter_endBottomCands[cell]; ++iter_otherSP) {
2215  if((R-(*iter_otherSP)->radius()) <= m_drmaxSSS) break;
2216  }
2217  iter_bottomCands[cell]=iter_otherSP;
2218 
2220  for (; iter_otherSP != iter_endBottomCands[cell]; ++iter_otherSP)
2221  {
2222 
2224  const float &Rb = (*iter_otherSP)->radius();
2225  float dR = R - Rb;
2226 
2228  if (dR < m_drminSSS)
2229  break;
2230 
2231  const float dz = Z - (*iter_otherSP)->z();
2232  const float dZdR = dz / dR;
2233 
2236  const float z0 = Z - R * dZdR;
2237  if (std::abs(dz) > m_dzmaxSSS || std::abs(z0) > zmax)
2238  continue;
2239 
2241  if(m_isLRT){
2242  float Ri = 1./R;
2243  const float ax = X*Ri;
2244  const float ay = Y*Ri;
2245  float VR = m_maxdImpact*Ri*Ri ;
2246  float dx = (*iter_otherSP)->x() - X;
2247  float dy = (*iter_otherSP)->y() - Y;
2248  float x = dx * ax + dy * ay;
2249  float y = dy * ax - dx * ay;
2250 
2251  if(std::abs(R*y) > -maxd0cut * x) {
2252  float r2 = 1. / (x * x + y * y);
2253  float u = x*r2 ;
2254  float v = y*r2 ;
2255  const float V0 = (y < 0.) ? VR: -VR;
2256  float A = (v-V0)/(u+Ri) ;
2257  float B = V0+A*Ri ;
2258  if((B*B) > (ipt2K*(1.+A*A))) continue;
2259  }
2260  }
2261 
2263  data.ITkSP[Nb] = (*iter_otherSP);
2264  data.ITkSP[Nb]->setDZDR(dZdR);
2268  if (++Nb == SPcapacity)
2269  {
2270  data.resizeSPCont();
2271  SPcapacity = data.ITkSP.size();
2272  }
2273  }
2274  }
2275 
2277  if (!(Nb - Nt))
2278  continue;
2279 
2281  float covr0 = (*iter_centralSP)->covr();
2282  float covz0 = (*iter_centralSP)->covz();
2283 
2285  float ax = X / R;
2286  float ay = Y / R;
2287 
2290  for (size_t i = 0; i < Nb; ++i)
2291  {
2292 
2293  SiSpacePointForSeed *sp = data.ITkSP[i];
2294 
2297  float dx = sp->x() - X;
2298  float dy = sp->y() - Y;
2299  float dz = sp->z() - Z;
2300  float x = dx * ax + dy * ay;
2301  float y = dy * ax - dx * ay;
2302 
2304  float r2 = 1. / (x * x + y * y);
2306  float dr = std::sqrt(r2);
2309  float tz = dz * dr;
2310 
2313  if (i >= Nt)
2314  tz = -tz;
2315 
2317  data.X[i] = x;
2318  data.Y[i] = y;
2319  data.Tz[i] = tz;
2320  data.Zo[i] = Z - R * tz;
2321  data.R[i] = dr;
2322  data.U[i] = x * r2;
2323  data.V[i] = y * r2;
2324  data.Er[i] = ((covz0 + sp->covz()) + (tz * tz) * (covr0 + sp->covr())) * r2;
2325  }
2326 
2327  data.nOneSeeds = 0;
2328  data.nOneSeedsQ = 0;
2329  data.ITkMapOneSeeds.clear();
2330  data.ITkMapOneSeedsQ.clear();
2331 
2334  for (size_t b = Nt; b < Nb; ++b)
2335  {
2336 
2338  float Zob = data.Zo[b];
2339  float Tzb = data.Tz[b];
2340  float Rb2r = data.R[b] * covr0;
2341  float Rb2z = data.R[b] * covz0;
2342  float Erb = data.Er[b];
2343  float Vb = data.V[b];
2344  float Ub = data.U[b];
2345  float Tzb2 = (1. + Tzb * Tzb);
2346  float sTzb2 = std::sqrt(Tzb2);
2347  float Se = 1. / std::sqrt(Tzb2);
2348  float Ce = Se * Tzb;
2349  float Sx = Se * ax;
2350  float Sy = Se * ay;
2351 
2352  float sigmaSquaredScatteringPtDependent = Tzb2 * COFK;
2353  float sigmaSquaredScatteringMinPt = Tzb2 * ipt2C;
2354  float d0max = maxd0cut;
2357 
2359  for (size_t t = 0; t < Nt; ++t)
2360  {
2361 
2384  // Trigger point
2385  //
2386  float dU0 = data.U[t] - Ub;
2387  if (dU0 == 0.)
2388  continue;
2389  float A0 = (data.V[t] - Vb) / dU0;
2390 
2391  float Cn = Ce * std::sqrt(1. + A0 * A0);
2392 
2393  float dn[3] = {Sx - Sy * A0, Sx * A0 + Sy, Cn};
2394  float rn[3];
2395  if (!(*iter_centralSP)->coordinates(dn, rn))
2396  continue;
2397 
2398  // Bottom point
2399  //
2400  float B0 = 2. * (Vb - A0 * Ub);
2401  float Cb = 1. - B0 * data.Y[b];
2402  float Sb = A0 + B0 * data.X[b];
2403  float db[3] = {Sx * Cb - Sy * Sb, Sx * Sb + Sy * Cb, Cn};
2404  float rb[3];
2405  if (!data.ITkSP[b]->coordinates(db, rb))
2406  continue;
2407 
2408  // Top point
2409  //
2410  float Ct = 1. - B0 * data.Y[t];
2411  float St = A0 + B0 * data.X[t];
2412  float dt[3] = {Sx * Ct - Sy * St, Sx * St + Sy * Ct, Cn};
2413  float rt[3];
2414  if (!data.ITkSP[t]->coordinates(dt, rt))
2415  continue;
2416 
2417  float xb = rb[0] - rn[0];
2418  float yb = rb[1] - rn[1];
2419  float zb = rb[2] - rn[2];
2420  float xt = rt[0] - rn[0];
2421  float yt = rt[1] - rn[1];
2422  float zt = rt[2] - rn[2];
2423 
2424  float rb2 = 1. / (xb * xb + yb * yb);
2425  float rt2 = 1. / (xt * xt + yt * yt);
2426 
2427  float tb = -zb * std::sqrt(rb2);
2428  float tz = zt * std::sqrt(rt2);
2429 
2434 
2436  float meanOneOverTanTheta = (tb + tz) / 2.;
2437 
2439  float sigmaSquaredSpacePointErrors = Erb + data.Er[t]
2440  + 2 * Rb2z * data.R[t]
2441  + 2 * Rb2r * data.R[t] * meanOneOverTanTheta * meanOneOverTanTheta; // mixed term with r-uncertainy on central SP
2442 
2444  float remainingSquaredDelta = (tb - tz) * (tb - tz) - sigmaSquaredSpacePointErrors;
2445 
2448  if (remainingSquaredDelta - sigmaSquaredScatteringMinPt > 0)
2449  continue;
2450 
2451  float Rn = std::sqrt(rn[0] * rn[0] + rn[1] * rn[1]);
2452  float Ax = rn[0] / Rn;
2453  float Ay = rn[1] / Rn;
2454 
2455  float ub = (xb * Ax + yb * Ay) * rb2;
2456  float vb = (yb * Ax - xb * Ay) * rb2;
2457  float ut = (xt * Ax + yt * Ay) * rt2;
2458  float vt = (yt * Ax - xt * Ay) * rt2;
2459 
2460  float dU = ut - ub;
2461  if (dU == 0.)
2462  continue;
2463  float A = (vt - vb) / dU;
2464  float onePlusAsquare = 1. + A * A;
2465  float B = vb - A * ub;
2466  float BSquare = B * B;
2467 
2480  if (BSquare > ipt2K * onePlusAsquare || remainingSquaredDelta * onePlusAsquare > BSquare * sigmaSquaredScatteringPtDependent)
2481  continue;
2482 
2499  float d0 = std::abs((A - B * Rn) * Rn);
2500 
2502  if (d0 <= d0max)
2503  {
2505  float dr = std::sqrt(1 / rb2);
2506  if (data.R[t] < data.R[b])
2507  dr = std::sqrt(1 / rt2);
2511  data.ITkSP[t]->setScorePenalty(std::abs((tb - tz) / (dr * sTzb2)));
2512  data.ITkSP[t]->setParam(d0);
2513  float DR = std::sqrt( xt * xt + yt * yt + zt * zt ); // distance between top and central SP
2514  data.ITkSP[t]->setDR(DR);
2515 
2517  data.ITkCmSp.emplace_back(B / std::sqrt(onePlusAsquare), data.ITkSP[t]);
2519  if (data.ITkCmSp.size() == 500)
2520  break;
2521  }
2522 
2523  }
2524  if (!data.ITkCmSp.empty())
2526  {
2527  newOneSeedWithCurvaturesComparisonSSS(data, data.ITkSP[b], (*iter_centralSP), Zob);
2528  }
2529  }
2530  fillSeeds(data);
2532  nseed += data.fillOneSeeds;
2533 
2534  }
2535 }

◆ production3SpTrigger()

void ITk::SiSpacePointsSeedMaker::production3SpTrigger ( EventData ,
std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &  ,
std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &  ,
std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &  ,
std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &  ,
const int  ,
const int  ,
int &   
) const
private

as above, but for the trigger

Definition at line 2541 of file ITkSiSpacePointsSeedMaker.cxx.

2547 {
2548  ATH_MSG_WARNING("ITk::SiSpacePointsSeedMaker::production3SpTrigger not implemented!");
2549 }

◆ sort()

void ITk::SiSpacePointsSeedMaker::sort ( std::vector< InDet::FloatInt > &  s,
int  start,
int  size 
) const
inlineprivate

Definition at line 535 of file ITkSiSpacePointsSeedMaker.h.

536  {
537  //QuickSort for fast tracking currently buggy
538  //TBC if really faster than std::sort
539  //Using std::sort in all cases for now
540  std::sort(s.begin()+start,s.begin()+start+size,[](const InDet::FloatInt a, const InDet::FloatInt b)->bool {return a.Fl < b.Fl;});
541  }

◆ stripInform()

void ITk::SiSpacePointsSeedMaker::stripInform ( EventData data,
const Trk::SpacePoint sp,
float *  r 
)
staticprivate

Definition at line 1363 of file ITkSiSpacePointsSeedMaker.cxx.

1364 {
1365  const InDet::SiCluster *c0 = static_cast<const InDet::SiCluster *>(sp->clusterList().first);
1366  const InDet::SiCluster *c1 = static_cast<const InDet::SiCluster *>(sp->clusterList().second);
1367  const InDetDD::SiDetectorElement *d0 = c0->detectorElement();
1368  const InDetDD::SiDetectorElement *d1 = c1->detectorElement();
1369 
1370  Amg::Vector2D lc0 = c0->localPosition();
1371  Amg::Vector2D lc1 = c1->localPosition();
1372 
1373  std::pair<Amg::Vector3D, Amg::Vector3D> e0 =
1374  (d0->endsOfStrip(InDetDD::SiLocalPosition(lc0.y(), lc0.x(), 0.)));
1375  std::pair<Amg::Vector3D, Amg::Vector3D> e1 =
1376  (d1->endsOfStrip(InDetDD::SiLocalPosition(lc1.y(), lc1.x(), 0.)));
1377 
1378  Amg::Vector3D s0(.5 * (e0.first + e0.second));
1379  Amg::Vector3D s1(.5 * (e1.first + e1.second));
1380 
1381  Amg::Vector3D b0(.5 * (e0.second - e0.first));
1382  Amg::Vector3D b1(.5 * (e1.second - e1.first));
1383  Amg::Vector3D d02(s0 - s1);
1384 
1385  // b0
1386  r[3] = float(b0[0]);
1387  r[4] = float(b0[1]);
1388  r[5] = float(b0[2]);
1389 
1390  // b1
1391  r[6] = float(b1[0]);
1392  r[7] = float(b1[1]);
1393  r[8] = float(b1[2]);
1394 
1395  // r0-r2
1396  r[9] = float(d02[0]);
1397  r[10] = float(d02[1]);
1398  r[11] = float(d02[2]);
1399 
1400  // r0
1401  r[12] = float(s0[0]) - data.xbeam[0];
1402  r[13] = float(s0[1]) - data.ybeam[0];
1403  r[14] = float(s0[2]) - data.zbeam[0];
1404 }

◆ writeNtuple()

void ITk::SiSpacePointsSeedMaker::writeNtuple ( const InDet::SiSpacePointsSeed seed,
const Trk::Track track,
int  seedType,
long  eventNumber 
) const
overridevirtual

Definition at line 3370 of file ITkSiSpacePointsSeedMaker.cxx.

3371 {
3372  if(m_writeNtuple) {
3373  std::lock_guard<std::mutex> lock(m_mutex);
3374 
3375  if(track != nullptr) {
3376  m_trackPt = (track->trackParameters()->front()->pT())/1000.f;
3377  m_trackEta = std::abs(track->trackParameters()->front()->eta());
3378  }
3379  else {
3380  m_trackPt = -1.;
3381  m_trackEta = -1.;
3382  }
3383  m_d0 = seed->d0();
3384  m_z0 = seed->zVertex();
3385  m_eta = seed->eta();
3386  m_x1 = seed->x1();
3387  m_x2 = seed->x2();
3388  m_x3 = seed->x3();
3389  m_y1 = seed->y1();
3390  m_y2 = seed->y2();
3391  m_y3 = seed->y3();
3392  m_z1 = seed->z1();
3393  m_z2 = seed->z2();
3394  m_z3 = seed->z3();
3395  m_r1 = seed->r1();
3396  m_r2 = seed->r2();
3397  m_r3 = seed->r3();
3398  m_type = seedType;
3399  m_dzdr_b = seed->dzdr_b();
3400  m_dzdr_t = seed->dzdr_t();
3401  m_pt = seed->pt();
3402  m_givesTrack = !(track == nullptr);
3403  m_eventNumber = eventNumber;
3404 
3405  // Ok: protected by mutex.
3406  TTree* outputTree ATLAS_THREAD_SAFE = m_outputTree;
3407  outputTree->Fill();
3408 
3409  }
3410 
3411 }

Member Data Documentation

◆ ATLAS_THREAD_SAFE [1/26]

std::string m_treeName ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 261 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [2/26]

TString m_treeFolder ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 262 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [3/26]

float m_d0 ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 263 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [4/26]

float m_z0 ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 264 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [5/26]

float m_pt ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 265 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [6/26]

float m_eta ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 266 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [7/26]

double m_x1 ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 267 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [8/26]

double m_x2 ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 268 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [9/26]

double m_x3 ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 269 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [10/26]

double m_y1 ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 270 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [11/26]

double m_y2 ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 271 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [12/26]

double m_y3 ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 272 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [13/26]

double m_z1 ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 273 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [14/26]

double m_z2 ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 274 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [15/26]

double m_z3 ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 275 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [16/26]

double m_r1 ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 276 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [17/26]

double m_r2 ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 277 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [18/26]

double m_r3 ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 278 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [19/26]

float m_quality ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 279 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [20/26]

int m_type ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 280 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [21/26]

double m_dzdr_t ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 281 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [22/26]

double m_dzdr_b ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 282 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [23/26]

bool m_givesTrack ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 283 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [24/26]

float m_trackPt ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 284 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [25/26]

float m_trackEta ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 285 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [26/26]

long m_eventNumber ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 286 of file ITkSiSpacePointsSeedMaker.h.

◆ m_alwaysKeepConfirmedPixelSeeds

BooleanProperty ITk::SiSpacePointsSeedMaker::m_alwaysKeepConfirmedPixelSeeds {this, "alwaysKeepConfirmedPixelSeeds", false}
private

Definition at line 204 of file ITkSiSpacePointsSeedMaker.h.

◆ m_alwaysKeepConfirmedStripSeeds

BooleanProperty ITk::SiSpacePointsSeedMaker::m_alwaysKeepConfirmedStripSeeds {this, "alwaysKeepConfirmedStripSeeds", false}
private

Definition at line 205 of file ITkSiSpacePointsSeedMaker.h.

◆ m_beamSpotKey

SG::ReadCondHandleKey<InDet::BeamSpotData> ITk::SiSpacePointsSeedMaker::m_beamSpotKey {this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot"}
private

Definition at line 171 of file ITkSiSpacePointsSeedMaker.h.

◆ m_binSizeR

FloatProperty ITk::SiSpacePointsSeedMaker::m_binSizeR {this, "radStep", 2.}
private

Definition at line 194 of file ITkSiSpacePointsSeedMaker.h.

◆ m_checketa

BooleanProperty ITk::SiSpacePointsSeedMaker::m_checketa {this, "checkEta", false}
private

Definition at line 235 of file ITkSiSpacePointsSeedMaker.h.

◆ m_COF

float ITk::SiSpacePointsSeedMaker::m_COF {134 * .05f * 9}
private

Definition at line 246 of file ITkSiSpacePointsSeedMaker.h.

◆ m_dImpactCutSlopeUnconfirmedPPP

FloatProperty ITk::SiSpacePointsSeedMaker::m_dImpactCutSlopeUnconfirmedPPP {this, "dImpactCutSlopeUnconfirmedPPP", 0.}
private

Definition at line 220 of file ITkSiSpacePointsSeedMaker.h.

◆ m_dImpactCutSlopeUnconfirmedSSS

FloatProperty ITk::SiSpacePointsSeedMaker::m_dImpactCutSlopeUnconfirmedSSS {this, "dImpactCutSlopeUnconfirmedSSS", 1.0}
private

Definition at line 219 of file ITkSiSpacePointsSeedMaker.h.

◆ m_drmax

FloatProperty ITk::SiSpacePointsSeedMaker::m_drmax {this, "maxdRadius", 300.}
private

Definition at line 190 of file ITkSiSpacePointsSeedMaker.h.

◆ m_drmaxPPP

FloatProperty ITk::SiSpacePointsSeedMaker::m_drmaxPPP {this, "maxdRadiusPPP", 150.}
private

Definition at line 214 of file ITkSiSpacePointsSeedMaker.h.

◆ m_drmaxSSS

FloatProperty ITk::SiSpacePointsSeedMaker::m_drmaxSSS {this, "maxdRadiusSSS", 300.}
private

Definition at line 217 of file ITkSiSpacePointsSeedMaker.h.

◆ m_drmin

FloatProperty ITk::SiSpacePointsSeedMaker::m_drmin {this, "mindRadius", 5.}
private

Definition at line 189 of file ITkSiSpacePointsSeedMaker.h.

◆ m_drminPPP

FloatProperty ITk::SiSpacePointsSeedMaker::m_drminPPP {this, "mindRadiusPPP", 6.}
private

Definition at line 213 of file ITkSiSpacePointsSeedMaker.h.

◆ m_drminSeedConf

float ITk::SiSpacePointsSeedMaker::m_drminSeedConf {5.}
private

Definition at line 251 of file ITkSiSpacePointsSeedMaker.h.

◆ m_drminSSS

FloatProperty ITk::SiSpacePointsSeedMaker::m_drminSSS {this, "mindRadiusSSS", 20.}
private

Definition at line 216 of file ITkSiSpacePointsSeedMaker.h.

◆ m_dzdrmax0

float ITk::SiSpacePointsSeedMaker::m_dzdrmax0 {0.}
private

Definition at line 243 of file ITkSiSpacePointsSeedMaker.h.

◆ m_dzdrmin0

float ITk::SiSpacePointsSeedMaker::m_dzdrmin0 {0.}
private

Definition at line 242 of file ITkSiSpacePointsSeedMaker.h.

◆ m_dzdrver

FloatProperty ITk::SiSpacePointsSeedMaker::m_dzdrver {this, "maxdZdRver", 0.02}
private

Definition at line 196 of file ITkSiSpacePointsSeedMaker.h.

◆ m_dzMaxFast

float ITk::SiSpacePointsSeedMaker::m_dzMaxFast {200.}
private

Definition at line 247 of file ITkSiSpacePointsSeedMaker.h.

◆ m_dzmaxPPP

FloatProperty ITk::SiSpacePointsSeedMaker::m_dzmaxPPP {this, "dZmaxForPPPSeeds", 600.}
private

Definition at line 199 of file ITkSiSpacePointsSeedMaker.h.

◆ m_dzmaxSSS

float ITk::SiSpacePointsSeedMaker::m_dzmaxSSS {900.}
private

Definition at line 250 of file ITkSiSpacePointsSeedMaker.h.

◆ m_dzver

FloatProperty ITk::SiSpacePointsSeedMaker::m_dzver {this, "maxdZver", 5.}
private

Definition at line 195 of file ITkSiSpacePointsSeedMaker.h.

◆ m_etamax

FloatProperty ITk::SiSpacePointsSeedMaker::m_etamax {this, "etaMax", 2.7}
private

Definition at line 184 of file ITkSiSpacePointsSeedMaker.h.

◆ m_etamin

FloatProperty ITk::SiSpacePointsSeedMaker::m_etamin {this, "etaMin", 0.}
private

Definition at line 227 of file ITkSiSpacePointsSeedMaker.h.

◆ m_fastTracking

BooleanProperty ITk::SiSpacePointsSeedMaker::m_fastTracking {this, "useFastTracking", false}
private

Definition at line 206 of file ITkSiSpacePointsSeedMaker.h.

◆ m_fieldCondObjInputKey

SG::ReadCondHandleKey<AtlasFieldCacheCondObj> ITk::SiSpacePointsSeedMaker::m_fieldCondObjInputKey
private
Initial value:
{this, "AtlasFieldCacheCondObj", "fieldCondObj",
"Name of the Magnetic Field conditions object key"}

Definition at line 172 of file ITkSiSpacePointsSeedMaker.h.

◆ m_inverseBinSizePhiPPP

float ITk::SiSpacePointsSeedMaker::m_inverseBinSizePhiPPP {0}
private

cache the inverse bin size in phi which we use - needed to evaluate phi bin locations

Definition at line 293 of file ITkSiSpacePointsSeedMaker.h.

◆ m_inverseBinSizePhiSSS

float ITk::SiSpacePointsSeedMaker::m_inverseBinSizePhiSSS {0}
private

Definition at line 295 of file ITkSiSpacePointsSeedMaker.h.

◆ m_inverseBinSizePhiVertex

float ITk::SiSpacePointsSeedMaker::m_inverseBinSizePhiVertex {0}
private

Definition at line 297 of file ITkSiSpacePointsSeedMaker.h.

◆ m_ipt

float ITk::SiSpacePointsSeedMaker::m_ipt {0.}
private

Definition at line 244 of file ITkSiSpacePointsSeedMaker.h.

◆ m_ipt2

float ITk::SiSpacePointsSeedMaker::m_ipt2 {0.}
private

Definition at line 245 of file ITkSiSpacePointsSeedMaker.h.

◆ m_isLRT

BooleanProperty ITk::SiSpacePointsSeedMaker::m_isLRT {this, "isLRT", false}
private

Definition at line 212 of file ITkSiSpacePointsSeedMaker.h.

◆ m_maxBinPhiVertex

int ITk::SiSpacePointsSeedMaker::m_maxBinPhiVertex {0}
private

Definition at line 296 of file ITkSiSpacePointsSeedMaker.h.

◆ m_maxdImpact

FloatProperty ITk::SiSpacePointsSeedMaker::m_maxdImpact {this, "maxdImpact", 10.}
private

Definition at line 197 of file ITkSiSpacePointsSeedMaker.h.

◆ m_maxdImpactSSS

FloatProperty ITk::SiSpacePointsSeedMaker::m_maxdImpactSSS {this, "maxdImpactSSS", 20.}
private

Definition at line 198 of file ITkSiSpacePointsSeedMaker.h.

◆ m_maxOneSize

IntegerProperty ITk::SiSpacePointsSeedMaker::m_maxOneSize {this, "maxSeedsForSpacePoint", 5}
private

Definition at line 183 of file ITkSiSpacePointsSeedMaker.h.

◆ m_maxOneSizePPP

IntegerProperty ITk::SiSpacePointsSeedMaker::m_maxOneSizePPP {this, "maxSeedsForSpacePointPixels", 5}
private

Definition at line 203 of file ITkSiSpacePointsSeedMaker.h.

◆ m_maxOneSizeSSS

IntegerProperty ITk::SiSpacePointsSeedMaker::m_maxOneSizeSSS {this, "maxSeedsForSpacePointStrips", 5}
private

Definition at line 202 of file ITkSiSpacePointsSeedMaker.h.

◆ m_maxPhiBinPPP

int ITk::SiSpacePointsSeedMaker::m_maxPhiBinPPP {0}
private

number of bins in phi

Definition at line 292 of file ITkSiSpacePointsSeedMaker.h.

◆ m_maxPhiBinSSS

int ITk::SiSpacePointsSeedMaker::m_maxPhiBinSSS {0}
private

Definition at line 294 of file ITkSiSpacePointsSeedMaker.h.

◆ m_maxScore

FloatProperty ITk::SiSpacePointsSeedMaker::m_maxScore {this, "maximumAcceptedSeedScore", 100.}
private

Definition at line 201 of file ITkSiSpacePointsSeedMaker.h.

◆ m_maxsize

IntegerProperty ITk::SiSpacePointsSeedMaker::m_maxsize {this, "maxSize", 10000}
private

Definition at line 181 of file ITkSiSpacePointsSeedMaker.h.

◆ m_maxsizeSP

IntegerProperty ITk::SiSpacePointsSeedMaker::m_maxsizeSP {this, "maxSizeSP", 4096}
private

Definition at line 182 of file ITkSiSpacePointsSeedMaker.h.

◆ m_mutex

std::mutex ITk::SiSpacePointsSeedMaker::m_mutex
mutableprivate

Definition at line 260 of file ITkSiSpacePointsSeedMaker.h.

◆ m_nBinsR

int ITk::SiSpacePointsSeedMaker::m_nBinsR {0}
private

number of bins in the radial coordinate

Definition at line 291 of file ITkSiSpacePointsSeedMaker.h.

◆ m_neighbourCellsBottomPPP

std::array<std::array<int, arraySizeNeighbourBins>, arraySizePhiZ> ITk::SiSpacePointsSeedMaker::m_neighbourCellsBottomPPP {}
private

mapping of neighbour cells in the 2D phi-z binning to consider for the "bottom SP" search for central SPs in each phi-z bin. Number of valid entries stored in m_nNeighboursPhiZbottom

Definition at line 315 of file ITkSiSpacePointsSeedMaker.h.

◆ m_neighbourCellsBottomSSS

std::array<std::array<int, arraySizeNeighbourBins>, arraySizePhiZ> ITk::SiSpacePointsSeedMaker::m_neighbourCellsBottomSSS {}
private

Definition at line 320 of file ITkSiSpacePointsSeedMaker.h.

◆ m_neighbourCellsTopPPP

std::array<std::array<int, arraySizeNeighbourBins>, arraySizePhiZ> ITk::SiSpacePointsSeedMaker::m_neighbourCellsTopPPP {}
private

mapping of neighbour cells in the 2D phi-z binning to consider for the "top SP" search for central SPs in each phi-z bin. Number of valid entries stored in m_nNeighboursPhiZtop

Definition at line 316 of file ITkSiSpacePointsSeedMaker.h.

◆ m_neighbourCellsTopSSS

std::array<std::array<int, arraySizeNeighbourBins>, arraySizePhiZ> ITk::SiSpacePointsSeedMaker::m_neighbourCellsTopSSS {}
private

Definition at line 321 of file ITkSiSpacePointsSeedMaker.h.

◆ m_neighboursVertexPhiZ

std::array<std::array<int, arraySizeNeighbourBinsVertex>, arraySizePhiZV> ITk::SiSpacePointsSeedMaker::m_neighboursVertexPhiZ {}
private

Definition at line 324 of file ITkSiSpacePointsSeedMaker.h.

◆ m_nNeighbourCellsBottomPPP

std::array<int,arraySizePhiZ> ITk::SiSpacePointsSeedMaker::m_nNeighbourCellsBottomPPP {}
private

arrays associating bins to each other for SP formation

number of neighbouring phi-z bins to consider when looking for "bottom SP" candidates for each phi-z bin

Definition at line 313 of file ITkSiSpacePointsSeedMaker.h.

◆ m_nNeighbourCellsBottomSSS

std::array<int,arraySizePhiZ> ITk::SiSpacePointsSeedMaker::m_nNeighbourCellsBottomSSS {}
private

Definition at line 318 of file ITkSiSpacePointsSeedMaker.h.

◆ m_nNeighbourCellsTopPPP

std::array<int,arraySizePhiZ> ITk::SiSpacePointsSeedMaker::m_nNeighbourCellsTopPPP {}
private

number of neighbouring phi-z bins to consider when looking for "top SP" candidates for each phi-z bin

Definition at line 314 of file ITkSiSpacePointsSeedMaker.h.

◆ m_nNeighbourCellsTopSSS

std::array<int,arraySizePhiZ> ITk::SiSpacePointsSeedMaker::m_nNeighbourCellsTopSSS {}
private

Definition at line 319 of file ITkSiSpacePointsSeedMaker.h.

◆ m_nNeighboursVertexPhiZ

std::array<int,arraySizePhiZV> ITk::SiSpacePointsSeedMaker::m_nNeighboursVertexPhiZ {}
private

Definition at line 323 of file ITkSiSpacePointsSeedMaker.h.

◆ m_optimisePhiBinning

BooleanProperty ITk::SiSpacePointsSeedMaker::m_optimisePhiBinning {this, "optimisePhiBinning", true}
private

Definition at line 209 of file ITkSiSpacePointsSeedMaker.h.

◆ m_outputlevel

int ITk::SiSpacePointsSeedMaker::m_outputlevel {0}
private

Definition at line 240 of file ITkSiSpacePointsSeedMaker.h.

◆ m_outputTree

TTree* ITk::SiSpacePointsSeedMaker::m_outputTree
private

Definition at line 259 of file ITkSiSpacePointsSeedMaker.h.

◆ m_pixel

BooleanProperty ITk::SiSpacePointsSeedMaker::m_pixel {this, "usePixel", true}
private

Definition at line 178 of file ITkSiSpacePointsSeedMaker.h.

◆ m_prdToTrackMap

SG::ReadHandleKey<Trk::PRDtoTrackMap> ITk::SiSpacePointsSeedMaker::m_prdToTrackMap {this,"PRDtoTrackMap","","option PRD-to-track association"}
private

Definition at line 170 of file ITkSiSpacePointsSeedMaker.h.

◆ m_ptmin

FloatProperty ITk::SiSpacePointsSeedMaker::m_ptmin {this, "pTmin", 500.}
private

Definition at line 229 of file ITkSiSpacePointsSeedMaker.h.

◆ m_r1maxv

FloatProperty ITk::SiSpacePointsSeedMaker::m_r1maxv {this, "maxVRadius1", 60.}
private

Definition at line 186 of file ITkSiSpacePointsSeedMaker.h.

◆ m_r1minv

FloatProperty ITk::SiSpacePointsSeedMaker::m_r1minv {this, "minVRadius1", 0.}
private

Definition at line 185 of file ITkSiSpacePointsSeedMaker.h.

◆ m_R2MaxFast

float ITk::SiSpacePointsSeedMaker::m_R2MaxFast {2500.}
private

Definition at line 248 of file ITkSiSpacePointsSeedMaker.h.

◆ m_r2maxv

FloatProperty ITk::SiSpacePointsSeedMaker::m_r2maxv {this, "maxVRadius2", 200.}
private

Definition at line 188 of file ITkSiSpacePointsSeedMaker.h.

◆ m_r2minv

FloatProperty ITk::SiSpacePointsSeedMaker::m_r2minv {this, "minVRadius2", 70.}
private

Definition at line 187 of file ITkSiSpacePointsSeedMaker.h.

◆ m_r_rmax

FloatProperty ITk::SiSpacePointsSeedMaker::m_r_rmax {this, "radMax", 1100.}
private

Definition at line 228 of file ITkSiSpacePointsSeedMaker.h.

◆ m_r_rmin

FloatProperty ITk::SiSpacePointsSeedMaker::m_r_rmin {this, "radMin", 0.}
private

Definition at line 193 of file ITkSiSpacePointsSeedMaker.h.

◆ m_rmaxPPP

float ITk::SiSpacePointsSeedMaker::m_rmaxPPP {140.}
private

Definition at line 249 of file ITkSiSpacePointsSeedMaker.h.

◆ m_rmaxSSS

FloatProperty ITk::SiSpacePointsSeedMaker::m_rmaxSSS {this, "radMaxSSS", 1000.}
private

Definition at line 211 of file ITkSiSpacePointsSeedMaker.h.

◆ m_rminSSS

FloatProperty ITk::SiSpacePointsSeedMaker::m_rminSSS {this, "radMinSSS", 400.}
private

Definition at line 210 of file ITkSiSpacePointsSeedMaker.h.

◆ m_seedScoreBonusConfirmationSeed

FloatProperty ITk::SiSpacePointsSeedMaker::m_seedScoreBonusConfirmationSeed {this, "seedScoreBonusConfirmationSeed", -200.}
private

Definition at line 221 of file ITkSiSpacePointsSeedMaker.h.

◆ m_seedScoreBonusPPP

FloatProperty ITk::SiSpacePointsSeedMaker::m_seedScoreBonusPPP {this, "seedScoreBonusPPP", -200.}
private

Definition at line 207 of file ITkSiSpacePointsSeedMaker.h.

◆ m_seedScoreBonusSSS

FloatProperty ITk::SiSpacePointsSeedMaker::m_seedScoreBonusSSS {this, "seedScoreBonusSSS", -400.}
private

Definition at line 208 of file ITkSiSpacePointsSeedMaker.h.

◆ m_seedScoreThresholdPPPConfirmationSeed

float ITk::SiSpacePointsSeedMaker::m_seedScoreThresholdPPPConfirmationSeed {0.}
private

Seed score thresholds defined based on the modifiers defined as configurables above.

These allow to categorise the seeds based on their quality score. The modifiers above are much larger than the range of the raw unmodified scores would be, resulting in a grouping of the scores based on the modifiers applied. The thresholds are just below the value reachable without the additional modifier max (score is assigned negative sign) score for PPP seeds with confirmation seed requirement.

Definition at line 308 of file ITkSiSpacePointsSeedMaker.h.

◆ m_seedScoreThresholdSSSConfirmationSeed

float ITk::SiSpacePointsSeedMaker::m_seedScoreThresholdSSSConfirmationSeed {0.}
private

max (score is assigned negative sign) score for SSS seeds with confirmation seed requirement.

Definition at line 309 of file ITkSiSpacePointsSeedMaker.h.

◆ m_spacepointsOverlap

SG::ReadHandleKey<SpacePointOverlapCollection> ITk::SiSpacePointsSeedMaker::m_spacepointsOverlap {this, "SpacePointsOverlapName", "OverlapSpacePoints"}
private

Definition at line 169 of file ITkSiSpacePointsSeedMaker.h.

◆ m_spacepointsPixel

SG::ReadHandleKey<SpacePointContainer> ITk::SiSpacePointsSeedMaker::m_spacepointsPixel {this, "SpacePointsPixelName", "ITkPixelSpacePoints", "Pixel space points container"}
private

Definition at line 168 of file ITkSiSpacePointsSeedMaker.h.

◆ m_spacepointsStrip

SG::ReadHandleKey<SpacePointContainer> ITk::SiSpacePointsSeedMaker::m_spacepointsStrip {this, "SpacePointsStripName", "ITkStripSpacePoints", "Strip space points container"}
private

Definition at line 167 of file ITkSiSpacePointsSeedMaker.h.

◆ m_strip

BooleanProperty ITk::SiSpacePointsSeedMaker::m_strip {this, "useStrip", true}
private

Definition at line 179 of file ITkSiSpacePointsSeedMaker.h.

◆ m_thistSvc

ServiceHandle<ITHistSvc> ITk::SiSpacePointsSeedMaker::m_thistSvc
private

Flag to write validation ntuples. Turned off by default.

Definition at line 258 of file ITkSiSpacePointsSeedMaker.h.

◆ m_umax

FloatProperty ITk::SiSpacePointsSeedMaker::m_umax {this, "minSeedsQuality", 0.}
private

Definition at line 230 of file ITkSiSpacePointsSeedMaker.h.

◆ m_useOverlap

BooleanProperty ITk::SiSpacePointsSeedMaker::m_useOverlap {this, "useOverlapSpCollection", true}
private

Definition at line 180 of file ITkSiSpacePointsSeedMaker.h.

◆ m_useSeedConfirmation

BooleanProperty ITk::SiSpacePointsSeedMaker::m_useSeedConfirmation {this, "useSeedConfirmation", false}
private

Definition at line 222 of file ITkSiSpacePointsSeedMaker.h.

◆ m_writeNtuple

Gaudi::Property<bool> ITk::SiSpacePointsSeedMaker::m_writeNtuple {this, "WriteNtuple", false, "Flag to write Validation Ntuples"}
private

Definition at line 256 of file ITkSiSpacePointsSeedMaker.h.

◆ m_zmax

FloatProperty ITk::SiSpacePointsSeedMaker::m_zmax {this , "maxZ", +250.}
private

Definition at line 192 of file ITkSiSpacePointsSeedMaker.h.

◆ m_zmaxPPP

FloatProperty ITk::SiSpacePointsSeedMaker::m_zmaxPPP {this, "maxZPPP", 2700.}
private

Definition at line 215 of file ITkSiSpacePointsSeedMaker.h.

◆ m_zmaxSSS

FloatProperty ITk::SiSpacePointsSeedMaker::m_zmaxSSS {this, "maxZSSS", 2700.}
private

Definition at line 218 of file ITkSiSpacePointsSeedMaker.h.

◆ m_zmin

FloatProperty ITk::SiSpacePointsSeedMaker::m_zmin {this, "minZ", -250.}
private

Definition at line 191 of file ITkSiSpacePointsSeedMaker.h.


The documentation for this class was generated from the following files:
Trk::SpacePoint::clusterList
const std::pair< const PrepRawData *, const PrepRawData * > & clusterList() const
return the pair of cluster pointers by reference
Definition: Tracking/TrkEvent/TrkSpacePoint/TrkSpacePoint/SpacePoint.h:127
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
ITk::SiSpacePointsSeedMaker::dumpEvent
static MsgStream & dumpEvent(EventData &data, MsgStream &out)
Definition: ITkSiSpacePointsSeedMaker.cxx:743
ITk::SiSpacePointsSeedMaker::m_nBinsR
int m_nBinsR
number of bins in the radial coordinate
Definition: ITkSiSpacePointsSeedMaker.h:291
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
replace
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition: hcg.cxx:307
Trk::SpacePoint
Definition: Tracking/TrkEvent/TrkSpacePoint/TrkSpacePoint/SpacePoint.h:35
beamspotman.r
def r
Definition: beamspotman.py:676
Trk::Vertex
Definition: Tracking/TrkEvent/VxVertex/VxVertex/Vertex.h:26
ITk::SiSpacePointsSeedMaker::m_drminPPP
FloatProperty m_drminPPP
Definition: ITkSiSpacePointsSeedMaker.h:213
ITk::SiSpacePointsSeedMaker::m_zmaxSSS
FloatProperty m_zmaxSSS
Definition: ITkSiSpacePointsSeedMaker.h:218
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
ITk::SiSpacePointsSeedMaker::buildConnectionMaps
static void buildConnectionMaps(std::array< int, arraySizePhiZ > &nNeighbourCellsBottom, std::array< int, arraySizePhiZ > &nNeighbourCellsTop, std::array< std::array< int, arraySizeNeighbourBins >, arraySizePhiZ > &neighbourCellsBottom, std::array< std::array< int, arraySizeNeighbourBins >, arraySizePhiZ > &neighbourCellsTop, int maxPhiBin, bool isSSS)
Definition: ITkSiSpacePointsSeedMaker.cxx:947
ReadCellNoiseFromCoolCompare.s1
s1
Definition: ReadCellNoiseFromCoolCompare.py:378
ITk::SiSpacePointsSeedMaker::m_r_rmin
FloatProperty m_r_rmin
Definition: ITkSiSpacePointsSeedMaker.h:193
python.tests.PyTestsLib.finalize
def finalize(self)
_info( "content of StoreGate..." ) self.sg.dump()
Definition: PyTestsLib.py:50
InDet::SiSpacePointsSeedMakerEventData::ToolType::ITk
@ ITk
ITk::SiSpacePointsSeedMaker.
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
ITk::SiSpacePointsSeedMaker::m_nNeighbourCellsBottomSSS
std::array< int, arraySizePhiZ > m_nNeighbourCellsBottomSSS
Definition: ITkSiSpacePointsSeedMaker.h:318
ReadCellNoiseFromCool.cell
cell
Definition: ReadCellNoiseFromCool.py:53
yt
#define yt
ITk::SiSpacePointsSeedMaker::m_neighbourCellsBottomSSS
std::array< std::array< int, arraySizeNeighbourBins >, arraySizePhiZ > m_neighbourCellsBottomSSS
Definition: ITkSiSpacePointsSeedMaker.h:320
ITk::SiSpacePointsSeedMaker::arraySizeZV
@ arraySizeZV
array size in z for vertexing
Definition: ITkSiSpacePointsSeedMaker.h:156
ITk::SiSpacePointsSeedMaker::m_dzmaxPPP
FloatProperty m_dzmaxPPP
Definition: ITkSiSpacePointsSeedMaker.h:199
ITk::SiSpacePointsSeedMaker::m_etamax
FloatProperty m_etamax
Definition: ITkSiSpacePointsSeedMaker.h:184
fitman.ax
ax
Definition: fitman.py:522
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
SG::ReadHandle::cptr
const_pointer_type cptr()
Dereference the pointer.
AtlasFieldCacheCondObj
Definition: AtlasFieldCacheCondObj.h:19
ITk::SiSpacePointsSeedMaker::m_maxScore
FloatProperty m_maxScore
Definition: ITkSiSpacePointsSeedMaker.h:201
Trk::SpacePoint::globalPosition
virtual const Amg::Vector3D & globalPosition() const override final
Interface method to get the global Position.
Definition: Tracking/TrkEvent/TrkSpacePoint/TrkSpacePoint/SpacePoint.h:146
ITk::SiSpacePointsSeedMaker::arraySizeZ
@ arraySizeZ
capacity of the 1D z arrays
Definition: ITkSiSpacePointsSeedMaker.h:152
WriteCellNoiseToCool.rb
rb
Definition: WriteCellNoiseToCool.py:229
ITk::SiSpacePointsSeedMaker::m_mutex
std::mutex m_mutex
Definition: ITkSiSpacePointsSeedMaker.h:260
egammaEnergyPositionAllSamples::e1
double e1(const xAOD::CaloCluster &cluster)
return the uncorrected cluster energy in 1st sampling
MagField::AtlasFieldCache::getFieldZR
void getFieldZR(const double *ATH_RESTRICT xyz, double *ATH_RESTRICT bxyz, double *ATH_RESTRICT deriv=nullptr)
get B field valaue on the z-r plane at given position works only inside the solenoid.
Definition: AtlasFieldCache.cxx:86
Trk::PRDtoTrackMap
Definition: PRDtoTrackMap.h:17
Amg::Vector2D
Eigen::Matrix< double, 2, 1 > Vector2D
Definition: GeoPrimitives.h:48
SG::ReadHandle< Trk::PRDtoTrackMap >
Monitored::Z
@ Z
Definition: HistogramFillerUtils.h:24
hist_file_dump.d
d
Definition: hist_file_dump.py:137
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
initialize
void initialize()
Definition: run_EoverP.cxx:894
ITk::SiSpacePointsSeedMaker::m_seedScoreBonusSSS
FloatProperty m_seedScoreBonusSSS
Definition: ITkSiSpacePointsSeedMaker.h:208
ITk::SiSpacePointsSeedMaker::m_r_rmax
FloatProperty m_r_rmax
Definition: ITkSiSpacePointsSeedMaker.h:228
ITk::SiSpacePointsSeedMaker::m_maxsizeSP
IntegerProperty m_maxsizeSP
Definition: ITkSiSpacePointsSeedMaker.h:182
CaloCondBlobAlgs_fillNoiseFromASCII.db
db
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:43
mergePhysValFiles.start
start
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:14
extractSporadic.c1
c1
Definition: extractSporadic.py:134
ITk::SiSpacePointsSeedMaker::m_alwaysKeepConfirmedStripSeeds
BooleanProperty m_alwaysKeepConfirmedStripSeeds
Definition: ITkSiSpacePointsSeedMaker.h:205
ITk::SiSpacePointsSeedMaker::sort
void sort(std::vector< InDet::FloatInt > &s, int start, int size) const
Definition: ITkSiSpacePointsSeedMaker.h:535
TRTCalib_cfilter.p1
p1
Definition: TRTCalib_cfilter.py:130
ITk::SiSpacePointsSeedMaker::m_spacepointsPixel
SG::ReadHandleKey< SpacePointContainer > m_spacepointsPixel
Definition: ITkSiSpacePointsSeedMaker.h:168
skel.it
it
Definition: skel.GENtoEVGEN.py:396
ITk::SiSpacePointsSeedMaker::m_prdToTrackMap
SG::ReadHandleKey< Trk::PRDtoTrackMap > m_prdToTrackMap
Definition: ITkSiSpacePointsSeedMaker.h:170
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:71
ITk::SiSpacePointsSeedMaker::m_nNeighbourCellsTopPPP
std::array< int, arraySizePhiZ > m_nNeighbourCellsTopPPP
number of neighbouring phi-z bins to consider when looking for "top SP" candidates for each phi-z bin
Definition: ITkSiSpacePointsSeedMaker.h:314
M_PI
#define M_PI
Definition: ActiveFraction.h:11
InDetDD::SolidStateDetectorElementBase::surface
Trk::Surface & surface()
Element Surface.
PlotCalibFromCool.ib
ib
Definition: PlotCalibFromCool.py:419
MCP::ScaleSmearParam::s0
@ s0
ITk::SiSpacePointsSeedMaker::newRegion
virtual void newRegion(const EventContext &ctx, EventData &data, const std::vector< IdentifierHash > &vPixel, const std::vector< IdentifierHash > &vStrip) const override
Definition: ITkSiSpacePointsSeedMaker.cxx:313
dq_defect_virtual_defect_validation.d1
d1
Definition: dq_defect_virtual_defect_validation.py:79
xAOD::eta1
setEt setPhi setE277 setWeta2 eta1
Definition: TrigEMCluster_v1.cxx:41
ITk::SiSpacePointsSeedMaker::m_dzdrmax0
float m_dzdrmax0
Definition: ITkSiSpacePointsSeedMaker.h:243
UploadAMITag.l
list l
Definition: UploadAMITag.larcaf.py:158
ITk::SiSpacePointsSeedMaker::m_zmaxPPP
FloatProperty m_zmaxPPP
Definition: ITkSiSpacePointsSeedMaker.h:215
ITk::SiSpacePointsSeedMaker::m_seedScoreBonusPPP
FloatProperty m_seedScoreBonusPPP
Definition: ITkSiSpacePointsSeedMaker.h:207
Phi
@ Phi
Definition: RPCdef.h:8
ReadCellNoiseFromCoolCompare.s4
s4
Definition: ReadCellNoiseFromCoolCompare.py:381
comCurvature
Definition: SiSpacePointsSeedMaker_ATLxk.h:523
python.TurnDataReader.dr
dr
Definition: TurnDataReader.py:112
ITk::SiSpacePointsSeedMaker::newOneSeedWithCurvaturesComparisonSeedConfirmation
void newOneSeedWithCurvaturesComparisonSeedConfirmation(EventData &data, SiSpacePointForSeed *&SPb, SiSpacePointForSeed *&SP0, float Zob) const
Definition: ITkSiSpacePointsSeedMaker.cxx:3213
ITk::SiSpacePointsSeedMaker::m_COF
float m_COF
Definition: ITkSiSpacePointsSeedMaker.h:246
ITk::SiSpacePointsSeedMaker::m_drmaxPPP
FloatProperty m_drmaxPPP
Definition: ITkSiSpacePointsSeedMaker.h:214
ITk::SiSpacePointsSeedMaker::m_inverseBinSizePhiPPP
float m_inverseBinSizePhiPPP
cache the inverse bin size in phi which we use - needed to evaluate phi bin locations
Definition: ITkSiSpacePointsSeedMaker.h:293
ITk::SiSpacePointsSeedMaker::m_rmaxSSS
FloatProperty m_rmaxSSS
Definition: ITkSiSpacePointsSeedMaker.h:211
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
ITk::SiSpacePointsSeedMaker::m_dzdrver
FloatProperty m_dzdrver
Definition: ITkSiSpacePointsSeedMaker.h:196
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
MCP::ScaleSmearParam::r2
@ r2
drawFromPickle.exp
exp
Definition: drawFromPickle.py:36
ITk::SiSpacePointsSeedMaker::m_fieldCondObjInputKey
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCondObjInputKey
Definition: ITkSiSpacePointsSeedMaker.h:172
ITk::SiSpacePointsSeedMaker::m_checketa
BooleanProperty m_checketa
Definition: ITkSiSpacePointsSeedMaker.h:235
x
#define x
ITk::SiSpacePointsSeedMaker::m_dImpactCutSlopeUnconfirmedSSS
FloatProperty m_dImpactCutSlopeUnconfirmedSSS
Definition: ITkSiSpacePointsSeedMaker.h:219
IDTrig_MC23a_preInclude.pTmin
pTmin
Definition: IDTrig_MC23a_preInclude.py:8
ITk::SiSpacePointsSeedMaker::arraySizeNeighbourBinsVertex
@ arraySizeNeighbourBinsVertex
Definition: ITkSiSpacePointsSeedMaker.h:158
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:77
ITk::SiSpacePointsSeedMaker::m_strip
BooleanProperty m_strip
Definition: ITkSiSpacePointsSeedMaker.h:179
ITk::SiSpacePointsSeedMaker::azimuthalStep
static float azimuthalStep(const float pTmin, const float maxd0, const float Rmin, const float Rmax)
Determine the expected azimuthal trajectory displacement in phi in presence of the magnetic field for...
Definition: ITkSiSpacePointsSeedMaker.cxx:1131
ITk::SiSpacePointsSeedMaker::m_rmaxPPP
float m_rmaxPPP
Definition: ITkSiSpacePointsSeedMaker.h:249
drawFromPickle.atan
atan
Definition: drawFromPickle.py:36
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
ITk::SiSpacePointsSeedMaker::m_dImpactCutSlopeUnconfirmedPPP
FloatProperty m_dImpactCutSlopeUnconfirmedPPP
Definition: ITkSiSpacePointsSeedMaker.h:220
ITk::SiSpacePointsSeedMaker::stripInform
static void stripInform(EventData &data, const Trk::SpacePoint *sp, float *r)
Definition: ITkSiSpacePointsSeedMaker.cxx:1363
Monitored::X
@ X
Definition: HistogramFillerUtils.h:24
PlotCalibFromCool.ie
ie
Definition: PlotCalibFromCool.py:420
xAOD::phi
setEt phi
Definition: TrigEMCluster_v1.cxx:29
ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE
std::string m_treeName ATLAS_THREAD_SAFE
Definition: ITkSiSpacePointsSeedMaker.h:261
InDetDD::SiLocalPosition
Definition: SiLocalPosition.h:31
m_type
TokenType m_type
the type
Definition: TProperty.cxx:44
ITk::SiSpacePointsSeedMaker::m_drmaxSSS
FloatProperty m_drmaxSSS
Definition: ITkSiSpacePointsSeedMaker.h:217
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
hotSpotInTAG.c0
c0
Definition: hotSpotInTAG.py:192
Execution.tb
tb
Definition: Execution.py:15
ITk::SiSpacePointsSeedMaker::findNext
void findNext(EventData &data) const
Definition: ITkSiSpacePointsSeedMaker.cxx:769
ITk::SiSpacePointsSeedMaker::m_maxOneSizePPP
IntegerProperty m_maxOneSizePPP
Definition: ITkSiSpacePointsSeedMaker.h:203
TRTCalib_cfilter.p2
p2
Definition: TRTCalib_cfilter.py:131
ITk::SiSpacePointsSeedMaker::pixInform
static void pixInform(const Trk::SpacePoint *sp, float *r)
Definition: ITkSiSpacePointsSeedMaker.cxx:1349
ITk::SiSpacePointsSeedMaker::m_zmin
FloatProperty m_zmin
Definition: ITkSiSpacePointsSeedMaker.h:191
ITk::SiSpacePointsSeedMaker::m_etamin
FloatProperty m_etamin
Definition: ITkSiSpacePointsSeedMaker.h:227
A
ITk::SiSpacePointsSeedMaker::m_seedScoreBonusConfirmationSeed
FloatProperty m_seedScoreBonusConfirmationSeed
Definition: ITkSiSpacePointsSeedMaker.h:221
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:210
ITk::SiSpacePointsSeedMaker::isUsed
bool isUsed(const Trk::SpacePoint *, const Trk::PRDtoTrackMap &prd_to_track_map) const
Definition: ITkSiSpacePointsSeedMaker.h:519
xt
#define xt
Generate_dsid_ranseed.seed
seed
Definition: Generate_dsid_ranseed.py:10
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
ITk::SiSpacePointsSeedMaker::m_maxOneSize
IntegerProperty m_maxOneSize
Definition: ITkSiSpacePointsSeedMaker.h:183
ITk::SiSpacePointsSeedMaker::arraySizePhiZV
@ arraySizePhiZV
array size in phi-Z 2D for the vertexing
Definition: ITkSiSpacePointsSeedMaker.h:157
P4Helpers::deltaEta
double deltaEta(const I4Momentum &p1, const I4Momentum &p2)
Computes efficiently .
Definition: P4Helpers.h:66
ITk::SiSpacePointsSeedMaker::m_dzMaxFast
float m_dzMaxFast
Definition: ITkSiSpacePointsSeedMaker.h:247
lumiFormat.i
int i
Definition: lumiFormat.py:85
z
#define z
ITk::SiSpacePointsSeedMaker::m_dzver
FloatProperty m_dzver
Definition: ITkSiSpacePointsSeedMaker.h:195
ITk::SiSpacePointsSeedMaker::newOneSeedWithCurvaturesComparisonPPP
void newOneSeedWithCurvaturesComparisonPPP(EventData &data, SiSpacePointForSeed *&SPb, SiSpacePointForSeed *&SP0, float Zob) const
Definition: ITkSiSpacePointsSeedMaker.cxx:3102
ITk::SiSpacePointsSeedMaker::newOneSeedQ
void newOneSeedQ(EventData &data, SiSpacePointForSeed *&, SiSpacePointForSeed *&, SiSpacePointForSeed *&, float, float) const
Definition: ITkSiSpacePointsSeedMaker.cxx:2604
beamspotman.n
n
Definition: beamspotman.py:731
ITk::SiSpacePointsSeedMaker::m_pixel
BooleanProperty m_pixel
Definition: ITkSiSpacePointsSeedMaker.h:178
endmsg
#define endmsg
Definition: AnalysisConfig_Ntuple.cxx:63
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
CaloNoise_fillDB.dt
dt
Definition: CaloNoise_fillDB.py:58
ITk::SiSpacePointsSeedMaker::newSpacePoint
SiSpacePointForSeed * newSpacePoint(EventData &data, const Trk::SpacePoint *const &sp) const
Create a SiSpacePointForSeed from the space point.
Definition: ITkSiSpacePointsSeedMaker.cxx:2860
ITk::SiSpacePointsSeedMaker::m_maxdImpactSSS
FloatProperty m_maxdImpactSSS
Definition: ITkSiSpacePointsSeedMaker.h:198
ITk::SiSpacePointsSeedMaker::m_rminSSS
FloatProperty m_rminSSS
Definition: ITkSiSpacePointsSeedMaker.h:210
ITk::SiSpacePointsSeedMaker::m_maxPhiBinPPP
int m_maxPhiBinPPP
number of bins in phi
Definition: ITkSiSpacePointsSeedMaker.h:292
zt
#define zt
ITk::SiSpacePointsSeedMaker::m_R2MaxFast
float m_R2MaxFast
Definition: ITkSiSpacePointsSeedMaker.h:248
python.getCurrentFolderTag.dn
dn
Definition: getCurrentFolderTag.py:64
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
ITk::SiSpacePointsSeedMaker::m_useSeedConfirmation
BooleanProperty m_useSeedConfirmation
Definition: ITkSiSpacePointsSeedMaker.h:222
TRT::Track::d0
@ d0
Definition: InnerDetector/InDetCalibEvent/TRT_CalibData/TRT_CalibData/TrackInfo.h:62
python.BunchSpacingUtils.rn
rn
Definition: BunchSpacingUtils.py:87
PixelAthClusterMonAlgCfg.zmax
zmax
Definition: PixelAthClusterMonAlgCfg.py:169
ITk::SiSpacePointsSeedMaker::m_ptmin
FloatProperty m_ptmin
Definition: ITkSiSpacePointsSeedMaker.h:229
ITk::SiSpacePointsSeedMaker::m_beamSpotKey
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
Definition: ITkSiSpacePointsSeedMaker.h:171
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
Preparation.mode
mode
Definition: Preparation.py:94
hist_file_dump.f
f
Definition: hist_file_dump.py:135
ITk::SiSpacePointsSeedMaker::m_isLRT
BooleanProperty m_isLRT
Definition: ITkSiSpacePointsSeedMaker.h:212
drawFromPickle.tan
tan
Definition: drawFromPickle.py:36
AnalysisUtils::Delta::R
double R(const INavigable4Momentum *p1, const double v_eta, const double v_phi)
Definition: AnalysisMisc.h:49
xAOD::eventNumber
eventNumber
Definition: EventInfo_v1.cxx:124
ITk::SiSpacePointsSeedMaker::erase
static void erase(EventData &data)
Definition: ITkSiSpacePointsSeedMaker.cxx:1410
ITk::SiSpacePointsSeedMaker::dumpConditions
MsgStream & dumpConditions(EventData &data, MsgStream &out) const
Definition: ITkSiSpacePointsSeedMaker.cxx:626
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
ITk::SiSpacePointsSeedMaker::production3SpSSS
void production3SpSSS(EventData &data, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &iter_bottomCands, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &iter_endBottomCands, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &iter_topCands, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &iter_endTopCands, const int numberBottomCells, const int numberTopCells, int &nseed) const
: Seed production from space points.
Definition: ITkSiSpacePointsSeedMaker.cxx:2058
TRT::Track::z0
@ z0
Definition: InnerDetector/InDetCalibEvent/TRT_CalibData/TRT_CalibData/TrackInfo.h:63
jobOption.theta
theta
Definition: jobOption.ParticleGun_fwd_sequence.py:13
ITk::SiSpacePointsSeedMaker::m_maxBinPhiVertex
int m_maxBinPhiVertex
Definition: ITkSiSpacePointsSeedMaker.h:296
ITk::SiSpacePointsSeedMaker::arraySizePhiV
@ arraySizePhiV
array size in phi for vertexing
Definition: ITkSiSpacePointsSeedMaker.h:155
ITk::SiSpacePointsSeedMaker::m_drminSeedConf
float m_drminSeedConf
Definition: ITkSiSpacePointsSeedMaker.h:251
ITk::SiSpacePointsSeedMaker::m_spacepointsStrip
SG::ReadHandleKey< SpacePointContainer > m_spacepointsStrip
Definition: ITkSiSpacePointsSeedMaker.h:167
Trk::PRDtoTrackMap::isUsed
bool isUsed(const PrepRawData &prd) const
does this PRD belong to at least one track?
MagField::AtlasFieldCache::solenoidOn
bool solenoidOn() const
status of the magnets
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
ITk::SiSpacePointsSeedMaker::m_thistSvc
ServiceHandle< ITHistSvc > m_thistSvc
Flag to write validation ntuples. Turned off by default.
Definition: ITkSiSpacePointsSeedMaker.h:258
ITk::SiSpacePointsSeedMaker::m_inverseBinSizePhiSSS
float m_inverseBinSizePhiSSS
Definition: ITkSiSpacePointsSeedMaker.h:295
ITk::SiSpacePointsSeedMaker::m_dzdrmin0
float m_dzdrmin0
Definition: ITkSiSpacePointsSeedMaker.h:242
ITk::SiSpacePointsSeedMaker::m_writeNtuple
Gaudi::Property< bool > m_writeNtuple
Definition: ITkSiSpacePointsSeedMaker.h:256
ITk::SiSpacePointsSeedMaker::m_maxOneSizeSSS
IntegerProperty m_maxOneSizeSSS
Definition: ITkSiSpacePointsSeedMaker.h:202
Trk::PrepRawData
Definition: PrepRawData.h:62
Monitored::Y
@ Y
Definition: HistogramFillerUtils.h:24
ITk::SiSpacePointsSeedMaker::m_maxPhiBinSSS
int m_maxPhiBinSSS
Definition: ITkSiSpacePointsSeedMaker.h:294
ITk::SiSpacePointsSeedMaker::m_maxdImpact
FloatProperty m_maxdImpact
Definition: ITkSiSpacePointsSeedMaker.h:197
InDet::FloatInt
Definition: SiSpacePointsSeedMakerEventData.h:33
ITk::SiSpacePointsSeedMaker::m_spacepointsOverlap
SG::ReadHandleKey< SpacePointOverlapCollection > m_spacepointsOverlap
Definition: ITkSiSpacePointsSeedMaker.h:169
GlobalVariables.Qmin
Qmin
Definition: GlobalVariables.py:192
ITk::SiSpacePointsSeedMaker::m_binSizeR
FloatProperty m_binSizeR
Definition: ITkSiSpacePointsSeedMaker.h:194
ITk::SiSpacePointsSeedMaker::buildConnectionMapsVertex
static void buildConnectionMapsVertex(std::array< int, arraySizePhiZV > &nNeighbourCells, std::array< std::array< int, arraySizeNeighbourBinsVertex >, arraySizePhiZV > &neighbourCells, int maxPhiBin)
Build maps for radius-azimuthal-Z sorted collections for Z Similar logic to the above,...
Definition: ITkSiSpacePointsSeedMaker.cxx:1088
ReadCellNoiseFromCoolCompare.s3
s3
Definition: ReadCellNoiseFromCoolCompare.py:380
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
xAOD::phiBin
setSAddress setEtaMS setDirPhiMS setDirZMS setBarrelRadius setEndcapAlpha setEndcapRadius setPhiMap phiBin
Definition: L2StandAloneMuon_v2.cxx:144
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
ITk::SiSpacePointsSeedMaker::arraySizePhi
@ arraySizePhi
capacity of the 1D phi arrays
Definition: ITkSiSpacePointsSeedMaker.h:151
ITk::SiSpacePointsSeedMaker::m_ipt
float m_ipt
Definition: ITkSiSpacePointsSeedMaker.h:244
ITk::SiSpacePointsSeedMaker::m_umax
FloatProperty m_umax
Definition: ITkSiSpacePointsSeedMaker.h:230
ITk::SiSpacePointsSeedMaker::m_nNeighboursVertexPhiZ
std::array< int, arraySizePhiZV > m_nNeighboursVertexPhiZ
Definition: ITkSiSpacePointsSeedMaker.h:323
ITk::SiSpacePointsSeedMaker::m_inverseBinSizePhiVertex
float m_inverseBinSizePhiVertex
Definition: ITkSiSpacePointsSeedMaker.h:297
ITk::SiSpacePointsSeedMaker::m_drminSSS
FloatProperty m_drminSSS
Definition: ITkSiSpacePointsSeedMaker.h:216
ITk::SiSpacePointsSeedMaker::m_drmin
FloatProperty m_drmin
Definition: ITkSiSpacePointsSeedMaker.h:189
ITk::SiSpacePointsSeedMaker::m_nNeighbourCellsBottomPPP
std::array< int, arraySizePhiZ > m_nNeighbourCellsBottomPPP
arrays associating bins to each other for SP formation
Definition: ITkSiSpacePointsSeedMaker.h:313
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
ITk::SiSpacePointsSeedMaker::convertToBeamFrameWork
static void convertToBeamFrameWork(EventData &data, const Trk::SpacePoint *const &, float *)
Definition: ITkSiSpacePointsSeedMaker.cxx:1192
SG::CondHandleKey::initialize
StatusCode initialize(bool used=true)
dqt_zlumi_alleff_HIST.B
B
Definition: dqt_zlumi_alleff_HIST.py:110
ITk::SiSpacePointsSeedMaker::m_neighbourCellsTopPPP
std::array< std::array< int, arraySizeNeighbourBins >, arraySizePhiZ > m_neighbourCellsTopPPP
mapping of neighbour cells in the 2D phi-z binning to consider for the "top SP" search for central SP...
Definition: ITkSiSpacePointsSeedMaker.h:316
ITk::SiSpacePointsSeedMaker::m_zmax
FloatProperty m_zmax
Definition: ITkSiSpacePointsSeedMaker.h:192
ITk::SiSpacePointsSeedMaker::m_neighbourCellsTopSSS
std::array< std::array< int, arraySizeNeighbourBins >, arraySizePhiZ > m_neighbourCellsTopSSS
Definition: ITkSiSpacePointsSeedMaker.h:321
validateBDTTau.vt
vt
Definition: validateBDTTau.py:43
ITk::SiSpacePointsSeedMaker::m_nNeighbourCellsTopSSS
std::array< int, arraySizePhiZ > m_nNeighbourCellsTopSSS
Definition: ITkSiSpacePointsSeedMaker.h:319
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
DataModelTestDataCommonDict::xb
DMTest::CView::Pers_t xb
Definition: DataModelTestDataCommonDict.h:55
ITk::SiSpacePointsSeedMaker::m_seedScoreThresholdSSSConfirmationSeed
float m_seedScoreThresholdSSSConfirmationSeed
max (score is assigned negative sign) score for SSS seeds with confirmation seed requirement.
Definition: ITkSiSpacePointsSeedMaker.h:309
ir
int ir
counter of the current depth
Definition: fastadd.cxx:49
python.PyAthena.v
v
Definition: PyAthena.py:154
makeTRTBarrelCans.dy
tuple dy
Definition: makeTRTBarrelCans.py:21
ITk::SiSpacePointsSeedMaker::m_maxsize
IntegerProperty m_maxsize
Definition: ITkSiSpacePointsSeedMaker.h:181
ITk::SiSpacePointsSeedMaker::production3SpTrigger
void production3SpTrigger(EventData &, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &, const int, const int, int &) const
as above, but for the trigger
Definition: ITkSiSpacePointsSeedMaker.cxx:2541
a
TList * a
Definition: liststreamerinfos.cxx:10
y
#define y
std::sort
void sort(typename std::reverse_iterator< DataModel_detail::iterator< DVL > > beg, typename std::reverse_iterator< DataModel_detail::iterator< DVL > > end, const Compare &comp)
Specialization of sort for DataVector/List.
Definition: DVL_algorithms.h:623
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
ITk::SiSpacePointsSeedMaker::production3SpPPP
void production3SpPPP(EventData &data, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &iter_bottomCands, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &iter_endBottomCands, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &iter_topCands, std::array< std::vector< SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &iter_endTopCands, const int numberBottomCells, const int numberTopCells, int &nseed) const
Definition: ITkSiSpacePointsSeedMaker.cxx:1624
ITk::SiSpacePointsSeedMaker::m_neighboursVertexPhiZ
std::array< std::array< int, arraySizeNeighbourBinsVertex >, arraySizePhiZV > m_neighboursVertexPhiZ
Definition: ITkSiSpacePointsSeedMaker.h:324
ITk::SiSpacePointsSeedMaker::newOneSeed
void newOneSeed(EventData &data, SiSpacePointForSeed *&, SiSpacePointForSeed *&, SiSpacePointForSeed *&, float, float) const
Definition: ITkSiSpacePointsSeedMaker.cxx:2555
ITk::SiSpacePointsSeedMaker::m_seedScoreThresholdPPPConfirmationSeed
float m_seedScoreThresholdPPPConfirmationSeed
Seed score thresholds defined based on the modifiers defined as configurables above.
Definition: ITkSiSpacePointsSeedMaker.h:308
SpacePointCollection
Definition: SpacePointCollection.h:40
DEBUG
#define DEBUG
Definition: page_access.h:11
ReadCellNoiseFromCoolCompare.s2
s2
Definition: ReadCellNoiseFromCoolCompare.py:379
makeTRTBarrelCans.dx
tuple dx
Definition: makeTRTBarrelCans.py:20
MagField::AtlasFieldCache
Local cache for magnetic field (based on MagFieldServices/AtlasFieldSvcTLS.h)
Definition: AtlasFieldCache.h:43
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
if
if(febId1==febId2)
Definition: LArRodBlockPhysicsV0.cxx:567
ITk::SiSpacePointsSeedMaker::m_outputlevel
int m_outputlevel
Definition: ITkSiSpacePointsSeedMaker.h:240
ITk::SiSpacePointsSeedMaker::fillSeeds
static void fillSeeds(EventData &data)
Definition: ITkSiSpacePointsSeedMaker.cxx:2744
ITk::SiSpacePointsSeedMaker::production3Sp
void production3Sp(EventData &data) const
Definition: ITkSiSpacePointsSeedMaker.cxx:1454
Rmin
double Rmin
Definition: LArDetectorConstructionTBEC.cxx:56
ITk::SiSpacePointsSeedMaker::isConfirmedSeed
bool isConfirmedSeed(const SiSpacePointForSeed *bottomSP, const SiSpacePointForSeed *topSP, float quality) const
Helper method to determine if a seed is 'confirmed' - this means that a second seed exists with compa...
Definition: ITkSiSpacePointsSeedMaker.cxx:3351
ITk::SiSpacePointsSeedMaker::newVertices
bool newVertices(EventData &data, const std::list< Trk::Vertex > &) const
Definition: ITkSiSpacePointsSeedMaker.cxx:787
ITk::SiSpacePointsSeedMaker::m_neighbourCellsBottomPPP
std::array< std::array< int, arraySizeNeighbourBins >, arraySizePhiZ > m_neighbourCellsBottomPPP
mapping of neighbour cells in the 2D phi-z binning to consider for the "bottom SP" search for central...
Definition: ITkSiSpacePointsSeedMaker.h:315
ITk::SiSpacePointsSeedMaker::m_ipt2
float m_ipt2
Definition: ITkSiSpacePointsSeedMaker.h:245
ITk::SiSpacePointsSeedMaker::buildFrameWork
void buildFrameWork()
Definition: ITkSiSpacePointsSeedMaker.cxx:829
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
ITk::SiSpacePointsSeedMaker::m_dzmaxSSS
float m_dzmaxSSS
Definition: ITkSiSpacePointsSeedMaker.h:250
egammaEnergyPositionAllSamples::e0
double e0(const xAOD::CaloCluster &cluster)
return the uncorrected cluster energy in pre-sampler
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
ITk::SiSpacePointsSeedMaker::m_alwaysKeepConfirmedPixelSeeds
BooleanProperty m_alwaysKeepConfirmedPixelSeeds
Definition: ITkSiSpacePointsSeedMaker.h:204
ITk::SiSpacePointsSeedMaker::m_useOverlap
BooleanProperty m_useOverlap
Definition: ITkSiSpacePointsSeedMaker.h:180
IdentifierHash
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
Definition: IdentifierHash.h:25
python.IoTestsLib.w
def w
Definition: IoTestsLib.py:200
TRTCalib_cfilter.p3
p3
Definition: TRTCalib_cfilter.py:132
FlavorTagDiscriminants::OnnxModelVersion::V0
@ V0
Trk::Surface
Definition: Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/Surface.h:75
ITk::SiSpacePointsSeedMaker::m_outputTree
TTree * m_outputTree
Definition: ITkSiSpacePointsSeedMaker.h:259
ITk::SiSpacePointsSeedMaker::initializeEventData
void initializeEventData(EventData &data, const EventContext &ctx) const
Definition: ITkSiSpacePointsSeedMaker.cxx:2947
ITk::SiSpacePointsSeedMaker::m_optimisePhiBinning
BooleanProperty m_optimisePhiBinning
Definition: ITkSiSpacePointsSeedMaker.h:209
ITk::SiSpacePointsSeedMaker::m_fastTracking
BooleanProperty m_fastTracking
Definition: ITkSiSpacePointsSeedMaker.h:206
ITk::SiSpacePointsSeedMaker::fillLists
void fillLists(EventData &data) const
Definition: ITkSiSpacePointsSeedMaker.cxx:1203
Trk::Surface::transform
const Amg::Transform3D & transform() const
Returns HepGeom::Transform3D by reference.
dq_make_web_display.cl
cl
print [x.__class__ for x in toList(dqregion.getSubRegions()) ]
Definition: dq_make_web_display.py:26
ITk::SiSpacePointsSeedMaker::arraySizePhiZ
@ arraySizePhiZ
capacity for the 2D phi-z arrays
Definition: ITkSiSpacePointsSeedMaker.h:153
TileDCSDataPlotter.tx
tx
Definition: TileDCSDataPlotter.py:878
ITk::SiSpacePointsSeedMaker::buildBeamFrameWork
void buildBeamFrameWork(EventData &data) const
Definition: ITkSiSpacePointsSeedMaker.cxx:1158
python.AutoConfigFlags.msg
msg
Definition: AutoConfigFlags.py:7
readCCLHist.float
float
Definition: readCCLHist.py:83
InDet::SiCluster
Definition: InnerDetector/InDetRecEvent/InDetPrepRawData/InDetPrepRawData/SiCluster.h:40
PUfitVar::nPhiBins
constexpr std::size_t nPhiBins
Definition: GepMETPufitAlg.cxx:20
ITk::SiSpacePointsSeedMaker::newOneSeedWithCurvaturesComparisonSSS
void newOneSeedWithCurvaturesComparisonSSS(EventData &data, SiSpacePointForSeed *&SPb, SiSpacePointForSeed *&SP0, float Zob) const
This creates all possible seeds with the passed central and bottom SP, using all top SP candidates wh...
Definition: ITkSiSpacePointsSeedMaker.cxx:3015
fitman.k
k
Definition: fitman.py:528
ITk::SiSpacePointsSeedMaker::arraySizeNeighbourBins
@ arraySizeNeighbourBins
array size to store neighbouring phi-z-regions in the seed finding
Definition: ITkSiSpacePointsSeedMaker.h:154
ITk::SiSpacePointsSeedMaker::dump
virtual MsgStream & dump(EventData &data, MsgStream &out) const override
Definition: ITkSiSpacePointsSeedMaker.cxx:615
fitman.ay
ay
Definition: fitman.py:525