31 double baseScorePerHit = 17.;
43 double hitQualityScore;
47 hitQualityScore = (1.2 * (baseScorePerHit -
x2 * .5));
49 hitQualityScore = (baseScorePerHit -
x2);
50 if (hitQualityScore < 0.)
53 quality += hitQualityScore;
97 dump(MSG::DEBUG,
nullptr);
102 return StatusCode::SUCCESS;
115 if (!key.key().empty()) {
143 auto theVertexContainer = std::make_unique<xAOD::VertexContainer>();
144 auto theVertexAuxContainer = std::make_unique<xAOD::VertexAuxContainer>();
145 theVertexContainer->setStore( theVertexAuxContainer.get() );
149 std::vector<InDet::IZWindowRoISeedTool::ZWindow> listRoIs;
151 double ZBoundary[2] = {0.0, 0.0};
153 if ( listRoIs.empty() ) {
157 ZBoundary[0] = listRoIs[0].zWindow[0];
158 ZBoundary[1] = listRoIs[0].zWindow[1];
159 ATH_MSG_DEBUG(
"selectedRoIs " << ZBoundary[0] <<
" " << ZBoundary[1]);
169 for(
size_t r = 0;
r < listRoIs.size();
r++ ){
173 theVertexContainer->back()->setZ( listRoIs[
r].zReference );
174 vtxDecor_boundaryLow(*theVertexContainer->back()) = listRoIs[
r].zWindow[0];;
175 vtxDecor_boundaryHigh(*theVertexContainer->back()) = listRoIs[
r].zWindow[1];
176 vtxDecor_perigeeZ0Lead(*theVertexContainer->back()) = listRoIs[
r].zPerigeePos[0];
177 vtxDecor_perigeeZ0Sublead(*theVertexContainer->back()) = listRoIs[
r].zPerigeePos[1];
178 vtxDecor_isHS(*theVertexContainer->back()) = 1;
187 double RandZBoundary[2];
188 std::vector<InDet::IZWindowRoISeedTool::ZWindow> listRandRoIs;
193 while( std::abs( listRoIs[0].zReference - listRandRoIs[0].zReference ) < 5. || std::abs(listRandRoIs[0].zReference) > 250.0 ){
194 listRandRoIs.clear();
198 RandZBoundary[0] = listRandRoIs[0].zWindow[0];
199 RandZBoundary[1] = listRandRoIs[0].zWindow[1];
200 for(
size_t r = 0;
r < listRandRoIs.size();
r++ ){
204 theVertexContainer->back()->setZ( listRandRoIs[
r].zReference );
205 vtxDecor_boundaryLow(*theVertexContainer->back()) = listRoIs[
r].zWindow[0];;
206 vtxDecor_boundaryHigh(*theVertexContainer->back()) = listRoIs[
r].zWindow[1];
207 vtxDecor_perigeeZ0Lead(*theVertexContainer->back()) = listRoIs[
r].zPerigeePos[0];
208 vtxDecor_perigeeZ0Sublead(*theVertexContainer->back()) = listRoIs[
r].zPerigeePos[1];
209 vtxDecor_isHS(*theVertexContainer->back()) = 0;
215 CHECK( vxOut_h.
record ( std::move(theVertexContainer), std::move(theVertexAuxContainer) ) );
221 if (not listRoIs.empty()) {
222 std::list<Trk::Vertex> VZ;
236 bool doWriteNtuple =
m_seedsmaker->getWriteNtupleBoolProperty();
237 unsigned long EvNumber = 0;
241 EvNumber = !eventInfo.
isValid() ? 0 : eventInfo->eventNumber();
248 std::multimap<double,Trk::Track*> qualitySortedTrackCandidates;
251 while((seed =
m_seedsmaker->next(ctx, seedEventData))) {
253 const std::list<Trk::Track*> trackList =
m_trackmaker->getTracks(ctx, trackEventData, seed->spacePoints());
255 qualitySortedTrackCandidates.insert(std::make_pair( -trackQuality(t), t ));
260 if (seed->r3() > 200.) {
261 if (seed->r1() < 200.) {
267 m_seedsmaker->writeNtuple(seed, !trackList.empty() ? trackList.front() :
nullptr, seedType, EvNumber) ;
284 for (
const std::pair<const double, Trk::Track*> & qualityAndTrack: qualitySortedTrackCandidates) {
290 outputTracks->push_back(qualityAndTrack.second);
298 outputTracks->clear();
306 dump(MSG::DEBUG, &counter);
309 return StatusCode::SUCCESS;
319 dump(MSG::INFO, &m_counterTotal);
321 return StatusCode::SUCCESS;
330 msg(assign_level) <<std::endl;
331 MsgStream& out_msg=
msg();
332 if (counter)
dumpevent(out_msg ,*counter);
346 std::string s2;
for(
int i=0; i<n; ++i) s2.append(
" "); s2.append(
"|");
348 std::string s3;
for(
int i=0; i<n; ++i) s3.append(
" "); s3.append(
"|");
350 std::string s4;
for(
int i=0; i<n; ++i) s4.append(
" "); s4.append(
"|");
352 out<<
"|----------------------------------------------------------------"
353 <<
"----------------------------------------------------|"
355 out<<
"| Tool for space points seeds finding | "<<
m_seedsmaker.type()<<s2
357 out<<
"| Tool for space points seeded track finding | "<<
m_trackmaker.type()<<s3
361 out<<
"|----------------------------------------------------------------"
362 <<
"----------------------------------------------------|"
376 out<<
"|-------------------------------------------------------------------|" <<std::endl;
377 out<<
"| Investigated "
378 <<std::setw(9)<<ns<<
" space points seeds and found ";
379 out<<std::setw(9)<<nt<<
" tracks using RoI-z strategy |"<<std::endl;
381 out<<
"|-------------------------------------------------------------------|" <<std::endl;
389 out<<
"|-------------------------------------------------------------------|" <<std::endl;
399(std::multimap<double,Trk::Track*>& qualitySortedTracks)
const
401 std::set<const Trk::PrepRawData*> clusters;
403 std::vector<const Trk::PrepRawData*> freeClusters;
404 freeClusters.reserve(15);
406 std::multimap<double, Trk::Track*>::iterator it_qualityAndTrack = qualitySortedTracks.begin();
409 while (it_qualityAndTrack!=qualitySortedTracks.end()) {
410 freeClusters.clear();
412 std::set<const Trk::PrepRawData*>::iterator it_clustersEnd = clusters.end();
429 if (not pr)
continue;
433 if (clusters.find(pr)==it_clustersEnd) {
435 freeClusters.push_back(pr);
440 int nFreeClusters =
static_cast<int>(freeClusters.size());
441 if (nFreeClusters >=
m_nfreeCut || nFreeClusters==nClusters) {
444 clusters.insert(freeClusters.begin(), freeClusters.end());
447 ++it_qualityAndTrack;
450 int nFreeClusters =
static_cast<int>(freeClusters.size());
451 if(
passEtaDepCuts( (*it_qualityAndTrack).second, nClusters, nFreeClusters, nPixels) ){
453 ++it_qualityAndTrack;
456 delete (*it_qualityAndTrack).second;
457 qualitySortedTracks.erase(it_qualityAndTrack++);
462 delete (*it_qualityAndTrack).second;
463 qualitySortedTracks.erase(it_qualityAndTrack++);
490 if(!par)
return false;
492 double eta = std::abs(par->eta());
493 if(nClusters < m_etaDependentCutsSvc->getMinSiHitsAtEta(
eta))
return false;
494 if(nFreeClusters < m_etaDependentCutsSvc->getMinSiNotSharedAtEta(
eta))
return false;
496 if(nPixels < m_etaDependentCutsSvc->getMinPixelHitsAtEta(
eta))
return false;
Scalar eta() const
pseudorapidity method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define CHECK(...)
Evaluate an expression and check for errors.
bool msgLvl(const MSG::Level lvl) const
An algorithm that can be simultaneously executed in multiple threads.
DataModel_detail::const_iterator< DataVector > const_iterator
ExtendedSiTrackMakerEventData_xk(const SG::ReadHandleKey< Trk::PRDtoTrackMap > &key)
SG::ReadHandle< Trk::PRDtoTrackMap > m_prdToTrackMap
std::atomic_int m_neventsTotal
Number events.
ToolHandle< Trk::IExtendedTrackSummaryTool > m_trackSummaryTool
SG::WriteHandleKey< xAOD::VertexContainer > m_vxOutputKey
virtual StatusCode initialize() override
StringProperty m_fieldmode
void filterSharedTracks(std::multimap< double, Trk::Track * > &) const
cleans up the collection of quality filtered tracks.
std::atomic_int m_problemsTotal
Number events with number seeds > maxNumber.
MsgStream & dumpevent(MsgStream &out, const SiSPSeededTrackFinderRoI::Counter_t &counter) const
SG::ReadHandleKey< xAOD::EventInfo > m_evtKey
bool passEtaDepCuts(const Trk::Track *track, int nClusters, int nFreeClusters, int nPixels) const
apply eta-dependent selections
IntegerProperty m_maxNumberSeeds
BooleanProperty m_useRoIWidth
ToolHandle< ISiSpacePointsSeedMaker > m_seedsmaker
SiSPSeededTrackFinderRoI(const std::string &name, ISvcLocator *pSvcLocator)
MsgStream & dumptools(MsgStream &out) const
SG::WriteHandleKey< TrackCollection > m_outputTracksKey
ServiceHandle< IInDetEtaDependentCutsSvc > m_etaDependentCutsSvc
BooleanProperty m_doRandomSpot
Trk::MagneticFieldProperties m_fieldprop
SG::ReadHandleKey< Trk::PRDtoTrackMap > m_prdToTrackMap
ToolHandle< ISiTrackMaker > m_trackmaker
virtual StatusCode execute(const EventContext &ctx) const override
MsgStream & dump(MSG::Level lvl, const SiSPSeededTrackFinderRoI::Counter_t *) const
ToolHandle< IZWindowRoISeedTool > m_RandomRoISeedTool
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
ToolHandle< IZWindowRoISeedTool > m_ZWindowRoISeedTool
IntegerProperty m_nfreeCut
virtual StatusCode finalize() override
InDet::SiSpacePointsSeedMakerEventData holds event dependent data used by ISiSpacePointsSeedMaker.
InDet::SiTrackMakerEventData_xk holds event dependent data used by ISiTrackMaker.
void setPRDtoTrackMap(const Trk::PRDtoTrackMap *prd_to_track_map)
SG::Accessor< T, ALLOC > Accessor
Property holding a SG store/key/clid from which a ReadHandle is made.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
int numberDoF() const
returns the number of degrees of freedom of the overall track or vertex fit as integer
double chiSquared() const
returns the of the overall track fit
magnetic field properties to steer the behavior of the extrapolation
This class is the pure abstract base class for all fittable tracking measurements.
Class describing the Line to which the Perigee refers to.
Class to handle RIO On Tracks ROT) for InDet and Muons, it inherits from the common MeasurementBase.
virtual const Trk::PrepRawData * prepRawData() const =0
returns the PrepRawData (also known as RIO) object to which this RIO_OnTrack is associated.
bool trackProperties(const TrackProperties &property) const
Access methods for track properties.
@ BremFit
A brem fit was performed on this track.
represents the track state (measurement, material, fit parameters and quality) at a surface.
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
@ Perigee
This represents a perigee, and so will contain a Perigee object only.
const Trk::TrackStates * trackStateOnSurfaces() const
return a pointer to a const DataVector of const TrackStateOnSurfaces.
const TrackInfo & info() const
Returns a const ref to info of a const tracks.
@ FastField
call the fast field access method of the FieldSvc
@ NoField
Field is set to 0., 0., 0.,.
ParametersBase< TrackParametersDim, Charged > TrackParameters
Vertex_v1 Vertex
Define the latest version of the vertex class.