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 ATLAS_THREAD_SAFE
TString m_treeFolder ATLAS_THREAD_SAFE
float m_d0 ATLAS_THREAD_SAFE = 0
float m_z0 ATLAS_THREAD_SAFE = 0
float m_pt ATLAS_THREAD_SAFE = 0
float m_eta ATLAS_THREAD_SAFE = 0
double m_x1 ATLAS_THREAD_SAFE = 0
double m_x2 ATLAS_THREAD_SAFE = 0
double m_x3 ATLAS_THREAD_SAFE = 0
double m_y1 ATLAS_THREAD_SAFE = 0
double m_y2 ATLAS_THREAD_SAFE = 0
double m_y3 ATLAS_THREAD_SAFE = 0
double m_z1 ATLAS_THREAD_SAFE = 0
double m_z2 ATLAS_THREAD_SAFE = 0
double m_z3 ATLAS_THREAD_SAFE = 0
double m_r1 ATLAS_THREAD_SAFE = 0
double m_r2 ATLAS_THREAD_SAFE = 0
double m_r3 ATLAS_THREAD_SAFE = 0
float m_quality ATLAS_THREAD_SAFE = 0
int m_type ATLAS_THREAD_SAFE = 0
double m_dzdr_t ATLAS_THREAD_SAFE = 0
double m_dzdr_b ATLAS_THREAD_SAFE = 0
bool m_givesTrack ATLAS_THREAD_SAFE = 0
float m_trackPt ATLAS_THREAD_SAFE = 0
float m_trackEta ATLAS_THREAD_SAFE = 0
long m_eventNumber ATLAS_THREAD_SAFE = 0
Binning parameters
int m_nBinsR {0}
 number of bins in the radial coordinate
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
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
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 2746 of file ITkSiSpacePointsSeedMaker.cxx.

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

◆ 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)
468
471
473 data.zminU = m_zmin;
474 data.zmaxU = m_zmax;
476 int mode = 2;
477 if (lv.begin() != lv.end())
478 mode = 3;
483 bool newv = newVertices(data, lv);
485 if (newv || !data.state || data.nspoint != 3 || data.mode != mode || data.nlist)
486 {
487 data.i_ITkSeedEnd = data.i_ITkSeeds.begin();
488 data.state = 1;
489 data.nspoint = 3;
490 data.nlist = 0;
491 data.mode = mode;
492 data.endlist = true;
493 data.fvNmin = 0;
494 data.fNmin = 0;
495 data.zMin = 0;
497 }
498
501 data.i_ITkSeed = data.i_ITkSeeds.begin();
502
503 if (msgLvl(MSG::DEBUG))
504 {
505 data.nprint = 1;
506 dump(data, msg(MSG::DEBUG));
507 }
508}
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)
519
522
525 data.zminU = ZVertex[0];
526 if (data.zminU < m_zmin)
527 data.zminU = m_zmin;
528 data.zmaxU = ZVertex[1];
529 if (data.zmaxU > m_zmax)
530 data.zmaxU = m_zmax;
531
533 int mode = 2;
534 if (lv.begin() != lv.end())
535 mode = 3;
540 bool newv = newVertices(data, lv);
542 if (newv || !data.state || data.nspoint != 3 || data.mode != mode || data.nlist)
543 {
544 data.i_ITkSeedEnd = data.i_ITkSeeds.begin();
545 data.state = 1;
546 data.nspoint = 3;
547 data.nlist = 0;
548 data.mode = mode;
549 data.endlist = true;
550 data.fvNmin = 0;
551 data.fNmin = 0;
552 data.zMin = 0;
554 }
557 data.i_ITkSeed = data.i_ITkSeeds.begin();
558
559 if (msgLvl(MSG::DEBUG))
560 {
561 data.nprint = 1;
562 dump(data, msg(MSG::DEBUG));
563 }
564}

◆ findNext()

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

Definition at line 769 of file ITkSiSpacePointsSeedMaker.cxx.

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

◆ findVSp()

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

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

call fillLists to repopulate the candidate space points

Definition at line 572 of file ITkSiSpacePointsSeedMaker.cxx.

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

◆ getWriteNtupleBoolProperty()

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

Definition at line 3416 of file ITkSiSpacePointsSeedMaker.cxx.

3417{
3418 return m_writeNtuple;
3419}

◆ 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
84 ATH_CHECK( m_thistSvc.retrieve() );
85
86 m_treeName = (std::string("SeedTree_")+name());
87 std::replace( m_treeName.begin(), m_treeName.end(), '.', '_' );
88
89 m_outputTree = new TTree( m_treeName.c_str() , "SeedMakerValTool");
90
91 m_outputTree->Branch("eventNumber", &m_eventNumber,"eventNumber/L");
92 m_outputTree->Branch("d0", &m_d0);
93 m_outputTree->Branch("z0", &m_z0);
94 m_outputTree->Branch("pt", &m_pt);
95 m_outputTree->Branch("eta", &m_eta);
96 m_outputTree->Branch("x1", &m_x1);
97 m_outputTree->Branch("x2", &m_x2);
98 m_outputTree->Branch("x3", &m_x3);
99 m_outputTree->Branch("y1", &m_y1);
100 m_outputTree->Branch("y2", &m_y2);
101 m_outputTree->Branch("y3", &m_y3);
102 m_outputTree->Branch("z1", &m_z1);
103 m_outputTree->Branch("z2", &m_z2);
104 m_outputTree->Branch("z3", &m_z3);
105 m_outputTree->Branch("r1", &m_r1);
106 m_outputTree->Branch("r2", &m_r2);
107 m_outputTree->Branch("r3", &m_r3);
108 m_outputTree->Branch("quality", &m_quality);
109 m_outputTree->Branch("seedType", &m_type);
110 m_outputTree->Branch("givesTrack", &m_givesTrack);
111 m_outputTree->Branch("dzdr_b", &m_dzdr_b);
112 m_outputTree->Branch("dzdr_t", &m_dzdr_t);
113 m_outputTree->Branch("track_pt", &m_trackPt);
114 m_outputTree->Branch("track_eta", &m_trackEta);
115
116 TString fullTreeName = m_treeFolder + m_treeName;
117
118 ATH_CHECK( m_thistSvc->regTree( fullTreeName.Data(), m_outputTree ) );
119
120 }
121
122
123 return sc;
124}
#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 2950 of file ITkSiSpacePointsSeedMaker.cxx.

2951{
2952 int seedArrayPerSPSize = (m_maxOneSizePPP > m_maxOneSizeSSS ? m_maxOneSizePPP : m_maxOneSizeSSS);
2954 seedArrayPerSPSize = 50;
2955 data.initialize(EventData::ToolType::ITk,
2957 seedArrayPerSPSize,
2958 0,
2959 m_nBinsR,
2960 0,
2963 m_checketa);
2964
2966
2968 double magField[3]{0, 0, 0};
2969 double globalPos[3] = {10., 10., 0.};
2970
2971 MagField::AtlasFieldCache fieldCache;
2972 SG::ReadCondHandle<AtlasFieldCacheCondObj> readHandle{m_fieldCondObjInputKey, ctx};
2973 const AtlasFieldCacheCondObj *fieldCondObj{*readHandle};
2974 if (fieldCondObj == nullptr) {
2975 ATH_MSG_ERROR("ITk::SiSpacePointsSeedMaker: Failed to retrieve AtlasFieldCacheCondObj with key " << m_fieldCondObjInputKey.key());
2976 return;
2977 }
2978
2979 fieldCondObj->getInitializedCache(fieldCache);
2980
2981 if (fieldCache.solenoidOn()) {
2983 fieldCache.getFieldZR(globalPos, magField);
2994 data.K = 2. / (300. * magField[2]);
2995 } else {
2996 data.K = 2. / (300. * 5.);
2997 }
2998
3003 data.ipt2K = m_ipt2 / (data.K * data.K);
3005 data.ipt2C = m_ipt2 * m_COF;
3006 data.COFK = m_COF * (data.K * data.K);
3008 data.bField[0] = magField[0];
3009 data.bField[1] = magField[1];
3010 data.bField[2] = magField[2];
3011
3012}
#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 3354 of file ITkSiSpacePointsSeedMaker.cxx.

3356{
3357
3359 if (bottomSP->spacepoint->clusterList().second)
3360 {
3361 return (quality < m_seedScoreThresholdSSSConfirmationSeed);
3362 }
3364 else if (!topSP->spacepoint->clusterList().second)
3365 {
3366 return (quality < m_seedScoreThresholdPPPConfirmationSeed);
3367 }
3369 else
3370 return (quality < 0.);
3371}

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

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

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

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

◆ newOneSeedWithCurvaturesComparison()

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

Definition at line 2660 of file ITkSiSpacePointsSeedMaker.cxx.

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

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

3218{
3219 static const float curvatureInterval = .00003;
3220 bool bottomSPisPixel = !SPb->spacepoint->clusterList().second;
3221 float bottomSPQuality = SPb->quality();
3222 float centralSPQuality = SP0->quality();
3223
3225 if (data.ITkCmSp.size() > 2)
3226 std::sort(data.ITkCmSp.begin(), data.ITkCmSp.end(), comCurvature());
3227
3228 float bottomR = SPb->radius();
3229 float bottomZ = SPb->z();
3230
3231 std::vector<std::pair<float, SiSpacePointForSeed *>>::iterator it_otherSP;
3232 std::vector<std::pair<float, SiSpacePointForSeed *>>::iterator it_commonTopSP = data.ITkCmSp.begin(), ie = data.ITkCmSp.end();
3233 std::vector<std::pair<float, SiSpacePointForSeed *>>::iterator it_startInnerLoop = it_commonTopSP;
3234
3236 for (; it_commonTopSP != ie; ++it_commonTopSP)
3237 {
3238
3239 SiSpacePointForSeed *SPt = (*it_commonTopSP).second;
3241 float seedIP = SPt->param();
3242 float seedQuality = seedIP + SPt->scorePenalty();
3243 float originalSeedQuality = seedQuality;
3244
3245 if (m_maxdImpact > 50)
3246 { //This only applies to LRT
3247
3248 float topR = SPt->radius();
3249 float topZ = SPt->z();
3250
3251 float Zot = std::abs(topR - bottomR) > 10e-9 ? bottomZ - (bottomR - originalSeedQuality) * ((topZ - bottomZ) / (topR - bottomR)) : bottomZ;
3252
3253 float theta1 = std::abs(topR - bottomR) > 10e-9 ? std::atan2(topR - bottomR, topZ - bottomZ) : 0.;
3254 float eta1 = theta1 > 0 ? -std::log(std::tan(.5 * theta1)) : 0.;
3255
3256 float theta0 = seedIP > 0 ? std::atan2(seedIP, Zot) : 0;
3257 float eta0 = theta0 > 0 ? -std::log(std::tan(.5 * theta0)) : 0.;
3258
3259 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
3260 //calculate weighted average of d0 and deltaEta, normalized by their maximum values
3261 float f = std::min(0.5, originalSeedQuality / 200.); //0.5 and 200 are parameters chosen from a grid scan to optimize efficiency
3262 seedQuality *= (1 - f) / 300.;
3263 seedQuality += f * deltaEta / 2.5;
3264 }
3265
3266 bool topSPisPixel = !SPt->spacepoint->clusterList().second;
3267
3269 const Trk::Surface *surfaceTopSP = SPt->sur();
3270 float radiusTopSP = SPt->radius();
3272 float minCurvature = (*it_commonTopSP).first - curvatureInterval;
3273 float maxCurvature = (*it_commonTopSP).first + curvatureInterval;
3274
3281
3283 if (!bottomSPisPixel)
3284 seedQuality += m_seedScoreBonusSSS;
3286 else if (topSPisPixel)
3287 seedQuality += m_seedScoreBonusPPP;
3288
3294
3295 for (it_otherSP = it_startInnerLoop; it_otherSP != ie; ++it_otherSP)
3296 {
3298 if (it_otherSP == it_commonTopSP)
3299 continue;
3302 if ((*it_otherSP).first < minCurvature)
3303 {
3304 it_startInnerLoop = it_otherSP;
3305 ++it_startInnerLoop;
3306 continue;
3307 }
3309 if ((*it_otherSP).first > maxCurvature)
3310 break;
3312 if ((*it_otherSP).second->sur() == surfaceTopSP)
3313 continue;
3315 float radiusOtherSP = (*it_otherSP).second->radius();
3316 if (std::abs(radiusOtherSP - radiusTopSP) < m_drminSeedConf)
3317 continue;
3318 // if we have a confirmation seed, we improve the score of the seed.
3319 seedQuality += m_seedScoreBonusConfirmationSeed;
3320 // apply confirmation bonus only once
3321 break;
3322 }
3323
3325 if (seedQuality > data.maxScore)
3326 continue;
3327
3330 if (bottomSPisPixel != topSPisPixel)
3331 {
3332 if (seedQuality > 0. ||
3333 (seedQuality > bottomSPQuality && seedQuality > centralSPQuality && seedQuality > SPt->quality()))
3334 continue;
3335 }
3338 if (!isConfirmedSeed(SPb, SPt, seedQuality))
3339 {
3341 double maxdImpact = m_maxdImpact - (m_dImpactCutSlopeUnconfirmedPPP * SPt->scorePenalty());
3343 if (!bottomSPisPixel)
3344 maxdImpact = m_maxdImpactSSS - (m_dImpactCutSlopeUnconfirmedSSS * SPt->scorePenalty());
3345 if (seedIP > maxdImpact)
3346 continue;
3347 }
3349 newOneSeed(data, SPb, SP0, SPt, Zob, seedQuality);
3350 }
3351 data.ITkCmSp.clear();
3352}
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 3018 of file ITkSiSpacePointsSeedMaker.cxx.

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

◆ newRegion() [1/2]

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

build the r-binning.

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

Definition at line 313 of file ITkSiSpacePointsSeedMaker.cxx.

315{
316 if (!m_pixel && !m_strip)
317 return;
318
319 if (not data.initialized)
321 erase(data);
322 data.iteration = 0;
323 data.trigger = false;
324 data.dzdrmin = m_dzdrmin0;
325 data.dzdrmax = m_dzdrmax0;
326 data.maxScore = m_maxScore;
327 data.r_first = 0;
328 data.checketa = false;
329
331 float oneOverBinSizeR = 1. / m_binSizeR; //was float irstep = 1.f/m_binSizeR;
332 int maxBinR = m_nBinsR - 1; //was int irmax = m_nBinsR-1;
333
335 data.i_ITkSpacePointForSeed = data.l_ITkSpacePointForSeed.begin();
336
337 SG::ReadHandle<Trk::PRDtoTrackMap> prd_to_track_map;
338 const Trk::PRDtoTrackMap *prd_to_track_map_cptr = nullptr;
339 if (!m_prdToTrackMap.key().empty())
340 {
341 prd_to_track_map = SG::ReadHandle<Trk::PRDtoTrackMap>(m_prdToTrackMap, ctx);
342 if (!prd_to_track_map.isValid())
343 {
344 ATH_MSG_ERROR("Failed to read PRD to track association map: " << m_prdToTrackMap.key());
345 }
346 prd_to_track_map_cptr = prd_to_track_map.cptr();
347 }
348
349 // Get pixels space points containers from store gate
350 //
351 if (m_pixel && !vPixel.empty())
352 {
353
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 2933 of file ITkSiSpacePointsSeedMaker.cxx.

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

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

2863{
2864 std::array<float, 15> r;
2865 return newSpacePoint(data, sp, r, true);
2866}

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

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

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

2795{
2797 if (not data.initialized)
2799
2800 if (data.nspoint == 3)
2801 {
2802 do
2803 {
2805 if (data.i_ITkSeed == data.i_ITkSeedEnd)
2806 {
2811 findNext(data);
2813 //cppcheck-suppress identicalInnerCondition
2814 if (data.i_ITkSeed == data.i_ITkSeedEnd)
2815 return nullptr;
2816 }
2817
2819 } while (!(*data.i_ITkSeed++).set3(data.seedOutput, 1./(1000. * data.K)));
2821 return &data.seedOutput;
2822 }
2823 else
2824 {
2826 if (data.i_ITkSeed == data.i_ITkSeedEnd)
2827 {
2828 findNext(data);
2829 //cppcheck-suppress identicalInnerCondition
2830 if (data.i_ITkSeed == data.i_ITkSeedEnd)
2831 return nullptr;
2832 }
2833 (*data.i_ITkSeed++).set2(data.seedOutput);
2834 return &data.seedOutput;
2835 }
2836 return nullptr;
2837}
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 std::array<std::array<int, arraySizeNeighbourBins>, arraySizePhiZ> neighbourCellsBottom{};
1501 std::array<std::array<int, arraySizeNeighbourBins>, arraySizePhiZ> neighbourCellsTop{};
1502
1503 if (isPixel)
1504 {
1506 nNeighbourCellsBottom = m_nNeighbourCellsBottomPPP;
1507 nNeighbourCellsTop = m_nNeighbourCellsTopPPP;
1508 neighbourCellsBottom = m_neighbourCellsBottomPPP;
1509 neighbourCellsTop = m_neighbourCellsTopPPP;
1510 }
1511 else
1512 {
1514 nNeighbourCellsBottom = m_nNeighbourCellsBottomSSS;
1515 nNeighbourCellsTop = m_nNeighbourCellsTopSSS;
1516 neighbourCellsBottom = m_neighbourCellsBottomSSS;
1517 neighbourCellsTop = m_neighbourCellsTopSSS;
1518 }
1519
1521 int nseed = 0;
1523 data.endlist = true;
1524
1526 for (int phiBin = data.fNmin; phiBin <= nPhiBins; ++phiBin)
1527 {
1528
1530 int z = (m_fastTracking && m_pixel) ? 2 : 0;
1532 if (!data.endlist)
1533 z = data.zMin;
1534
1538 for (; z < arraySizeZ; ++z)
1539 {
1540
1541 if (m_fastTracking && m_pixel)
1542 {
1543 data.RTmax = RTmax[ zBinIndex[z] ];
1544 data.RTmin = RTmin[ zBinIndex[z] ];
1545 }
1546
1547 int phiZbin = phiBin * arraySizeZ + zBinIndex[z];
1548
1550 if (!data.rfz_map[phiZbin])
1551 continue;
1552
1555 int numberBottomCells = 0;
1556 int numberTopCells = 0;
1557
1562 for (int neighbourCellNumber = 0; neighbourCellNumber < nNeighbourCellsBottom[phiZbin]; ++neighbourCellNumber)
1563 {
1564
1565 int theNeighbourCell = neighbourCellsBottom[phiZbin][neighbourCellNumber];
1567 if (!data.rfz_map[theNeighbourCell])
1568 continue;
1570 iter_bottomCands[numberBottomCells] = data.rfz_ITkSorted[theNeighbourCell].begin();
1571 iter_endBottomCands[numberBottomCells++] = data.rfz_ITkSorted[theNeighbourCell].end();
1572 }
1573
1578 for (int neighbourCellNumber = 0; neighbourCellNumber < nNeighbourCellsTop[phiZbin]; ++neighbourCellNumber)
1579 {
1580
1581 int theNeighbourCell = neighbourCellsTop[phiZbin][neighbourCellNumber];
1583 if (!data.rfz_map[theNeighbourCell])
1584 continue;
1586 iter_topCands[numberTopCells] = data.rfz_ITkSorted[theNeighbourCell].begin();
1587 iter_endTopCands[numberTopCells++] = data.rfz_ITkSorted[theNeighbourCell].end();
1588 }
1589
1591 if (!data.trigger)
1592 {
1593 if (isPixel)
1594 production3SpPPP(data, iter_bottomCands, iter_endBottomCands, iter_topCands, iter_endTopCands, numberBottomCells, numberTopCells, nseed);
1595 else
1596 production3SpSSS(data, iter_bottomCands, iter_endBottomCands, iter_topCands, iter_endTopCands, numberBottomCells, numberTopCells, nseed);
1597 }
1598 else
1599 production3SpTrigger(data, iter_bottomCands, iter_endBottomCands, iter_topCands, iter_endTopCands, numberBottomCells, numberTopCells, nseed);
1600 }
1601
1608 if (nseed >= m_maxsize)
1609 {
1610 data.endlist = false;
1611 data.fNmin = phiBin + 1;
1612 return;
1613 }
1614 }
1615
1617 data.endlist = true;
1618}
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 1624 of file ITkSiSpacePointsSeedMaker.cxx.

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

2066{
2067
2073
2075 std::vector<SiSpacePointForSeed *>::iterator iter_centralSP = iter_bottomCands[0];
2076 std::vector<SiSpacePointForSeed *>::iterator iter_otherSP;
2077
2083
2085 for (; iter_centralSP != iter_endBottomCands[0]; ++iter_centralSP)
2086 {
2087 if((*iter_centralSP)->radius() > data.RTmin) break;
2088 }
2089
2092 iter_topCands[0] = iter_centralSP;
2093 ++iter_topCands[0];
2094
2096 const float ipt2K = data.ipt2K;
2097 const float ipt2C = data.ipt2C;
2098 const float COFK = data.COFK;
2099 const float maxd0cut = m_maxdImpactSSS;
2100 const float zmax = data.zmaxU;
2101 data.ITkCmSp.clear();
2102
2105 size_t SPcapacity = data.ITkSP.size();
2106
2108 for (; iter_centralSP != iter_endBottomCands[0]; ++iter_centralSP)
2109 {
2110
2111 const float &R = (*iter_centralSP)->radius();
2112
2113 if(R > data.RTmax) break;
2114
2116 const float &X = (*iter_centralSP)->x();
2117 const float &Y = (*iter_centralSP)->y();
2118 const float &Z = (*iter_centralSP)->z();
2119
2122 double absZ = std::abs(Z);
2124 if (absZ > m_zmaxSSS)
2125 continue;
2126
2129 size_t Nt = 0;
2130
2133 for (int cell = 0; cell < numberTopCells; ++cell)
2134 {
2135
2136 for (iter_otherSP = iter_topCands[cell]; iter_otherSP != iter_endTopCands[cell]; ++iter_otherSP)
2137 {
2139 float Rt = (*iter_otherSP)->radius();
2140 float dR = Rt - R;
2141 if (dR >= m_drminSSS)
2142 break;
2143 }
2144 iter_topCands[cell] = iter_otherSP;
2145
2147 for (iter_otherSP = iter_topCands[cell]; iter_otherSP != iter_endTopCands[cell]; ++iter_otherSP)
2148 {
2149
2151 float Rt = (*iter_otherSP)->radius();
2152 float dR = Rt - R;
2154 if (dR > m_drmaxSSS)
2155 break;
2156
2157 const float dz = (*iter_otherSP)->z() - Z;
2158 const float dZdR = dz / dR;
2159
2162 const float z0 = Z - R * dZdR;
2163 if (std::abs(dz) > m_dzmaxSSS || std::abs(z0) > zmax)
2164 continue;
2165
2167 if(m_isLRT){
2168 float Ri = 1./R;
2169 const float ax = X*Ri;
2170 const float ay = Y*Ri;
2171 float VR = m_maxdImpact*Ri*Ri ;
2172 float dx = (*iter_otherSP)->x() - X;
2173 float dy = (*iter_otherSP)->y() - Y;
2174 float x = dx * ax + dy * ay;
2175 float y = dy * ax - dx * ay;
2176
2177 if(std::abs(R*y) > maxd0cut * x) {
2178 float r2 = 1. / (x * x + y * y);
2179 float u = x*r2 ;
2180 float v = y*r2 ;
2181 const float V0 = (y < 0.) ? VR: -VR;
2182 float A = (v-V0)/(u+Ri) ;
2183 float B = V0+A*Ri ;
2184 if((B*B) > (ipt2K*(1.+A*A))) continue;
2185 }
2186 }
2187
2189 data.ITkSP[Nt] = (*iter_otherSP);
2190 data.ITkSP[Nt]->setDZDR(dZdR);
2194 if (++Nt == SPcapacity)
2195 {
2196 data.resizeSPCont();
2197 SPcapacity = data.ITkSP.size();
2198 }
2199 }
2200 }
2201
2203 if (!Nt)
2204 continue;
2205
2209 size_t Nb = Nt;
2210
2213 for (int cell = 0; cell < numberBottomCells; ++cell)
2214 {
2215
2216 for(iter_otherSP=iter_bottomCands[cell]; iter_otherSP!=iter_endBottomCands[cell]; ++iter_otherSP) {
2217 if((R-(*iter_otherSP)->radius()) <= m_drmaxSSS) break;
2218 }
2219 iter_bottomCands[cell]=iter_otherSP;
2220
2222 for (; iter_otherSP != iter_endBottomCands[cell]; ++iter_otherSP)
2223 {
2224
2226 const float &Rb = (*iter_otherSP)->radius();
2227 float dR = R - Rb;
2228
2230 if (dR < m_drminSSS)
2231 break;
2232
2233 const float dz = Z - (*iter_otherSP)->z();
2234 const float dZdR = dz / dR;
2235
2238 const float z0 = Z - R * dZdR;
2239 if (std::abs(dz) > m_dzmaxSSS || std::abs(z0) > zmax)
2240 continue;
2241
2243 if(m_isLRT){
2244 float Ri = 1./R;
2245 const float ax = X*Ri;
2246 const float ay = Y*Ri;
2247 float VR = m_maxdImpact*Ri*Ri ;
2248 float dx = (*iter_otherSP)->x() - X;
2249 float dy = (*iter_otherSP)->y() - Y;
2250 float x = dx * ax + dy * ay;
2251 float y = dy * ax - dx * ay;
2252
2253 if(std::abs(R*y) > -maxd0cut * x) {
2254 float r2 = 1. / (x * x + y * y);
2255 float u = x*r2 ;
2256 float v = y*r2 ;
2257 const float V0 = (y < 0.) ? VR: -VR;
2258 float A = (v-V0)/(u+Ri) ;
2259 float B = V0+A*Ri ;
2260 if((B*B) > (ipt2K*(1.+A*A))) continue;
2261 }
2262 }
2263
2265 data.ITkSP[Nb] = (*iter_otherSP);
2266 data.ITkSP[Nb]->setDZDR(dZdR);
2270 if (++Nb == SPcapacity)
2271 {
2272 data.resizeSPCont();
2273 SPcapacity = data.ITkSP.size();
2274 }
2275 }
2276 }
2277
2279 if (!(Nb - Nt))
2280 continue;
2281
2283 float covr0 = (*iter_centralSP)->covr();
2284 float covz0 = (*iter_centralSP)->covz();
2285
2287 float ax = X / R;
2288 float ay = Y / R;
2289
2292 for (size_t i = 0; i < Nb; ++i)
2293 {
2294
2295 SiSpacePointForSeed *sp = data.ITkSP[i];
2296
2299 float dx = sp->x() - X;
2300 float dy = sp->y() - Y;
2301 float dz = sp->z() - Z;
2302 float x = dx * ax + dy * ay;
2303 float y = dy * ax - dx * ay;
2304
2306 float r2 = 1. / (x * x + y * y);
2308 float dr = std::sqrt(r2);
2311 float tz = dz * dr;
2312
2315 if (i >= Nt)
2316 tz = -tz;
2317
2319 data.X[i] = x;
2320 data.Y[i] = y;
2321 data.Tz[i] = tz;
2322 data.Zo[i] = Z - R * tz;
2323 data.R[i] = dr;
2324 data.U[i] = x * r2;
2325 data.V[i] = y * r2;
2326 data.Er[i] = ((covz0 + sp->covz()) + (tz * tz) * (covr0 + sp->covr())) * r2;
2327 }
2328
2329 data.nOneSeeds = 0;
2330 data.nOneSeedsQ = 0;
2331 data.ITkMapOneSeeds.clear();
2332 data.ITkMapOneSeedsQ.clear();
2333
2336 for (size_t b = Nt; b < Nb; ++b)
2337 {
2338
2340 float Zob = data.Zo[b];
2341 float Tzb = data.Tz[b];
2342 float Rb2r = data.R[b] * covr0;
2343 float Rb2z = data.R[b] * covz0;
2344 float Erb = data.Er[b];
2345 float Vb = data.V[b];
2346 float Ub = data.U[b];
2347 float Tzb2 = (1. + Tzb * Tzb);
2348 float sTzb2 = std::sqrt(Tzb2);
2349 float Se = 1. / std::sqrt(Tzb2);
2350 float Ce = Se * Tzb;
2351 float Sx = Se * ax;
2352 float Sy = Se * ay;
2353
2354 float sigmaSquaredScatteringPtDependent = Tzb2 * COFK;
2355 float sigmaSquaredScatteringMinPt = Tzb2 * ipt2C;
2358 float d0max = maxd0cut;
2359
2361 for (size_t t = 0; t < Nt; ++t)
2362 {
2363
2385
2386 // Trigger point
2387 //
2388 float dU0 = data.U[t] - Ub;
2389 if (dU0 == 0.)
2390 continue;
2391 float A0 = (data.V[t] - Vb) / dU0;
2392
2393 float Cn = Ce * std::sqrt(1. + A0 * A0);
2394
2395 float dn[3] = {Sx - Sy * A0, Sx * A0 + Sy, Cn};
2396 float rn[3];
2397 if (!(*iter_centralSP)->coordinates(dn, rn))
2398 continue;
2399
2400 // Bottom point
2401 //
2402 float B0 = 2. * (Vb - A0 * Ub);
2403 float Cb = 1. - B0 * data.Y[b];
2404 float Sb = A0 + B0 * data.X[b];
2405 float db[3] = {Sx * Cb - Sy * Sb, Sx * Sb + Sy * Cb, Cn};
2406 float rb[3];
2407 if (!data.ITkSP[b]->coordinates(db, rb))
2408 continue;
2409
2410 // Top point
2411 //
2412 float Ct = 1. - B0 * data.Y[t];
2413 float St = A0 + B0 * data.X[t];
2414 float dt[3] = {Sx * Ct - Sy * St, Sx * St + Sy * Ct, Cn};
2415 float rt[3];
2416 if (!data.ITkSP[t]->coordinates(dt, rt))
2417 continue;
2418
2419 float xb = rb[0] - rn[0];
2420 float yb = rb[1] - rn[1];
2421 float zb = rb[2] - rn[2];
2422 float xt = rt[0] - rn[0];
2423 float yt = rt[1] - rn[1];
2424 float zt = rt[2] - rn[2];
2425
2426 float rb2 = 1. / (xb * xb + yb * yb);
2427 float rt2 = 1. / (xt * xt + yt * yt);
2428
2429 float tb = -zb * std::sqrt(rb2);
2430 float tz = zt * std::sqrt(rt2);
2431
2436
2438 float meanOneOverTanTheta = (tb + tz) / 2.;
2439
2441 float sigmaSquaredSpacePointErrors = Erb + data.Er[t]
2442 + 2 * Rb2z * data.R[t]
2443 + 2 * Rb2r * data.R[t] * meanOneOverTanTheta * meanOneOverTanTheta; // mixed term with r-uncertainy on central SP
2444
2446 float remainingSquaredDelta = (tb - tz) * (tb - tz) - sigmaSquaredSpacePointErrors;
2447
2450 if (remainingSquaredDelta - sigmaSquaredScatteringMinPt > 0)
2451 continue;
2452
2453 float Rn = std::sqrt(rn[0] * rn[0] + rn[1] * rn[1]);
2454 float Ax = rn[0] / Rn;
2455 float Ay = rn[1] / Rn;
2456
2457 float ub = (xb * Ax + yb * Ay) * rb2;
2458 float vb = (yb * Ax - xb * Ay) * rb2;
2459 float ut = (xt * Ax + yt * Ay) * rt2;
2460 float vt = (yt * Ax - xt * Ay) * rt2;
2461
2462 float dU = ut - ub;
2463 if (dU == 0.)
2464 continue;
2465 float A = (vt - vb) / dU;
2466 float onePlusAsquare = 1. + A * A;
2467 float B = vb - A * ub;
2468 float BSquare = B * B;
2469
2482 if (BSquare > ipt2K * onePlusAsquare || remainingSquaredDelta * onePlusAsquare > BSquare * sigmaSquaredScatteringPtDependent)
2483 continue;
2484
2501 float d0 = std::abs((A - B * Rn) * Rn);
2502
2504 if (d0 <= d0max)
2505 {
2507 float dr = std::sqrt(1 / rb2);
2508 if (data.R[t] < data.R[b])
2509 dr = std::sqrt(1 / rt2);
2513 data.ITkSP[t]->setScorePenalty(std::abs((tb - tz) / (dr * sTzb2)));
2514 data.ITkSP[t]->setParam(d0);
2515 float DR = std::sqrt( xt * xt + yt * yt + zt * zt ); // distance between top and central SP
2516 data.ITkSP[t]->setDR(DR);
2517
2519 data.ITkCmSp.emplace_back(B / std::sqrt(onePlusAsquare), data.ITkSP[t]);
2521 if (data.ITkCmSp.size() == 500)
2522 break;
2523 }
2524
2525 }
2527 if (!data.ITkCmSp.empty())
2528 {
2529 newOneSeedWithCurvaturesComparisonSSS(data, data.ITkSP[b], (*iter_centralSP), Zob);
2530 }
2531 }
2533 fillSeeds(data);
2534 nseed += data.fillOneSeeds;
2535
2536 }
2537}
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 2543 of file ITkSiSpacePointsSeedMaker.cxx.

2549{
2550 ATH_MSG_WARNING("ITk::SiSpacePointsSeedMaker::production3SpTrigger not implemented!");
2551}

◆ 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

◆ stripInform()

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

◆ writeNtuple()

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

Definition at line 3373 of file ITkSiSpacePointsSeedMaker.cxx.

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

Member Data Documentation

◆ ATLAS_THREAD_SAFE [1/26]

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

Definition at line 261 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [2/26]

TString m_treeFolder ITk::SiSpacePointsSeedMaker::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 262 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [3/26]

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

Definition at line 263 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [4/26]

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

Definition at line 264 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [5/26]

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

Definition at line 265 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [6/26]

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

Definition at line 266 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [7/26]

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

Definition at line 267 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [8/26]

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

Definition at line 268 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [9/26]

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

Definition at line 269 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [10/26]

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

Definition at line 270 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [11/26]

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

Definition at line 271 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [12/26]

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

Definition at line 272 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [13/26]

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

Definition at line 273 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [14/26]

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

Definition at line 274 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [15/26]

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

Definition at line 275 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [16/26]

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

Definition at line 276 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [17/26]

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

Definition at line 277 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [18/26]

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

Definition at line 278 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [19/26]

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

Definition at line 279 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [20/26]

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

Definition at line 280 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [21/26]

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

Definition at line 281 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [22/26]

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

Definition at line 282 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [23/26]

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

Definition at line 283 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [24/26]

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

Definition at line 284 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [25/26]

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

Definition at line 285 of file ITkSiSpacePointsSeedMaker.h.

◆ ATLAS_THREAD_SAFE [26/26]

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

Definition at line 286 of file ITkSiSpacePointsSeedMaker.h.

◆ m_alwaysKeepConfirmedPixelSeeds

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

Definition at line 204 of file ITkSiSpacePointsSeedMaker.h.

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_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: