19#include <unordered_map>
25 std::vector<VTIndex>& trackIndex,
26 std::vector<VRef>& vtxRefs)
33 int nv = vertices.size(), nv1 = nv + 1;
35 auto& orphans = tmpMap.back();
38 std::unordered_map<GIndex, bool> vcont;
39 std::vector<VtxTBracket> vtxOrdBrack;
41 for (
int iv = 0; iv < nv; iv++) {
42 int idMin = v2tfitRefs[iv].getFirstEntry(), idMax = idMin + v2tfitRefs[iv].getEntries();
43 auto& vtxIds = tmpMap[iv];
44 vtxIds.reserve(v2tfitRefs[iv].getEntries());
45 for (
int id = idMin;
id < idMax;
id++) {
46 auto gid = v2tfitIDs[
id];
47 vtxIds.emplace_back(gid).setPVContributor();
50 const auto& vtx = vertices[iv];
51 const auto& vto = vtxOrdBrack.emplace_back(
VtxTBracket{
55 if (vto.tBracket.delta() > maxVtxSpan) {
56 maxVtxSpan = vto.tBracket.delta();
60 std::sort(vtxOrdBrack.begin(), vtxOrdBrack.end(), [](
const VtxTBracket&
a,
const VtxTBracket&
b) { return a.tBracket.getMin() < b.tBracket.getMin(); });
62 extractTracks(recoData, vcont);
64 int ivStart = 0, nAssigned = 0, nAmbiguous = 0;
65 std::vector<int> vtxList;
66 for (
const auto& tro : mTBrackets) {
68 for (
int iv = ivStart; iv < nv; iv++) {
69 const auto& vto = vtxOrdBrack[iv];
70 auto res = tro.tBracket.isOutside(vto.tBracket);
72 if (tro.tBracket.getMin() > vto.tBracket.getMin() + maxVtxSpan) {
81 vtxList.push_back(vto.origID);
85 bool ambig = vtxList.size() > 1;
86 for (
auto v : vtxList) {
87 auto&
ref = tmpMap[
v].emplace_back(tro.origID);
96 orphans.emplace_back(tro.origID);
103 static size_t logCounter = 0;
104 bool logVertices = mPrescaleLogs > 0 ? (logCounter % mPrescaleLogs) == 0 :
true;
105 for (
int iv = 0; iv < nv1; iv++) {
106 auto& trvec = tmpMap[iv];
108 std::sort(trvec.begin(), trvec.end(), [](
VTIndex a,
VTIndex b) { return a.getSource() < b.getSource(); });
110 auto entry0 = trackIndex.size();
111 auto& vr = vtxRefs.emplace_back();
112 vr.setVtxID(iv < nv ? iv : -1);
114 for (
const auto gid0 : trvec) {
115 int src = gid0.getSource();
116 while (oldSrc <
src) {
118 vr.setFirstEntryOfSource(oldSrc, trackIndex.size());
120 trackIndex.push_back(gid0);
123 vr.setFirstEntryOfSource(oldSrc, trackIndex.size());
125 vr.setEnd(trackIndex.size());
131 LOG(info) <<
"Assigned " << nAssigned <<
" (" << nAmbiguous <<
" ambiguously) out of " << mTBrackets.size() <<
" non-contributor tracks + " << vcont.size() <<
" contributors";
141 auto creator = [
this, itsBias, mftBias, &vcont](
auto& _tr,
GIndex _origID,
float t0,
float terr) {
142 if constexpr (!(isMFTTrack<decltype(_tr)>() || isMCHTrack<decltype(_tr)>() || isGlobalFwdTrack<decltype(_tr)>())) {
143 if (vcont.find(_origID) != vcont.end()) {
148 if constexpr (isTPCTrack<decltype(_tr)>()) {
150 t0 *= this->mTPCBin2MUS;
151 t0 -= this->mTPCTDriftOffset;
152 terr *= this->mTPCBin2MUS;
153 }
else if constexpr (isITSTrack<decltype(_tr)>()) {
155 terr *= this->mITSROFrameLengthMUS;
156 }
else if constexpr (isMFTTrack<decltype(_tr)>()) {
158 terr *= this->mMFTROFrameLengthMUS;
159 }
else if constexpr (!(isMCHTrack<decltype(_tr)>() || isGlobalFwdTrack<decltype(_tr)>())) {
161 terr *= PVParams.nSigmaTimeTrack;
164 terr += PVParams.timeMarginTrackTime;
165 mTBrackets.emplace_back(TrackTBracket{{
t0 - terr,
t0 + terr}, _origID});
167 if constexpr (isGlobalFwdTrack<decltype(_tr)>() || isMFTTrack<decltype(_tr)>()) {
173 data.createTracksVariadic(creator);
176 unsigned int cntEMC = 0, cntPHS = 0, cntCPV = 0, cntFT0 = 0, cntFV0 = 0, cntFDD = 0;
177 for (
const auto& trig :
data.getEMCALTriggers()) {
178 auto t = trig.getBCData().differenceInBCMUS(
data.startIR);
181 for (
const auto& trig :
data.getPHOSTriggers()) {
182 auto t = trig.getBCData().differenceInBCMUS(
data.startIR);
185 for (
const auto& trig :
data.getPHOSTriggers()) {
186 auto t = trig.getBCData().differenceInBCMUS(
data.startIR);
189 for (
const auto&
rec :
data.getFT0RecPoints()) {
190 auto t =
rec.getInteractionRecord().differenceInBCMUS(
data.startIR);
193 for (
const auto&
rec :
data.getFV0RecPoints()) {
194 auto t =
rec.getInteractionRecord().differenceInBCMUS(
data.startIR);
197 for (
const auto&
rec :
data.getFDDRecPoints()) {
198 auto t =
rec.getInteractionRecord().differenceInBCMUS(
data.startIR);
203 std::sort(mTBrackets.begin(), mTBrackets.end(), [](
const TrackTBracket&
a,
const TrackTBracket&
b) { return a.tBracket.getMin() < b.tBracket.getMin(); });
205 LOG(info) <<
"collected " << mTBrackets.size() <<
" non-contributor and " << vcont.size() <<
" contributor seeds";
Wrapper container for different reconstructed object types.
static const PVertexerParams & Instance()
GLboolean GLboolean GLboolean b
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t0
GLboolean GLboolean GLboolean GLboolean a
constexpr double LHCBunchSpacingMUS
constexpr double LHCBunchSpacingNS
o2::InteractionRecord startIR
auto getPrimaryVertices() const
auto getPrimaryVertexContributors() const
auto getPrimaryVertexContributorsRefs() const
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"