ATLAS Offline Software
Loading...
Searching...
No Matches
ITk::SiSpacePointsSeedMaker Class Referencefinal

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

#include <ITkSiSpacePointsSeedMaker.h>

Inheritance 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
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
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
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
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 {2025}
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.
TTree * m_outputTree
std::mutex m_mutex
std::string m_treeName
std::string m_treeFolder
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
int m_maxPhiBinPPP {0}
 number of bins in phi
float m_inverseBinSizePhiPPP {0}
 cache the inverse bin size in phi which we use - needed to evaluate phi bin locations
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.
float m_seedScoreThresholdSSSConfirmationSeed {0.}
 max (score is assigned negative sign) score for SSS seeds with confirmation seed requirement.
std::array< int, arraySizePhiZm_nNeighbourCellsBottomPPP {}
 arrays associating bins to each other for SP formation
std::array< int, arraySizePhiZm_nNeighbourCellsTopPPP {}
 number of neighbouring phi-z bins to consider when looking for "top SP" candidates for each phi-z bin
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
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
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.
SiSpacePointForSeednewSpacePoint (EventData &data, const Trk::SpacePoint *const &sp, std::span< float, 15 > 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.
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
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.
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.
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!
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.
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 *, 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.

151 {arraySizePhi=200,
152 arraySizeZ=11,
155 arraySizePhiV=100,
156 arraySizeZV=3,
@ arraySizeZ
capacity of the 1D 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
@ arraySizePhi
capacity of the 1D phi arrays
@ arraySizePhiZ
capacity for the 2D phi-z arrays

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}
ServiceHandle< ITHistSvc > m_thistSvc
Flag to write validation ntuples. Turned off by default.

◆ ~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{
1160 SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle{m_beamSpotKey};
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}
Scalar phi() const
phi method
Scalar theta() const
theta method
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
Eigen::Matrix< double, 3, 1 > Vector3D

◆ 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
1063 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}
#define z
setSAddress setEtaMS setDirPhiMS setDirZMS setBarrelRadius setEndcapAlpha setEndcapRadius setPhiMap phiBin

◆ 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)
844 m_dzdrmax0 = 1. / std::tan(2. * std::atan(std::exp(-m_etamax)));
845 m_dzdrmin0 = 1. / std::tan(2. * std::atan(std::exp(-m_etamin)));
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
867
869 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}
#define M_PI
float m_seedScoreThresholdSSSConfirmationSeed
max (score is assigned negative sign) score for SSS seeds with confirmation seed requirement.
std::array< std::array< int, arraySizeNeighbourBins >, arraySizePhiZ > m_neighbourCellsBottomSSS
std::array< int, arraySizePhiZ > m_nNeighbourCellsTopSSS
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,...
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...
std::array< int, arraySizePhiZ > m_nNeighbourCellsBottomSSS
float m_inverseBinSizePhiPPP
cache the inverse bin size in phi which we use - needed to evaluate phi bin locations
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...
int m_maxPhiBinPPP
number of bins in phi
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
std::array< std::array< int, arraySizeNeighbourBinsVertex >, arraySizePhiZV > m_neighboursVertexPhiZ
float m_seedScoreThresholdPPPConfirmationSeed
Seed score thresholds defined based on the modifiers defined as configurables above.
std::array< int, arraySizePhiZ > m_nNeighbourCellsBottomPPP
arrays associating bins to each other for SP formation
std::array< std::array< int, arraySizeNeighbourBins >, arraySizePhiZ > m_neighbourCellsTopSSS
std::array< int, arraySizePhiZV > m_nNeighboursVertexPhiZ
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...
int m_nBinsR
number of bins in the radial coordinate
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)

◆ convertToBeamFrameWork()

void ITk::SiSpacePointsSeedMaker::convertToBeamFrameWork ( EventData & data,
const Trk::SpacePoint * ,
float *  )
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}
static Double_t sp
#define y
#define x
int r
Definition globals.cxx:22

◆ 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}
static MsgStream & dumpEvent(EventData &data, MsgStream &out)
MsgStream & dumpConditions(EventData &data, MsgStream &out) const

◆ 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}
#define endmsg
SG::ReadHandleKey< SpacePointContainer > m_spacepointsPixel
SG::ReadHandleKey< SpacePointOverlapCollection > m_spacepointsOverlap
SG::ReadHandleKey< SpacePointContainer > m_spacepointsStrip

◆ 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
1223
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}
@ Phi
Definition RPCdef.h:8
constexpr std::size_t nPhiBins
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.

◆ 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 2749 of file ITkSiSpacePointsSeedMaker.cxx.

2750{
2751 data.fillOneSeeds = 0;
2752
2753 std::multimap<float, SiSpacePointsProSeed *>::iterator it_seedCandidate = data.ITkMapOneSeeds.begin();
2754 std::multimap<float, SiSpacePointsProSeed *>::iterator it_endSeedCandidates = data.ITkMapOneSeeds.end();
2755
2756 if (data.nOneSeedsQ){
2757 it_seedCandidate = data.ITkMapOneSeedsQ.begin();
2758 it_endSeedCandidates = data.ITkMapOneSeedsQ.end();
2759 }
2760
2762 if (it_seedCandidate == it_endSeedCandidates)
2763 return;
2764
2765 SiSpacePointsProSeed *theSeed{nullptr};
2766
2768 for (; it_seedCandidate != it_endSeedCandidates; ++it_seedCandidate)
2769 {
2770
2772 float quality = (*it_seedCandidate).first;
2773 theSeed = (*it_seedCandidate).second;
2774
2776 if (!theSeed->setQuality(quality))
2777 continue;
2778
2780 if (data.i_ITkSeedEnd != data.i_ITkSeeds.end())
2781 {
2782 theSeed = &(*data.i_ITkSeedEnd++);
2783 *theSeed = *(*it_seedCandidate).second;
2784 }
2785 else
2786 {
2788 data.i_ITkSeeds.emplace_back(*(*it_seedCandidate).second);
2789 //unused value, keep in comment to avoid repeating in future
2790 //theSeed = &(data.i_ITkSeeds.back());
2791 data.i_ITkSeedEnd = data.i_ITkSeeds.end();
2792 }
2793
2794 ++data.fillOneSeeds;
2795 }
2796}

◆ 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}
#define ATH_MSG_WARNING(x)

◆ 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)
467 initializeEventData(data, ctx);
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;
496 production3Sp(data);
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}
void fillLists(EventData &data) const
virtual MsgStream & dump(EventData &data, MsgStream &out) const override
bool newVertices(EventData &data, const std::list< Trk::Vertex > &) const
void production3Sp(EventData &data) const
void initializeEventData(EventData &data, const EventContext &ctx) const
MsgStream & msg
Definition testRead.cxx:32

◆ 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)
518 initializeEventData(data, ctx);
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;
553 production3Sp(data);
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)
777 production3Sp(data);
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)
576 initializeEventData(data, ctx);
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;
600 production3Sp(data);
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 3420 of file ITkSiSpacePointsSeedMaker.cxx.

3421{
3422 return m_writeNtuple;
3423}

◆ initialize()

StatusCode ITk::SiSpacePointsSeedMaker::initialize ( )
overridevirtual

Definition at line 55 of file ITkSiSpacePointsSeedMaker.cxx.

56{
57 StatusCode sc = AlgTool::initialize();
58
62
63 // Get beam geometry
64 //
65 ATH_CHECK(m_beamSpotKey.initialize());
66
68
69 // PRD-to-track association (optional)
70 ATH_CHECK(m_prdToTrackMap.initialize(!m_prdToTrackMap.key().empty()));
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 //coverity[MISSING_LOCK]
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 std::string fullTreeName = m_treeFolder + m_treeName;
117
118 ATH_CHECK( m_thistSvc->regTree( fullTreeName, m_outputTree ) );
119
120 }
121
122
123 return sc;
124}
#define ATH_CHECK
Evaluate an expression and check for errors.
static Double_t sc
SG::ReadHandleKey< Trk::PRDtoTrackMap > m_prdToTrackMap
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCondObjInputKey
::StatusCode StatusCode
StatusCode definition for legacy code.

◆ 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 2954 of file ITkSiSpacePointsSeedMaker.cxx.

2955{
2956 int seedArrayPerSPSize = (m_maxOneSizePPP > m_maxOneSizeSSS ? m_maxOneSizePPP : m_maxOneSizeSSS);
2958 seedArrayPerSPSize = 50;
2959 data.initialize(EventData::ToolType::ITk,
2961 seedArrayPerSPSize,
2962 0,
2963 m_nBinsR,
2964 0,
2967 m_checketa);
2968
2969 buildBeamFrameWork(data);
2970
2972 double magField[3]{0, 0, 0};
2973 double globalPos[3] = {10., 10., 0.};
2974
2975 MagField::AtlasFieldCache fieldCache;
2976 SG::ReadCondHandle<AtlasFieldCacheCondObj> readHandle{m_fieldCondObjInputKey, ctx};
2977 const AtlasFieldCacheCondObj *fieldCondObj{*readHandle};
2978 if (fieldCondObj == nullptr) {
2979 ATH_MSG_ERROR("ITk::SiSpacePointsSeedMaker: Failed to retrieve AtlasFieldCacheCondObj with key " << m_fieldCondObjInputKey.key());
2980 return;
2981 }
2982
2983 fieldCondObj->getInitializedCache(fieldCache);
2984
2985 if (fieldCache.solenoidOn()) {
2987 fieldCache.getFieldZR(globalPos, magField);
2998 data.K = 2. / (300. * magField[2]);
2999 } else {
3000 data.K = 2. / (300. * 5.);
3001 }
3002
3007 data.ipt2K = m_ipt2 / (data.K * data.K);
3009 data.ipt2C = m_ipt2 * m_COF;
3010 data.COFK = m_COF * (data.K * data.K);
3012 data.bField[0] = magField[0];
3013 data.bField[1] = magField[1];
3014 data.bField[2] = magField[2];
3015
3016}
#define ATH_MSG_ERROR(x)
void getInitializedCache(MagField::AtlasFieldCache &cache) const
get B field cache for evaluation as a function of 2-d or 3-d position.
void buildBeamFrameWork(EventData &data) const
bool solenoidOn() const
status of the magnets
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.

◆ 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 3358 of file ITkSiSpacePointsSeedMaker.cxx.

3360{
3361
3363 if (bottomSP->spacepoint->clusterList().second)
3364 {
3365 return (quality < m_seedScoreThresholdSSSConfirmationSeed);
3366 }
3368 else if (!topSP->spacepoint->clusterList().second)
3369 {
3370 return (quality < m_seedScoreThresholdPPPConfirmationSeed);
3371 }
3373 else
3374 return (quality < 0.);
3375}

◆ 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 }
bool isUsed(const PrepRawData &prd) const
does this PRD belong to at least one track?

◆ isZCompatible()

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

Definition at line 2843 of file ITkSiSpacePointsSeedMaker.cxx.

2845{
2846 if (Zv < data.zminU || Zv > data.zmaxU)
2847 return false;
2848 if (!data.isvertex)
2849 return true;
2850
2851 float dZmin = std::numeric_limits<float>::max();
2852 for (const float &v : data.l_vertex)
2853 {
2854 float dZ = std::abs(v - Zv);
2855 if (dZ >= dZmin)
2856 break;
2857 dZmin = dZ;
2858 }
2859 return dZmin < (m_dzver + m_dzdrver * R) * sqrt(1. + T * T);
2860}
double R(const INavigable4Momentum *p1, const double v_eta, const double v_phi)

◆ 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)
146 initializeEventData(data, ctx);
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
189 SG::ReadHandle<SpacePointContainer> spacepointsStrip{m_spacepointsStrip, ctx};
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) {
220 SG::ReadHandle<SpacePointOverlapCollection> spacepointsOverlap{m_spacepointsOverlap, ctx};
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
267 SG::ReadHandle<SpacePointContainer> spacepointsPixel{m_spacepointsPixel, ctx};
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}
SiSpacePointForSeed * newSpacePoint(EventData &data, const Trk::SpacePoint *const &sp) const
Create a SiSpacePointForSeed from the space point.
bool isUsed(const Trk::SpacePoint *, const Trk::PRDtoTrackMap &prd_to_track_map) const
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.

◆ 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 2560 of file ITkSiSpacePointsSeedMaker.cxx.

2563{
2565 float worstQualityInMap = std::numeric_limits<float>::min();
2566 SiSpacePointsProSeed *worstSeedSoFar = nullptr;
2567 if (!data.ITkMapOneSeeds.empty())
2568 {
2569 std::multimap<float, SiSpacePointsProSeed *>::reverse_iterator l = data.ITkMapOneSeeds.rbegin();
2570 worstQualityInMap = (*l).first;
2571 worstSeedSoFar = (*l).second;
2572 }
2575 if (data.nOneSeeds < data.maxSeedsPerSP
2578 || (m_useSeedConfirmation && data.keepAllConfirmedSeeds && worstQualityInMap <= seedCandidateQuality && isConfirmedSeed(p1, p3, seedCandidateQuality) && data.nOneSeeds < data.seedPerSpCapacity)
2581 || (m_useSeedConfirmation && data.keepAllConfirmedSeeds && worstQualityInMap > seedCandidateQuality && isConfirmedSeed(worstSeedSoFar->spacepoint0(), worstSeedSoFar->spacepoint2(), worstQualityInMap) && data.nOneSeeds < data.seedPerSpCapacity))
2582 {
2583 data.ITkOneSeeds[data.nOneSeeds].set(p1, p2, p3, z);
2584 data.ITkMapOneSeeds.insert(std::make_pair(seedCandidateQuality, &data.ITkOneSeeds[data.nOneSeeds]));
2585 ++data.nOneSeeds;
2586 }
2587
2589 else if (worstQualityInMap > seedCandidateQuality)
2590 {
2592 worstSeedSoFar->set(p1, p2, p3, z);
2594 std::multimap<float, SiSpacePointsProSeed *>::iterator
2595 i = data.ITkMapOneSeeds.insert(std::make_pair(seedCandidateQuality, worstSeedSoFar));
2597 for (++i; i != data.ITkMapOneSeeds.end(); ++i)
2598 {
2599 if ((*i).second == worstSeedSoFar)
2600 {
2601 data.ITkMapOneSeeds.erase(i);
2602 return;
2603 }
2604 }
2605 }
2606}
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...
l
Printing final latex table to .tex output file.

◆ 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 2609 of file ITkSiSpacePointsSeedMaker.cxx.

2612{
2614 float worstQualityInMap = std::numeric_limits<float>::min();
2615 SiSpacePointsProSeed *worstSeedSoFar = nullptr;
2616 if (!data.ITkMapOneSeedsQ.empty())
2617 {
2618 std::multimap<float, SiSpacePointsProSeed *>::reverse_iterator l = data.ITkMapOneSeedsQ.rbegin();
2619 worstQualityInMap = (*l).first;
2620 worstSeedSoFar = (*l).second;
2621 }
2624 if (data.nOneSeedsQ < data.maxSeedsPerSP
2627 || (m_useSeedConfirmation && data.keepAllConfirmedSeeds && worstQualityInMap <= seedCandidateQuality && isConfirmedSeed(p1, p3, seedCandidateQuality) && data.nOneSeedsQ < data.seedPerSpCapacity)
2630 || (m_useSeedConfirmation && data.keepAllConfirmedSeeds && worstQualityInMap > seedCandidateQuality && isConfirmedSeed(worstSeedSoFar->spacepoint0(), worstSeedSoFar->spacepoint2(), worstQualityInMap) && data.nOneSeedsQ < data.seedPerSpCapacity))
2631 {
2632 data.ITkOneSeedsQ[data.nOneSeedsQ].set(p1, p2, p3, z);
2633 data.ITkMapOneSeedsQ.insert(std::make_pair(seedCandidateQuality, &data.ITkOneSeedsQ[data.nOneSeedsQ]));
2634 ++data.nOneSeedsQ;
2635 }
2636
2638 else if (worstQualityInMap > seedCandidateQuality)
2639 {
2641 worstSeedSoFar->set(p1, p2, p3, z);
2643 std::multimap<float, SiSpacePointsProSeed *>::iterator
2644 i = data.ITkMapOneSeedsQ.insert(std::make_pair(seedCandidateQuality, worstSeedSoFar));
2646 for (++i; i != data.ITkMapOneSeedsQ.end(); ++i)
2647 {
2648 if ((*i).second == worstSeedSoFar)
2649 {
2650 data.ITkMapOneSeedsQ.erase(i);
2651 return;
2652 }
2653 }
2654 }
2655}

◆ newOneSeedWithCurvaturesComparison()

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

Definition at line 2663 of file ITkSiSpacePointsSeedMaker.cxx.

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

◆ 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 3109 of file ITkSiSpacePointsSeedMaker.cxx.

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

◆ 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 3220 of file ITkSiSpacePointsSeedMaker.cxx.

3222{
3223 static const float curvatureInterval = .00003;
3224 bool bottomSPisPixel = !SPb->spacepoint->clusterList().second;
3225 float bottomSPQuality = SPb->quality();
3226 float centralSPQuality = SP0->quality();
3227
3229 if (data.ITkCmSp.size() > 2)
3230 std::sort(data.ITkCmSp.begin(), data.ITkCmSp.end(), comCurvature());
3231
3232 float bottomR = SPb->radius();
3233 float bottomZ = SPb->z();
3234
3235 std::vector<std::pair<float, SiSpacePointForSeed *>>::iterator it_otherSP;
3236 std::vector<std::pair<float, SiSpacePointForSeed *>>::iterator it_commonTopSP = data.ITkCmSp.begin(), ie = data.ITkCmSp.end();
3237 std::vector<std::pair<float, SiSpacePointForSeed *>>::iterator it_startInnerLoop = it_commonTopSP;
3238
3240 for (; it_commonTopSP != ie; ++it_commonTopSP)
3241 {
3242
3243 SiSpacePointForSeed *SPt = (*it_commonTopSP).second;
3245 float seedIP = SPt->param();
3246 float seedQuality = seedIP + SPt->scorePenalty();
3247 float originalSeedQuality = seedQuality;
3248
3249 if (m_maxdImpact > 50)
3250 { //This only applies to LRT
3251
3252 float topR = SPt->radius();
3253 float topZ = SPt->z();
3254
3255 float Zot = std::abs(topR - bottomR) > 10e-9 ? bottomZ - (bottomR - originalSeedQuality) * ((topZ - bottomZ) / (topR - bottomR)) : bottomZ;
3256
3257 float theta1 = std::abs(topR - bottomR) > 10e-9 ? std::atan2(topR - bottomR, topZ - bottomZ) : 0.;
3258 float eta1 = theta1 > 0 ? -std::log(std::tan(.5 * theta1)) : 0.;
3259
3260 float theta0 = seedIP > 0 ? std::atan2(seedIP, Zot) : 0;
3261 float eta0 = theta0 > 0 ? -std::log(std::tan(.5 * theta0)) : 0.;
3262
3263 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
3264 //calculate weighted average of d0 and deltaEta, normalized by their maximum values
3265 float f = std::min(0.5, originalSeedQuality / 200.); //0.5 and 200 are parameters chosen from a grid scan to optimize efficiency
3266 seedQuality *= (1 - f) / 300.;
3267 seedQuality += f * deltaEta / 2.5;
3268 }
3269
3270 bool topSPisPixel = !SPt->spacepoint->clusterList().second;
3271
3273 const Trk::Surface *surfaceTopSP = SPt->sur();
3274 float radiusTopSP = SPt->radius();
3276 float minCurvature = (*it_commonTopSP).first - curvatureInterval;
3277 float maxCurvature = (*it_commonTopSP).first + curvatureInterval;
3278
3285
3287 if (!bottomSPisPixel)
3288 seedQuality += m_seedScoreBonusSSS;
3290 else if (topSPisPixel)
3291 seedQuality += m_seedScoreBonusPPP;
3292
3298
3299 for (it_otherSP = it_startInnerLoop; it_otherSP != ie; ++it_otherSP)
3300 {
3302 if (it_otherSP == it_commonTopSP)
3303 continue;
3306 if ((*it_otherSP).first < minCurvature)
3307 {
3308 it_startInnerLoop = it_otherSP;
3309 ++it_startInnerLoop;
3310 continue;
3311 }
3313 if ((*it_otherSP).first > maxCurvature)
3314 break;
3316 if ((*it_otherSP).second->sur() == surfaceTopSP)
3317 continue;
3319 float radiusOtherSP = (*it_otherSP).second->radius();
3320 if (std::abs(radiusOtherSP - radiusTopSP) < m_drminSeedConf)
3321 continue;
3322 // if we have a confirmation seed, we improve the score of the seed.
3323 seedQuality += m_seedScoreBonusConfirmationSeed;
3324 // apply confirmation bonus only once
3325 break;
3326 }
3327
3329 if (seedQuality > data.maxScore)
3330 continue;
3331
3334 if (bottomSPisPixel != topSPisPixel)
3335 {
3336 if (seedQuality > 0. ||
3337 (seedQuality > bottomSPQuality && seedQuality > centralSPQuality && seedQuality > SPt->quality()))
3338 continue;
3339 }
3342 if (!isConfirmedSeed(SPb, SPt, seedQuality))
3343 {
3345 double maxdImpact = m_maxdImpact - (m_dImpactCutSlopeUnconfirmedPPP * SPt->scorePenalty());
3347 if (!bottomSPisPixel)
3348 maxdImpact = m_maxdImpactSSS - (m_dImpactCutSlopeUnconfirmedSSS * SPt->scorePenalty());
3349 if (seedIP > maxdImpact)
3350 continue;
3351 }
3353 newOneSeed(data, SPb, SP0, SPt, Zob, seedQuality);
3354 }
3355 data.ITkCmSp.clear();
3356}
double deltaEta(const I4Momentum &p1, const I4Momentum &p2)
Computes efficiently .
Definition P4Helpers.h:66
setEt setPhi setE277 setWeta2 eta1

◆ 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 3022 of file ITkSiSpacePointsSeedMaker.cxx.

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

◆ 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)
320 initializeEventData(data, ctx);
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
354 SG::ReadHandle<SpacePointContainer> spacepointsPixel{m_spacepointsPixel, ctx};
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
391 SG::ReadHandle<SpacePointContainer> spacepointsStrip{m_spacepointsStrip, ctx};
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}
int ir
counter of the current depth
Definition fastadd.cxx:49

◆ 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}
virtual void newRegion(const EventContext &ctx, EventData &data, const std::vector< IdentifierHash > &vPixel, const std::vector< IdentifierHash > &vStrip) const override

◆ newSeed()

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

Definition at line 2937 of file ITkSiSpacePointsSeedMaker.cxx.

2939{
2940 SiSpacePointForSeed *p3 = nullptr;
2941
2942 if (data.i_ITkSeedEnd != data.i_ITkSeeds.end())
2943 {
2944 SiSpacePointsProSeed *s = &(*data.i_ITkSeedEnd++);
2945 s->set(p1, p2, p3, z);
2946 }
2947 else
2948 {
2949 data.i_ITkSeeds.emplace_back(p1, p2, p3, z);
2950 data.i_ITkSeedEnd = data.i_ITkSeeds.end();
2951 }
2952}

◆ 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 2866 of file ITkSiSpacePointsSeedMaker.cxx.

2867{
2868 std::array<float, 15> r;
2869 return newSpacePoint(data, sp, r, true);
2870}

◆ newSpacePoint() [2/2]

SiSpacePointForSeed * ITk::SiSpacePointsSeedMaker::newSpacePoint ( EventData & data,
const Trk::SpacePoint *const & sp,
std::span< float, 15 > 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 2872 of file ITkSiSpacePointsSeedMaker.cxx.

2873{
2874
2875 SiSpacePointForSeed *sps = nullptr;
2876
2879 convertToBeamFrameWork(data, sp, r.data());
2880
2882 if (data.checketa)
2883 {
2884 float z = (std::abs(r[2]) + m_zmax);
2885 float x = r[0] * data.dzdrmin;
2886 float y = r[1] * data.dzdrmin;
2887 if ((z * z) < (x * x + y * y))
2888 return sps;
2889 }
2890
2891 if (m_fastTracking)
2892 {
2893 float R2 = r[0] * r[0] + r[1] * r[1];
2894 // cotTheta=18.2855 corresponds to eta=3.6
2895 if (std::abs(r[2]) > m_dzMaxFast && R2 < m_R2MaxFast && std::abs(r[2]) < 18.2855 * std::sqrt(R2))
2896 return nullptr;
2897 if (std::abs(r[2]) - m_zmax > data.dzdrmax * std::sqrt(R2))
2898 return nullptr;
2899 }
2900
2901 if (usePixStripInform)
2902 {
2903 if (!sp->clusterList().second)
2904 pixInform(sp, r.data());
2905 else
2906 stripInform(data, sp, r.data());
2907 }
2908
2912 if (data.i_ITkSpacePointForSeed != data.l_ITkSpacePointForSeed.end())
2913 {
2915 sps = &(*data.i_ITkSpacePointForSeed++);
2918 sps->set(sp, r);
2919 }
2920 else
2921 {
2923 data.l_ITkSpacePointForSeed.emplace_back(sp, r);
2925 sps = &(data.l_ITkSpacePointForSeed.back());
2927 data.i_ITkSpacePointForSeed = data.l_ITkSpacePointForSeed.end();
2928 }
2929
2930 return sps;
2931}
static void pixInform(const Trk::SpacePoint *sp, float *r)
static void stripInform(EventData &data, const Trk::SpacePoint *sp, float *r)
static void convertToBeamFrameWork(EventData &data, const Trk::SpacePoint *, float *)

◆ 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 2798 of file ITkSiSpacePointsSeedMaker.cxx.

2799{
2801 if (not data.initialized)
2802 initializeEventData(data, ctx);
2803
2804 if (data.nspoint == 3)
2805 {
2806 do
2807 {
2809 if (data.i_ITkSeed == data.i_ITkSeedEnd)
2810 {
2815 findNext(data);
2817 //cppcheck-suppress identicalInnerCondition
2818 if (data.i_ITkSeed == data.i_ITkSeedEnd)
2819 return nullptr;
2820 }
2821
2823 } while (!(*data.i_ITkSeed++).set3(data.seedOutput, 1./(1000. * data.K)));
2825 return &data.seedOutput;
2826 }
2827 else
2828 {
2830 if (data.i_ITkSeed == data.i_ITkSeedEnd)
2831 {
2832 findNext(data);
2833 //cppcheck-suppress identicalInnerCondition
2834 if (data.i_ITkSeed == data.i_ITkSeedEnd)
2835 return nullptr;
2836 }
2837 (*data.i_ITkSeed++).set2(data.seedOutput);
2838 return &data.seedOutput;
2839 }
2840 return nullptr;
2841}
void findNext(EventData &data) const

◆ 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}
static Double_t Tp(Double_t *t, Double_t *par)
Trk::Surface & surface()
Element Surface.
const Amg::Transform3D & transform() const
Returns HepGeom::Transform3D by reference.
Eigen::Affine3d Transform3D
cl
print [x.__class__ for x in toList(dqregion.getSubRegions()) ]

◆ 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
1470
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
1492 std::array<std::vector<SiSpacePointForSeed *>::iterator, arraySizeNeighbourBins> iter_topCands;
1493 std::array<std::vector<SiSpacePointForSeed *>::iterator, arraySizeNeighbourBins> iter_endTopCands;
1494 std::array<std::vector<SiSpacePointForSeed *>::iterator, arraySizeNeighbourBins> iter_bottomCands;
1495 std::array<std::vector<SiSpacePointForSeed *>::iterator, arraySizeNeighbourBins> iter_endBottomCands;
1496
1497 int nPhiBins;
1498 std::array<int, arraySizePhiZ> nNeighbourCellsBottom{};
1499 std::array<int, arraySizePhiZ> nNeighbourCellsTop{};
1500 //coverity[STACK_USE]
1501 std::array<std::array<int, arraySizeNeighbourBins>, arraySizePhiZ> neighbourCellsBottom{};
1502 // Local variable neighbourCellsTop uses 79200 bytes of stack space,
1503 //coverity[STACK_USE]
1504 std::array<std::array<int, arraySizeNeighbourBins>, arraySizePhiZ> neighbourCellsTop{};
1505
1506 if (isPixel)
1507 {
1509 nNeighbourCellsBottom = m_nNeighbourCellsBottomPPP;
1510 nNeighbourCellsTop = m_nNeighbourCellsTopPPP;
1511 neighbourCellsBottom = m_neighbourCellsBottomPPP;
1512 neighbourCellsTop = m_neighbourCellsTopPPP;
1513 }
1514 else
1515 {
1517 nNeighbourCellsBottom = m_nNeighbourCellsBottomSSS;
1518 nNeighbourCellsTop = m_nNeighbourCellsTopSSS;
1519 neighbourCellsBottom = m_neighbourCellsBottomSSS;
1520 neighbourCellsTop = m_neighbourCellsTopSSS;
1521 }
1522
1524 int nseed = 0;
1526 data.endlist = true;
1527
1529 for (int phiBin = data.fNmin; phiBin <= nPhiBins; ++phiBin)
1530 {
1531
1533 int z = (m_fastTracking && m_pixel) ? 2 : 0;
1535 if (!data.endlist)
1536 z = data.zMin;
1537
1541 for (; z < arraySizeZ; ++z)
1542 {
1543
1544 if (m_fastTracking && m_pixel)
1545 {
1546 data.RTmax = RTmax[ zBinIndex[z] ];
1547 data.RTmin = RTmin[ zBinIndex[z] ];
1548 }
1549
1550 int phiZbin = phiBin * arraySizeZ + zBinIndex[z];
1551
1553 if (!data.rfz_map[phiZbin])
1554 continue;
1555
1558 int numberBottomCells = 0;
1559 int numberTopCells = 0;
1560
1565 for (int neighbourCellNumber = 0; neighbourCellNumber < nNeighbourCellsBottom[phiZbin]; ++neighbourCellNumber)
1566 {
1567
1568 int theNeighbourCell = neighbourCellsBottom[phiZbin][neighbourCellNumber];
1570 if (!data.rfz_map[theNeighbourCell])
1571 continue;
1573 iter_bottomCands[numberBottomCells] = data.rfz_ITkSorted[theNeighbourCell].begin();
1574 iter_endBottomCands[numberBottomCells++] = data.rfz_ITkSorted[theNeighbourCell].end();
1575 }
1576
1581 for (int neighbourCellNumber = 0; neighbourCellNumber < nNeighbourCellsTop[phiZbin]; ++neighbourCellNumber)
1582 {
1583
1584 int theNeighbourCell = neighbourCellsTop[phiZbin][neighbourCellNumber];
1586 if (!data.rfz_map[theNeighbourCell])
1587 continue;
1589 iter_topCands[numberTopCells] = data.rfz_ITkSorted[theNeighbourCell].begin();
1590 iter_endTopCands[numberTopCells++] = data.rfz_ITkSorted[theNeighbourCell].end();
1591 }
1592
1594 if (!data.trigger)
1595 {
1596 if (isPixel)
1597 production3SpPPP(data, iter_bottomCands, iter_endBottomCands, iter_topCands, iter_endTopCands, numberBottomCells, numberTopCells, nseed);
1598 else
1599 production3SpSSS(data, iter_bottomCands, iter_endBottomCands, iter_topCands, iter_endTopCands, numberBottomCells, numberTopCells, nseed);
1600 }
1601 else
1602 production3SpTrigger(data, iter_bottomCands, iter_endBottomCands, iter_topCands, iter_endTopCands, numberBottomCells, numberTopCells, nseed);
1603 }
1604
1611 if (nseed >= m_maxsize)
1612 {
1613 data.endlist = false;
1614 data.fNmin = phiBin + 1;
1615 return;
1616 }
1617 }
1618
1620 data.endlist = true;
1621}
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
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.

◆ 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 1627 of file ITkSiSpacePointsSeedMaker.cxx.

1633{
1634
1640
1642 std::vector<SiSpacePointForSeed *>::iterator iter_centralSP = iter_bottomCands[0];
1643
1649
1651 for (; iter_centralSP != iter_endBottomCands[0]; ++iter_centralSP)
1652 {
1653 if((*iter_centralSP)->radius() > data.RTmin) break;
1654 }
1655
1658 iter_topCands[0] = iter_centralSP;
1659 ++iter_topCands[0];
1660
1662 const float &ipt2K = data.ipt2K;
1663 const float &ipt2C = data.ipt2C;
1664 const float &COFK = data.COFK;
1665 const float &maxd0cut = m_maxdImpact;
1666 const float &zmax = data.zmaxU;
1667 const float &dzdrmax = data.dzdrmax;
1668 data.ITkCmSp.clear();
1669
1672 size_t SPcapacity = data.ITkSP.size();
1673
1675 for (; iter_centralSP != iter_endBottomCands[0]; ++iter_centralSP)
1676 {
1677 const float &R = (*iter_centralSP)->radius();
1678
1679 if(R > data.RTmax)
1680 break;
1681
1683 const float &X = (*iter_centralSP)->x();
1684 const float &Y = (*iter_centralSP)->y();
1685 const float &Z = (*iter_centralSP)->z();
1686
1689 double absZ = std::abs(Z);
1690 if (!m_fastTracking && absZ > m_zmaxPPP)
1691 continue;
1692
1693 float covr0 = (*iter_centralSP)->covr();
1694 float covz0 = (*iter_centralSP)->covz();
1695 float Ri = 1. / R;
1696 float ax = X * Ri;
1697 float ay = Y * Ri;
1698 float VR = maxd0cut / (R * R);
1699 size_t Ntm = 2;
1700 if (R > m_rmaxPPP)
1701 Ntm = 1;
1702
1705 size_t Nt = 0;
1706
1709 for (int cell = 0; cell < numberTopCells; ++cell)
1710 {
1711 std::vector<SiSpacePointForSeed *>::iterator iter_otherSP = iter_topCands[cell], iter_otherSPend = iter_endTopCands[cell];
1712 if (iter_otherSP == iter_otherSPend) continue;
1713
1714 for(; iter_otherSP!=iter_otherSPend; ++iter_otherSP) {
1715 if(( (*iter_otherSP)->radius()- R ) >= m_drminPPP) break;
1716 }
1717 iter_topCands[cell]=iter_otherSP;
1718
1720 for (; iter_otherSP != iter_endTopCands[cell]; ++iter_otherSP)
1721 {
1723 float Rt = (*iter_otherSP)->radius();
1724 float dR = Rt - R;
1725
1726 const float dz = (*iter_otherSP)->z() - Z;
1727 const float dZdR = dz / dR;
1730 const float z0 = Z - R * dZdR;
1731 if (std::abs(z0) > zmax)
1732 continue;
1733
1734 float dx = (*iter_otherSP)->x() - X;
1735 float dy = (*iter_otherSP)->y() - Y;
1736 float x = dx * ax + dy * ay;
1737 float y = dy * ax - dx * ay;
1738 float dxy = x * x + y * y;
1739 float r2 = 1. / dxy;
1740 float u = x * r2;
1741 float v = y * r2;
1742
1743 if (std::abs(R * y) > maxd0cut * x)
1744 {
1745 float V0;
1746 y < 0. ? V0 = VR : V0 = -VR;
1747 float A = (v - V0) / (u + 1. / R);
1748 float B = V0 + A / R;
1749 if ((B * B) > (ipt2K * (1. + A * A)))
1750 continue;
1751 }
1752
1753 const float dr = std::sqrt(r2);
1754 const float tz = dz * dr;
1756 if (std::abs(tz) > dzdrmax)
1757 continue;
1758
1760 data.ITkSP[Nt] = (*iter_otherSP);
1761 data.R[Nt] = dr;
1762 data.U[Nt] = u;
1763 data.V[Nt] = v;
1764 data.Er[Nt] = ((covz0 + (*iter_otherSP)->covz()) + (tz * tz) * (covr0 + (*iter_otherSP)->covr())) * r2;
1765 data.ITkSP[Nt]->setDR(std::sqrt(dxy + dz * dz));
1766 data.ITkSP[Nt]->setDZDR(dZdR);
1767 data.Tn[Nt].Fl = tz;
1768 data.Tn[Nt].In = Nt;
1769
1773 if (++Nt == SPcapacity)
1774 {
1775 size_t increment = 50;
1777 SPcapacity = data.ITkSP.size();
1778 }
1779 }
1780 }
1781
1782 if (Nt < Ntm)
1783 continue;
1784
1788 size_t Nb = Nt;
1789
1792 for (int cell = 0; cell < numberBottomCells; ++cell)
1793 {
1794
1795 std::vector<SiSpacePointForSeed*>::iterator iter_otherSP = iter_bottomCands[cell];
1796
1797 for(; iter_otherSP!=iter_endBottomCands[cell]; ++iter_otherSP) {
1798 if( (R - (*iter_otherSP)->radius()) <= m_drmaxPPP) break;
1799 }
1800 iter_bottomCands[cell]=iter_otherSP;
1801
1803 for (; iter_otherSP != iter_endBottomCands[cell]; ++iter_otherSP)
1804 {
1806 const float &Rb = (*iter_otherSP)->radius();
1807 float dR = R - Rb;
1808
1810 if (dR < m_drminPPP)
1811 break;
1812
1813 const float dz = Z - (*iter_otherSP)->z();
1814 const float dZdR = dz / dR;
1817 const float z0 = Z - R * dZdR;
1818 if (std::abs(z0) > zmax)
1819 continue;
1820
1821 float dx = (*iter_otherSP)->x() - X;
1822 float dy = (*iter_otherSP)->y() - Y;
1823 float x = dx * ax + dy * ay;
1824 float y = dy * ax - dx * ay;
1825 float dxy = ( x * x + y * y );
1826 float r2 = 1. / dxy;
1827 float u = x * r2;
1828 float v = y * r2;
1829
1830 if (std::abs(R * y) > -maxd0cut * x)
1831 {
1832 float V0;
1833 y > 0. ? V0 = VR : V0 = -VR;
1834 float A = (v - V0) / (u + 1. / R);
1835 float B = V0 + A / R;
1836 if ((B * B) > (ipt2K * (1. + A * A)))
1837 continue;
1838 }
1839
1840 const float dr = std::sqrt(r2);
1841 const float tz = dz * dr;
1843 if (std::abs(tz) > dzdrmax)
1844 continue;
1845
1846 //Updated to 45mm for ITk layout 03-00-00
1847 if (m_fastTracking && (*iter_otherSP)->radius() < 45. && std::abs(tz) > 1.5)
1848 continue;
1849
1851 data.ITkSP[Nb] = (*iter_otherSP);
1852 data.R[Nb] = dr;
1853 data.U[Nb] = u;
1854 data.V[Nb] = v;
1855 data.Er[Nb] = ((covz0 + (*iter_otherSP)->covz()) + (tz * tz) * (covr0 + (*iter_otherSP)->covr())) * r2;
1856 data.ITkSP[Nb]->setDR(std::sqrt(dxy + dz * dz));
1857 data.ITkSP[Nb]->setDZDR(dZdR);
1858 data.Tn[Nb].Fl = tz;
1859 data.Tn[Nb].In = Nb;
1860
1864 if (++Nb == SPcapacity)
1865 {
1866 size_t increment = 50;
1868 SPcapacity = data.ITkSP.size();
1869 }
1870
1871 }
1872 }
1873
1875 if (!(Nb - Nt))
1876 continue;
1877
1878 sort(data.Tn,0,Nt);
1879 sort(data.Tn,Nt,Nb-Nt);
1880
1881 data.nOneSeeds = 0;
1882 data.nOneSeedsQ = 0;
1883 data.ITkMapOneSeeds.clear();
1884 data.ITkMapOneSeedsQ.clear();
1885
1888 size_t it0 = 0;
1889 for (size_t ib = Nt; ib < Nb; ++ib)
1890 {
1891
1892 if (it0 == Nt)
1893 break;
1894
1896 float Tzb = data.Tn[ib].Fl;
1897 int b = data.Tn[ib].In;
1898
1899 float Rb2r = data.R[b] * covr0;
1900 float Rb2z = data.R[b] * covz0;
1901 float Erb = data.Er[b];
1902 float Vb = data.V[b];
1903 float Ub = data.U[b];
1904 float Tzb2 = (1. + Tzb * Tzb);
1905 float sTzb2 = std::sqrt(Tzb2);
1906
1907 float sigmaSquaredScatteringPtDependent = Tzb2 * COFK;
1908 float sigmaSquaredScatteringMinPt = Tzb2 * ipt2C;
1911 float d0max = maxd0cut;
1912
1913 size_t Nc = 1;
1914 if (data.ITkSP[b]->radius() > m_rmaxPPP){
1915 Nc = 0;
1916 }
1917 if (data.nOneSeedsQ)
1918 ++Nc;
1919
1921 for (size_t it = it0; it < Nt; ++it)
1922 {
1923
1924 int t = data.Tn[it].In; // index of top seed after sorting
1925 float Tzt = data.Tn[it].Fl;
1926
1931
1933 float meanOneOverTanThetaSquare = Tzb * Tzt; // SSS uses arithmetic average, PPP geometric average
1934
1936 float sigmaSquaredSpacePointErrors = Erb + data.Er[t]
1937 + 2 * Rb2z * data.R[t]
1938 + 2 * Rb2r * data.R[t] * meanOneOverTanThetaSquare; // mixed term with r-uncertainy on central SP
1939
1941 float remainingSquaredDelta = (Tzb - Tzt) * (Tzb - Tzt) - sigmaSquaredSpacePointErrors;
1942
1945 if (remainingSquaredDelta - sigmaSquaredScatteringMinPt > 0)
1946 {
1947 if (Tzb - Tzt < 0.)
1948 break;
1949 it0 = it + 1 ;
1950 continue;
1951 }
1952
1974
1975 float dU = data.U[t] - Ub;
1976 if (dU == 0.)
1977 continue;
1978 float A = (data.V[t] - Vb) / dU;
1979 float onePlusAsquare = 1. + A * A;
1980 float B = Vb - A * Ub;
1981 float BSquare = B * B;
1982
1995 if (BSquare > ipt2K * onePlusAsquare)
1996 continue;
1997 if (remainingSquaredDelta * onePlusAsquare > BSquare * sigmaSquaredScatteringPtDependent)
1998 {
1999 if (Tzb - Tzt < 0.)
2000 break;
2001 it0 = it;
2002 continue;
2003 }
2004
2021 float d0 = std::abs((A - B * R) * R);
2022
2024 if (d0 <= d0max)
2025 {
2027 float dr = data.R[b];
2028 if (data.R[t] < data.R[b])
2029 dr = data.R[t];
2033 data.ITkSP[t]->setScorePenalty(std::abs((Tzb - Tzt) / (dr * sTzb2)));
2034 data.ITkSP[t]->setParam(d0);
2035
2037 data.ITkCmSp.emplace_back(B / std::sqrt(onePlusAsquare), data.ITkSP[t]);
2039 if (data.ITkCmSp.size() == 500)
2040 break;
2041 }
2042
2043 }
2045
2046 if (data.ITkCmSp.size() > Nc)
2047 {
2048 newOneSeedWithCurvaturesComparisonPPP(data, data.ITkSP[b], (*iter_centralSP), Z - R * Tzb);
2049 }
2050 data.ITkCmSp.clear();
2051 }
2053 fillSeeds(data);
2054 nseed += data.fillOneSeeds;
2055
2056 }
2057}
void newOneSeedWithCurvaturesComparisonPPP(EventData &data, SiSpacePointForSeed *&SPb, SiSpacePointForSeed *&SP0, float Zob) const
void sort(std::vector< InDet::FloatInt > &s, int start, int size) const
static void fillSeeds(EventData &data)

◆ 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 2063 of file ITkSiSpacePointsSeedMaker.cxx.

2069{
2070
2076
2078 std::vector<SiSpacePointForSeed *>::iterator iter_centralSP = iter_bottomCands[0];
2079 std::vector<SiSpacePointForSeed *>::iterator iter_otherSP;
2080
2086
2088 for (; iter_centralSP != iter_endBottomCands[0]; ++iter_centralSP)
2089 {
2090 if((*iter_centralSP)->radius() > data.RTmin) break;
2091 }
2092
2095 iter_topCands[0] = iter_centralSP;
2096 ++iter_topCands[0];
2097
2099 const float ipt2K = data.ipt2K;
2100 const float ipt2C = data.ipt2C;
2101 const float COFK = data.COFK;
2102 const float maxd0cut = m_maxdImpactSSS;
2103 const float zmax = data.zmaxU;
2104 data.ITkCmSp.clear();
2105
2108 size_t SPcapacity = data.ITkSP.size();
2109
2111 for (; iter_centralSP != iter_endBottomCands[0]; ++iter_centralSP)
2112 {
2113
2114 const float &R = (*iter_centralSP)->radius();
2115
2116 if(R > data.RTmax) break;
2117
2119 const float &X = (*iter_centralSP)->x();
2120 const float &Y = (*iter_centralSP)->y();
2121 const float &Z = (*iter_centralSP)->z();
2122
2125 double absZ = std::abs(Z);
2127 if (absZ > m_zmaxSSS)
2128 continue;
2129
2132 size_t Nt = 0;
2133
2136 for (int cell = 0; cell < numberTopCells; ++cell)
2137 {
2138
2139 for (iter_otherSP = iter_topCands[cell]; iter_otherSP != iter_endTopCands[cell]; ++iter_otherSP)
2140 {
2142 float Rt = (*iter_otherSP)->radius();
2143 float dR = Rt - R;
2144 if (dR >= m_drminSSS)
2145 break;
2146 }
2147 iter_topCands[cell] = iter_otherSP;
2148
2150 for (iter_otherSP = iter_topCands[cell]; iter_otherSP != iter_endTopCands[cell]; ++iter_otherSP)
2151 {
2152
2154 float Rt = (*iter_otherSP)->radius();
2155 float dR = Rt - R;
2157 if (dR > m_drmaxSSS)
2158 break;
2159
2160 const float dz = (*iter_otherSP)->z() - Z;
2161 const float dZdR = dz / dR;
2162
2165 const float z0 = Z - R * dZdR;
2166 if (std::abs(dz) > m_dzmaxSSS || std::abs(z0) > zmax)
2167 continue;
2168
2170 if(m_isLRT){
2171 float Ri = 1./R;
2172 const float ax = X*Ri;
2173 const float ay = Y*Ri;
2174 float VR = m_maxdImpact*Ri*Ri ;
2175 float dx = (*iter_otherSP)->x() - X;
2176 float dy = (*iter_otherSP)->y() - Y;
2177 float x = dx * ax + dy * ay;
2178 float y = dy * ax - dx * ay;
2179
2180 if(std::abs(R*y) > maxd0cut * x) {
2181 float r2 = 1. / (x * x + y * y);
2182 float u = x*r2 ;
2183 float v = y*r2 ;
2184 const float V0 = (y < 0.) ? VR: -VR;
2185 float A = (v-V0)/(u+Ri) ;
2186 float B = V0+A*Ri ;
2187 if((B*B) > (ipt2K*(1.+A*A))) continue;
2188 }
2189 }
2190
2192 data.ITkSP[Nt] = (*iter_otherSP);
2193 data.ITkSP[Nt]->setDZDR(dZdR);
2197 if (++Nt == SPcapacity)
2198 {
2199 data.resizeSPCont();
2200 SPcapacity = data.ITkSP.size();
2201 }
2202 }
2203 }
2204
2206 if (!Nt)
2207 continue;
2208
2212 size_t Nb = Nt;
2213
2216 for (int cell = 0; cell < numberBottomCells; ++cell)
2217 {
2218
2219 for(iter_otherSP=iter_bottomCands[cell]; iter_otherSP!=iter_endBottomCands[cell]; ++iter_otherSP) {
2220 if((R-(*iter_otherSP)->radius()) <= m_drmaxSSS) break;
2221 }
2222 iter_bottomCands[cell]=iter_otherSP;
2223
2225 for (; iter_otherSP != iter_endBottomCands[cell]; ++iter_otherSP)
2226 {
2227
2229 const float &Rb = (*iter_otherSP)->radius();
2230 float dR = R - Rb;
2231
2233 if (dR < m_drminSSS)
2234 break;
2235
2236 const float dz = Z - (*iter_otherSP)->z();
2237 const float dZdR = dz / dR;
2238
2241 const float z0 = Z - R * dZdR;
2242 if (std::abs(dz) > m_dzmaxSSS || std::abs(z0) > zmax)
2243 continue;
2244
2246 if(m_isLRT){
2247 float Ri = 1./R;
2248 const float ax = X*Ri;
2249 const float ay = Y*Ri;
2250 float VR = m_maxdImpact*Ri*Ri ;
2251 float dx = (*iter_otherSP)->x() - X;
2252 float dy = (*iter_otherSP)->y() - Y;
2253 float x = dx * ax + dy * ay;
2254 float y = dy * ax - dx * ay;
2255
2256 if(std::abs(R*y) > -maxd0cut * x) {
2257 float r2 = 1. / (x * x + y * y);
2258 float u = x*r2 ;
2259 float v = y*r2 ;
2260 const float V0 = (y < 0.) ? VR: -VR;
2261 float A = (v-V0)/(u+Ri) ;
2262 float B = V0+A*Ri ;
2263 if((B*B) > (ipt2K*(1.+A*A))) continue;
2264 }
2265 }
2266
2268 data.ITkSP[Nb] = (*iter_otherSP);
2269 data.ITkSP[Nb]->setDZDR(dZdR);
2273 if (++Nb == SPcapacity)
2274 {
2275 data.resizeSPCont();
2276 SPcapacity = data.ITkSP.size();
2277 }
2278 }
2279 }
2280
2282 if (!(Nb - Nt))
2283 continue;
2284
2286 float covr0 = (*iter_centralSP)->covr();
2287 float covz0 = (*iter_centralSP)->covz();
2288
2290 float ax = X / R;
2291 float ay = Y / R;
2292
2295 for (size_t i = 0; i < Nb; ++i)
2296 {
2297
2298 SiSpacePointForSeed *sp = data.ITkSP[i];
2299
2302 float dx = sp->x() - X;
2303 float dy = sp->y() - Y;
2304 float dz = sp->z() - Z;
2305 float x = dx * ax + dy * ay;
2306 float y = dy * ax - dx * ay;
2307
2309 float r2 = 1. / (x * x + y * y);
2311 float dr = std::sqrt(r2);
2314 float tz = dz * dr;
2315
2318 if (i >= Nt)
2319 tz = -tz;
2320
2322 data.X[i] = x;
2323 data.Y[i] = y;
2324 data.Tz[i] = tz;
2325 data.Zo[i] = Z - R * tz;
2326 data.R[i] = dr;
2327 data.U[i] = x * r2;
2328 data.V[i] = y * r2;
2329 data.Er[i] = ((covz0 + sp->covz()) + (tz * tz) * (covr0 + sp->covr())) * r2;
2330 }
2331
2332 data.nOneSeeds = 0;
2333 data.nOneSeedsQ = 0;
2334 data.ITkMapOneSeeds.clear();
2335 data.ITkMapOneSeedsQ.clear();
2336
2339 for (size_t b = Nt; b < Nb; ++b)
2340 {
2341
2343 float Zob = data.Zo[b];
2344 float Tzb = data.Tz[b];
2345 float Rb2r = data.R[b] * covr0;
2346 float Rb2z = data.R[b] * covz0;
2347 float Erb = data.Er[b];
2348 float Vb = data.V[b];
2349 float Ub = data.U[b];
2350 float Tzb2 = (1. + Tzb * Tzb);
2351 float sTzb2 = std::sqrt(Tzb2);
2352 float Se = 1. / std::sqrt(Tzb2);
2353 float Ce = Se * Tzb;
2354 float Sx = Se * ax;
2355 float Sy = Se * ay;
2356
2357 float sigmaSquaredScatteringPtDependent = Tzb2 * COFK;
2358 float sigmaSquaredScatteringMinPt = Tzb2 * ipt2C;
2361 float d0max = maxd0cut;
2362
2364 for (size_t t = 0; t < Nt; ++t)
2365 {
2366
2388
2389 // Trigger point
2390 //
2391 float dU0 = data.U[t] - Ub;
2392 if (dU0 == 0.)
2393 continue;
2394 float A0 = (data.V[t] - Vb) / dU0;
2395
2396 float Cn = Ce * std::sqrt(1. + A0 * A0);
2397
2398 float dn[3] = {Sx - Sy * A0, Sx * A0 + Sy, Cn};
2399 float rn[3];
2400 if (!(*iter_centralSP)->coordinates(dn, rn))
2401 continue;
2402
2403 // Bottom point
2404 //
2405 float B0 = 2. * (Vb - A0 * Ub);
2406 float Cb = 1. - B0 * data.Y[b];
2407 float Sb = A0 + B0 * data.X[b];
2408 float db[3] = {Sx * Cb - Sy * Sb, Sx * Sb + Sy * Cb, Cn};
2409 float rb[3];
2410 if (!data.ITkSP[b]->coordinates(db, rb))
2411 continue;
2412
2413 // Top point
2414 //
2415 float Ct = 1. - B0 * data.Y[t];
2416 float St = A0 + B0 * data.X[t];
2417 float dt[3] = {Sx * Ct - Sy * St, Sx * St + Sy * Ct, Cn};
2418 float rt[3];
2419 if (!data.ITkSP[t]->coordinates(dt, rt))
2420 continue;
2421
2422 float xb = rb[0] - rn[0];
2423 float yb = rb[1] - rn[1];
2424 float zb = rb[2] - rn[2];
2425 float xt = rt[0] - rn[0];
2426 float yt = rt[1] - rn[1];
2427 float zt = rt[2] - rn[2];
2428
2429 float rb2 = 1. / (xb * xb + yb * yb);
2430 float rt2 = 1. / (xt * xt + yt * yt);
2431
2432 float tb = -zb * std::sqrt(rb2);
2433 float tz = zt * std::sqrt(rt2);
2434
2439
2441 float meanOneOverTanTheta = (tb + tz) / 2.;
2442
2444 float sigmaSquaredSpacePointErrors = Erb + data.Er[t]
2445 + 2 * Rb2z * data.R[t]
2446 + 2 * Rb2r * data.R[t] * meanOneOverTanTheta * meanOneOverTanTheta; // mixed term with r-uncertainy on central SP
2447
2449 float remainingSquaredDelta = (tb - tz) * (tb - tz) - sigmaSquaredSpacePointErrors;
2450
2453 if (remainingSquaredDelta - sigmaSquaredScatteringMinPt > 0)
2454 continue;
2455
2456 float Rn = std::sqrt(rn[0] * rn[0] + rn[1] * rn[1]);
2457 float Ax = rn[0] / Rn;
2458 float Ay = rn[1] / Rn;
2459
2460 float ub = (xb * Ax + yb * Ay) * rb2;
2461 float vb = (yb * Ax - xb * Ay) * rb2;
2462 float ut = (xt * Ax + yt * Ay) * rt2;
2463 float vt = (yt * Ax - xt * Ay) * rt2;
2464
2465 float dU = ut - ub;
2466 if (dU == 0.)
2467 continue;
2468 float A = (vt - vb) / dU;
2469 float onePlusAsquare = 1. + A * A;
2470 float B = vb - A * ub;
2471 float BSquare = B * B;
2472
2485 if (BSquare > ipt2K * onePlusAsquare || remainingSquaredDelta * onePlusAsquare > BSquare * sigmaSquaredScatteringPtDependent)
2486 continue;
2487
2504 float d0 = std::abs((A - B * Rn) * Rn);
2505
2507 if (d0 <= d0max)
2508 {
2510 float dr = std::sqrt(1 / rb2);
2511 if (data.R[t] < data.R[b])
2512 dr = std::sqrt(1 / rt2);
2516 data.ITkSP[t]->setScorePenalty(std::abs((tb - tz) / (dr * sTzb2)));
2517 data.ITkSP[t]->setParam(d0);
2518 float DR = std::sqrt( xt * xt + yt * yt + zt * zt ); // distance between top and central SP
2519 data.ITkSP[t]->setDR(DR);
2520
2522 data.ITkCmSp.emplace_back(B / std::sqrt(onePlusAsquare), data.ITkSP[t]);
2524 if (data.ITkCmSp.size() == 500)
2525 break;
2526 }
2527
2528 }
2530 if (!data.ITkCmSp.empty())
2531 {
2532 newOneSeedWithCurvaturesComparisonSSS(data, data.ITkSP[b], (*iter_centralSP), Zob);
2533 }
2534 }
2536 fillSeeds(data);
2537 nseed += data.fillOneSeeds;
2538
2539 }
2540}
static const int B0
Definition AtlasPID.h:122
#define xt
#define yt
#define zt
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...

◆ 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 2546 of file ITkSiSpacePointsSeedMaker.cxx.

2552{
2553 ATH_MSG_WARNING("ITk::SiSpacePointsSeedMaker::production3SpTrigger not implemented!");
2554}

◆ 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 }
static Double_t a
size_t size() const
Number of registered mappings.

◆ 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}
static Double_t s0
Eigen::Matrix< double, 2, 1 > Vector2D
double e0(const xAOD::CaloCluster &cluster)
return the uncorrected cluster energy in pre-sampler
double e1(const xAOD::CaloCluster &cluster)
return the uncorrected cluster energy in 1st sampling

◆ writeNtuple()

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

Definition at line 3377 of file ITkSiSpacePointsSeedMaker.cxx.

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

Member Data Documentation

◆ ATLAS_THREAD_SAFE [1/24]

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

Definition at line 286 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [2/24]

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

Definition at line 285 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [3/24]

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

Definition at line 284 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [4/24]

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

Definition at line 283 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [5/24]

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

Definition at line 282 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [6/24]

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

Definition at line 281 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [7/24]

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

Definition at line 280 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [8/24]

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

Definition at line 279 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [9/24]

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

Definition at line 278 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [10/24]

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

Definition at line 277 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [11/24]

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

Definition at line 276 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [12/24]

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

Definition at line 275 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [13/24]

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

Definition at line 274 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [14/24]

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

Definition at line 273 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [15/24]

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

Definition at line 272 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [16/24]

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

Definition at line 271 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [17/24]

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

Definition at line 270 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [18/24]

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

Definition at line 269 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [19/24]

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

Definition at line 268 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [20/24]

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

Definition at line 267 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [21/24]

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

Definition at line 266 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [22/24]

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

Definition at line 265 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [23/24]

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

Definition at line 264 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [24/24]

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

Definition at line 263 of file ITkSiSpacePointsSeedMaker.h.

◆ m_alwaysKeepConfirmedPixelSeeds

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

Definition at line 204 of file ITkSiSpacePointsSeedMaker.h.

204{this, "alwaysKeepConfirmedPixelSeeds", false};

◆ m_alwaysKeepConfirmedStripSeeds

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

Definition at line 205 of file ITkSiSpacePointsSeedMaker.h.

205{this, "alwaysKeepConfirmedStripSeeds", false};

◆ 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.

171{this, "BeamSpotKey", "BeamSpotData", "SG key for beam spot"};

◆ m_binSizeR

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

Definition at line 194 of file ITkSiSpacePointsSeedMaker.h.

194{this, "radStep", 2.};

◆ m_checketa

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

Definition at line 235 of file ITkSiSpacePointsSeedMaker.h.

235{this, "checkEta", false};

◆ m_COF

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

Definition at line 246 of file ITkSiSpacePointsSeedMaker.h.

246{134 * .05f * 9};

◆ m_dImpactCutSlopeUnconfirmedPPP

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

Definition at line 220 of file ITkSiSpacePointsSeedMaker.h.

220{this, "dImpactCutSlopeUnconfirmedPPP", 0.};

◆ m_dImpactCutSlopeUnconfirmedSSS

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

Definition at line 219 of file ITkSiSpacePointsSeedMaker.h.

219{this, "dImpactCutSlopeUnconfirmedSSS", 1.0};

◆ m_drmax

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

Definition at line 190 of file ITkSiSpacePointsSeedMaker.h.

190{this, "maxdRadius", 300.};

◆ m_drmaxPPP

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

Definition at line 214 of file ITkSiSpacePointsSeedMaker.h.

214{this, "maxdRadiusPPP", 150.};

◆ m_drmaxSSS

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

Definition at line 217 of file ITkSiSpacePointsSeedMaker.h.

217{this, "maxdRadiusSSS", 300.};

◆ m_drmin

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

Definition at line 189 of file ITkSiSpacePointsSeedMaker.h.

189{this, "mindRadius", 5.};

◆ m_drminPPP

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

Definition at line 213 of file ITkSiSpacePointsSeedMaker.h.

213{this, "mindRadiusPPP", 6.};

◆ m_drminSeedConf

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

Definition at line 251 of file ITkSiSpacePointsSeedMaker.h.

251{5.};

◆ m_drminSSS

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

Definition at line 216 of file ITkSiSpacePointsSeedMaker.h.

216{this, "mindRadiusSSS", 20.};

◆ m_dzdrmax0

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

Definition at line 243 of file ITkSiSpacePointsSeedMaker.h.

243{0.};

◆ m_dzdrmin0

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

Definition at line 242 of file ITkSiSpacePointsSeedMaker.h.

242{0.};

◆ m_dzdrver

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

Definition at line 196 of file ITkSiSpacePointsSeedMaker.h.

196{this, "maxdZdRver", 0.02};

◆ m_dzMaxFast

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

Definition at line 247 of file ITkSiSpacePointsSeedMaker.h.

247{200.};

◆ m_dzmaxPPP

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

Definition at line 199 of file ITkSiSpacePointsSeedMaker.h.

199{this, "dZmaxForPPPSeeds", 600.};

◆ m_dzmaxSSS

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

Definition at line 250 of file ITkSiSpacePointsSeedMaker.h.

250{900.};

◆ m_dzver

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

Definition at line 195 of file ITkSiSpacePointsSeedMaker.h.

195{this, "maxdZver", 5.};

◆ m_etamax

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

Definition at line 184 of file ITkSiSpacePointsSeedMaker.h.

184{this, "etaMax", 2.7};

◆ m_etamin

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

Definition at line 227 of file ITkSiSpacePointsSeedMaker.h.

227{this, "etaMin", 0.};

◆ m_fastTracking

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

Definition at line 206 of file ITkSiSpacePointsSeedMaker.h.

206{this, "useFastTracking", false};

◆ 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.

172 {this, "AtlasFieldCacheCondObj", "fieldCondObj",
173 "Name of the Magnetic Field conditions object key"};

◆ 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.

293{0};

◆ m_inverseBinSizePhiSSS

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

Definition at line 295 of file ITkSiSpacePointsSeedMaker.h.

295{0};

◆ m_inverseBinSizePhiVertex

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

Definition at line 297 of file ITkSiSpacePointsSeedMaker.h.

297{0};

◆ m_ipt

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

Definition at line 244 of file ITkSiSpacePointsSeedMaker.h.

244{0.};

◆ m_ipt2

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

Definition at line 245 of file ITkSiSpacePointsSeedMaker.h.

245{0.};

◆ m_isLRT

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

Definition at line 212 of file ITkSiSpacePointsSeedMaker.h.

212{this, "isLRT", false};

◆ m_maxBinPhiVertex

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

Definition at line 296 of file ITkSiSpacePointsSeedMaker.h.

296{0};

◆ m_maxdImpact

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

Definition at line 197 of file ITkSiSpacePointsSeedMaker.h.

197{this, "maxdImpact", 10.};

◆ m_maxdImpactSSS

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

Definition at line 198 of file ITkSiSpacePointsSeedMaker.h.

198{this, "maxdImpactSSS", 20.};

◆ m_maxOneSize

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

Definition at line 183 of file ITkSiSpacePointsSeedMaker.h.

183{this, "maxSeedsForSpacePoint", 5};

◆ m_maxOneSizePPP

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

Definition at line 203 of file ITkSiSpacePointsSeedMaker.h.

203{this, "maxSeedsForSpacePointPixels", 5};

◆ m_maxOneSizeSSS

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

Definition at line 202 of file ITkSiSpacePointsSeedMaker.h.

202{this, "maxSeedsForSpacePointStrips", 5};

◆ m_maxPhiBinPPP

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

number of bins in phi

Definition at line 292 of file ITkSiSpacePointsSeedMaker.h.

292{0};

◆ m_maxPhiBinSSS

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

Definition at line 294 of file ITkSiSpacePointsSeedMaker.h.

294{0};

◆ m_maxScore

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

Definition at line 201 of file ITkSiSpacePointsSeedMaker.h.

201{this, "maximumAcceptedSeedScore", 100.};

◆ m_maxsize

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

Definition at line 181 of file ITkSiSpacePointsSeedMaker.h.

181{this, "maxSize", 10000};

◆ m_maxsizeSP

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

Definition at line 182 of file ITkSiSpacePointsSeedMaker.h.

182{this, "maxSizeSP", 4096};

◆ 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.

291{0};

◆ 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.

315{};

◆ m_neighbourCellsBottomSSS

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

Definition at line 320 of file ITkSiSpacePointsSeedMaker.h.

320{};

◆ 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.

316{};

◆ m_neighbourCellsTopSSS

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

Definition at line 321 of file ITkSiSpacePointsSeedMaker.h.

321{};

◆ m_neighboursVertexPhiZ

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

Definition at line 324 of file ITkSiSpacePointsSeedMaker.h.

324{};

◆ 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.

313{};

◆ m_nNeighbourCellsBottomSSS

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

Definition at line 318 of file ITkSiSpacePointsSeedMaker.h.

318{};

◆ 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.

314{};

◆ m_nNeighbourCellsTopSSS

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

Definition at line 319 of file ITkSiSpacePointsSeedMaker.h.

319{};

◆ m_nNeighboursVertexPhiZ

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

Definition at line 323 of file ITkSiSpacePointsSeedMaker.h.

323{};

◆ m_optimisePhiBinning

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

Definition at line 209 of file ITkSiSpacePointsSeedMaker.h.

209{this, "optimisePhiBinning", true};

◆ m_outputlevel

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

Definition at line 240 of file ITkSiSpacePointsSeedMaker.h.

240{0};

◆ 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.

178{this, "usePixel", true};

◆ 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.

170{this,"PRDtoTrackMap","","option PRD-to-track association"};

◆ m_ptmin

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

Definition at line 229 of file ITkSiSpacePointsSeedMaker.h.

229{this, "pTmin", 500.};

◆ m_r1maxv

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

Definition at line 186 of file ITkSiSpacePointsSeedMaker.h.

186{this, "maxVRadius1", 60.};

◆ m_r1minv

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

Definition at line 185 of file ITkSiSpacePointsSeedMaker.h.

185{this, "minVRadius1", 0.};

◆ m_R2MaxFast

float ITk::SiSpacePointsSeedMaker::m_R2MaxFast {2025}
private

Definition at line 248 of file ITkSiSpacePointsSeedMaker.h.

248{2025}; // 45mm*45mm. Updated for ITK Layout 03-00-00

◆ m_r2maxv

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

Definition at line 188 of file ITkSiSpacePointsSeedMaker.h.

188{this, "maxVRadius2", 200.};

◆ m_r2minv

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

Definition at line 187 of file ITkSiSpacePointsSeedMaker.h.

187{this, "minVRadius2", 70.};

◆ m_r_rmax

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

Definition at line 228 of file ITkSiSpacePointsSeedMaker.h.

228{this, "radMax", 1100.};

◆ m_r_rmin

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

Definition at line 193 of file ITkSiSpacePointsSeedMaker.h.

193{this, "radMin", 0.};

◆ m_rmaxPPP

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

Definition at line 249 of file ITkSiSpacePointsSeedMaker.h.

249{140.};

◆ m_rmaxSSS

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

Definition at line 211 of file ITkSiSpacePointsSeedMaker.h.

211{this, "radMaxSSS", 1000.};

◆ m_rminSSS

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

Definition at line 210 of file ITkSiSpacePointsSeedMaker.h.

210{this, "radMinSSS", 400.};

◆ m_seedScoreBonusConfirmationSeed

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

Definition at line 221 of file ITkSiSpacePointsSeedMaker.h.

221{this, "seedScoreBonusConfirmationSeed", -200.};

◆ m_seedScoreBonusPPP

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

Definition at line 207 of file ITkSiSpacePointsSeedMaker.h.

207{this, "seedScoreBonusPPP", -200.};

◆ m_seedScoreBonusSSS

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

Definition at line 208 of file ITkSiSpacePointsSeedMaker.h.

208{this, "seedScoreBonusSSS", -400.};

◆ 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.

308{0.};

◆ 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.

309{0.};

◆ m_spacepointsOverlap

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

Definition at line 169 of file ITkSiSpacePointsSeedMaker.h.

169{this, "SpacePointsOverlapName", "OverlapSpacePoints"};

◆ 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.

168{this, "SpacePointsPixelName", "ITkPixelSpacePoints", "Pixel space points container"};

◆ 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.

167{this, "SpacePointsStripName", "ITkStripSpacePoints", "Strip space points container"};

◆ m_strip

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

Definition at line 179 of file ITkSiSpacePointsSeedMaker.h.

179{this, "useStrip", true};

◆ 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_treeFolder

std::string ITk::SiSpacePointsSeedMaker::m_treeFolder
private

Definition at line 262 of file ITkSiSpacePointsSeedMaker.h.

◆ m_treeName

std::string ITk::SiSpacePointsSeedMaker::m_treeName
private

Definition at line 261 of file ITkSiSpacePointsSeedMaker.h.

◆ m_umax

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

Definition at line 230 of file ITkSiSpacePointsSeedMaker.h.

230{this, "minSeedsQuality", 0.};

◆ m_useOverlap

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

Definition at line 180 of file ITkSiSpacePointsSeedMaker.h.

180{this, "useOverlapSpCollection", true};

◆ m_useSeedConfirmation

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

Definition at line 222 of file ITkSiSpacePointsSeedMaker.h.

222{this, "useSeedConfirmation", false};

◆ 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.

256{this, "WriteNtuple", false, "Flag to write Validation Ntuples"};

◆ m_zmax

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

Definition at line 192 of file ITkSiSpacePointsSeedMaker.h.

192{this , "maxZ", +250.};

◆ m_zmaxPPP

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

Definition at line 215 of file ITkSiSpacePointsSeedMaker.h.

215{this, "maxZPPP", 2700.};

◆ m_zmaxSSS

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

Definition at line 218 of file ITkSiSpacePointsSeedMaker.h.

218{this, "maxZSSS", 2700.};

◆ m_zmin

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

Definition at line 191 of file ITkSiSpacePointsSeedMaker.h.

191{this, "minZ", -250.};

The documentation for this class was generated from the following files: