38 std::vector<VTIndex>& trackIndex,
39 std::vector<VRef>& vtxRefs)
46 int nv = vertices.size(), nv1 = nv + 1;
48 auto& orphans = tmpMap.back();
51 std::unordered_map<GIndex, bool> vcont;
52 std::vector<VtxTBracket> vtxOrdBrack;
54 for (
int iv = 0; iv < nv; iv++) {
55 int idMin = v2tfitRefs[iv].getFirstEntry(), idMax = idMin + v2tfitRefs[iv].getEntries();
56 auto& vtxIds = tmpMap[iv];
57 vtxIds.reserve(v2tfitRefs[iv].getEntries());
58 for (
int id = idMin;
id < idMax;
id++) {
59 auto gid = v2tfitIDs[
id];
60 vtxIds.emplace_back(gid).setPVContributor();
63 const auto& vtx = vertices[iv];
64 const auto& vto = vtxOrdBrack.emplace_back(
VtxTBracket{
68 if (vto.tBracket.delta() > maxVtxSpan) {
69 maxVtxSpan = vto.tBracket.delta();
73 std::sort(vtxOrdBrack.begin(), vtxOrdBrack.end(), [](
const VtxTBracket&
a,
const VtxTBracket&
b) { return a.tBracket.getMin() < b.tBracket.getMin(); });
75 extractTracks(recoData, vcont);
77 int ivStart = 0, nAssigned = 0, nAmbiguous = 0;
78 std::vector<int> vtxList;
79 for (
const auto& tro : mTBrackets) {
81 for (
int iv = ivStart; iv < nv; iv++) {
82 const auto& vto = vtxOrdBrack[iv];
83 auto res = tro.tBracket.isOutside(vto.tBracket);
85 if (tro.tBracket.getMin() > vto.tBracket.getMin() + maxVtxSpan) {
94 vtxList.push_back(vto.origID);
98 bool ambig = vtxList.size() > 1;
99 for (
auto v : vtxList) {
100 auto&
ref = tmpMap[
v].emplace_back(tro.origID);
109 orphans.emplace_back(tro.origID);
116 static size_t logCounter = 0;
117 bool logVertices = mPrescaleLogs > 0 ? (logCounter % mPrescaleLogs) == 0 :
true;
118 for (
int iv = 0; iv < nv1; iv++) {
119 auto& trvec = tmpMap[iv];
121 std::sort(trvec.begin(), trvec.end(), [](
VTIndex a,
VTIndex b) { return a.getSource() < b.getSource(); });
123 auto entry0 = trackIndex.size();
124 auto& vr = vtxRefs.emplace_back();
125 vr.setVtxID(iv < nv ? iv : -1);
127 for (
const auto gid0 : trvec) {
128 int src = gid0.getSource();
129 while (oldSrc <
src) {
131 vr.setFirstEntryOfSource(oldSrc, trackIndex.size());
133 trackIndex.push_back(gid0);
136 vr.setFirstEntryOfSource(oldSrc, trackIndex.size());
138 vr.setEnd(trackIndex.size());
140 if (PVParams.fillITSGloContributors) {
141 auto& ITSGloContributors = vr.getITSGloContributors();
142 ITSGloContributors.setFirstEntry(trackIndex.size());
143 for (
auto srcITS : mITSGloSources) {
144 const int fst = vr.getFirstEntryOfSource(srcITS), lst = fst + vr.getEntriesOfSource(srcITS);
145 for (
int ii = fst; ii < lst; ii++) {
146 auto vid = trackIndex[ii];
147 if (vid.isPVContributor()) {
153 ITSGloContributors.setEntries(trackIndex.size() - ITSGloContributors.getFirstEntry());
161 LOG(info) <<
"Assigned " << nAssigned <<
" (" << nAmbiguous <<
" ambiguously) out of " << mTBrackets.size() <<
" non-contributor tracks + " << vcont.size() <<
" contributors";