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;
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;
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++);