ATLAS Offline Software
Loading...
Searching...
No Matches
InDet::SiSpacePointsSeedMaker_ATLxk Class Referencefinal

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

#include <SiSpacePointsSeedMaker_ATLxk.h>

Inheritance diagram for InDet::SiSpacePointsSeedMaker_ATLxk:

Public Member Functions

Standard tool methods
 SiSpacePointsSeedMaker_ATLxk (const std::string &, const std::string &, const IInterface *)
 Constructor.
virtual ~SiSpacePointsSeedMaker_ATLxk ()=default
virtual StatusCode initialize () override
 Initialisation.
virtual StatusCode finalize () override
 Finalize.
Methods to initialize tool for new event or region
virtual void newEvent (const EventContext &ctx, EventData &data, int iteration) const override
 Initialize tool for new event.
virtual void newRegion (const EventContext &ctx, EventData &data, const std::vector< IdentifierHash > &vPixel, const std::vector< IdentifierHash > &vSCT) const override
 Initialize tool for new region.
virtual void newRegion (const EventContext &ctx, SiSpacePointsSeedMakerEventData &data, const std::vector< IdentifierHash > &vPixel, const std::vector< IdentifierHash > &vSCT, 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 SiSpacePointsSeednext (const EventContext &ctx, EventData &data) const override
 This method will update the data.seedOutput member to be the next seed pointed at by the data.i_seed_Pro iterator over the data.l_seeds_Pro list.
virtual void writeNtuple (const SiSpacePointsSeed *seed, const Trk::Track *track, int seedType, long eventNumber) const override
 This method is called by the SiSPSeededTrackFinder algorithm to fill ntuples for seeds seen by the algorithm.
virtual bool getWriteNtupleBoolProperty () const override

Private Attributes

FloatProperty m_maxScore {this, "maximumAcceptedSeedScore", 100.}
 Maximum score to accept.
std::array< int, arraySizePhiZm_nNeighbourCellsBottom {}
 arrays associating bins to each other for SP formation
std::array< int, arraySizePhiZm_nNeighbourCellsTop {}
 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_neighbourCellsBottom {}
 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_neighbourCellsTop {}
 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, arraySizePhiZVm_nNeighboursVertexPhiZ {}
std::array< std::array< int, arraySizeNeighbourBinsVertex >, arraySizePhiZVm_neighboursVertexPhiZ {}
Data handles

Private data and methods

SG::ReadHandleKey< SpacePointContainerm_spacepointsPixel {this, "SpacePointsPixelName", "PixelSpacePoints", "Pixel space points container"}
SG::ReadHandleKey< SpacePointContainerm_spacepointsSCT {this, "SpacePointsSCTName", "SCT_SpacePoints", "SCT 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
 Read handle for conditions object to get the field cache.
Properties, which will not be changed after construction
BooleanProperty m_pixel {this, "usePixel", true}
BooleanProperty m_sct {this, "useSCT", true}
BooleanProperty m_useOverlap {this, "useOverlapSpCollection", true}
IntegerProperty m_maxsize {this, "maxSize", 50000}
IntegerProperty m_maxsizeSP {this, "maxSizeSP", 5000}
IntegerProperty m_maxOneSizeSSS {this, "maxSeedsForSpacePointStrips", 5}
 maximum number of seeds to keep per central space point.
IntegerProperty m_maxOneSizePPP {this, "maxSeedsForSpacePointPixels", 5}
BooleanProperty m_alwaysKeepConfirmedPixelSeeds {this, "alwaysKeepConfirmedPixelSeeds", false}
 This flag will lead to all confirmed seeds (seeds where a second compatible seed with a different top spacepoint is found) being kept, even in excess of maxSeedsForSpacePoint above.
BooleanProperty m_alwaysKeepConfirmedStripSeeds {this, "alwaysKeepConfirmedStripSeeds", false}
BooleanProperty m_optimisePhiBinning {this, "optimisePhiBinning", true}
 This flag will make the buildFrameWork method determine an optimal phi binning of the search regions based on the pt and IP cuts, assuming PPP and/or SSS passes are being run.
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_drmax {this, "maxdRadius", 270.}
FloatProperty m_zmin {this, "minZ", -250.}
FloatProperty m_zmax {this, "maxZ", +250.}
FloatProperty m_dzver {this, "maxdZver", 5.}
FloatProperty m_dzdrver {this, "maxdZdRver", .02}
Properties, which can be updated in buildFrameWork method which is called in initialize method
FloatProperty m_etamin {this, "etaMin", 0.}
FloatProperty m_r_rmax {this, "radMax", 600.}
FloatProperty m_binSizeR {this, "radStep", 2.}
FloatProperty m_drmin {this, "mindRadius", 5.}
FloatProperty m_maxdImpact {this, "maxdImpact", 10.}
FloatProperty m_maxdImpactSSS {this, "maxdImpactSSS", 50.}
FloatProperty m_dImpactCutSlopeUnconfirmedSSS {this, "dImpactCutSlopeUnconfirmedSSS", 1.0}
 these flags allow to dynamically tighten the d0 cut on non-confirmed seeds based on the penalty score they receive for kinking in the r-z plane.
FloatProperty m_dImpactCutSlopeUnconfirmedPPP {this, "dImpactCutSlopeUnconfirmedPPP", 0.}
FloatProperty m_maxdImpactDecays {this, "maxdImpactForDecays", 20.}
FloatProperty m_ptmin {this, "pTmin", 500.}
FloatProperty m_fieldScale {this, "fieldScale", 1.}
Properties, which can be updated in newEvent method. checketa is prepared in EventData.
BooleanProperty m_checketa {this, "checkEta", false}
FloatProperty m_seedScoreBonusPPP {this, "seedScoreBonusPPP", -200.}
 Scoring modifiers applied when ranking seeds.
FloatProperty m_seedScoreBonusSSS {this, "seedScoreBonusSSS", -400.}
FloatProperty m_seedScoreBonusConfirmationSeed {this, "seedScoreBonusConfirmationSeed", -200.}
Data member, which is not updated at all.
float m_drminv {20.}
Binning parameters
int m_nBinsR {0}
 number of bins in the radial coordinate
int m_maxPhiBin {0}
 number of bins in phi
int m_maxBinPhiVertex {0}
 number of bins in phi for vertices
float m_inverseBinSizePhi {0}
 cache the inverse bin size in phi which we use - needed to evaluate phi bin locations
float m_inverseBinSizePhiVertex {0}
 as above but for vertex
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.

Static Private Attributes

static constexpr float m_radiusCutIBL {43.}
 We detect IBL hits via the seed radial location.

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
 Dumps relevant information into the MsgStream.

Data members, which are updated only in buildFrameWork in initialize

float m_dzdrmin0 {0.}
 conversion factors and cached cut values
float m_dzdrmax0 {0.}
 implicitly store eta cut
float m_ipt {0.}
 inverse of 90% of the ptmin cut
float m_ipt2 {0.}
 inverse square of 90% of the pt min cut
static constexpr float m_COF {134*.05f*9}
 appears to be an approximated term related to multiple-scattering of particles traversing the ID during the seed formation

Disallow default instantiation, copy, assignment

Gaudi::Property< bool > m_writeNtuple {this, "WriteNtuple", false, "Flag to write Validation Ntuples"}
 Flag to write validation ntuples. Turned off by default.
ServiceHandle< ITHistSvc > m_thistSvc
TTree * m_outputTree
std::mutex m_mutex
std::string m_treeName
std::string m_treeFolder
float m_d0 ATLAS_THREAD_SAFE = 0
float m_z0 ATLAS_THREAD_SAFE = 0
float m_pt ATLAS_THREAD_SAFE = 0
float m_eta ATLAS_THREAD_SAFE = 0
double m_x1 ATLAS_THREAD_SAFE = 0
double m_x2 ATLAS_THREAD_SAFE = 0
double m_x3 ATLAS_THREAD_SAFE = 0
double m_y1 ATLAS_THREAD_SAFE = 0
double m_y2 ATLAS_THREAD_SAFE = 0
double m_y3 ATLAS_THREAD_SAFE = 0
double m_z1 ATLAS_THREAD_SAFE = 0
double m_z2 ATLAS_THREAD_SAFE = 0
double m_z3 ATLAS_THREAD_SAFE = 0
double m_r1 ATLAS_THREAD_SAFE = 0
double m_r2 ATLAS_THREAD_SAFE = 0
double m_r3 ATLAS_THREAD_SAFE = 0
float m_quality ATLAS_THREAD_SAFE = 0
int m_type ATLAS_THREAD_SAFE = 0
double m_dzdr_t ATLAS_THREAD_SAFE = 0
double m_dzdr_b ATLAS_THREAD_SAFE = 0
bool m_givesTrack ATLAS_THREAD_SAFE = 0
float m_trackPt ATLAS_THREAD_SAFE = 0
float m_trackEta ATLAS_THREAD_SAFE = 0
long m_eventNumber ATLAS_THREAD_SAFE = 0
 SiSpacePointsSeedMaker_ATLxk ()=delete
 SiSpacePointsSeedMaker_ATLxk (const SiSpacePointsSeedMaker_ATLxk &)=delete
SiSpacePointsSeedMaker_ATLxkoperator= (const SiSpacePointsSeedMaker_ATLxk &)=delete
MsgStream & dumpConditions (EventData &data, MsgStream &out) const
 Dumps conditions information into the MsgStream.
void buildFrameWork ()
 prepare several data members with cached cut values, conversion factors, binnings, etc
void buildBeamFrameWork (EventData &data) const
 Initiate beam frame work for seed generator.
SiSpacePointForSeednewSpacePoint (EventData &data, const Trk::SpacePoint *const &sp) const
 Create a SiSpacePointForSeed from the space point.
void newOneSeed (EventData &data, SiSpacePointForSeed *&p1, SiSpacePointForSeed *&p2, SiSpacePointForSeed *&p3, float z, float quality) const
 This inserts a seed into the set of saved seeds.
void newOneSeedWithCurvaturesComparison (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 fillSeeds (EventData &data) const
 fills the seeds from the mapOneSeeds_Pro member into the l_seeds_Pro member of the data object, applying some more quality requirements on the way.
void fillLists (EventData &data) const
 this method populates the data object's "histograms" (implemented as nested vectors).
void production2Sp (EventData &data) const
void production3Sp (EventData &data) const
 Top-level method for 3-SP seed production.
void production3Sp (EventData &data, std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &iter_bottomCands, std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &iter_endBottomCands, std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &iter_topCands, std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &iter_endTopCands, const int numberBottomCells, const int numberTopCells, int &nseed, const int zbin=-1) const
 : Seed production from space points.
void production3SpTrigger (EventData &data, std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &rb, std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &rbe, std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &rt, std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &rte, const int numberBottomCells, const int numberTopCells, int &nseed) const
 as above, but for the trigger
bool newVertices (EventData &data, const std::list< Trk::Vertex > &lV) const
 This method updates the EventData based on the passed list of vertices.
void findNext (EventData &data) const
 This method is called within next() when we are out of vertices.
bool isZCompatible (EventData &data, const float Zv, const float R, const float T) const
bool isUsed (const Trk::SpacePoint *sp, const Trk::PRDtoTrackMap &prd_to_track_map) const
void initializeEventData (EventData &data) const
bool isConfirmedSeed (const InDet::SiSpacePointForSeed *bottomSP, const InDet::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.
static MsgStream & dumpEvent (EventData &data, MsgStream &out)
 Dumps event information into the MsgStream.
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 *&p1, SiSpacePointForSeed *&p2, float z)
static void erase (EventData &data)
static void convertToBeamFrameWork (EventData &data, const Trk::SpacePoint *const &sp, std::array< float, 3 > &r)
 This method popualtes the r array with the space point's coordinates relative to the beam spot.

Detailed Description

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

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

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

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

Definition at line 59 of file SiSpacePointsSeedMaker_ATLxk.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 148 of file SiSpacePointsSeedMaker_ATLxk.h.

Constructor & Destructor Documentation

◆ SiSpacePointsSeedMaker_ATLxk() [1/3]

InDet::SiSpacePointsSeedMaker_ATLxk::SiSpacePointsSeedMaker_ATLxk ( const std::string & t,
const std::string & n,
const IInterface * p )

Constructor.

Definition at line 32 of file SiSpacePointsSeedMaker_ATLxk.cxx.

34 : base_class(t, n, p),
35 m_thistSvc("THistSvc", n),
36 m_outputTree(nullptr),
37 m_treeName(""),
38 m_treeFolder("/valNtuples/")
39{
40}

◆ ~SiSpacePointsSeedMaker_ATLxk()

virtual InDet::SiSpacePointsSeedMaker_ATLxk::~SiSpacePointsSeedMaker_ATLxk ( )
virtualdefault

◆ SiSpacePointsSeedMaker_ATLxk() [2/3]

InDet::SiSpacePointsSeedMaker_ATLxk::SiSpacePointsSeedMaker_ATLxk ( )
privatedelete

◆ SiSpacePointsSeedMaker_ATLxk() [3/3]

InDet::SiSpacePointsSeedMaker_ATLxk::SiSpacePointsSeedMaker_ATLxk ( const SiSpacePointsSeedMaker_ATLxk & )
privatedelete

Member Function Documentation

◆ azimuthalStep()

float InDet::SiSpacePointsSeedMaker_ATLxk::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 1341 of file SiSpacePointsSeedMaker_ATLxk.cxx.

1342{
1343 // Tell clang to optimize assuming that FP exceptions can trap.
1344 // Otherwise, it can vectorize the division, which can lead to
1345 // spurious division-by-zero traps from unused vector lanes.
1347
1351 float Rm = pTmin/.6f;
1352
1359 float worstCaseD0 = maxd0;
1360 if (maxd0 > Rmin) worstCaseD0 = Rmin;
1361
1362 float sI = std::abs(std::asin(worstCaseD0/Rmin) - std::asin(worstCaseD0/Rmax));
1363 float sF = std::abs(std::asin(std::min(1.f,Rmax/(2.f*Rm))) -
1364 std::asin(std::min(1.f,Rmin/(2.f*Rm))));
1365 return sI+sF;
1366}
#define CXXUTILS_TRAPPING_FP
Definition trapping_fp.h:24

◆ buildBeamFrameWork()

void InDet::SiSpacePointsSeedMaker_ATLxk::buildBeamFrameWork ( EventData & data) const
private

Initiate beam frame work for seed generator.

Definition at line 1172 of file SiSpacePointsSeedMaker_ATLxk.cxx.

1173{
1174 SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle { m_beamSpotKey };
1175
1176 const Amg::Vector3D &bsCentre = beamSpotHandle->beamPos();
1177 double tx = std::tan(beamSpotHandle->beamTilt(0));
1178 double ty = std::tan(beamSpotHandle->beamTilt(1));
1179
1180 double phi = std::atan2(ty,tx);
1181 double theta = std::acos(1./std::sqrt(1.+tx*tx+ty*ty));
1182 double sinTheta = std::sin(theta);
1183 double cosTheta = std::cos(theta);
1184 double sinPhi = std::sin(phi);
1185 double cosPhi = std::cos(phi);
1186
1187 data.xbeam[0] = static_cast<float>(bsCentre.x());
1188 data.xbeam[1] = static_cast<float>(cosTheta*cosPhi*cosPhi+sinPhi*sinPhi);
1189 data.xbeam[2] = static_cast<float>(cosTheta*sinPhi*cosPhi-sinPhi*cosPhi);
1190 data.xbeam[3] =-static_cast<float>(sinTheta*cosPhi );
1191
1192 data.ybeam[0] = static_cast<float>(bsCentre.y());
1193 data.ybeam[1] = static_cast<float>(cosTheta*cosPhi*sinPhi-sinPhi*cosPhi);
1194 data.ybeam[2] = static_cast<float>(cosTheta*sinPhi*sinPhi+cosPhi*cosPhi);
1195 data.ybeam[3] =-static_cast<float>(sinTheta*sinPhi );
1196
1197 data.zbeam[0] = static_cast<float>(bsCentre.z());
1198 data.zbeam[1] = static_cast<float>(sinTheta*cosPhi);
1199 data.zbeam[2] = static_cast<float>(sinTheta*sinPhi);
1200 data.zbeam[3] = static_cast<float>(cosTheta);
1201}
Scalar phi() const
phi method
Scalar theta() const
theta method
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
Eigen::Matrix< double, 3, 1 > Vector3D

◆ buildFrameWork()

void InDet::SiSpacePointsSeedMaker_ATLxk::buildFrameWork ( )
private

prepare several data members with cached cut values, conversion factors, binnings, etc

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

the minumum allowed phi-granularity is the one we would need to reconstruct 100 MeV tracks. The approximate formula below estimates the maximum curvature we expect in a 2T magnetic field, assuming we want to contain all Si hits from our track in the phi slice we are looking at

  • very conservative indeed, as we never need SCT and PIX at the same time!

< 1.67, bin size 0.6

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)

The factor 3 we divide by is motivated by the fact that we combine sets of three consecutive phi bins in the seed making step. So each individual bin should be approximately a third of the maximum expected azimutal deflection

case 2: SSS seeds, if we use them

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

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

pick the larger of the two and invert

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

Build radius-azimuthal-Z sorted containers for Z-vertices same logic as for the space points above

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

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 908 of file SiSpacePointsSeedMaker_ATLxk.cxx.

909{
910 // Tell clang to optimize assuming that FP operations may trap.
912
913 m_ptmin = std::max( std::abs(m_ptmin), float(100.*m_fieldScale));
917
919 if (std::abs(m_etamin) < .1) m_etamin = -m_etamax;
921 m_dzdrmax0 = 1.f/std::tan(2.f*std::atan(std::exp(-m_etamax)));
922 m_dzdrmin0 = 1.f/std::tan(2.f*std::atan(std::exp(-m_etamin)));
923
925 m_ipt = 1.f/std::abs(.9f*m_ptmin);
927
936
938 m_nBinsR = static_cast<int>((m_r_rmax+.1f)/m_binSizeR);
939
944
946 constexpr float twoPi = 2.f*M_PI;
947
949 const int nPhiBinsMax = arraySizePhi;
950 const float inverseSizePhiMax = static_cast<float>(nPhiBinsMax)/twoPi;
951
959 constexpr float inverseSizePhiMin = 100./60.;
960
966
969 constexpr float radiusPixelStart = 33.;
970 constexpr float radiusPixelEnd = 150.;
974 const float binSizePhi_PPP = m_pixel ? azimuthalStep(m_ptmin/m_fieldScale,m_maxdImpact,radiusPixelStart,radiusPixelEnd)/3.f : 0.f;
976 constexpr float radiusSctStart = 295.; ;
977 constexpr float radiusSctEnd = 560.;
978 const float binSizePhi_SSS = m_sct ? azimuthalStep(m_ptmin/m_fieldScale,m_maxdImpactSSS,radiusSctStart,radiusSctEnd)/3.f : 0.f;
980 m_inverseBinSizePhi = 1.f/std::max(binSizePhi_PPP, binSizePhi_SSS);
981 }
982 else {
985 float ptm = 400.;
987 if (m_ptmin/m_fieldScale < ptm) ptm = m_ptmin/m_fieldScale;
988 m_inverseBinSizePhi = ptm /60.f;
989 }
990
992 if (m_inverseBinSizePhi > inverseSizePhiMax) m_inverseBinSizePhi = inverseSizePhiMax;
993 else if (m_inverseBinSizePhi < inverseSizePhiMin) m_inverseBinSizePhi = inverseSizePhiMin;
994
996 m_maxPhiBin = static_cast<int>(twoPi*m_inverseBinSizePhi);
998 if (m_maxPhiBin >=nPhiBinsMax) m_maxPhiBin = nPhiBinsMax-1;
999
1002 const int nPhiBinsVertexMax = arraySizePhiV;
1003 const float inverseBinSizePhiVertexMax = static_cast<float>(nPhiBinsVertexMax)/twoPi;
1005 if (m_inverseBinSizePhiVertex > inverseBinSizePhiVertexMax) m_inverseBinSizePhiVertex = inverseBinSizePhiVertexMax;
1006 m_maxBinPhiVertex = static_cast<int>(twoPi*m_inverseBinSizePhiVertex);
1007 if (m_maxBinPhiVertex>=nPhiBinsVertexMax) m_maxBinPhiVertex = nPhiBinsVertexMax-1;
1008
1009
1013
1014 for (int phiBin=0; phiBin<=m_maxPhiBin; ++phiBin) {
1015
1016 int phiBelow = phiBin-1;
1017 if (phiBelow<0) phiBelow=m_maxPhiBin;
1018
1019 int phiAbove = phiBin+1;
1020 if (phiAbove>m_maxPhiBin) phiAbove=0;
1021
1023 for (int z=0; z<arraySizeZ; ++z) {
1024
1027
1028 int twoDbinSamePhi = phiBin * arraySizeZ+z;
1029 int twoDbinLowerPhi = phiBelow*arraySizeZ+z;
1030 int twoDbinHigherPhi = phiAbove* arraySizeZ+z;
1031
1032 m_nNeighbourCellsBottom [twoDbinSamePhi] = 3;
1033 m_nNeighbourCellsTop [twoDbinSamePhi] = 3;
1034
1035 m_neighbourCellsBottom[twoDbinSamePhi][0] = twoDbinSamePhi;
1036 m_neighbourCellsTop[twoDbinSamePhi][0] = twoDbinSamePhi;
1037
1038 m_neighbourCellsBottom[twoDbinSamePhi][1] = twoDbinLowerPhi;
1039 m_neighbourCellsTop[twoDbinSamePhi][1] = twoDbinLowerPhi;
1040
1041 m_neighbourCellsBottom[twoDbinSamePhi][2] = twoDbinHigherPhi;
1042 m_neighbourCellsTop[twoDbinSamePhi][2] = twoDbinHigherPhi;
1043
1052 if (z==5) {
1053 m_nNeighbourCellsTop [twoDbinSamePhi] = 9;
1054 // in the central z region, we include the two neighbouring
1055 // z slices for the top neighbour search
1056
1057 m_neighbourCellsTop[twoDbinSamePhi][3] = twoDbinSamePhi+1;
1058 m_neighbourCellsTop[twoDbinSamePhi][4] = twoDbinLowerPhi+1;
1059 m_neighbourCellsTop[twoDbinSamePhi][5] = twoDbinHigherPhi+1;
1060 m_neighbourCellsTop[twoDbinSamePhi][6] = twoDbinSamePhi-1;
1061 m_neighbourCellsTop[twoDbinSamePhi][7] = twoDbinLowerPhi-1;
1062 m_neighbourCellsTop[twoDbinSamePhi][8] = twoDbinHigherPhi-1;
1063 }
1064 // z > 5: positive z values, |z| > 250mm
1065 else if (z> 5) {
1066 // for the bottom SP search in positive non-central z, we include the
1067 // neighbouring Z region on the left (towards the IP) in the bottom
1068 // neighbour search
1069 m_nNeighbourCellsBottom [twoDbinSamePhi] = 6;
1070 m_neighbourCellsBottom[twoDbinSamePhi][3] = twoDbinSamePhi-1;
1071 m_neighbourCellsBottom[twoDbinSamePhi][4] = twoDbinLowerPhi-1;
1072 m_neighbourCellsBottom[twoDbinSamePhi][5] = twoDbinHigherPhi-1;
1073
1074 if (z<10) {
1080 m_nNeighbourCellsTop [twoDbinSamePhi] = 6;
1081 m_neighbourCellsTop[twoDbinSamePhi][3] = twoDbinSamePhi+1;
1082 m_neighbourCellsTop[twoDbinSamePhi][4] = twoDbinLowerPhi+1;
1083 m_neighbourCellsTop[twoDbinSamePhi][5] = twoDbinHigherPhi+1;
1084 }
1085 }
1086 // z < 5: negative z values, |z| > 250mm
1087 else {
1092 m_nNeighbourCellsBottom [twoDbinSamePhi] = 6;
1093 m_neighbourCellsBottom[twoDbinSamePhi][3] = twoDbinSamePhi+1;
1094 m_neighbourCellsBottom[twoDbinSamePhi][4] = twoDbinLowerPhi+1;
1095 m_neighbourCellsBottom[twoDbinSamePhi][5] = twoDbinHigherPhi+1;
1096
1097 if (z>0) {
1098 // if there is a z region on the left (away from the IP), we include it in the top
1099 // neighbour search
1100 m_nNeighbourCellsTop [twoDbinSamePhi] = 6;
1101 m_neighbourCellsTop[twoDbinSamePhi][3] = twoDbinSamePhi-1;
1102 m_neighbourCellsTop[twoDbinSamePhi][4] = twoDbinLowerPhi-1;
1103 m_neighbourCellsTop[twoDbinSamePhi][5] = twoDbinHigherPhi-1;
1104 }
1105 }
1106
1112 if (z==3) {
1113 m_nNeighbourCellsBottom[twoDbinSamePhi] = 9;
1114 m_neighbourCellsBottom[twoDbinSamePhi][6] = twoDbinSamePhi+2;
1115 m_neighbourCellsBottom[twoDbinSamePhi][7] = twoDbinLowerPhi+2;
1116 m_neighbourCellsBottom[twoDbinSamePhi][8] = twoDbinHigherPhi+2;
1117 } else if (z==7) {
1118 m_nNeighbourCellsBottom[twoDbinSamePhi] = 9;
1119 m_neighbourCellsBottom[twoDbinSamePhi][6] = twoDbinSamePhi-2;
1120 m_neighbourCellsBottom[twoDbinSamePhi][7] = twoDbinLowerPhi-2;
1121 m_neighbourCellsBottom[twoDbinSamePhi][8] = twoDbinHigherPhi-2;
1122 }
1123 }
1124 }
1125
1129 for (int phiBin=0; phiBin<=m_maxBinPhiVertex; ++phiBin) {
1130
1131 int phiBinBelow = phiBin-1;
1132 if (phiBinBelow<0) phiBinBelow=m_maxBinPhiVertex;
1133
1134 int phiBinTop = phiBin+1;
1135 if (phiBinTop>m_maxBinPhiVertex) phiBinTop=0;
1136
1138 for (int zbin=0; zbin<arraySizeZV; ++zbin) {
1139
1140 int twoDbinSamePhi = phiBin *arraySizeZV+zbin;
1141 int twoDbinLowerPhi = phiBinBelow*arraySizeZV+zbin;
1142 int twoDbinHigherPhi = phiBinTop*arraySizeZV+zbin;
1143
1145 m_nNeighboursVertexPhiZ[twoDbinSamePhi] = 3;
1146 m_neighboursVertexPhiZ[twoDbinSamePhi][0] = twoDbinSamePhi;
1147 m_neighboursVertexPhiZ[twoDbinSamePhi][1] = twoDbinLowerPhi;
1148 m_neighboursVertexPhiZ[twoDbinSamePhi][2] = twoDbinHigherPhi;
1149
1151 if (zbin>1) {
1152 m_nNeighboursVertexPhiZ[twoDbinSamePhi] = 6;
1153 m_neighboursVertexPhiZ[twoDbinSamePhi][3] = twoDbinSamePhi-1;
1154 m_neighboursVertexPhiZ[twoDbinSamePhi][4] = twoDbinLowerPhi-1;
1155 m_neighboursVertexPhiZ[twoDbinSamePhi][5] = twoDbinHigherPhi-1;
1156 }
1158 else if (zbin<1) {
1159 m_nNeighboursVertexPhiZ[twoDbinSamePhi] = 6;
1160 m_neighboursVertexPhiZ[twoDbinSamePhi][3] = twoDbinSamePhi+1;
1161 m_neighboursVertexPhiZ[twoDbinSamePhi][4] = twoDbinLowerPhi+1;
1162 m_neighboursVertexPhiZ[twoDbinSamePhi][5] = twoDbinHigherPhi+1;
1163 }
1164 }
1165 }
1166}
#define M_PI
#define z
std::array< std::array< int, arraySizeNeighbourBinsVertex >, arraySizePhiZV > m_neighboursVertexPhiZ
float m_seedScoreThresholdPPPConfirmationSeed
Seed score thresholds defined based on the modifiers defined as configurables above.
int m_maxBinPhiVertex
number of bins in phi for vertices
BooleanProperty m_optimisePhiBinning
This flag will make the buildFrameWork method determine an optimal phi binning of the search regions ...
std::array< int, arraySizePhiZ > m_nNeighbourCellsBottom
arrays associating bins to each other for SP formation
float m_seedScoreThresholdSSSConfirmationSeed
max (score is assigned negative sign) score for SSS seeds with confirmation seed requirement.
FloatProperty m_seedScoreBonusPPP
Scoring modifiers applied when ranking seeds.
float m_inverseBinSizePhiVertex
as above but for vertex
std::array< int, arraySizePhiZV > m_nNeighboursVertexPhiZ
float m_inverseBinSizePhi
cache the inverse bin size in phi which we use - needed to evaluate phi bin locations
std::array< std::array< int, arraySizeNeighbourBins >, arraySizePhiZ > m_neighbourCellsBottom
mapping of neighbour cells in the 2D phi-z binning to consider for the "bottom SP" search for central...
int m_nBinsR
number of bins in the radial coordinate
float m_ipt2
inverse square of 90% of the pt min cut
std::array< int, arraySizePhiZ > m_nNeighbourCellsTop
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 >, arraySizePhiZ > m_neighbourCellsTop
mapping of neighbour cells in the 2D phi-z binning to consider for the "top SP" search for central SP...
float m_ipt
inverse of 90% of the ptmin cut
float m_dzdrmin0
conversion factors and cached cut values
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...
setSAddress setEtaMS setDirPhiMS setDirZMS setBarrelRadius setEndcapAlpha setEndcapRadius setPhiMap phiBin

◆ convertToBeamFrameWork()

void InDet::SiSpacePointsSeedMaker_ATLxk::convertToBeamFrameWork ( EventData & data,
const Trk::SpacePoint *const & sp,
std::array< float, 3 > & r )
staticprivate

This method popualtes the r array with the space point's coordinates relative to the beam spot.

Initiate beam frame work for seed generator.

Parameters
[in]dataEvent data
[in]spSpace point to take the global position from
[out]r3-array, will be populated with the relative coordinates

Definition at line 1207 of file SiSpacePointsSeedMaker_ATLxk.cxx.

1209{
1210 r[0] = static_cast<float>(sp->globalPosition().x())-data.xbeam[0];
1211 r[1] = static_cast<float>(sp->globalPosition().y())-data.ybeam[0];
1212 r[2] = static_cast<float>(sp->globalPosition().z())-data.zbeam[0];
1213}
static Double_t sp
#define y
#define x
int r
Definition globals.cxx:22

◆ dump()

MsgStream & InDet::SiSpacePointsSeedMaker_ATLxk::dump ( EventData & data,
MsgStream & out ) const
overridevirtual

Dumps relevant information into the MsgStream.

Definition at line 694 of file SiSpacePointsSeedMaker_ATLxk.cxx.

695{
696 if (not data.initialized) initializeEventData(data);
697
698 if (data.nprint) return dumpEvent(data, out);
699 return dumpConditions(data, out);
700}
MsgStream & dumpConditions(EventData &data, MsgStream &out) const
Dumps conditions information into the MsgStream.
static MsgStream & dumpEvent(EventData &data, MsgStream &out)
Dumps event information into the MsgStream.

◆ dumpConditions()

MsgStream & InDet::SiSpacePointsSeedMaker_ATLxk::dumpConditions ( EventData & data,
MsgStream & out ) const
private

Dumps conditions information into the MsgStream.

Definition at line 706 of file SiSpacePointsSeedMaker_ATLxk.cxx.

707{
708 int n = 42-m_spacepointsPixel.key().size();
709 std::string s2;
710 for (int i=0; i<n; ++i) s2.append(" ");
711 s2.append("|");
712 n = 42-m_spacepointsSCT.key().size();
713 std::string s3;
714 for (int i=0; i<n; ++i) s3.append(" ");
715 s3.append("|");
716 n = 42-m_spacepointsOverlap.key().size();
717 std::string s4;
718 for (int i=0; i<n; ++i) s4.append(" ");
719 s4.append("|");
720 n = 42-m_beamSpotKey.key().size();
721 std::string s5;
722 for (int i=0; i<n; ++i) s5.append(" ");
723 s5.append("|");
724
725 out<<"|---------------------------------------------------------------------|"
726 <<endmsg;
727 out<<"| Pixel space points | "<<m_spacepointsPixel.key() <<s2
728 <<endmsg;
729 out<<"| SCT space points | "<<m_spacepointsSCT.key()<<s3
730 <<endmsg;
731 out<<"| Overlap space points | "<<m_spacepointsOverlap.key()<<s4
732 <<endmsg;
733 out<<"| BeamConditionsService | "<<m_beamSpotKey.key()<<s5
734 <<endmsg;
735 out<<"| usePixel | "
736 <<std::setw(12)<<m_pixel
737 <<" |"<<endmsg;
738 out<<"| useSCT | "
739 <<std::setw(12)<<m_sct
740 <<" |"<<endmsg;
741 out<<"| maxSize | "
742 <<std::setw(12)<<m_maxsize
743 <<" |"<<endmsg;
744 out<<"| maxSizeSP | "
745 <<std::setw(12)<<m_maxsizeSP
746 <<" |"<<endmsg;
747 out<<"| pTmin (mev) | "
748 <<std::setw(12)<<std::setprecision(5)<<m_ptmin
749 <<" |"<<endmsg;
750 out<<"| max radius SP | "
751 <<std::setw(12)<<std::setprecision(5)<<m_r_rmax
752 <<" |"<<endmsg;
753 out<<"| radius step | "
754 <<std::setw(12)<<std::setprecision(5)<<m_binSizeR
755 <<" |"<<endmsg;
756 out<<"| min Z-vertex position | "
757 <<std::setw(12)<<std::setprecision(5)<<m_zmin
758 <<" |"<<endmsg;
759 out<<"| max Z-vertex position | "
760 <<std::setw(12)<<std::setprecision(5)<<m_zmax
761 <<" |"<<endmsg;
762 out<<"| min radius first SP(2) | "
763 <<std::setw(12)<<std::setprecision(5)<<m_r1minv
764 <<" |"<<endmsg;
765 out<<"| min radius second SP(2) | "
766 <<std::setw(12)<<std::setprecision(5)<<m_r2minv
767 <<" |"<<endmsg;
768 out<<"| max radius first SP(2) | "
769 <<std::setw(12)<<std::setprecision(5)<<m_r1maxv
770 <<" |"<<endmsg;
771 out<<"| max radius second SP(2) | "
772 <<std::setw(12)<<std::setprecision(5)<<m_r2maxv
773 <<" |"<<endmsg;
774 out<<"| min space points dR | "
775 <<std::setw(12)<<std::setprecision(5)<<m_drmin
776 <<" |"<<endmsg;
777 out<<"| max space points dR | "
778 <<std::setw(12)<<std::setprecision(5)<<m_drmax
779 <<" |"<<endmsg;
780 out<<"| max dZ impact | "
781 <<std::setw(12)<<std::setprecision(5)<<m_dzver
782 <<" |"<<endmsg;
783 out<<"| max dZ/dR impact | "
784 <<std::setw(12)<<std::setprecision(5)<<m_dzdrver
785 <<" |"<<endmsg;
786 out<<"| max impact | "
787 <<std::setw(12)<<std::setprecision(5)<<m_maxdImpact
788 <<" |"<<endmsg;
789 out<<"| max impact sss | "
790 <<std::setw(12)<<std::setprecision(5)<<m_maxdImpactSSS
791 <<" |"<<endmsg;
792 out<<"|---------------------------------------------------------------------|"
793 <<endmsg;
794 out<<"| Beam X center | "
795 <<std::setw(12)<<std::setprecision(5)<<data.xbeam[0]
796 <<" |"<<endmsg;
797 out<<"| Beam Y center | "
798 <<std::setw(12)<<std::setprecision(5)<<data.ybeam[0]
799 <<" |"<<endmsg;
800 out<<"| Beam Z center | "
801 <<std::setw(12)<<std::setprecision(5)<<data.zbeam[0]
802 <<" |"<<endmsg;
803 out<<"| Beam X-axis direction | "
804 <<std::setw(12)<<std::setprecision(5)<<data.xbeam[1]
805 <<std::setw(12)<<std::setprecision(5)<<data.xbeam[2]
806 <<std::setw(12)<<std::setprecision(5)<<data.xbeam[3]
807 <<" |"<<endmsg;
808 out<<"| Beam Y-axis direction | "
809 <<std::setw(12)<<std::setprecision(5)<<data.ybeam[1]
810 <<std::setw(12)<<std::setprecision(5)<<data.ybeam[2]
811 <<std::setw(12)<<std::setprecision(5)<<data.ybeam[3]
812 <<" |"<<endmsg;
813 out<<"| Beam Z-axis direction | "
814 <<std::setw(12)<<std::setprecision(5)<<data.zbeam[1]
815 <<std::setw(12)<<std::setprecision(5)<<data.zbeam[2]
816 <<std::setw(12)<<std::setprecision(5)<<data.zbeam[3]
817 <<" |"<<endmsg;
818 out<<"|---------------------------------------------------------------------|"
819 <<endmsg;
820 return out;
821}
#define endmsg
SG::ReadHandleKey< SpacePointContainer > m_spacepointsSCT
SG::ReadHandleKey< SpacePointContainer > m_spacepointsPixel
SG::ReadHandleKey< SpacePointOverlapCollection > m_spacepointsOverlap

◆ dumpEvent()

MsgStream & InDet::SiSpacePointsSeedMaker_ATLxk::dumpEvent ( EventData & data,
MsgStream & out )
staticprivate

Dumps event information into the MsgStream.

Definition at line 827 of file SiSpacePointsSeedMaker_ATLxk.cxx.

828{
829 out<<"|---------------------------------------------------------------------|"
830 <<endmsg;
831 out<<"| ns | "
832 <<std::setw(12)<<data.ns
833 <<" |"<<endmsg;
834 out<<"| nsaz | "
835 <<std::setw(12)<<data.nsaz
836 <<" |"<<endmsg;
837 out<<"| nsazv | "
838 <<std::setw(12)<<data.nsazv
839 <<" |"<<endmsg;
840 out<<"| seeds | "
841 <<std::setw(12)<<data.l_seeds_Pro.size()
842 <<" |"<<endmsg;
843 out<<"|---------------------------------------------------------------------|"
844 <<endmsg;
845 return out;
846}

◆ erase()

void InDet::SiSpacePointsSeedMaker_ATLxk::erase ( EventData & data)
staticprivate

Definition at line 1374 of file SiSpacePointsSeedMaker_ATLxk.cxx.

1375{
1376 for (int i=0; i<data.nrfz; ++i) {
1377 int n = data.rfz_index[i];
1378 data.rfz_map[n] = 0;
1379 data.rfz_Sorted[n].clear();
1380 }
1381
1382 for (int i=0; i<data.nrfzv; ++i) {
1383 int n = data.rfzv_index[i];
1384 data.rfzv_map[n] = 0;
1385 data.rfzv_Sorted[n].clear();
1386 }
1387 data.state = 0;
1388 data.nsaz = 0;
1389 data.nsazv = 0;
1390 data.nrfz = 0;
1391 data.nrfzv = 0;
1392}

◆ fillLists()

void InDet::SiSpacePointsSeedMaker_ATLxk::fillLists ( EventData & data) const
private

this method populates the data object's "histograms" (implemented as nested vectors).

Initiate space points seed maker.

using the list of r-binned space points in the object assumed to have been previously set (for example via the newEvent method of this class).

Parameters
[in,out]dataEvent data which will be updated.

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

if we are in the second iteration (PPP pass), we have some special exit conditions.

if we are dealing with a pixel hit and the radial bin index is below 20, we are in the IBL. this seems to be based on the default radial step of 2mm / bin, where this is equivalent to 40mm.

if we reach a strip hit in the PPP pass, we have two conditions for bailing out:

a) if we saw IBL hits in the past, we stop as soon as we see the first strip hit - pure PPP

b) in case we did not see any IBL hits, we stop after bin index 175. using the default r bin size of 2mm, this is equivalent to 350mm. So the idea seems to be to include the first strip layer at 299mm before we stop. This implies that for the non-IBL running, we include PPS seeds in this pass.

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)

if we do not use the SCT, and did see some hits somewhere below 43mm (meaning we have the IBL installed), apply stricter requirements on the seed score later on

Definition at line 1219 of file SiSpacePointsSeedMaker_ATLxk.cxx.

1220{
1221 constexpr float twoPi = 2.*M_PI;
1222
1223 int firstRadialBin = 0;
1224 bool ibl = false;
1225
1238
1239 const std::map<float, int> ztoBin{
1240 {-2500. ,0},
1241 {-1400. ,1},
1242 {-925. ,2},
1243 {-450. ,3},
1244 {-250 ,4},
1245 { 250 ,5},
1246 { 450 ,6},
1247 { 925 ,7},
1248 { 1400 ,8},
1249 { 2500 ,9},
1250 { 100000 ,10},
1251 };
1252
1253 for (int radialBin=data.r_first; radialBin<m_nBinsR; ++radialBin) {
1254
1256 if (!data.r_map[radialBin]) continue;
1258 if (firstRadialBin == 0) firstRadialBin = radialBin;
1259
1261 if (data.iteration) {
1268 if (!data.r_Sorted[radialBin].front()->spacepoint->clusterList().second) {
1269 if (radialBin * m_binSizeR < m_radiusCutIBL) ibl = true;
1270 }
1271
1273
1275 else if (ibl) {
1276 break;
1277 }
1283 else if (radialBin > 175) {
1284 break;
1285 }
1286 }
1287 // loop over the space points in the r-bin and sort them into the 2d phi-z binning
1288 for (InDet::SiSpacePointForSeed* SP : data.r_Sorted[radialBin]) {
1289
1292 float Phi = SP->phi();
1293 if (Phi<0.) Phi+=twoPi; // phi is defined in [0..2pi] for the binning
1294 int phiBin = static_cast<int>(Phi*m_inverseBinSizePhi);
1296 if (phiBin < 0) {
1298 } else if (phiBin > m_maxPhiBin) {
1299 phiBin = 0;
1300 }
1301
1302 float Z = SP->z();
1309 int zBin{0};
1310 auto bound = ztoBin.lower_bound(Z);
1312 if (bound == ztoBin.end()){
1313 --bound;
1314 }
1315 zBin=bound->second;
1316
1318 int twoDbin = phiBin*arraySizeZ+zBin;
1321 ++data.nsaz;
1322 // push our space point into the 2D binned array
1323 data.rfz_Sorted[twoDbin].push_back(SP);
1327 if (!data.rfz_map[twoDbin]++) data.rfz_index[data.nrfz++] = twoDbin;
1328 }
1329 }
1332 if (!m_sct && firstRadialBin && static_cast<float>(firstRadialBin)*m_binSizeR < m_radiusCutIBL) {
1334 }
1335
1336 data.state = 0;
1337}
@ Phi
Definition RPCdef.h:8
static constexpr float m_radiusCutIBL
We detect IBL hits via the seed radial location.

◆ fillSeeds()

void InDet::SiSpacePointsSeedMaker_ATLxk::fillSeeds ( EventData & data) const
private

fills the seeds from the mapOneSeeds_Pro member into the l_seeds_Pro member of the data object, applying some more quality requirements on the way.

Fill seeds.

Parameters
[in,out]dataEvent data which is modified

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

if this is not the highest-quality seed in the list and we have the first hit in the IBL, require a confirmation seed (score is then boosted by -200 for PPP + -200 for confirmation --> below -200)

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 2402 of file SiSpacePointsSeedMaker_ATLxk.cxx.

2403{
2404
2405 data.fillOneSeeds = 0;
2406
2407 std::multimap<float,InDet::SiSpacePointsProSeed*>::iterator it_firstSeedCandidate = data.mapOneSeeds_Pro.begin();
2408 std::multimap<float,InDet::SiSpacePointsProSeed*>::iterator it_seedCandidate = data.mapOneSeeds_Pro.begin();
2409 std::multimap<float,InDet::SiSpacePointsProSeed*>::iterator it_endSeedCandidates = data.mapOneSeeds_Pro.end();
2410
2412 if (it_seedCandidate==it_endSeedCandidates) return;
2413
2414 SiSpacePointsProSeed* theSeed{nullptr};
2415
2417 for (; it_seedCandidate!=it_endSeedCandidates; ++it_seedCandidate) {
2418
2420 float quality = (*it_seedCandidate).first;
2421 theSeed = (*it_seedCandidate).second;
2423 if (it_seedCandidate!=it_firstSeedCandidate && theSeed->spacepoint0()->radius() < m_radiusCutIBL && quality > m_seedScoreThresholdPPPConfirmationSeed) continue;
2425 if (!theSeed->setQuality(quality)) continue;
2426
2428 if (data.i_seede_Pro!=data.l_seeds_Pro.end()) {
2429 theSeed = &(*data.i_seede_Pro++);
2430 *theSeed = *(*it_seedCandidate).second;
2431 } else {
2433 data.l_seeds_Pro.emplace_back(*(*it_seedCandidate).second);
2434 //unused value, keep commented to avoid repetition
2435 //theSeed = &(data.l_seeds_Pro.back());
2436 data.i_seede_Pro = data.l_seeds_Pro.end();
2437 }
2438
2439 ++data.fillOneSeeds;
2440 }
2441}

◆ finalize()

StatusCode InDet::SiSpacePointsSeedMaker_ATLxk::finalize ( )
overridevirtual

Finalize.

Definition at line 122 of file SiSpacePointsSeedMaker_ATLxk.cxx.

123{
124 return AlgTool::finalize();
125}

◆ find2Sp()

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

With two space points with or without vertex constraint.

Methods to initilize different strategies of seeds production with two space points with or without vertex constraint.

Definition at line 530 of file SiSpacePointsSeedMaker_ATLxk.cxx.

531{
532 if (not data.initialized) initializeEventData(data);
533
534 data.zminU = m_zmin;
535 data.zmaxU = m_zmax;
536
537 int mode = 0;
538 if (lv.begin()!=lv.end()) mode = 1;
539 bool newv = newVertices(data, lv);
540
541 if (newv || !data.state || data.nspoint!=2 || data.mode!=mode || data.nlist) {
542 data.i_seede_Pro = data.l_seeds_Pro.begin();
543 data.state = 1;
544 data.nspoint = 2;
545 data.nlist = 0;
546 data.mode = mode;
547 data.endlist = true;
548 data.fvNmin = 0;
549 data.fNmin = 0;
550 data.zMin = 0;
551 production2Sp(data);
552 }
553 data.i_seed_Pro = data.l_seeds_Pro.begin();
554
555
556 if (msgLvl(MSG::DEBUG)) {
557 data.nprint=1;
558 dump(data, msg(MSG::DEBUG));
559 }
560}
bool newVertices(EventData &data, const std::list< Trk::Vertex > &lV) const
This method updates the EventData based on the passed list of vertices.
virtual MsgStream & dump(EventData &data, MsgStream &out) const override
Dumps relevant information into the MsgStream.
MsgStream & msg
Definition testRead.cxx:32

◆ find3Sp() [1/2]

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

with three space points with or without vertex constraint

Methods to initilize different strategies of seeds production with three space points with or without vertex constraint.

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_seed_Pro iterator - this is used to return the seeds to the consumer when they call next()

Definition at line 567 of file SiSpacePointsSeedMaker_ATLxk.cxx.

568{
569 if (not data.initialized) initializeEventData(data);
570
572 data.zminU = m_zmin;
573 data.zmaxU = m_zmax;
575 int mode = 2;
576 if (lv.begin()!=lv.end()) mode = 3;
581 bool newv = newVertices(data, lv);
583 if (newv || !data.state || data.nspoint!=3 || data.mode!=mode || data.nlist) {
584 data.i_seede_Pro = data.l_seeds_Pro.begin();
585 data.state = 1;
586 data.nspoint = 3;
587 data.nlist = 0;
588 data.mode = mode;
589 data.endlist = true;
590 data.fvNmin = 0;
591 data.fNmin = 0;
592 data.zMin = 0;
593 production3Sp(data);
594 }
597 data.i_seed_Pro = data.l_seeds_Pro.begin();
598
599
600 if (msgLvl(MSG::DEBUG)) {
601 data.nprint=1;
602 dump(data, msg(MSG::DEBUG));
603 }
604}
void production3Sp(EventData &data) const
Top-level method for 3-SP seed production.

◆ find3Sp() [2/2]

void InDet::SiSpacePointsSeedMaker_ATLxk::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

Methods to initilize different strategies of seeds production with three space points with or without vertex constraint.

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_seed_Pro iterator - this is used to return the seeds to the consumer when they call next()

Definition at line 611 of file SiSpacePointsSeedMaker_ATLxk.cxx.

612{
613 if (not data.initialized) initializeEventData(data);
614
617 data.zminU = ZVertex[0];
618 if (data.zminU < m_zmin) data.zminU = m_zmin;
619 data.zmaxU = ZVertex[1];
620 if (data.zmaxU > m_zmax) data.zmaxU = m_zmax;
621
623 int mode = 2;
624 if (lv.begin()!=lv.end()) mode = 3;
629 bool newv = newVertices(data, lv);
631 if (newv || !data.state || data.nspoint!=3 || data.mode!=mode || data.nlist) {
632 data.i_seede_Pro = data.l_seeds_Pro.begin();
633 data.state = 1;
634 data.nspoint = 3;
635 data.nlist = 0;
636 data.mode = mode;
637 data.endlist = true;
638 data.fvNmin = 0;
639 data.fNmin = 0;
640 data.zMin = 0;
641 production3Sp(data);
642 }
645 data.i_seed_Pro = data.l_seeds_Pro.begin();
646
647 if (msgLvl(MSG::DEBUG)) {
648 data.nprint=1;
649 dump(data, msg(MSG::DEBUG));
650 }
651}

◆ findNext()

void InDet::SiSpacePointsSeedMaker_ATLxk::findNext ( EventData & data) const
private

This method is called within next() when we are out of vertices.

Find next set space points.

It will internally trigger a re-run of production3Sp if we are out of seeds and data.endlist is not set (indicating the search is not finished).

Definition at line 852 of file SiSpacePointsSeedMaker_ATLxk.cxx.

853{
854 if (data.endlist) return;
855
856 data.i_seede_Pro = data.l_seeds_Pro.begin();
857
858 if (data.mode==0 or data.mode==1) production2Sp(data);
859 else if (data.mode==2 or data.mode==3) production3Sp(data);
860 else if (data.mode==5 or data.mode==6) production3Sp(data);
861
862 data.i_seed_Pro = data.l_seeds_Pro.begin();
863 ++data.nlist;
864}

◆ findVSp()

void InDet::SiSpacePointsSeedMaker_ATLxk::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

Methods to initilize different strategies of seeds production with variable number space points with or without vertex constraint Variable means (2,3,4,....) any number space points.

Definition at line 659 of file SiSpacePointsSeedMaker_ATLxk.cxx.

660{
661 if (not data.initialized) initializeEventData(data);
662
663 data.zminU = m_zmin;
664 data.zmaxU = m_zmax;
665
666 int mode = 5;
667 if (lv.begin()!=lv.end()) mode = 6;
668 bool newv = newVertices(data, lv);
669
670 if (newv || !data.state || data.nspoint!=4 || data.mode!=mode || data.nlist) {
671 data.i_seede_Pro = data.l_seeds_Pro.begin();
672 data.state = 1;
673 data.nspoint = 4;
674 data.nlist = 0;
675 data.mode = mode;
676 data.endlist = true;
677 data.fvNmin = 0;
678 data.fNmin = 0;
679 data.zMin = 0;
680 production3Sp(data);
681 }
682 data.i_seed_Pro = data.l_seeds_Pro.begin();
683
684 if (msgLvl(MSG::DEBUG)) {
685 data.nprint=1;
686 dump(data, msg(MSG::DEBUG));
687 }
688}

◆ getWriteNtupleBoolProperty()

bool InDet::SiSpacePointsSeedMaker_ATLxk::getWriteNtupleBoolProperty ( ) const
overridevirtual

Definition at line 2632 of file SiSpacePointsSeedMaker_ATLxk.cxx.

2632 {
2633 return m_writeNtuple;
2634}
Gaudi::Property< bool > m_writeNtuple
Flag to write validation ntuples. Turned off by default.

◆ initialize()

StatusCode InDet::SiSpacePointsSeedMaker_ATLxk::initialize ( )
overridevirtual

Initialisation.

Get beam geometry

PRD-to-track association (optional)

Build framework. Will set up internal variables not related to the event data object

Definition at line 46 of file SiSpacePointsSeedMaker_ATLxk.cxx.

47{
48 StatusCode sc = AlgTool::initialize();
49
51 ATH_CHECK(m_spacepointsSCT.initialize(m_sct));
53
55 if (not m_beamSpotKey.empty()) {
56 ATH_CHECK(m_beamSpotKey.initialize());
57 }
58
59 ATH_CHECK( m_fieldCondObjInputKey.initialize() );
60
62 ATH_CHECK( m_prdToTrackMap.initialize( !m_prdToTrackMap.key().empty()));
63
67
68 if (msgLvl(MSG::DEBUG)) {
71 data.nprint=0;
72 dump(data, msg(MSG::DEBUG));
73 }
74
75 if (m_writeNtuple) {
76 //coverity[MISSING_LOCK]
77 ATH_CHECK( m_thistSvc.retrieve() );
78
79 m_treeName = (std::string("SeedTree_")+name());
80 std::replace( m_treeName.begin(), m_treeName.end(), '.', '_' );
81
82 m_outputTree = new TTree( m_treeName.c_str() , "SeedMakerValTool");
83
84 m_outputTree->Branch("eventNumber", &m_eventNumber);
85 m_outputTree->Branch("d0", &m_d0);
86 m_outputTree->Branch("z0", &m_z0);
87 m_outputTree->Branch("pt", &m_pt);
88 m_outputTree->Branch("eta", &m_eta);
89 m_outputTree->Branch("x1", &m_x1);
90 m_outputTree->Branch("x2", &m_x2);
91 m_outputTree->Branch("x3", &m_x3);
92 m_outputTree->Branch("y1", &m_y1);
93 m_outputTree->Branch("y2", &m_y2);
94 m_outputTree->Branch("y3", &m_y3);
95 m_outputTree->Branch("z1", &m_z1);
96 m_outputTree->Branch("z2", &m_z2);
97 m_outputTree->Branch("z3", &m_z3);
98 m_outputTree->Branch("r1", &m_r1);
99 m_outputTree->Branch("r2", &m_r2);
100 m_outputTree->Branch("r3", &m_r3);
101 m_outputTree->Branch("quality", &m_quality);
102 m_outputTree->Branch("seedType", &m_type);
103 m_outputTree->Branch("givesTrack", &m_givesTrack);
104 m_outputTree->Branch("dzdr_b", &m_dzdr_b);
105 m_outputTree->Branch("dzdr_t", &m_dzdr_t);
106 m_outputTree->Branch("track_pt", &m_trackPt);
107 m_outputTree->Branch("track_eta", &m_trackEta);
108
109 std::string fullTreeName = m_treeFolder + m_treeName;
110
111 ATH_CHECK( m_thistSvc->regTree( fullTreeName, m_outputTree ) );
112
113 }
114
115 return sc;
116}
#define ATH_CHECK
Evaluate an expression and check for errors.
static Double_t sc
void buildFrameWork()
prepare several data members with cached cut values, conversion factors, binnings,...
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCondObjInputKey
Read handle for conditions object to get the field cache.
SG::ReadHandleKey< Trk::PRDtoTrackMap > m_prdToTrackMap
::StatusCode StatusCode
StatusCode definition for legacy code.

◆ initializeEventData()

void InDet::SiSpacePointsSeedMaker_ATLxk::initializeEventData ( EventData & data) const
private

maxsize not used

sizeRF not used

Definition at line 2604 of file SiSpacePointsSeedMaker_ATLxk.cxx.

2604 {
2605 int seedArrayPerSPSize = (m_maxOneSizePPP>m_maxOneSizeSSS ? m_maxOneSizePPP : m_maxOneSizeSSS);
2607 data.initialize(EventData::ToolType::ATLxk,
2609 seedArrayPerSPSize,
2610 0,
2611 m_nBinsR,
2612 0,
2615 m_checketa);
2616}
BooleanProperty m_alwaysKeepConfirmedPixelSeeds
This flag will lead to all confirmed seeds (seeds where a second compatible seed with a different top...
IntegerProperty m_maxOneSizeSSS
maximum number of seeds to keep per central space point.

◆ isConfirmedSeed()

bool InDet::SiSpacePointsSeedMaker_ATLxk::isConfirmedSeed ( const InDet::SiSpacePointForSeed * bottomSP,
const InDet::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 2618 of file SiSpacePointsSeedMaker_ATLxk.cxx.

2618 {
2619
2621 if (bottomSP->spacepoint->clusterList().second){
2622 return (quality < m_seedScoreThresholdSSSConfirmationSeed);
2623 }
2625 else if (!topSP->spacepoint->clusterList().second){
2626 return (quality < m_seedScoreThresholdPPPConfirmationSeed);
2627 }
2629 else return (quality < 0.);
2630}
const Trk::SpacePoint * spacepoint
const std::pair< const PrepRawData *, const PrepRawData * > & clusterList() const
return the pair of cluster pointers by reference

◆ isUsed()

bool InDet::SiSpacePointsSeedMaker_ATLxk::isUsed ( const Trk::SpacePoint * sp,
const Trk::PRDtoTrackMap & prd_to_track_map ) const
inlineprivate

Definition at line 536 of file SiSpacePointsSeedMaker_ATLxk.h.

537 {
538 const Trk::PrepRawData* d = sp->clusterList().first;
539 if (!d || !prd_to_track_map.isUsed(*d)) return false;
540 d = sp->clusterList().second;
541 if (!d || prd_to_track_map.isUsed(*d)) return true;
542 return false;
543 }
bool isUsed(const PrepRawData &prd) const
does this PRD belong to at least one track?

◆ isZCompatible()

bool InDet::SiSpacePointsSeedMaker_ATLxk::isZCompatible ( EventData & data,
const float Zv,
const float R,
const float T ) const
private

Definition at line 2525 of file SiSpacePointsSeedMaker_ATLxk.cxx.

2527{
2528 if (Zv < data.zminU or Zv > data.zmaxU) return false;
2529 if (not data.isvertex) return true;
2530 if (data.l_vertex.empty()) return false;
2531
2532 float dZmin = std::numeric_limits<float>::max();
2533 for (const float& v: data.l_vertex) {
2534 float dZ = std::abs(v-Zv);
2535 if (dZ >= dZmin) break;
2536 dZmin = dZ;
2537 }
2538
2539 //return dZmin < (m_dzver+m_dzdrver*R)*sqrt(1.+T*T);
2540 //(Minor) speed-up: Avoid calculation of sqrt, compare squares
2541 return dZmin*dZmin < (m_dzver+m_dzdrver*R)*(m_dzver+m_dzdrver*R)*(1.f+T*T);
2542}
double R(const INavigable4Momentum *p1, const double v_eta, const double v_phi)
unsigned long long T

◆ newEvent()

void InDet::SiSpacePointsSeedMaker_ATLxk::newEvent ( const EventContext & ctx,
EventData & data,
int iteration ) const
overridevirtual

Initialize tool for new event.

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

pass the iteration info into our data object

Erase any existing entries in the data object

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

in the first iteration, initialise the beam framework - beam spot position and direction

Read the field information

Get field cache object

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}

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

for the second iteration (PPP pass), don't redo the full init required the first time

< reset the first radial bin

call fillLists to repopulate the candidate space points and exit

the following will only happen in the first iteration

build the r-binning.

This cleans up remaining entries in the data object. In standard execution, we only run this in the first iterations on a newly created data object, in which case this loop will not ever be entered. Leaving it in place for nonstandard use cases.

read the prd to track map, in case we want to use it.

Now, we will populate the space point list in the event data object once.

reset the first r index

Get pixels space points containers from store gate

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

Remove DBM space points

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

if this is the highest bin we saw so far, update the r_first member of the data object to this bin

update the space point counter

< increment r_first past the last occupied bin we saw

Get sct space points containers from store gate

as for the pixel, veto already used SP if we are using the PRD to track map in later passes of track finding. Also, veto SP outside the maximum radius

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

as for PIX, determine the radial bin. Note that for the SCT we do not update data.r_first.

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 sct 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 radius

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.

negative iterations are not used in the current run-3 reco

populates the phi-z sorted histograms using the spacepoint lists and r-binning. after this call, we have a 3D binning

Definition at line 131 of file SiSpacePointsSeedMaker_ATLxk.cxx.

132{
134 if (not data.initialized) initializeEventData(data);
135
136 data.trigger = false;
137 if (!m_pixel && !m_sct) return;
138
140 data.iteration = iteration;
141 if (iteration <=0) data.iteration = 0;
143 erase(data);
144 data.dzdrmin = m_dzdrmin0;
145 data.dzdrmax = m_dzdrmax0;
146 data.maxScore = m_maxScore;
147
149 if (data.iteration == 0) {
150 if (not m_beamSpotKey.empty()) {
151 buildBeamFrameWork(data);
152 }
153
155 double magField[3]{0,0,0};
156 double globalPos[3] ={10.,10.,0.};
157
158 MagField::AtlasFieldCache fieldCache;
160 SG::ReadCondHandle<AtlasFieldCacheCondObj> readHandle{m_fieldCondObjInputKey, ctx};
161 const AtlasFieldCacheCondObj* fieldCondObj{*readHandle};
162 if (fieldCondObj == nullptr) {
163 ATH_MSG_ERROR("SiSpacePointsSeedMaker_ATLxk: Failed to retrieve AtlasFieldCacheCondObj with key " << m_fieldCondObjInputKey.key());
164 return;
165 }
166 fieldCondObj->getInitializedCache (fieldCache);
167
168 if (fieldCache.solenoidOn()) {
170 fieldCache.getFieldZR(globalPos,magField);
181 data.K = 2.f/(300.f*float(magField[2]));
182 } else {
183 data.K = 2.f/(300.f* 5.f );
184 }
189 data.ipt2K = m_ipt2/(data.K*data.K);
191 data.ipt2C = m_ipt2*m_COF;
192 data.COFK = m_COF*(data.K*data.K);
193
195 data.i_spforseed = data.l_spforseed.begin();
196 // Set the seed multiplicity strategy of the event data to the one configured
197 // by the user for strip seeds
198 data.maxSeedsPerSP = m_maxOneSizeSSS;
199 data.keepAllConfirmedSeeds = m_alwaysKeepConfirmedStripSeeds;
200
201 }
202 else {
203 data.r_first = 0;
204 // Set the seed multiplicity strategy of the event data to the one configured
205 // by the user for pixel seeds
206 data.maxSeedsPerSP = m_maxOneSizePPP;
207 data.keepAllConfirmedSeeds = m_alwaysKeepConfirmedPixelSeeds;
208
210 fillLists(data);
211 return;
212 }
213
215
216 data.checketa = data.dzdrmin > 1.;
217
219 float oneOverBinSizeR = 1.f/m_binSizeR;
220 int maxBinR = m_nBinsR-1;
221
228 for (int i=0; i<data.nr; ++i) {
229 int n = data.r_index[i];
230 data.r_map[n] = 0;
231 data.r_Sorted[n].clear();
232 }
233 data.ns = data.nr = 0;
234
236 SG::ReadHandle<Trk::PRDtoTrackMap> prd_to_track_map;
237 const Trk::PRDtoTrackMap *prd_to_track_map_cptr = nullptr;
238 if (!m_prdToTrackMap.key().empty()) {
239 prd_to_track_map=SG::ReadHandle<Trk::PRDtoTrackMap>(m_prdToTrackMap, ctx);
240 if (!prd_to_track_map.isValid()) {
241 ATH_MSG_ERROR("Failed to read PRD to track association map: " << m_prdToTrackMap.key());
242 }
243 prd_to_track_map_cptr = prd_to_track_map.cptr();
244 }
245
249
251 data.r_first = 0;
252
254 if (m_pixel) {
255
256 SG::ReadHandle<SpacePointContainer> spacepointsPixel{m_spacepointsPixel, ctx};
257 if (spacepointsPixel.isValid()) {
259 for (const SpacePointCollection* spc: *spacepointsPixel) {
260 for (const Trk::SpacePoint* sp: *spc) {
261
264 if ((prd_to_track_map_cptr && isUsed(sp,*prd_to_track_map_cptr)) || sp->r() > m_r_rmax) continue;
265
268 const InDetDD::SiDetectorElement* de=
269 static_cast<const InDetDD::SiDetectorElement*>(sp->clusterList().first->detectorElement());
270 if (!de || de->isDBM()) continue;
271
276 InDet::SiSpacePointForSeed* sps = newSpacePoint(data, sp);
278 if (!sps) continue;
279
282 int radiusBin = static_cast<int>(sps->radius()*oneOverBinSizeR);
284 if (radiusBin>maxBinR) radiusBin = maxBinR;
285
287 data.r_Sorted[radiusBin].push_back(sps);
289 ++data.r_map[radiusBin];
292 if (data.r_map[radiusBin]==1) data.r_index[data.nr++] = radiusBin;
294 if (radiusBin > data.r_first) data.r_first = radiusBin;
296 ++data.ns;
297 }
298 }
299 }
300 ++data.r_first;
301 }
302
304 if (m_sct) {
305
306 SG::ReadHandle<SpacePointContainer> spacepointsSCT{m_spacepointsSCT, ctx};
307 if (spacepointsSCT.isValid()) {
308
309 for (const SpacePointCollection* spc: *spacepointsSCT) {
310 for (const Trk::SpacePoint* sp: *spc) {
313 if ((prd_to_track_map_cptr && isUsed(sp,*prd_to_track_map_cptr)) || sp->r() > m_r_rmax) continue;
314
316 InDet::SiSpacePointForSeed* sps = newSpacePoint(data, sp);
317 if (!sps) continue;
318
321 int radiusBin = static_cast<int>(sps->radius()*oneOverBinSizeR);
322 if (radiusBin>maxBinR) radiusBin = maxBinR;
324 data.r_Sorted[radiusBin].push_back(sps);
326 ++data.r_map[radiusBin];
328 if (data.r_map[radiusBin]==1) data.r_index[data.nr++] = radiusBin;
330 ++data.ns;
331 }
332 }
333 }
334
336 if (m_useOverlap && !data.checketa) {
337
338 SG::ReadHandle<SpacePointOverlapCollection> spacepointsOverlap{m_spacepointsOverlap, ctx};
339 if (spacepointsOverlap.isValid()) {
340
341 for (const Trk::SpacePoint* sp: *spacepointsOverlap) {
343 if ((prd_to_track_map_cptr && isUsed(sp, *prd_to_track_map_cptr)) || sp->r() > m_r_rmax) continue;
344
346 InDet::SiSpacePointForSeed* sps = newSpacePoint(data, sp);
347 if (!sps) continue;
348
350 int radiusBin = static_cast<int>(sps->radius()*oneOverBinSizeR);
351 if (radiusBin>maxBinR) radiusBin = maxBinR;
353 data.r_Sorted[radiusBin].push_back(sps);
355 ++data.r_map[radiusBin];
357 if (data.r_map[radiusBin]==1) data.r_index[data.nr++] = radiusBin;
359 ++data.ns;
360 }
361 }
362 }
363 }
364
366 if (iteration < 0) data.r_first = 0;
367
370 fillLists(data);
371}
#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.
FloatProperty m_maxScore
Maximum score to accept.
void fillLists(EventData &data) const
this method populates the data object's "histograms" (implemented as nested vectors).
SiSpacePointForSeed * newSpacePoint(EventData &data, const Trk::SpacePoint *const &sp) const
Create a SiSpacePointForSeed from the space point.
bool isUsed(const Trk::SpacePoint *sp, const Trk::PRDtoTrackMap &prd_to_track_map) const
void buildBeamFrameWork(EventData &data) const
Initiate beam frame work for seed generator.
static constexpr float m_COF
appears to be an approximated term related to multiple-scattering of particles traversing the ID duri...
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.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
bool first
Definition DeMoScan.py:534

◆ newOneSeed()

void InDet::SiSpacePointsSeedMaker_ATLxk::newOneSeed ( EventData & data,
InDet::SiSpacePointForSeed *& p1,
InDet::SiSpacePointForSeed *& p2,
InDet::SiSpacePointForSeed *& p3,
float z,
float quality ) const
private

This inserts a seed into the set of saved seeds.

It internally respects the user-configured max number of seeds per central space point. Once this is exceeded, the new seed will replace worse-quality seeds if there are any, otherwise it will not insert anything.

Parameters
[in,out]dataEvent data - update OneSeeds_Pro and mapOneSeeds_Pro members
[in]p1First space point for this seed
[in]p2Second space point for this seed
[in]p3Third space point for this seed
[in]zz0 IP estimate
[in]qualityquality estimate (based on d0, plus modifiers)

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 2216 of file SiSpacePointsSeedMaker_ATLxk.cxx.

2220{
2222 float worstQualityInMap = std::numeric_limits<float>::min();
2223 InDet::SiSpacePointsProSeed* worstSeedSoFar = nullptr;
2224 if (!data.mapOneSeeds_Pro.empty()) {
2225 std::multimap<float,InDet::SiSpacePointsProSeed*>::reverse_iterator l = data.mapOneSeeds_Pro.rbegin();
2226 worstQualityInMap = (*l).first;
2227 worstSeedSoFar = (*l).second;
2228 }
2231 if (data.nOneSeeds < data.maxSeedsPerSP
2234 || (data.keepAllConfirmedSeeds && worstQualityInMap <= seedCandidateQuality && isConfirmedSeed(p1,p3,seedCandidateQuality) && data.nOneSeeds < data.seedPerSpCapacity)
2237 || (data.keepAllConfirmedSeeds && worstQualityInMap > seedCandidateQuality && worstSeedSoFar
2238 && isConfirmedSeed(worstSeedSoFar->spacepoint0(),worstSeedSoFar->spacepoint2(),worstQualityInMap) && data.nOneSeeds < data.seedPerSpCapacity)
2239 ){
2240 data.OneSeeds_Pro[data.nOneSeeds].set(p1,p2,p3,z);
2241 data.mapOneSeeds_Pro.insert(std::make_pair(seedCandidateQuality, &data.OneSeeds_Pro[data.nOneSeeds]));
2242 ++data.nOneSeeds;
2243 }
2245 else if (worstSeedSoFar && (worstQualityInMap > seedCandidateQuality)){
2247 worstSeedSoFar->set(p1,p2,p3,z);
2249 std::multimap<float,InDet::SiSpacePointsProSeed*>::iterator
2250 i = data.mapOneSeeds_Pro.insert(std::make_pair(seedCandidateQuality,worstSeedSoFar));
2252 for (++i; i!=data.mapOneSeeds_Pro.end(); ++i) {
2253 if ((*i).second==worstSeedSoFar) {
2254 data.mapOneSeeds_Pro.erase(i);
2255 return;
2256 }
2257 }
2258 }
2259}
SiSpacePointForSeed * spacepoint0()
void set(SiSpacePointForSeed *&, SiSpacePointForSeed *&, SiSpacePointForSeed *&, float)
SiSpacePointForSeed * spacepoint2()
bool isConfirmedSeed(const InDet::SiSpacePointForSeed *bottomSP, const InDet::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.

◆ newOneSeedWithCurvaturesComparison()

void InDet::SiSpacePointsSeedMaker_ATLxk::newOneSeedWithCurvaturesComparison ( 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,out]dataEvent data, used to read top SP candidates and write out found seeds (see newOneSeed).
[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

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 2273 of file SiSpacePointsSeedMaker_ATLxk.cxx.

2275{
2276 constexpr float curvatureInterval = .00003;
2277
2278 bool bottomSPisPixel = !SPb->spacepoint->clusterList().second;
2279 float bottomSPQuality = SPb->quality();
2280 float centralSPQuality = SP0->quality();
2281
2283 if(data.CmSp.size() > 2) std::sort(data.CmSp.begin(), data.CmSp.end(), comCurvature());
2284
2285 float bottomR=SPb->radius();
2286 float bottomZ=SPb->z();
2287
2288 std::vector<std::pair<float,InDet::SiSpacePointForSeed*>>::iterator it_otherSP;
2289 std::vector<std::pair<float,InDet::SiSpacePointForSeed*>>::iterator it_commonTopSP = data.CmSp.begin(), ie = data.CmSp.end();
2290 std::vector<std::pair<float,InDet::SiSpacePointForSeed*>>::iterator it_startInnerLoop=it_commonTopSP;
2291
2293 for (; it_commonTopSP!=ie; ++it_commonTopSP) {
2294
2296 float seedIP = (*it_commonTopSP).second->param();
2297 float seedQuality = seedIP + (*it_commonTopSP).second->scorePenalty();
2298 float originalSeedQuality = seedQuality;
2299
2300 if(m_maxdImpact > 50){ //This only applies to LRT
2301 // Tell clang to optimize assuming that FP exceptions can trap.
2302 // Otherwise, it can vectorize the division, which can lead to
2303 // spurious division-by-zero traps from unused vector lanes.
2305
2306 float topR=(*it_commonTopSP).second->radius();
2307 float topZ=(*it_commonTopSP).second->z();
2308
2309 float Zot = std::abs(topR - bottomR) > 10e-9 ?
2310 bottomZ - (bottomR - originalSeedQuality) * ((topZ - bottomZ) / (topR - bottomR)) : bottomZ;
2311
2312 float eta1 = computeEta(topR - bottomR, topZ - bottomZ);
2313 float eta0 = computeEta(seedIP, Zot);
2314
2315 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
2316 //calculate weighted average of d0 and deltaEta, normalized by their maximum values
2317 float f=std::min(0.5f,originalSeedQuality/200.f); //0.5 and 200 are parameters chosen from a grid scan to optimize efficiency
2318 seedQuality*=(1.f-f)/300.f;
2319 seedQuality+=f*deltaEta/2.5f;
2320 }
2321
2322 bool topSPisPixel = !(*it_commonTopSP).second->spacepoint->clusterList().second;
2323
2325 const Trk::Surface* surfaceTopSP = (*it_commonTopSP).second->sur ();
2326 float radiusTopSP = (*it_commonTopSP).second->radius();
2328 float minCurvature =(*it_commonTopSP).first-curvatureInterval;
2329 float maxCurvature =(*it_commonTopSP).first+curvatureInterval;
2330
2337
2339 if (!bottomSPisPixel) seedQuality+=m_seedScoreBonusSSS;
2341 else if ( topSPisPixel) seedQuality+=m_seedScoreBonusPPP;
2342
2343
2349
2350 for (it_otherSP=it_startInnerLoop; it_otherSP!=ie; ++it_otherSP) {
2352 if ( it_otherSP == it_commonTopSP ) continue;
2355 if ( (*it_otherSP).first < minCurvature ) {
2356 it_startInnerLoop=it_otherSP;
2357 ++it_startInnerLoop;
2358 continue;
2359 }
2361 if ( (*it_otherSP).first > maxCurvature ) break;
2363 if ( (*it_otherSP).second->sur()==surfaceTopSP) continue;
2365 float radiusOtherSP = (*it_otherSP).second->radius();
2366 if (std::abs(radiusOtherSP-radiusTopSP) < m_drmin) continue;
2367 // if we have a confirmation seed, we improve the score of the seed.
2368 seedQuality += m_seedScoreBonusConfirmationSeed;
2369 // apply confirmation bonus only once
2370 break;
2371 }
2372
2374 if (seedQuality > data.maxScore) continue;
2375
2378 if (bottomSPisPixel!=topSPisPixel) {
2379 if (seedQuality > 0. ||
2380 (seedQuality > bottomSPQuality && seedQuality > centralSPQuality && seedQuality > (*it_commonTopSP).second->quality())
2381 ) continue;
2382 }
2385 if (!isConfirmedSeed(SPb,it_commonTopSP->second,seedQuality)){
2387 double maxdImpact = m_maxdImpact - (m_dImpactCutSlopeUnconfirmedPPP * (*it_commonTopSP).second->scorePenalty());
2389 if (!bottomSPisPixel) maxdImpact = m_maxdImpactSSS - (m_dImpactCutSlopeUnconfirmedSSS * (*it_commonTopSP).second->scorePenalty());
2390 if (seedIP > maxdImpact) continue;
2391 }
2393 newOneSeed(data, SPb, SP0, (*it_commonTopSP).second, Zob, seedQuality);
2394 }
2395 data.CmSp.clear();
2396}
void newOneSeed(EventData &data, SiSpacePointForSeed *&p1, SiSpacePointForSeed *&p2, SiSpacePointForSeed *&p3, float z, float quality) const
This inserts a seed into the set of saved seeds.
FloatProperty m_dImpactCutSlopeUnconfirmedSSS
these flags allow to dynamically tighten the d0 cut on non-confirmed seeds based on the penalty score...
double deltaEta(const I4Momentum &p1, const I4Momentum &p2)
Computes efficiently .
Definition P4Helpers.h:66
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
setEt setPhi setE277 setWeta2 eta1

◆ newRegion() [1/2]

void InDet::SiSpacePointsSeedMaker_ATLxk::newRegion ( const EventContext & ctx,
EventData & data,
const std::vector< IdentifierHash > & vPixel,
const std::vector< IdentifierHash > & vSCT ) const
overridevirtual

Initialize tool for new region.

not used in offline reco (trigger specific)

Definition at line 378 of file SiSpacePointsSeedMaker_ATLxk.cxx.

381{
382 if (not data.initialized) initializeEventData(data);
383
384 data.iteration = 0;
385 data.trigger = false;
386 erase(data);
387 if (!m_pixel && !m_sct) return;
388
389 data.dzdrmin = m_dzdrmin0;
390 data.dzdrmax = m_dzdrmax0;
391 data.maxScore = m_maxScore;
392
393 if (not m_beamSpotKey.empty()) {
394 buildBeamFrameWork(data);
395 }
396
397 double magField[3]{0,0,0};
398 double globalPos[3] ={10.,10.,0.};
399
400 MagField::AtlasFieldCache fieldCache;
401 // Get field cache object
402 SG::ReadCondHandle<AtlasFieldCacheCondObj> readHandle{m_fieldCondObjInputKey, ctx};
403 const AtlasFieldCacheCondObj* fieldCondObj{*readHandle};
404
405 if (fieldCondObj == nullptr) {
406 ATH_MSG_ERROR("SiSpacePointsSeedMaker_ATLxk: Failed to retrieve AtlasFieldCacheCondObj with key " << m_fieldCondObjInputKey.key());
407 return;
408 }
409 fieldCondObj->getInitializedCache (fieldCache);
410
411 // initialise pt cuts and conversion factors
412 if (fieldCache.solenoidOn()) {
413 fieldCache.getFieldZR(globalPos,magField);
414
415 data.K = 2.f/(300.f*float(magField[2]));
416 } else {
417 data.K = 2.f/(300.f* 5.f );
418 }
419
420 data.ipt2K = m_ipt2/(data.K*data.K);
421 data.ipt2C = m_ipt2*m_COF;
422 data.COFK = m_COF*(data.K*data.K);
423
424 data.i_spforseed = data.l_spforseed.begin();
425
426 float oneOverBinSizeR = 1.f/m_binSizeR;
427 int maxBinR = m_nBinsR-1;
428
429 data.r_first = 0;
430 data.checketa = false;
431
432 for (int i=0; i<data.nr; ++i) {
433 int n = data.r_index[i];
434 data.r_map[n] = 0;
435 data.r_Sorted[n].clear();
436 }
437 data.ns = data.nr = 0;
438
439 // Get pixels space points containers from store gate
440 //
441 if (m_pixel && !vPixel.empty()) {
442
443 SG::ReadHandle<SpacePointContainer> spacepointsPixel{m_spacepointsPixel, ctx};
444 if ( spacepointsPixel.isValid() ) {
445
446 // Loop through all trigger collections
447 //
448 for (const IdentifierHash& l: vPixel) {
449 const auto *w = spacepointsPixel->indexFindPtr(l);
450 if (w==nullptr) continue;
451 for (const Trk::SpacePoint* sp: *w) {
452 float r = sp->r();
453 if (r > m_r_rmax) continue;
454 InDet::SiSpacePointForSeed* sps = newSpacePoint(data, sp);
455 int ir = static_cast<int>(sps->radius()*oneOverBinSizeR);
456 if (ir>maxBinR) ir = maxBinR;
457 data.r_Sorted[ir].push_back(sps);
458 ++data.r_map[ir];
459 if (data.r_map[ir]==1) data.r_index[data.nr++] = ir;
460 ++data.ns;
461 }
462 }
463 }
464 }
465
466 // Get sct space points containers from store gate
467 //
468 if (m_sct && !vSCT.empty()) {
469
470 SG::ReadHandle<SpacePointContainer> spacepointsSCT{m_spacepointsSCT, ctx};
471 if (spacepointsSCT.isValid()) {
472
473 // Loop through all trigger collections
474 //
475 for (const IdentifierHash& l: vSCT) {
476 const auto *w = spacepointsSCT->indexFindPtr(l);
477 if (w==nullptr) continue;
478 for (const Trk::SpacePoint* sp: *w) {
479 float r = sp->r();
480 if (r > m_r_rmax) continue;
481 InDet::SiSpacePointForSeed* sps = newSpacePoint(data, sp);
482 int ir = static_cast<int>(sps->radius()*oneOverBinSizeR);
483 if (ir>maxBinR) ir = maxBinR;
484 data.r_Sorted[ir].push_back(sps);
485 ++data.r_map[ir];
486 if (data.r_map[ir]==1) data.r_index[data.nr++] = ir;
487 ++data.ns;
488 }
489 }
490 }
491 }
492 fillLists(data);
493}
int ir
counter of the current depth
Definition fastadd.cxx:49

◆ newRegion() [2/2]

virtual void InDet::SiSpacePointsSeedMaker_ATLxk::newRegion ( const EventContext & ctx,
SiSpacePointsSeedMakerEventData & data,
const std::vector< IdentifierHash > & vPixel,
const std::vector< IdentifierHash > & vSCT,
const IRoiDescriptor & iRD ) const
overridevirtual

◆ newSeed()

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

Definition at line 2590 of file SiSpacePointsSeedMaker_ATLxk.cxx.

2592{
2593 InDet::SiSpacePointForSeed* p3 = nullptr;
2594
2595 if (data.i_seede_Pro!=data.l_seeds_Pro.end()) {
2596 SiSpacePointsProSeed* s = &(*data.i_seede_Pro++);
2597 s->set(p1, p2, p3, z);
2598 } else {
2599 data.l_seeds_Pro.emplace_back(p1, p2, p3, z);
2600 data.i_seede_Pro = data.l_seeds_Pro.end();
2601 }
2602}

◆ newSpacePoint()

InDet::SiSpacePointForSeed * InDet::SiSpacePointsSeedMaker_ATLxk::newSpacePoint ( EventData & data,
const Trk::SpacePoint *const & sp ) const
private

Create a SiSpacePointForSeed from the space point.

New space point for seeds.

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.

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 2548 of file SiSpacePointsSeedMaker_ATLxk.cxx.

2550{
2551 InDet::SiSpacePointForSeed* sps = nullptr;
2552
2555 std::array<float,3> r{0,0,0};
2556 convertToBeamFrameWork(data, sp, r);
2557
2559 if (data.checketa) {
2560 float z = (std::abs(r[2])+m_zmax);
2561 float x = r[0]*data.dzdrmin;
2562 float y = r[1]*data.dzdrmin;
2563 if ((z*z )<(x*x+y*y)) return sps;
2564 }
2568 if (data.i_spforseed!=data.l_spforseed.end()) {
2570 sps = &(*data.i_spforseed++);
2573 sps->set(sp,r);
2574 } else {
2576 data.l_spforseed.emplace_back(sp, r);
2578 sps = &(data.l_spforseed.back());
2580 data.i_spforseed = data.l_spforseed.end();
2581 }
2582
2583 return sps;
2584}
void set(const Trk::SpacePoint *, std::span< float const, 3 >)
static void convertToBeamFrameWork(EventData &data, const Trk::SpacePoint *const &sp, std::array< float, 3 > &r)
This method popualtes the r array with the space point's coordinates relative to the beam spot.

◆ newVertices()

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

This method updates the EventData based on the passed list of vertices.

New and old list vertices comparison.

The list may be empty. Updates the isvertex, l_vertex, zminU and zmaxU members of the data object. Always returns false.

Parameters
[in,out]dataEvent data to update
[in]lVpossibly empty list of vertices

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.

Ich bin der Geist, der stets verneint! are we sure this is not a bug?

Definition at line 870 of file SiSpacePointsSeedMaker_ATLxk.cxx.

871{
872 unsigned int s1 = data.l_vertex.size();
873 unsigned int s2 = lV.size();
874
876 data.isvertex = false;
879 if (s1==0 && s2==0) return false;
880
882 data.l_vertex.clear();
884 if (s2 == 0) return false;
885
887 data.isvertex = true;
888 for (const Trk::Vertex& v: lV) {
889 data.l_vertex.insert(static_cast<float>(v.position().z()));
890 }
891
894 data.zminU = (*data.l_vertex. begin())-20.f;
895 if (data.zminU < m_zmin) data.zminU = m_zmin;
896 data.zmaxU = (*data.l_vertex.rbegin())+20.f;
897 if (data.zmaxU > m_zmax) data.zmaxU = m_zmax;
898
901 return false;
902}

◆ next()

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

This method will update the data.seedOutput member to be the next seed pointed at by the data.i_seed_Pro iterator over the data.l_seeds_Pro list.

Some poor quality PPS seeds will be skipped, this cut is implemented within the SiSpacePointsSeed::set3 method. If we run out of seeds after having previously reached a premature abort condition, seed finding will automatically be continued until all seeds have been found.

Parameters
[in]ctxEvent contex
[in,out]dataEvent data, updated and used to obtain the next seed to return

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 2443 of file SiSpacePointsSeedMaker_ATLxk.cxx.

2444{
2446 if (not data.initialized) initializeEventData(data);
2447
2448 if (data.nspoint==3) {
2449 do {
2451 if (data.i_seed_Pro==data.i_seede_Pro) {
2456 findNext(data);
2458 //cppcheck-suppress identicalInnerCondition
2459 if (data.i_seed_Pro==data.i_seede_Pro) return nullptr;
2460 }
2462 } while (!(*data.i_seed_Pro++).set3(data.seedOutput));
2463
2465 return &data.seedOutput;
2466 } else {
2468 if (data.i_seed_Pro==data.i_seede_Pro) {
2469 findNext(data);
2470 //cppcheck-suppress identicalInnerCondition
2471 if (data.i_seed_Pro==data.i_seede_Pro) return nullptr;
2472 }
2473 (*data.i_seed_Pro++).set2(data.seedOutput);
2474 return &data.seedOutput;
2475 }
2476 return nullptr;
2477}
void findNext(EventData &data) const
This method is called within next() when we are out of vertices.

◆ operator=()

SiSpacePointsSeedMaker_ATLxk & InDet::SiSpacePointsSeedMaker_ATLxk::operator= ( const SiSpacePointsSeedMaker_ATLxk & )
privatedelete

◆ production2Sp()

void InDet::SiSpacePointsSeedMaker_ATLxk::production2Sp ( EventData & data) const
private

Definition at line 1404 of file SiSpacePointsSeedMaker_ATLxk.cxx.

1405{
1406 if (data.nsazv<2) return;
1407
1408 std::vector<InDet::SiSpacePointForSeed*>::iterator r0,r0e,r,re;
1409 int nseed = 0;
1410
1411 // Loop thorugh all azimuthal regions
1412 //
1413 for (int f=data.fvNmin; f<=m_maxBinPhiVertex; ++f) {
1414
1415 // For each azimuthal region loop through Z regions
1416 //
1417 int z = 0;
1418 if (!data.endlist) z = data.zMin;
1419 for (; z<arraySizeZV; ++z) {
1420
1421 int a = f*arraySizeZV+z;
1422 if (!data.rfzv_map[a]) continue;
1423 r0 = data.rfzv_Sorted[a].begin();
1424 r0e = data.rfzv_Sorted[a].end ();
1425
1426 if (!data.endlist) {
1427 r0 = data.rMin;
1428 data.endlist = true;
1429 }
1430
1431 // Loop through trigger space points
1432 //
1433 for (; r0!=r0e; ++r0) {
1434
1435 float X = (*r0)->x();
1436 float Y = (*r0)->y();
1437 float R = (*r0)->radius();
1438 if (R<m_r2minv) continue;
1439 if (R>m_r2maxv) break;
1440 float Z = (*r0)->z();
1441 float ax = X/R;
1442 float ay = Y/R;
1443
1444 // Bottom links production
1445 //
1446 int numberBottomCells = m_nNeighboursVertexPhiZ[a];
1447 for (int i=0; i<numberBottomCells; ++i) {
1448
1449 int an = m_neighboursVertexPhiZ[a][i];
1450 if (!data.rfzv_map[an]) continue;
1451
1452 r = data.rfzv_Sorted[an].begin();
1453 re = data.rfzv_Sorted[an].end();
1454
1455 for (; r!=re; ++r) {
1456
1457 float Rb =(*r)->radius();
1458 if (Rb<m_r1minv) continue;
1459 if (Rb>m_r1maxv) break;
1460 float dR = R-Rb;
1461 if (dR<m_drminv) break;
1462 if (dR>m_drmax) continue;
1463 float dZ = Z-(*r)->z();
1464 float Tz = dZ/dR;
1465 if (Tz<data.dzdrmin || Tz>data.dzdrmax) continue;
1466 float Zo = Z-R*Tz;
1467
1468 // Comparison with vertices Z coordinates
1469 //
1470 if (!isZCompatible(data, Zo, Rb, Tz)) continue;
1471
1472 // Momentum cut
1473 //
1474 float dx =(*r)->x()-X;
1475 float dy =(*r)->y()-Y;
1476 float x = dx*ax+dy*ay;
1477 float y =-dx*ay+dy*ax;
1478 float xy = x*x+y*y;
1479 if (xy == 0.) continue;
1480 float r2 = 1.f/xy;
1481 float Ut = x*r2;
1482 float Vt = y*r2;
1483 float UR = Ut*R+1.f;
1484 if (UR == 0.) continue;
1485 float A = Vt*R/UR;
1486 float B = Vt-A*Ut;
1487 if (std::abs(B*data.K) > m_ipt*std::sqrt(1.f+A*A)) continue;
1488 ++nseed;
1489 newSeed(data, (*r), (*r0), Zo);
1490 }
1491 }
1492 if (nseed < m_maxsize) continue;
1493 data.endlist=false;
1494 data.rMin = (++r0);
1495 data.fvNmin=f;
1496 data.zMin=z;
1497 return;
1498 }
1499 }
1500 }
1501 data.endlist = true;
1502}
const std::regex re(r_e)
static Double_t a
static void newSeed(EventData &data, SiSpacePointForSeed *&p1, SiSpacePointForSeed *&p2, float z)
bool isZCompatible(EventData &data, const float Zv, const float R, const float T) const
const double r0
electron radius{cm}

◆ production3Sp() [1/2]

void InDet::SiSpacePointsSeedMaker_ATLxk::production3Sp ( EventData & data) const
private

Top-level method for 3-SP seed production.

This method loops over each eta-Z region, and in each region calls the extended production3Sp method below to do the actual work.

Parameters
[in,out]dataEvent data which will be updated

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 So we first go from the IP to the right, then from the IP to the left, each time working our way outward

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 1508 of file SiSpacePointsSeedMaker_ATLxk.cxx.

1509{
1510
1512 if (data.nsaz<3) return;
1513
1524
1525
1535 const std::array<int,arraySizeZ> zBinIndex {5,6,7,8,9,10,4,3,2,1,0};
1536
1539 std::array<std::vector<InDet::SiSpacePointForSeed*>::iterator,arraySizeNeighbourBins> iter_topCands;
1540 std::array<std::vector<InDet::SiSpacePointForSeed*>::iterator,arraySizeNeighbourBins> iter_endTopCands;
1541 std::array<std::vector<InDet::SiSpacePointForSeed*>::iterator,arraySizeNeighbourBins> iter_bottomCands;
1542 std::array<std::vector<InDet::SiSpacePointForSeed*>::iterator,arraySizeNeighbourBins> iter_endBottomCands;
1543
1545 int nseed = 0;
1547 data.endlist = true;
1548
1550 for (int phiBin=data.fNmin; phiBin<=m_maxPhiBin; ++phiBin) {
1551
1553 int z = 0;
1555 if (!data.endlist) z = data.zMin;
1556
1560 for (; z<arraySizeZ; ++z) {
1561
1562 int phiZbin = phiBin *arraySizeZ+zBinIndex[z];
1563
1565 if (!data.rfz_map[phiZbin]) continue;
1566
1569 int numberBottomCells = 0;
1570 int numberTopCells = 0;
1571
1576 for (int neighbourCellNumber=0; neighbourCellNumber<m_nNeighbourCellsBottom[phiZbin]; ++neighbourCellNumber) {
1577
1578 int theNeighbourCell = m_neighbourCellsBottom[phiZbin][neighbourCellNumber];
1580 if (!data.rfz_map[theNeighbourCell]) continue;
1582 iter_bottomCands [numberBottomCells] = data.rfz_Sorted[theNeighbourCell].begin();
1583 iter_endBottomCands[numberBottomCells++] = data.rfz_Sorted[theNeighbourCell].end();
1584 }
1585
1590 for (int neighbourCellNumber=0; neighbourCellNumber<m_nNeighbourCellsTop[phiZbin]; ++neighbourCellNumber) {
1591
1592 int theNeighbourCell = m_neighbourCellsTop[phiZbin][neighbourCellNumber];
1594 if (!data.rfz_map[theNeighbourCell]) continue;
1596 iter_topCands [numberTopCells] = data.rfz_Sorted[theNeighbourCell].begin();
1597 iter_endTopCands[numberTopCells++] = data.rfz_Sorted[theNeighbourCell].end();
1598 }
1599
1601 if (!data.trigger) production3Sp (data, iter_bottomCands, iter_endBottomCands, iter_topCands, iter_endTopCands, numberBottomCells, numberTopCells, nseed,zBinIndex[z]);
1602 else production3SpTrigger(data, iter_bottomCands, iter_endBottomCands, iter_topCands, iter_endTopCands, numberBottomCells, numberTopCells, nseed);
1603 }
1604
1611 if (nseed>=m_maxsize) {
1612 data.endlist=false;
1613 data.fNmin = phiBin+1;
1614 return;
1615 }
1616 }
1618 data.endlist = true;
1619}
void production3SpTrigger(EventData &data, std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &rb, std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &rbe, std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &rt, std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > &rte, const int numberBottomCells, const int numberTopCells, int &nseed) const
as above, but for the trigger

◆ production3Sp() [2/2]

void InDet::SiSpacePointsSeedMaker_ATLxk::production3Sp ( EventData & data,
std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > & iter_bottomCands,
std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > & iter_endBottomCands,
std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > & iter_topCands,
std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > & iter_endTopCands,
const int numberBottomCells,
const int numberTopCells,
int & nseed,
const int zbin = -1 ) 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.

identify if we are looking at pixel or strip space points

bins 4,5,6 are the region in z = +/- 450 mm - "barrel like" in terms of hit locations

the central SP should not be in the IBL (nothing could go below)

in the pixels, the highest-up SP can be fairly far out along the disk

in the barrel pixels, we also remove the outermost layer from the central SP search

for strip seed formation, allow most of the strip volume

default behaviour, applies in the forward region

start slightly above the lowest r occuring in the SCT for the central SP

for the central SP, do not go all the way to the upper edge of a disk.

in the barrel avoid the first strip layer for the central SP

skip last barrel layer as well - there must be a hit beyond

in the transition also avoid the first strip layer for the central SP

here, actually go higher than otherwise, to catch the ~full extent of the first two disks. We manually exclude the flat barrel part below

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

veto the last pixel disk

veto strip barrel layer 4 in the transition region

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

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 bottom SP is too far, remember this for future iterations and don't bother starting from the beginning again

if the points are too close in r, abort (future ones will be even closer). If we are in the second pass (PPP) and starting to reach strip spacepoints, also time to stop!

dZ/dR

and abs value

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

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

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 did not find ANY bottom SP, or if we exceed the storage capacity, we abort this seed candidate.

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

Top links production

again, loop over cells of interest, this time for the top SP candidate

loop over each SP in each cell

evaluate the radial distance,

and continue if we are too close

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

evaluate (and cut on) dZ/dR

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

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 found no top candidates (remember, Nt starts counting at Nb), 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

for strips, apply the strip version of the IP cut

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

theta estimate of the seed based on the average value of 1/tan(theta)

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. 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 = V --> B = V - A x U

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

< delta U = 0 blocks the evaluation of A.

< A parameter, slope of the seed point distribution in the U,V plane

< B parameter, V axis intercept of the seed point distribution in the U,V plane

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 the precise d0 calculation if we don't have to worry about floating point exceptions

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

set parameters for ntuple writing

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 1625 of file SiSpacePointsSeedMaker_ATLxk.cxx.

1632{
1638
1640 std::vector<InDet::SiSpacePointForSeed*>::iterator iter_centralSP=iter_bottomCands[0];
1641 std::vector<InDet::SiSpacePointForSeed*>::iterator iter_otherSP;
1642
1648
1650 bool isStrip = ((*iter_centralSP)->spacepoint->clusterList().second);
1651
1654 bool isBarrelRegion = (zbin >=4 && zbin <= 6);
1655 bool isTransitionRegion = (zbin == 3 || zbin == 7); // region in z = 450 - 925mm
1656 float rmin = 40.;
1657 float rmax = 140.;
1658
1659 if (isBarrelRegion){
1660 rmax = 100;
1661 }
1663 if(isStrip) {
1665 rmin = 285.;
1666 rmax = 450.;
1667 if (isBarrelRegion){
1668 rmin = 335;
1669 rmax = 450.;
1670 }
1671 else if (isTransitionRegion){
1672 rmin = 335;
1673 rmax = 550;
1675 }
1676 }
1677
1679 for(; iter_centralSP!=iter_endBottomCands[0]; ++iter_centralSP) {
1680 if((*iter_centralSP)->radius() > rmin) break;
1681 }
1682
1685 iter_topCands[0] = iter_centralSP;
1686 ++iter_topCands[0];
1687
1689 const float ipt2K = data.ipt2K;
1690 const float ipt2C = data.ipt2C;
1691 const float COFK = data.COFK;
1692 const float maxd0cut = m_maxdImpact;
1693 const float maxd0cutstrips = m_maxdImpactDecays;
1694 const float zmin = data.zminU;
1695 const float zmax = data.zmaxU;
1696 const float dzdrmax = data.dzdrmax;
1697 const float dzdrmin = data.dzdrmin;
1698 data.CmSp.clear();
1699
1702 size_t SPcapacity = data.SP.size();
1703
1705 for (; iter_centralSP!=iter_endBottomCands[0]; ++iter_centralSP) {
1706
1707 const float& R = (*iter_centralSP)->radius();
1708 if(R > rmax) break;
1709
1711 const float& X = (*iter_centralSP)->x();
1712 const float& Y = (*iter_centralSP)->y();
1713 const float& Z = (*iter_centralSP)->z();
1714
1717 double absZ = std::abs(Z);
1719 if (isStrip && absZ > 2650. ) continue;
1721 if (!isStrip && absZ > 600.) continue;
1723 if (isStrip && isTransitionRegion && absZ < 750. && R > 450.) continue;
1724
1727 size_t Nb = 0;
1728
1731 for (int cell=0; cell<numberBottomCells; ++cell) {
1733 for (iter_otherSP=iter_bottomCands[cell]; iter_otherSP!=iter_endBottomCands[cell]; ++iter_otherSP) {
1734
1736 const float& Rb =(*iter_otherSP)->radius();
1737 float dR = R-Rb;
1738
1741 if (dR > m_drmax) {
1742 iter_bottomCands[cell]=iter_otherSP;
1743 continue;
1744 }
1747 if (dR < m_drmin || (data.iteration && (*iter_otherSP)->spacepoint->clusterList().second)) break;
1748
1750 const float dZdR = (Z-(*iter_otherSP)->z())/dR;
1752 const float absdZdR = std::abs(dZdR);
1754 if (absdZdR < dzdrmin or absdZdR > dzdrmax) continue;
1755
1758 const float z0 = Z-R*dZdR;
1759 if(z0 > zmax || z0 < zmin) continue;
1761 data.SP[Nb] = (*iter_otherSP);
1762 if(m_writeNtuple) data.SP[Nb]->setDZDR(dZdR);
1766 if (++Nb==SPcapacity){
1767 data.resizeSPCont();
1768 SPcapacity=data.SP.size();
1769 }
1770 }
1771 }
1772
1774 if (!Nb) continue;
1775
1779 size_t Nt = Nb;
1780
1782
1784 for (int cell=0; cell<numberTopCells; ++cell) {
1786 for (iter_otherSP=iter_topCands[cell];iter_otherSP!=iter_endTopCands[cell]; ++iter_otherSP) {
1787
1789 float Rt =(*iter_otherSP)->radius();
1790 float dR = Rt-R;
1791
1793 if (dR<m_drmin) {
1794 iter_topCands[cell]=iter_otherSP;
1795 continue;
1796 }
1798 if (dR>m_drmax) break;
1799
1801 float dZdR = ((*iter_otherSP)->z()-Z)/dR;
1802 float absdZdR = std::abs(dZdR);
1803 if (absdZdR < dzdrmin or absdZdR > dzdrmax) continue;
1804
1807 float z0 = Z-R*dZdR;
1808 if(z0 > zmax || z0 < zmin) continue;
1810 data.SP[Nt] = (*iter_otherSP);
1811 if (m_writeNtuple) data.SP[Nt]->setDZDR(dZdR);
1815 if (++Nt==SPcapacity) {
1816 data.resizeSPCont();
1817 SPcapacity=data.SP.size();
1818 }
1819 }
1820 }
1821
1823 if (!(Nt-Nb)) continue;
1824
1826 float covr0 = (*iter_centralSP)->covr ();
1827 float covz0 = (*iter_centralSP)->covz ();
1828
1830 float ax = X/R;
1831 float ay = Y/R;
1832
1835 for (size_t i=0; i<Nt; ++i) {
1836
1837 InDet::SiSpacePointForSeed* sp = data.SP[i];
1838
1841 float dx = sp->x()-X;
1842 float dy = sp->y()-Y;
1843 float dz = sp->z()-Z;
1844 float x = dx*ax+dy*ay;
1845 float y = dy*ax-dx*ay;
1846
1848 float r2 = 1.f/(x*x+y*y);
1850 float dr = std::sqrt(r2);
1853 float tz = dz*dr;
1854
1857 if (i < Nb) tz = -tz;
1858
1860 data.Tz[i] = tz;
1861 data.Zo[i] = Z-R*tz;
1862 data.R [i] = dr;
1863 data.U [i] = x*r2;
1864 data.V [i] = y*r2;
1865 data.Er[i] = ((covz0+sp->covz())+(tz*tz)*(covr0+sp->covr()))*r2;
1866 }
1867
1868 data.nOneSeeds = 0;
1869 data.mapOneSeeds_Pro.clear();
1870
1873 for (size_t b=0; b<Nb; ++b) {
1874
1876 float Zob = data.Zo[b];
1877 float Tzb = data.Tz[b];
1878 float Erb = data.Er[b];
1879 float Vb = data.V [b];
1880 float Ub = data.U [b];
1881 float Tzb2 = (1.f+Tzb*Tzb);
1882 float sTzb2 = std::sqrt(Tzb2);
1883 float sigmaSquaredScatteringPtDependent = Tzb2*COFK;
1884 float sigmaSquaredScatteringMinPt = Tzb2*ipt2C;
1887 float d0max = maxd0cut;
1889 if (data.SP[b]->spacepoint->clusterList().second) d0max = maxd0cutstrips;
1890
1892 for (size_t t=Nb; t<Nt; ++t) {
1893
1898
1900 float meanOneOverTanTheta = (Tzb+data.Tz[t])/2.f;
1901 float theta = 0.;
1902 if(m_writeNtuple){
1904 theta = std::atan(1.f/meanOneOverTanTheta);
1905 }
1907 float sigmaSquaredSpacePointErrors = Erb+data.Er[t]
1908 + 2.f * covz0 * data.R[t]*data.R[b]
1909 + 2.f * covr0 * data.R[t]*data.R[b] * meanOneOverTanTheta * meanOneOverTanTheta; // mixed term with r-uncertainy on central SP
1911 float remainingSquaredDelta = (Tzb-data.Tz[t])*(Tzb-data.Tz[t]) - sigmaSquaredSpacePointErrors;
1912
1915 if (remainingSquaredDelta - sigmaSquaredScatteringMinPt > 0 ) continue;
1916
1938 float deltaU = data.U[t]-Ub;
1939 if (deltaU == 0.) continue;
1940 float A = (data.V[t]-Vb)/deltaU;
1941 float B = Vb-A*Ub;
1942 float onePlusAsquare = 1.f+A*A;
1943 float BSquare = B*B;
1944
1957 if (BSquare > ipt2K*onePlusAsquare || remainingSquaredDelta*onePlusAsquare > BSquare*sigmaSquaredScatteringPtDependent) continue;
1974 float d0 = 0;
1975 if(std::abs(B) < 1e-10) d0 = std::abs((A-B*R)*R);
1977 else{
1978 float x0 = -A/(2.f*B);
1979 float rTrack = std::sqrt(onePlusAsquare/BSquare)*.5f;
1980 d0 = std::abs(-rTrack + std::sqrt(rTrack*rTrack +2.f*x0*R +R*R));
1981 }
1982
1984 if (d0 <= d0max) {
1986 float dr = data.R[b];
1987 if (data.R[t] < data.R[b]) dr = data.R[t];
1991 data.SP[t]->setScorePenalty(std::abs((Tzb-data.Tz[t])/(dr*sTzb2)));
1992 data.SP[t]->setParam(d0);
1993
1994 if(m_writeNtuple){
1996 data.SP[t]->setEta(-std::log(std::tan(0.5f*theta)));
1997 data.SP[t]->setPt(std::sqrt(onePlusAsquare/BSquare)/(1000.f*data.K));
1998 }
2000 data.CmSp.emplace_back(B/std::sqrt(onePlusAsquare), data.SP[t]);
2002
2003 }
2004
2005 }
2007 if (!data.CmSp.empty()) {
2008 newOneSeedWithCurvaturesComparison(data, data.SP[b], (*iter_centralSP), Zob);
2009 }
2010 }
2012 fillSeeds(data);
2013 nseed += data.fillOneSeeds;
2014
2015 }
2016}
void fillSeeds(EventData &data) const
fills the seeds from the mapOneSeeds_Pro member into the l_seeds_Pro member of the data object,...
void newOneSeedWithCurvaturesComparison(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 InDet::SiSpacePointsSeedMaker_ATLxk::production3SpTrigger ( EventData & data,
std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > & rb,
std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > & rbe,
std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > & rt,
std::array< std::vector< InDet::SiSpacePointForSeed * >::iterator, arraySizeNeighbourBins > & rte,
const int numberBottomCells,
const int numberTopCells,
int & nseed ) const
private

as above, but for the trigger

Definition at line 2022 of file SiSpacePointsSeedMaker_ATLxk.cxx.

2029{
2030 constexpr float twoPi = 2.*M_PI;
2031
2032 std::vector<InDet::SiSpacePointForSeed*>::iterator r0=rb[0],r;
2033
2034 float rmin = 40.;
2035 float rmax = 140.;
2036 if((*r0)->spacepoint->clusterList().second) {
2037 rmin = 280.;
2038 rmax = 540.;
2039 }
2040
2041 for(; r0!=rbe[0]; ++r0) {if((*r0)->radius() > rmin) break;}
2042 rt[0] = r0; ++rt[0];
2043
2044 float ipt2K = data.ipt2K;
2045 float ipt2C = data.ipt2C;
2046 float COFK = data.COFK;
2047 float maxd0cut = m_maxdImpact;
2048 float maxd0cutstrips = m_maxdImpactSSS;
2049
2050 data.CmSp.clear();
2051
2052 // Loop through all trigger space points
2053 //
2054 for (; r0!=rbe[0]; ++r0) {
2055
2056 data.nOneSeeds = 0;
2057 data.mapOneSeeds_Pro.clear();
2058
2059 float R = (*r0)->radius();
2060 if(R>rmax) break;
2061
2062 const Trk::Surface* sur0 = (*r0)->sur();
2063 float X = (*r0)->x();
2064 float Y = (*r0)->y();
2065 float Z = (*r0)->z();
2066 int Nb = 0;
2067
2068 // Bottom links production
2069 //
2070 for (int i=0; i<numberBottomCells; ++i) {
2071
2072 for (r=rb[i]; r!=rbe[i]; ++r) {
2073
2074 float Rb =(*r)->radius();
2075
2076 float dR = R-Rb;
2077 if (dR > m_drmax) {
2078 rb[i]=r;
2079 continue;
2080 }
2081 if ((*r)->sur()==sur0) continue;
2082
2083 if (dR < m_drmin || (data.iteration && (*r)->spacepoint->clusterList().second)) break;
2084
2085 // Comparison with bottom and top Z
2086 //
2087 float Tz = (Z-(*r)->z())/dR;
2088 float Zo = Z-R*Tz;
2089 if (Zo < data.zminB || Zo > data.zmaxB) continue;
2090 float Zu = Z+(550.f-R)*Tz;
2091 if (Zu < data.zminU || Zu > data.zmaxU) continue;
2092 data.SP[Nb] = (*r);
2093 if (++Nb==m_maxsizeSP) goto breakb;
2094 }
2095 }
2096 breakb:
2097 if (!Nb || Nb==m_maxsizeSP) continue;
2098 int Nt = Nb;
2099
2100 // Top links production
2101 //
2102 for (int i=0; i<numberTopCells; ++i) {
2103
2104 for (r=rt[i]; r!=rte[i]; ++r) {
2105
2106 float Rt =(*r)->radius();
2107 float dR = Rt-R;
2108
2109 if (dR<m_drmin) {
2110 rt[i]=r;
2111 continue;
2112 }
2113 if (dR>m_drmax) break;
2114 if ((*r)->sur()==sur0) continue;
2115
2116 // Comparison with bottom and top Z
2117 //
2118 float Tz = ((*r)->z()-Z)/dR;
2119 float Zo = Z-R*Tz;
2120 if (Zo < data.zminB || Zo > data.zmaxB) continue;
2121 float Zu = Z+(550.f-R)*Tz;
2122 if (Zu < data.zminU || Zu > data.zmaxU) continue;
2123 data.SP[Nt] = (*r);
2124 if (++Nt==m_maxsizeSP) goto breakt;
2125 }
2126 }
2127
2128 breakt:
2129 if (!(Nt-Nb)) continue;
2130 float covr0 = (*r0)->covr ();
2131 float covz0 = (*r0)->covz ();
2132
2133 float ax = X/R;
2134 float ay = Y/R;
2135
2136 for (int i=0; i<Nt; ++i) {
2137
2138 InDet::SiSpacePointForSeed* sp = data.SP[i];
2139
2140 float dx = sp->x()-X;
2141 float dy = sp->y()-Y;
2142 float dz = sp->z()-Z;
2143 float x = dx*ax+dy*ay;
2144 float y = dy*ax-dx*ay;
2145 float r2 = 1.f/(x*x+y*y);
2146 float dr = std::sqrt(r2);
2147 float tz = dz*dr;
2148 if (i < Nb) tz = -tz;
2149
2150 data.Tz[i] = tz;
2151 data.Zo[i] = Z-R*tz;
2152 data.R [i] = dr;
2153 data.U [i] = x*r2;
2154 data.V [i] = y*r2;
2155 data.Er[i] = ((covz0+sp->covz())+(tz*tz)*(covr0+sp->covr()))*r2;
2156 }
2157 covr0 *= .5f;
2158 covz0 *= 2.f;
2159
2160 // Three space points comparison
2161 //
2162 for (int b=0; b<Nb; ++b) {
2163
2164 float Zob = data.Zo[b];
2165 float Tzb = data.Tz[b];
2166 float Rb2r = data.R [b]*covr0;
2167 float Rb2z = data.R [b]*covz0;
2168 float Erb = data.Er[b];
2169 float Vb = data.V [b];
2170 float Ub = data.U [b];
2171 float Tzb2 = (1.f+Tzb*Tzb);
2172 float CSA = Tzb2*COFK;
2173 float ICSA = Tzb2*ipt2C;
2174 float d0max = maxd0cut;
2175 if (data.SP[b]->spacepoint->clusterList().second) d0max = maxd0cutstrips;
2176
2177 for (int t=Nb; t<Nt; ++t) {
2178
2179 float dT = ((Tzb-data.Tz[t])*(Tzb-data.Tz[t])-data.R[t]*Rb2z-(Erb+data.Er[t]))-(data.R[t]*Rb2r)*((Tzb+data.Tz[t])*(Tzb+data.Tz[t]));
2180 if ( dT > ICSA) continue;
2181
2182 float deltaU = data.U[t]-Ub;
2183 if (deltaU == 0.) continue;
2184 float A = (data.V[t]-Vb)/deltaU;
2185 float onePlusAsquare = 1.f+A*A;
2186 float B = Vb-A*Ub;
2187 float BSquare = B*B;
2188 if (BSquare > ipt2K*onePlusAsquare || dT*onePlusAsquare > BSquare*CSA) continue;
2189
2190 float Im = std::abs((A-B*R)*R);
2191 if (Im > d0max) continue;
2192
2193 // Azimuthal angle test
2194 //
2195 float y = 1.;
2196 float x = 2.f*B*R-A;
2197 float df = std::abs(std::atan2(ay*y-ax*x,ax*y+ay*x)-data.ftrig);
2198 if (df > M_PI) df = twoPi-df;
2199 if (df > data.ftrigW) continue;
2200 data.CmSp.emplace_back(B/std::sqrt(onePlusAsquare), data.SP[t]);
2201 data.SP[t]->setParam(Im);
2202 }
2203 if (!data.CmSp.empty()) {
2204 newOneSeedWithCurvaturesComparison(data, data.SP[b], (*r0), Zob);
2205 }
2206 }
2207 fillSeeds(data);
2208 nseed += data.fillOneSeeds;
2209 }
2210}
df
Printing table to screen.

◆ writeNtuple()

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

This method is called by the SiSPSeededTrackFinder algorithm to fill ntuples for seeds seen by the algorithm.

Method to write ntuple entries for an input seed.

seedType represents Pixel/SCT type seeds, where 0->SCT and 1->Pixel. givesTrack is determined by whether or not the given seed forms atleast one track candidate. 0->No track candidate 1->At least one track Candidate

Definition at line 2482 of file SiSpacePointsSeedMaker_ATLxk.cxx.

2482 {
2483
2484 if(m_writeNtuple) {
2485 std::lock_guard<std::mutex> lock(m_mutex);
2486
2487 if(track != nullptr) {
2488 m_trackPt = (track->trackParameters()->front()->pT())/1000.f;
2489 m_trackEta = std::abs(track->trackParameters()->front()->eta());
2490 }
2491 else {
2492 m_trackPt = -1.;
2493 m_trackEta = -1.;
2494 }
2495 m_d0 = seed->d0();
2496 m_z0 = seed->zVertex();
2497 m_eta = seed->eta();
2498 m_x1 = seed->x1();
2499 m_x2 = seed->x2();
2500 m_x3 = seed->x3();
2501 m_y1 = seed->y1();
2502 m_y2 = seed->y2();
2503 m_y3 = seed->y3();
2504 m_z1 = seed->z1();
2505 m_z2 = seed->z2();
2506 m_z3 = seed->z3();
2507 m_r1 = seed->r1();
2508 m_r2 = seed->r2();
2509 m_r3 = seed->r3();
2510 m_type = seedType;
2511 m_dzdr_b = seed->dzdr_b();
2512 m_dzdr_t = seed->dzdr_t();
2513 m_pt = seed->pt();
2514 m_givesTrack = !(track == nullptr);
2515 m_eventNumber = eventNumber;
2516
2517 // Ok: protected by mutex.
2518 TTree* outputTree ATLAS_THREAD_SAFE = m_outputTree;
2519 outputTree->Fill();
2520
2521 }
2522
2523}
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.

Member Data Documentation

◆ ATLAS_THREAD_SAFE [1/24]

long m_eventNumber InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 514 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [2/24]

float m_trackEta InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 513 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [3/24]

float m_trackPt InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 512 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [4/24]

bool m_givesTrack InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 511 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [5/24]

double m_dzdr_b InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 510 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [6/24]

double m_dzdr_t InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 509 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [7/24]

int m_type InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 508 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [8/24]

float m_quality InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 507 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [9/24]

double m_r3 InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 506 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [10/24]

double m_r2 InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 505 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [11/24]

double m_r1 InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 504 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [12/24]

double m_z3 InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 503 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [13/24]

double m_z2 InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 502 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [14/24]

double m_z1 InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 501 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [15/24]

double m_y3 InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 500 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [16/24]

double m_y2 InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 499 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [17/24]

double m_y1 InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 498 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [18/24]

double m_x3 InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 497 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [19/24]

double m_x2 InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 496 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [20/24]

double m_x1 InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 495 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [21/24]

float m_eta InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 494 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [22/24]

float m_pt InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 493 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [23/24]

float m_z0 InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 492 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ ATLAS_THREAD_SAFE [24/24]

float m_d0 InDet::SiSpacePointsSeedMaker_ATLxk::ATLAS_THREAD_SAFE = 0
mutableprivate

Definition at line 491 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ m_alwaysKeepConfirmedPixelSeeds

BooleanProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_alwaysKeepConfirmedPixelSeeds {this, "alwaysKeepConfirmedPixelSeeds", false}
private

This flag will lead to all confirmed seeds (seeds where a second compatible seed with a different top spacepoint is found) being kept, even in excess of maxSeedsForSpacePoint above.

Definition at line 188 of file SiSpacePointsSeedMaker_ATLxk.h.

188{this, "alwaysKeepConfirmedPixelSeeds", false};

◆ m_alwaysKeepConfirmedStripSeeds

BooleanProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_alwaysKeepConfirmedStripSeeds {this, "alwaysKeepConfirmedStripSeeds", false}
private

Definition at line 189 of file SiSpacePointsSeedMaker_ATLxk.h.

189{this, "alwaysKeepConfirmedStripSeeds", false};

◆ m_beamSpotKey

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

Definition at line 167 of file SiSpacePointsSeedMaker_ATLxk.h.

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

◆ m_binSizeR

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_binSizeR {this, "radStep", 2.}
private

Definition at line 210 of file SiSpacePointsSeedMaker_ATLxk.h.

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

◆ m_checketa

BooleanProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_checketa {this, "checkEta", false}
private

Definition at line 226 of file SiSpacePointsSeedMaker_ATLxk.h.

226{this, "checkEta", false};

◆ m_COF

float InDet::SiSpacePointsSeedMaker_ATLxk::m_COF {134*.05f*9}
staticconstexprprivate

appears to be an approximated term related to multiple-scattering of particles traversing the ID during the seed formation

Definition at line 255 of file SiSpacePointsSeedMaker_ATLxk.h.

255{134*.05f*9};

◆ m_dImpactCutSlopeUnconfirmedPPP

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_dImpactCutSlopeUnconfirmedPPP {this, "dImpactCutSlopeUnconfirmedPPP", 0.}
private

Definition at line 218 of file SiSpacePointsSeedMaker_ATLxk.h.

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

◆ m_dImpactCutSlopeUnconfirmedSSS

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_dImpactCutSlopeUnconfirmedSSS {this, "dImpactCutSlopeUnconfirmedSSS", 1.0}
private

these flags allow to dynamically tighten the d0 cut on non-confirmed seeds based on the penalty score they receive for kinking in the r-z plane.

The cut is adapted as cut_value = original - slope x penalty

Definition at line 217 of file SiSpacePointsSeedMaker_ATLxk.h.

217{this, "dImpactCutSlopeUnconfirmedSSS", 1.0};

◆ m_drmax

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_drmax {this, "maxdRadius", 270.}
private

Definition at line 199 of file SiSpacePointsSeedMaker_ATLxk.h.

199{this, "maxdRadius", 270.};

◆ m_drmin

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_drmin {this, "mindRadius", 5.}
private

Definition at line 211 of file SiSpacePointsSeedMaker_ATLxk.h.

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

◆ m_drminv

float InDet::SiSpacePointsSeedMaker_ATLxk::m_drminv {20.}
private

Definition at line 244 of file SiSpacePointsSeedMaker_ATLxk.h.

244{20.};

◆ m_dzdrmax0

float InDet::SiSpacePointsSeedMaker_ATLxk::m_dzdrmax0 {0.}
private

implicitly store eta cut

Definition at line 251 of file SiSpacePointsSeedMaker_ATLxk.h.

251{0.};

◆ m_dzdrmin0

float InDet::SiSpacePointsSeedMaker_ATLxk::m_dzdrmin0 {0.}
private

conversion factors and cached cut values

implicitly store eta cut

Definition at line 250 of file SiSpacePointsSeedMaker_ATLxk.h.

250{0.};

◆ m_dzdrver

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_dzdrver {this, "maxdZdRver", .02}
private

Definition at line 203 of file SiSpacePointsSeedMaker_ATLxk.h.

203{this, "maxdZdRver", .02};

◆ m_dzver

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_dzver {this, "maxdZver", 5.}
private

Definition at line 202 of file SiSpacePointsSeedMaker_ATLxk.h.

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

◆ m_etamax

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_etamax {this, "etaMax", 2.7}
private

Definition at line 194 of file SiSpacePointsSeedMaker_ATLxk.h.

194{this, "etaMax", 2.7};

◆ m_etamin

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_etamin {this, "etaMin", 0.}
private

Definition at line 208 of file SiSpacePointsSeedMaker_ATLxk.h.

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

◆ m_fieldCondObjInputKey

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

Read handle for conditions object to get the field cache.

Definition at line 169 of file SiSpacePointsSeedMaker_ATLxk.h.

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

◆ m_fieldScale

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_fieldScale {this, "fieldScale", 1.}
private

Definition at line 221 of file SiSpacePointsSeedMaker_ATLxk.h.

221{this, "fieldScale", 1.};

◆ m_inverseBinSizePhi

float InDet::SiSpacePointsSeedMaker_ATLxk::m_inverseBinSizePhi {0}
private

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

Definition at line 262 of file SiSpacePointsSeedMaker_ATLxk.h.

262{0};

◆ m_inverseBinSizePhiVertex

float InDet::SiSpacePointsSeedMaker_ATLxk::m_inverseBinSizePhiVertex {0}
private

as above but for vertex

Definition at line 263 of file SiSpacePointsSeedMaker_ATLxk.h.

263{0};

◆ m_ipt

float InDet::SiSpacePointsSeedMaker_ATLxk::m_ipt {0.}
private

inverse of 90% of the ptmin cut

Definition at line 252 of file SiSpacePointsSeedMaker_ATLxk.h.

252{0.};

◆ m_ipt2

float InDet::SiSpacePointsSeedMaker_ATLxk::m_ipt2 {0.}
private

inverse square of 90% of the pt min cut

Definition at line 253 of file SiSpacePointsSeedMaker_ATLxk.h.

253{0.};

◆ m_maxBinPhiVertex

int InDet::SiSpacePointsSeedMaker_ATLxk::m_maxBinPhiVertex {0}
private

number of bins in phi for vertices

Definition at line 261 of file SiSpacePointsSeedMaker_ATLxk.h.

261{0};

◆ m_maxdImpact

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_maxdImpact {this, "maxdImpact", 10.}
private

Definition at line 212 of file SiSpacePointsSeedMaker_ATLxk.h.

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

◆ m_maxdImpactDecays

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_maxdImpactDecays {this, "maxdImpactForDecays", 20.}
private

Definition at line 219 of file SiSpacePointsSeedMaker_ATLxk.h.

219{this, "maxdImpactForDecays", 20.};

◆ m_maxdImpactSSS

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_maxdImpactSSS {this, "maxdImpactSSS", 50.}
private

Definition at line 213 of file SiSpacePointsSeedMaker_ATLxk.h.

213{this, "maxdImpactSSS", 50.};

◆ m_maxOneSizePPP

IntegerProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_maxOneSizePPP {this, "maxSeedsForSpacePointPixels", 5}
private

Definition at line 184 of file SiSpacePointsSeedMaker_ATLxk.h.

184{this, "maxSeedsForSpacePointPixels", 5};

◆ m_maxOneSizeSSS

IntegerProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_maxOneSizeSSS {this, "maxSeedsForSpacePointStrips", 5}
private

maximum number of seeds to keep per central space point.

the top N seeds sorted by quality are preserved if more candidates than the limit exist

Definition at line 183 of file SiSpacePointsSeedMaker_ATLxk.h.

183{this, "maxSeedsForSpacePointStrips", 5};

◆ m_maxPhiBin

int InDet::SiSpacePointsSeedMaker_ATLxk::m_maxPhiBin {0}
private

number of bins in phi

Definition at line 260 of file SiSpacePointsSeedMaker_ATLxk.h.

260{0};

◆ m_maxScore

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_maxScore {this, "maximumAcceptedSeedScore", 100.}
private

Maximum score to accept.

Definition at line 240 of file SiSpacePointsSeedMaker_ATLxk.h.

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

◆ m_maxsize

IntegerProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_maxsize {this, "maxSize", 50000}
private

Definition at line 178 of file SiSpacePointsSeedMaker_ATLxk.h.

178{this, "maxSize", 50000};

◆ m_maxsizeSP

IntegerProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_maxsizeSP {this, "maxSizeSP", 5000}
private

Definition at line 179 of file SiSpacePointsSeedMaker_ATLxk.h.

179{this, "maxSizeSP", 5000};

◆ m_mutex

std::mutex InDet::SiSpacePointsSeedMaker_ATLxk::m_mutex
mutableprivate

Definition at line 486 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ m_nBinsR

int InDet::SiSpacePointsSeedMaker_ATLxk::m_nBinsR {0}
private

number of bins in the radial coordinate

Definition at line 259 of file SiSpacePointsSeedMaker_ATLxk.h.

259{0};

◆ m_neighbourCellsBottom

std::array<std::array<int, arraySizeNeighbourBins>, arraySizePhiZ> InDet::SiSpacePointsSeedMaker_ATLxk::m_neighbourCellsBottom {}
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 287 of file SiSpacePointsSeedMaker_ATLxk.h.

287{};

◆ m_neighbourCellsTop

std::array<std::array<int, arraySizeNeighbourBins>, arraySizePhiZ> InDet::SiSpacePointsSeedMaker_ATLxk::m_neighbourCellsTop {}
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 288 of file SiSpacePointsSeedMaker_ATLxk.h.

288{};

◆ m_neighboursVertexPhiZ

std::array<std::array<int, arraySizeNeighbourBinsVertex>, arraySizePhiZV> InDet::SiSpacePointsSeedMaker_ATLxk::m_neighboursVertexPhiZ {}
private

Definition at line 291 of file SiSpacePointsSeedMaker_ATLxk.h.

291{};

◆ m_nNeighbourCellsBottom

std::array<int,arraySizePhiZ> InDet::SiSpacePointsSeedMaker_ATLxk::m_nNeighbourCellsBottom {}
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 285 of file SiSpacePointsSeedMaker_ATLxk.h.

285{};

◆ m_nNeighbourCellsTop

std::array<int,arraySizePhiZ> InDet::SiSpacePointsSeedMaker_ATLxk::m_nNeighbourCellsTop {}
private

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

Definition at line 286 of file SiSpacePointsSeedMaker_ATLxk.h.

286{};

◆ m_nNeighboursVertexPhiZ

std::array<int,arraySizePhiZV> InDet::SiSpacePointsSeedMaker_ATLxk::m_nNeighboursVertexPhiZ {}
private

Definition at line 290 of file SiSpacePointsSeedMaker_ATLxk.h.

290{};

◆ m_optimisePhiBinning

BooleanProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_optimisePhiBinning {this, "optimisePhiBinning", true}
private

This flag will make the buildFrameWork method determine an optimal phi binning of the search regions based on the pt and IP cuts, assuming PPP and/or SSS passes are being run.

Not recommended for use with Large-R Tracking, where unnecessarily large regions may result.

Definition at line 193 of file SiSpacePointsSeedMaker_ATLxk.h.

193{this, "optimisePhiBinning", true};

◆ m_outputTree

TTree* InDet::SiSpacePointsSeedMaker_ATLxk::m_outputTree
private

Definition at line 484 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ m_pixel

BooleanProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_pixel {this, "usePixel", true}
private

Definition at line 175 of file SiSpacePointsSeedMaker_ATLxk.h.

175{this, "usePixel", true};

◆ m_prdToTrackMap

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

Definition at line 166 of file SiSpacePointsSeedMaker_ATLxk.h.

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

◆ m_ptmin

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_ptmin {this, "pTmin", 500.}
private

Definition at line 220 of file SiSpacePointsSeedMaker_ATLxk.h.

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

◆ m_r1maxv

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_r1maxv {this, "maxVRadius1", 60.}
private

Definition at line 196 of file SiSpacePointsSeedMaker_ATLxk.h.

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

◆ m_r1minv

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_r1minv {this, "minVRadius1", 0.}
private

Definition at line 195 of file SiSpacePointsSeedMaker_ATLxk.h.

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

◆ m_r2maxv

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_r2maxv {this, "maxVRadius2", 200.}
private

Definition at line 198 of file SiSpacePointsSeedMaker_ATLxk.h.

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

◆ m_r2minv

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_r2minv {this, "minVRadius2", 70.}
private

Definition at line 197 of file SiSpacePointsSeedMaker_ATLxk.h.

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

◆ m_r_rmax

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_r_rmax {this, "radMax", 600.}
private

Definition at line 209 of file SiSpacePointsSeedMaker_ATLxk.h.

209{this, "radMax", 600.};

◆ m_radiusCutIBL

float InDet::SiSpacePointsSeedMaker_ATLxk::m_radiusCutIBL {43.}
staticconstexprprivate

We detect IBL hits via the seed radial location.

Place the cut value roughly between IBL and L0

Definition at line 282 of file SiSpacePointsSeedMaker_ATLxk.h.

282{43.};

◆ m_sct

BooleanProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_sct {this, "useSCT", true}
private

Definition at line 176 of file SiSpacePointsSeedMaker_ATLxk.h.

176{this, "useSCT", true};

◆ m_seedScoreBonusConfirmationSeed

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_seedScoreBonusConfirmationSeed {this, "seedScoreBonusConfirmationSeed", -200.}
private

Definition at line 236 of file SiSpacePointsSeedMaker_ATLxk.h.

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

◆ m_seedScoreBonusPPP

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_seedScoreBonusPPP {this, "seedScoreBonusPPP", -200.}
private

Scoring modifiers applied when ranking seeds.

These are used within the newOneSeedWithCurvaturesComparison method. Be aware that a negative score is considered "better", so these should be set to negative numbers.

Definition at line 234 of file SiSpacePointsSeedMaker_ATLxk.h.

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

◆ m_seedScoreBonusSSS

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_seedScoreBonusSSS {this, "seedScoreBonusSSS", -400.}
private

Definition at line 235 of file SiSpacePointsSeedMaker_ATLxk.h.

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

◆ m_seedScoreThresholdPPPConfirmationSeed

float InDet::SiSpacePointsSeedMaker_ATLxk::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 276 of file SiSpacePointsSeedMaker_ATLxk.h.

276{0.};

◆ m_seedScoreThresholdSSSConfirmationSeed

float InDet::SiSpacePointsSeedMaker_ATLxk::m_seedScoreThresholdSSSConfirmationSeed {0.}
private

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

Definition at line 277 of file SiSpacePointsSeedMaker_ATLxk.h.

277{0.};

◆ m_spacepointsOverlap

SG::ReadHandleKey<SpacePointOverlapCollection> InDet::SiSpacePointsSeedMaker_ATLxk::m_spacepointsOverlap {this, "SpacePointsOverlapName", "OverlapSpacePoints"}
private

Definition at line 165 of file SiSpacePointsSeedMaker_ATLxk.h.

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

◆ m_spacepointsPixel

SG::ReadHandleKey<SpacePointContainer> InDet::SiSpacePointsSeedMaker_ATLxk::m_spacepointsPixel {this, "SpacePointsPixelName", "PixelSpacePoints", "Pixel space points container"}
private

Definition at line 163 of file SiSpacePointsSeedMaker_ATLxk.h.

163{this, "SpacePointsPixelName", "PixelSpacePoints", "Pixel space points container"};

◆ m_spacepointsSCT

SG::ReadHandleKey<SpacePointContainer> InDet::SiSpacePointsSeedMaker_ATLxk::m_spacepointsSCT {this, "SpacePointsSCTName", "SCT_SpacePoints", "SCT space points container"}
private

Definition at line 164 of file SiSpacePointsSeedMaker_ATLxk.h.

164{this, "SpacePointsSCTName", "SCT_SpacePoints", "SCT space points container"};

◆ m_thistSvc

ServiceHandle<ITHistSvc> InDet::SiSpacePointsSeedMaker_ATLxk::m_thistSvc
private

Definition at line 482 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ m_treeFolder

std::string InDet::SiSpacePointsSeedMaker_ATLxk::m_treeFolder
private

Definition at line 489 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ m_treeName

std::string InDet::SiSpacePointsSeedMaker_ATLxk::m_treeName
private

Definition at line 488 of file SiSpacePointsSeedMaker_ATLxk.h.

◆ m_useOverlap

BooleanProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_useOverlap {this, "useOverlapSpCollection", true}
private

Definition at line 177 of file SiSpacePointsSeedMaker_ATLxk.h.

177{this, "useOverlapSpCollection", true};

◆ m_writeNtuple

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

Flag to write validation ntuples. Turned off by default.

Definition at line 480 of file SiSpacePointsSeedMaker_ATLxk.h.

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

◆ m_zmax

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_zmax {this, "maxZ", +250.}
private

Definition at line 201 of file SiSpacePointsSeedMaker_ATLxk.h.

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

◆ m_zmin

FloatProperty InDet::SiSpacePointsSeedMaker_ATLxk::m_zmin {this, "minZ", -250.}
private

Definition at line 200 of file SiSpacePointsSeedMaker_ATLxk.h.

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

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