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]);
163 static const SG::AuxElement::Accessor<float> vtxDecor_boundaryLow(
"boundaryLow");
164 static const SG::AuxElement::Accessor<float> vtxDecor_boundaryHigh(
"boundaryHigh");
165 static const SG::AuxElement::Accessor<float> vtxDecor_perigeeZ0Lead(
"perigeeZ0Lead");
166 static const SG::AuxElement::Accessor<float> vtxDecor_perigeeZ0Sublead(
"perigeeZ0Sublead");
167 static const SG::AuxElement::Accessor<float> vtxDecor_isHS(
"isHS");
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;
237 bool doWriteNtuple =
m_seedsmaker->getWriteNtupleBoolProperty();
238 unsigned long EvNumber = 0;
242 EvNumber = !eventInfo.
isValid() ? 0 : eventInfo->eventNumber();
249 std::multimap<double,Trk::Track*> qualitySortedTrackCandidates;
252 while((seed =
m_seedsmaker->next(ctx, seedEventData))) {
254 const std::list<Trk::Track*> trackList =
m_trackmaker->getTracks(ctx, trackEventData, seed->spacePoints());
256 qualitySortedTrackCandidates.insert(std::make_pair( -trackQuality(t), t ));
261 if (seed->r3() > 200.) {
262 if (seed->r1() < 200.) {
268 m_seedsmaker->writeNtuple(seed, !trackList.empty() ? trackList.front() :
nullptr, seedType, EvNumber) ;
285 for (
const std::pair<const double, Trk::Track*> & qualityAndTrack: qualitySortedTrackCandidates) {
291 outputTracks->push_back(qualityAndTrack.second);
299 outputTracks->clear();
307 dump(MSG::DEBUG, &counter);
310 return StatusCode::SUCCESS;
400(std::multimap<double,Trk::Track*>& qualitySortedTracks)
const
402 std::set<const Trk::PrepRawData*> clusters;
404 std::vector<const Trk::PrepRawData*> freeClusters;
405 freeClusters.reserve(15);
407 std::multimap<double, Trk::Track*>::iterator it_qualityAndTrack = qualitySortedTracks.begin();
410 while (it_qualityAndTrack!=qualitySortedTracks.end()) {
411 freeClusters.clear();
413 std::set<const Trk::PrepRawData*>::iterator it_clustersEnd = clusters.end();
430 if (not pr)
continue;
434 if (clusters.find(pr)==it_clustersEnd) {
436 freeClusters.push_back(pr);
441 int nFreeClusters =
static_cast<int>(freeClusters.size());
442 if (nFreeClusters >=
m_nfreeCut || nFreeClusters==nClusters) {
445 clusters.insert(freeClusters.begin(), freeClusters.end());
448 ++it_qualityAndTrack;
451 int nFreeClusters =
static_cast<int>(freeClusters.size());
452 if(
passEtaDepCuts( (*it_qualityAndTrack).second, nClusters, nFreeClusters, nPixels) ){
454 ++it_qualityAndTrack;
457 delete (*it_qualityAndTrack).second;
458 qualitySortedTracks.erase(it_qualityAndTrack++);
463 delete (*it_qualityAndTrack).second;
464 qualitySortedTracks.erase(it_qualityAndTrack++);