24#include "MFTTracking/IOUtils.h"
37#include "MFTBase/GeometryTGeo.h"
48const std::unordered_map<GID::Source, EveWorkflowHelper::PropagationRange> EveWorkflowHelper::propagationRanges = {
49 {
GID::ITS, EveWorkflowHelper::prITS},
50 {
GID::TPC, EveWorkflowHelper::prTPC},
51 {
GID::ITSTPC, {EveWorkflowHelper::prITS.minR, EveWorkflowHelper::prTPC.maxR, EveWorkflowHelper::prTPC.minZ, EveWorkflowHelper::prTPC.maxZ}},
52 {
GID::TPCTOF, {EveWorkflowHelper::prTPC.minR, EveWorkflowHelper::prTOF.maxR, EveWorkflowHelper::prTOF.minZ, EveWorkflowHelper::prTOF.maxZ}},
53 {
GID::TPCTRD, {EveWorkflowHelper::prTPC.minR, EveWorkflowHelper::prTRD.maxR, EveWorkflowHelper::prTRD.minZ, EveWorkflowHelper::prTRD.maxZ}},
54 {
GID::ITSTPCTRD, {EveWorkflowHelper::prITS.minR, EveWorkflowHelper::prTRD.maxR, EveWorkflowHelper::prTRD.minZ, EveWorkflowHelper::prTRD.maxZ}},
55 {
GID::ITSTPCTOF, {EveWorkflowHelper::prITS.minR, EveWorkflowHelper::prTOF.maxR, EveWorkflowHelper::prTOF.minZ, EveWorkflowHelper::prTOF.maxZ}},
56 {
GID::TPCTRDTOF, {EveWorkflowHelper::prTPC.minR, EveWorkflowHelper::prTOF.maxR, EveWorkflowHelper::prTOF.minZ, EveWorkflowHelper::prTOF.maxZ}},
57 {
GID::ITSTPCTRDTOF, {EveWorkflowHelper::prITS.minR, EveWorkflowHelper::prTOF.maxR, EveWorkflowHelper::prTOF.minZ, EveWorkflowHelper::prTOF.maxZ}},
62 const auto phi = track.getPhi();
63 const auto sinPhi = std::sin(phi);
64 const auto tgL = track.getTgl();
66 const auto SlopeX = std::cos(phi) / tgL;
67 const auto SlopeY = sinPhi / tgL;
68 const auto InvP_yz = track.getInvQPt() / std::sqrt(sinPhi * sinPhi + tgL * tgL);
70 const std::array<Double_t, 5>
params{track.getX(), SlopeX, track.getY(), SlopeY, InvP_yz};
71 const std::array<Double_t, 15> cov{
78 return {track.getZ(),
params.data(), cov.data()};
88 for (std::size_t ich = 0; ich < 4; ++ich) {
89 auto cur_icl = track.getClusterMatched(ich);
97 const auto& cluster = midClusters[icl];
100 return track.getPositionZ();
108 auto noOfClusters = track.getNClusters();
109 auto offset = track.getFirstClusterIdx();
111 const auto& lastCluster = mchClusters[
offset + noOfClusters - 1];
113 return lastCluster.getZ();
123 if (uint64_t(bcd) > o2::constants::lhc::LHCMaxBunches * 256 &&
BCDiffErrCount < MAXBCDiffErrCount) {
124 LOGP(alarm,
"ATTENTION: wrong bunches diff. {} for current IR {} wrt 1st TF orbit {}", bcd,
ir.
asString(),
129 return bcd * o2::constants::lhc::LHCBunchSpacingNS * 1e-3;
135 return rof.getOverlap(br).isValid();
147 return rof.isOutside(t) == Bracket::Relation::Inside;
161 auto correctTrackTime = [
this](
auto& _tr,
float t0,
float terr) {
162 if constexpr (isTPCTrack<decltype(_tr)>()) {
166 }
else if constexpr (isITSTrack<decltype(_tr)>()) {
169 }
else if constexpr (isMFTTrack<decltype(_tr)>()) {
173 }
else if constexpr (!(isMCHTrack<decltype(_tr)>() || isMIDTrack<decltype(_tr)>() ||
174 isGlobalFwdTrack<decltype(_tr)>())) {
185 auto flag =
static_cast<int>(
time) + TIME_OFFSET;
196 auto fixMFTMCHMIDLabel = [
this](
GID& gid) {
199 if (trFwd.getMIDTrackID() != -1) {
204 auto creator = [&conf, maskTrk,
this, &correctTrackTime, &flagTime, &fixMFTMCHMIDLabel](
auto& trk,
GID gid,
205 float time,
float terr) {
206 fixMFTMCHMIDLabel(gid);
208 const auto src = gid.getSource();
215 auto bracket = correctTrackTime(trk,
time, terr);
239 bool checkTPCDCA = conf.TPCOnlyMaxDCARZ[0] > 0.f || conf.TPCOnlyMaxDCARZ[1] > 0.f;
242 const auto totalPrimaryVertices =
245 for (std::size_t iv = 0; iv < totalPrimaryVertices; iv++) {
247 if (pv.getX() < conf.PVXYZMin[0] || pv.getX() > conf.PVXYZMax[0] ||
248 pv.getY() < conf.PVXYZMin[1] || pv.getY() > conf.PVXYZMax[1] ||
249 pv.getZ() < conf.PVXYZMin[2] || pv.getZ() > conf.PVXYZMax[2]) {
254 const auto& vtref = vtxRefs[iv];
255 const gsl::span tracksForVertex(trackIndex.data() + vtref.getFirstEntry(), vtref.getEntries());
256 for (
const auto& tvid : tracksForVertex) {
261 fixMFTMCHMIDLabel(gid);
268 if (!tpcTr.hasBothSidesClusters()) {
273 if (tpcTr.hasCSideClustersOnly()) {
276 trc.setZ(trc.getZ() + dz);
278 std::array<float, 2> dca;
279 if (!prop->propagateToDCA(pvXYZ, trc, prop->getNominalBz(), 10.,
280 o2::base::PropagatorF::MatCorrType::USEMatCorrNONE, &dca) ||
281 (conf.TPCOnlyMaxDCARZ[1] > 0. && std::abs(dca[1]) > conf.TPCOnlyMaxDCARZ[1]) ||
282 (conf.TPCOnlyMaxDCARZ[0] > 0. && std::abs(dca[0]) > conf.TPCOnlyMaxDCARZ[0])) {
299 auto filterTrigger = [&](
const auto& trig) {
316 const auto totalPrimaryVertices =
319 for (std::size_t iv = 0; iv < totalPrimaryVertices; iv++) {
320 const auto& vtref = vtxRefs[iv];
323 for (std::size_t
i = 0;
i < allTriggersHMP.size();
i++) {
325 const auto& trig = allTriggersHMP[
i];
329 const auto triggersPHOS = gsl::span(trackIndex.data() + vtref.getFirstEntryOfSource(
GID::PHS),
330 vtref.getEntriesOfSource(
GID::PHS));
332 for (
const auto& tvid : triggersPHOS) {
334 if (tvid.getIndex() < allTriggersPHOS.size()) {
335 const auto& trig = allTriggersPHOS[tvid.getIndex()];
336 if (filterTrigger(trig)) {
342 const auto triggersEMCAL = gsl::span(trackIndex.data() + vtref.getFirstEntryOfSource(
GID::EMC),
343 vtref.getEntriesOfSource(
GID::EMC));
345 for (
const auto& tvid : triggersEMCAL) {
347 if (tvid.getIndex() < allTriggersEMCAL.size()) {
348 const auto& trig = allTriggersEMCAL[tvid.getIndex()];
350 if (filterTrigger(trig)) {
358 for (std::size_t
i = 0;
i < allTriggersHMP.size();
i++) {
360 const auto& trig = allTriggersHMP[
i];
364 for (std::size_t
i = 0;
i < allTriggersPHOS.size();
i++) {
366 const auto& trig = allTriggersPHOS[
i];
368 if (filterTrigger(trig)) {
373 for (std::size_t
i = 0;
i < allTriggersEMCAL.size();
i++) {
375 const auto& trig = allTriggersEMCAL[
i];
377 if (filterTrigger(trig)) {
389 for (
const auto& irFrame : irFrames) {
399 LOGF(info,
"Primary vertex %d has no tracks", primaryVertexIdx);
401 auto unflagTime = [](
unsigned int time) {
402 return static_cast<float>(
static_cast<int>(
time & ~(1 << 31)) - TIME_OFFSET);
411 return mGIDTrackTime.at(a) < mGIDTrackTime.at(b);
417 if (conf.maxTracks > 0 &&
trackCount >= conf.maxTracks) {
421 for (std::size_t it = 0; it <
trackCount; it++) {
422 const auto& gid =
tracks[it];
426 switch (gid.getSource()) {
436 if (!tpcTr.hasBothSidesClusters()) {
440 if (tpcTr.hasCSideClustersOnly()) {
487 LOGF(info,
"Track type %s not handled", gid.getSourceName());
494 LOGF(info,
"Primary vertex %d has no triggers", primaryVertexIdx);
498 for (std::size_t it = 0; it < triggers.size(); it++) {
499 const auto& gid = triggers[it];
501 switch (gid.getSource()) {
512 LOGF(info,
"Trigger type %s not handled", gid.getSourceName());
520 const std::string& receiverHostname,
int receiverPort,
int receiverTimeout,
bool useOnlyFiles,
527 .port = receiverPort,
529 .host = receiverHostname,
530 .toFile = !useOnlySockets,
531 .toSocket = !useOnlyFiles});
540 auto maxR2 = maxR * maxR;
541 float rMin = std::sqrt(trc.getX() * trc.getX() + trc.getY() * trc.getY());
546 std::vector<PNT> pnts;
547 int nSteps = std::max(2,
int((maxR - minR) / maxStep));
549 float xMin = trc.getX(), xMax = maxR * maxR - trc.getY() * trc.getY();
551 xMax = std::sqrt(xMax);
554 float dx = (xMax - xMin) / nSteps;
556 float dxmin = std::abs(xMin - tp.getX()), dxmax = std::abs(xMax - tp.getX());
560 std::swap(xMin, xMax);
563 if (!prop->propagateTo(tp, xMin,
false, 0.99, maxStep, o2::base::PropagatorF::MatCorrType::USEMatCorrNONE)) {
566 auto xyz = tp.getXYZGlo();
567 pnts.emplace_back(
PNT{xyz.X(), xyz.Y(), xyz.Z()});
568 for (
int is = 0; is < nSteps; is++) {
569 if (!prop->propagateTo(tp, tp.getX() + dx,
false, 0.99, 999., o2::base::PropagatorF::MatCorrType::USEMatCorrNONE)) {
572 xyz = tp.getXYZGlo();
573 if (xyz.Z() <
minZ) {
576 if (xyz.Z() >
maxZ) {
579 if (xyz.X() * xyz.X() + xyz.Y() * xyz.Y() > maxR2) {
582 pnts.emplace_back(
PNT{xyz.X(), xyz.Y(), xyz.Z()});
594 .charge = tr.getCharge(),
596 .startXYZ = {tr.getX(), tr.getY(), tr.getZ()},
598 .theta = tr.getTheta(),
602 const auto it = propagationRanges.find(
source);
604 const bool rangeNotFound = (it == propagationRanges.cend());
610 const auto& prange = it->second;
612 auto pnts =
getTrackPoints(tr, prange.minR, prange.maxR, maxStep, prange.minZ, prange.maxZ);
614 for (
size_t ip = 0; ip < pnts.size(); ip++) {
615 vTrack->addPolyPoint(pnts[ip][0], pnts[ip][1], pnts[ip][2] + dz);
623 for (
int lr = 0; lr < nLr; lr++) {
627 if (clusITS.size() && ITSClusterROFRec.size()) {
641 if (clusMFT.size() && MFTClusterROFRec.size()) {
643 auto pattIt = patterns.begin();
655 auto bc = trig.getBc();
656 auto orbit = trig.getOrbit();
659 for (
int j = trig.getFirstEntry();
j <= trig.getLastEntry();
j++) {
661 auto module = cluster.ch();
662 double x = cluster.x();
663 double y = cluster.y();
676 const gsl::span cellsForTrigger(
cells.data() + trig.getFirstEntry(), trig.getNumberOfObjects());
678 for (
const auto& cell : cellsForTrigger) {
679 std::array<char, 3> relativeLocalPositionInModule;
689 .energy = cell.getEnergy(),
690 .phi = (float)gPos.Phi(),
691 .eta = (float)gPos.Eta(),
703 const gsl::span cellsForTrigger(
cells.data() + trig.getFirstEntry(), trig.getNumberOfObjects());
706 for (
const auto& cell : cellsForTrigger) {
712 auto cellTime = cell.getTimeStamp();
713 auto cellEnergy = cell.getEnergy();
721 cellTime = calibCell->getTimeStamp();
722 cellEnergy = calibCell->getEnergy();
724 if (std::abs(cellTime) > conf.EMCCellTimeMax) {
728 if (cellEnergy < conf.EMCCellEnergyMin) {
732 const auto id = cell.getTower();
735 std::array<double, 3> rPos{relPosCell.X(), relPosCell.Y(), relPosCell.Z()};
736 std::array<double, 3> gPos{};
739 const auto& [sm_id, module_number, index_module_phi, index_module_eta] = this->
mEMCALGeom->
GetCellIndex(
id);
741 matrix->LocalToMaster(rPos.data(), gPos.data());
742 TVector3 vPos(gPos.data());
745 .energy = cellEnergy,
746 .phi = (
float)vPos.Phi(),
747 .eta = (float)vPos.Eta(),
792 auto gidITSTPCTRD =
match.getTrackRef();
801 auto gidTPCTRD =
match.getTrackRef();
822 const auto mchGID =
GID{
static_cast<unsigned int>(trMFTMCH.getMCHTrackID()),
GID::MCH};
840 const auto midGID =
GID{
static_cast<unsigned int>(trMFTMCHMID.getMIDTrackID()),
GID::MID};
859 auto trackParam =
mch::TrackParam(mchTrack.getZ(), mchTrack.getParameters(), mchTrack.getCovariances());
871 const std::array<float, 5> arraypar = {
872 track.y(), track.z(), track.snp(),
873 track.tgl(), track.signed1Pt()};
885 tr.setParameters({track.x(), track.y(), track.phi(), track.tgl(), track.signed1Pt()});
892 trackFwd.
setZ(track.z());
893 trackFwd.
setParameters({track.x(), track.y(), track.phi(), track.tgl(), track.signed1Pt()});
900 switch (track.trackType()) {
904 endZ = midZPositions.back();
908 endZ = mchZPositions.back();
912 endZ = midZPositions.back();
916 endZ = mchZPositions.back();
927 auto vTrack =
mEvent.
addTrack({.time =
static_cast<float>(trackTime),
929 .PID = o2::track::PID::Muon,
930 .startXYZ = {(float)tr.
getX(), (float)tr.
getY(), (float)tr.
getZ()},
931 .phi = (float)tr.
getPhi(),
933 .eta = (float)tr.
getEta(),
936 for (
auto zPos : mftZPositions) {
938 vTrack->addPolyPoint((
float)tr.
getX(), (float)tr.
getY(), (float)tr.
getZ());
944 auto vTrack =
mEvent.
addTrack({.time =
static_cast<float>(trackTime),
946 .
PID = o2::track::PID::Muon,
948 (float)track.getNonBendingCoor(), (float)track.getBendingCoor(),
949 (float)track.getZ()},
955 static constexpr auto stepDensity = 50.;
957 const auto nSteps =
static_cast<std::size_t
>(std::abs(endZ - startZ) / stepDensity);
959 const auto dZ = (endZ - startZ) / nSteps;
961 for (std::size_t
i = 0;
i < nSteps; ++
i) {
962 const auto z = startZ +
i * dZ;
963 vTrack->
addPolyPoint(track.getNonBendingCoor(), track.getBendingCoor(),
z);
976 int sector = tOFClustersArray[tofcl].getSector();
977 float x = tOFClustersArray[tofcl].getX();
978 float y = tOFClustersArray[tofcl].getY();
979 float z = tOFClustersArray[tofcl].getZ();
996 int ncl = trc.getNumberOfClusters();
997 int offset = trc.getFirstClusterEntry();
998 for (
int icl = 0; icl < ncl; icl++) {
1001 float xyz[] = {glo.X(), glo.Y(), glo.Z()};
1008 int ncl = trc.getNClusters();
1009 int offset = trc.getFirstEntry();
1010 for (
int icl = 0; icl < ncl; icl++) {
1013 float xyz[] = {glo.X(), glo.Y(), glo.Z()};
1025 if (trackTimeTB < -1e9) {
1026 trackTimeTB = trc.getTime0();
1029 for (
int iCl = trc.getNClusterReferences(); iCl--;) {
1030 uint8_t sector,
row;
1031 const auto& clTPC = trc.getCluster(mTPCTracksClusIdx, iCl, *mTPCClusterIdxStruct, sector,
row);
1033 std::array<float, 3> xyz;
1034 this->mTPCFastTransform->TransformIdeal(sector,
row, clTPC.getPad(), clTPC.getTime(), xyz[0], xyz[1], xyz[2],
1037 sector % o2::tpc::SECTORSPERSIDE));
1047 auto offset = mftTrack.getExternalClusterIndexOffset();
1049 for (
int icl = noOfClusters - 1; icl > -1; --icl) {
1051 float xyz[] = {thisCluster.getX(), thisCluster.getY(), thisCluster.getZ()};
1092 auto trackParam =
mch::TrackParam(track.getZ(), track.getParameters(), track.getCovariances());
1105 auto offset = mchTrack.getFirstClusterIdx();
1107 for (
int icl = noOfClusters - 1; icl > -1; --icl) {
1108 const auto& cluster = mchClusters[
offset + icl];
1109 float glo[] = {cluster.x, cluster.y, cluster.z};
1120 auto vTrack =
mEvent.
addTrack({.time =
static_cast<float>(trackTime),
1122 .PID = o2::track::PID::Muon,
1124 (float)midTrack.getPositionX(), (float)midTrack.getPositionY(),
1125 (float)midTrack.getPositionZ()},
1131 for (
int ich = 0; ich < 4; ++ich) {
1132 auto icl = midTrack.getClusterMatched(ich);
1134 auto& cluster = midClusters[icl];
1135 vTrack->
addPolyPoint(cluster.xCoor, cluster.yCoor, cluster.zCoor);
1146 for (
int ich = 0; ich < 4; ++ich) {
1147 auto icl = midTrack.getClusterMatched(ich);
1149 auto& cluster = midClusters[icl];
1150 float glo[] = {cluster.xCoor, cluster.yCoor, cluster.zCoor};
1165 for (
int iLayer = 0; iLayer < 6; ++iLayer) {
1166 if (tpcTrdTrack.getTrackletIndex(iLayer) >= 0) {
1168 const auto& tracklet = trdTracklets[tpcTrdTrack.getTrackletIndex(iLayer)];
1169 const auto& spacePoint = trdCalibratedTracklets[tpcTrdTrack.getTrackletIndex(iLayer)];
1171 float x = spacePoint.getX(),
y = spacePoint.getY(),
z = spacePoint.getZ();
1173 int iChamber = tracklet.getDetector();
1175 int sector = iChamber / 30;
1190 if (conf.timeMinMax[0] >= 0.f && conf.timeMinMax[0] < conf.timeMinMax[1]) {
1192 mTimeBracket = {conf.timeMinMax[0], conf.timeMinMax[1]};
1194 if (conf.TPCEtaAbsMax > 0.f) {
1201 o2::math_utils::bit2Mask(o2::math_utils::TransformType::T2L, o2::math_utils::TransformType::L2G));
1204 o2::math_utils::bit2Mask(o2::math_utils::TransformType::T2L, o2::math_utils::TransformType::T2GRot,
1205 o2::math_utils::TransformType::L2G));
1216 ? alpParamsITS.roFrameLengthInBC *
1217 o2::constants::lhc::LHCBunchSpacingMUS
1218 : alpParamsITS.roFrameLengthTrig *
1223 ? alpParamsMFT.roFrameLengthInBC *
1224 o2::constants::lhc::LHCBunchSpacingMUS
1225 : alpParamsMFT.roFrameLengthTrig *
1240 v->refVDrift,
v->getTimeOffset());
Helper for geometry and GRP related CCDB requests.
Global index for barrel track: provides provenance (detectors combination), index in respective array...
Class to delimit start and end IR of certain time period.
Definition of the GeometryTGeo class.
std::vector< o2::its::TrackITS > tracks
Definition of the parameter class for the detector electronics.
Wrapper container for different reconstructed object types.
Definition of the MCH track parameters for internal use.
Reference on ITS/MFT clusters set.
Referenc on track indices contributing to the vertex, with possibility chose tracks from specific sou...
static GRPGeomHelper & instance()
GPUd() value_type estimateLTFast(o2 static GPUd() float estimateLTIncrement(const o2 PropagatorImpl * Instance(bool uninitialized=false)
static const EveConfParam & Instance()
const Mat3D & getMatrixT2G(int sensID) const
std::optional< T > getCalibratedCell(const T &inputcell) const
Calibrate single cell.
const TGeoHMatrix * GetMatrixForSuperModuleFromGeoManager(Int_t smod) const
Provides shift-rotation matrix for EMCAL from the TGeoManager.
std::tuple< int, int, int, int > GetCellIndex(Int_t absId) const
Get cell SM, module numbers from absolute ID number.
static Geometry * GetInstance()
Get geometry instance. It should have been set before.
math_utils::Point3D< double > RelPosCellInSModule(Int_t absId, Double_t distEf) const
Look to see what the relative position inside a given cell is for a recpoint.
void drawMCHClusters(GID gid)
void drawMFTTrack(GID gid, o2::track::TrackParFwd track, float trackTime)
std::unordered_map< std::size_t, std::vector< GID > > mPrimaryVertexTriggerGIDs
o2::mch::TrackParam forwardTrackToMCHTrack(const o2::track::TrackParFwd &track)
void drawITS(GID gid, float trackTime)
void drawTPCTRDTOF(GID gid, float trackTime)
void drawMCHMID(GID gid, float trackTime)
GID::Source detectorMapToGIDSource(uint8_t dm)
AODBarrelTracks::iterator AODBarrelTrack
void drawMFT(GID gid, float trackTime)
void save(const std::string &jsonPath, const std::string &ext, int numberOfFiles, const std::string &receiverHostname, int receiverPort, int receiverTimeout, bool useOnlyFiles, bool useOnlySockets)
void drawTPCTOF(GID gid, float trackTime)
o2::event_visualisation::VisualisationEvent mEvent
const o2::tpc::VDriftCorrFact * mTPCVDrift
void drawTPC(GID gid, float trackTime, float dz=0.f)
void drawMID(GID gid, float trackTime)
AODMFTTracks::iterator AODMFTTrack
void drawMFTMCH(GID gid, float trackTime)
float findLastMIDClusterPosition(const o2::mid::Track &track)
std::unordered_map< GID, unsigned int > mGIDTrackTime
void drawMFTClusters(GID gid)
o2::emcal::CellRecalibrator * mEMCALCalib
float mITSROFrameLengthMUS
ITS RO frame in mus.
float findLastMCHClusterPosition(const o2::mch::TrackMCH &track)
void setTPCVDrift(const o2::tpc::VDriftCorrFact *v)
std::vector< Bracket > mItsROFBrackets
void drawPoint(const float xyz[])
void drawITSClusters(GID gid)
o2::phos::Geometry * mPHOSGeom
o2::its::GeometryTGeo * mITSGeom
static std::vector< PNT > getTrackPoints(const o2::track::TrackPar &trc, float minR, float maxR, float maxStep, float minZ=-25000, float maxZ=25000)
void drawTOFClusters(GID gid)
void drawTRDClusters(const o2::trd::TrackTRD &trc)
void draw(std::size_t primaryVertexIdx, bool sortTracks)
float mMFTROFrameLengthMUS
MFT RO frame in mus.
const o2::globaltracking::RecoContainer * mRecoCont
void drawITSTPCTRD(GID gid, float trackTime, GID::Source source=GID::ITSTPCTRD)
void drawMCH(GID gid, float trackTime)
void drawMIDClusters(GID gid)
void selectTracks(const CalibObjectsConst *calib, GID::mask_t maskCl, GID::mask_t maskTrk, GID::mask_t maskMatch)
o2::mft::GeometryTGeo * mMFTGeom
o2::emcal::Geometry * mEMCALGeom
double bcDiffToTFTimeMUS(const o2::InteractionRecord &ir)
void prepareITSClusters(const o2::itsmft::TopologyDictionary *dict)
void drawMFTMCHMID(GID gid, float trackTime)
void drawAODFwd(AODForwardTrack const &track, float trackTime)
void addTrackToEvent(const o2::track::TrackPar &tr, GID gid, float trackTime, float dz, GID::Source source=GID::NSources, float maxStep=4.f)
void drawForwardTrack(GID gid, mch::TrackParam track, float startZ, float endZ, float trackTime)
o2::itsmft::ClustersPerLayer< o2::BaseCluster< float > > mITSClustersArray
void prepareMFTClusters(const o2::itsmft::TopologyDictionary *dict)
void drawAODBarrel(AODBarrelTrack const &track, float trackTime)
void drawITSTPCTOF(GID gid, float trackTime, GID::Source source=GID::ITSTPCTOF)
std::vector< o2::BaseCluster< float > > mMFTClustersArray
void drawTPCClusters(GID gid, float trackTimeTB=-2.e9)
std::unordered_map< std::size_t, std::vector< GID > > mPrimaryVertexTrackGIDs
static int BCDiffErrCount
void drawTPCTRD(GID gid, float trackTime, GID::Source source=GID::TPCTRD)
AODForwardTracks::iterator AODForwardTrack
bool isInsideTimeBracket(const Bracket &br)
bool isInsideITSROF(const Bracket &br)
void drawAODMFT(AODMFTTrack const &track, float trackTime)
const o2::vertexing::PVertexerParams * mPVParams
void drawGlobalPoint(const TVector3 &xyx, GID gid, float time)
void drawITSTPC(GID gid, float trackTime, GID::Source source=GID::ITSTPC)
void drawITSTPCTRDTOF(GID gid, float trackTime)
std::unordered_set< GID > mTotalAcceptedDataTypes
std::unordered_map< GID, std::size_t > mTotalDataTypes
void reduceNumberOfFiles(size_t filesInFolder) const
std::string newFileName() const
static VisualisationEventSerializer * getInstance(std::string ext)
virtual void toFile(const VisualisationEvent &event, Location &location)=0
static o2::dataformats::GlobalTrackID deserialize(unsigned seralizedValue)
VisualisationCluster & addCluster(const float *xyz)
VisualisationTrack * addTrack(VisualisationTrack::VisualisationTrackVO vo)
VisualisationCalo * addCalo(VisualisationCalo::VisualisationCaloVO vo)
void setEveVersion(int eveVersion)
void addPolyPoint(float x, float y, float z)
void lors2Mars(Int_t c, double x, double y, double *m, Int_t pl=kPc) const
static Param * instance()
static GeometryTGeo * Instance()
void fillMatrixCache(int mask) override
void beginLayer(int lr)
to be called once all the layers were filled
void init(int nLr)
< prepare for filling nLr layer slots, discarding the previous content
Bracket getOverlap(const Bracket< T > &other) const
Relation isOutside(const Bracket< T > &t) const
MCH track external format.
int getNClusters() const
get the number of clusters attached to the track
track parameters for internal use
void fillMatrixCache(Int_t mask) override
static GeometryTGeo * Instance()
const int getNumberOfPoints() const
This class defines the MID track.
void local2Global(char module, float x, float z, TVector3 &globaPos) const
static void absIdToRelPosInModule(short absId, float &x, float &z)
static bool absToRelNumbering(short absId, char *relid)
static Geometry * GetInstance()
void propagateParamToZlinear(double zEnd)
Double_t getTheta() const
void setParameters(const SMatrix5 ¶meters)
set track parameters
Double_t getZ() const
return Z coordinate (cm)
Double_t getCharge() const
return the charge (assumed forward motion)
void setZ(Double_t z)
set Z coordinate (cm)
bool match(const std::vector< std::string > &queries, const char *pattern)
GLfloat GLfloat GLfloat alpha
GLboolean GLboolean GLboolean b
GLsizei GLsizei GLchar * source
GLenum const GLfloat * params
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t0
GLboolean GLboolean GLboolean GLboolean a
GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat maxZ
GLbitfield GLuint64 timeout
GLdouble GLdouble GLdouble z
@ GlobalMuonTrackOtherMatch
@ HIGH_GAIN
High gain channel.
@ LOW_GAIN
Low gain channel.
std::array< float, 3 > PNT
constexpr int MaxITSLayers
void convertCompactClusters(gsl::span< const itsmft::CompClusterExt > clusters, gsl::span< const unsigned char >::iterator &pattIt, std::vector< o2::BaseCluster< float > > &output, const itsmft::TopologyDictionary *dict)
convert compact clusters to 3D spacepoints
std::tuple< float, float > rotateZ(float xL, float yL, float snAlp, float csAlp)
float sector2Angle(int sect)
void convertCompactClusters(gsl::span< const itsmft::CompClusterExt > clusters, gsl::span< const unsigned char >::iterator &pattIt, std::vector< o2::BaseCluster< float > > &output, const itsmft::TopologyDictionary *dict)
convert compact clusters to 3D spacepoints into std::vector<o2::BaseCluster<float>>
std::string asString() const
int64_t differenceInBC(const InteractionRecord &other) const
auto getITSPerLayer() const
const o2::dataformats::MatchInfoTOF & getTPCTOFMatch(GTrackID id) const
auto getMCHMIDMatches() const
bool isTrackSourceLoaded(int src) const
o2::InteractionRecord startIR
const o2::tpc::TrackTPC & getTPCTrack(GTrackID id) const
gsl::span< const o2::trd::CalibratedTracklet > getTRDCalibratedTracklets() const
const o2::mch::TrackMCH & getMCHTrack(GTrackID gid) const
auto getTPCTRDTriggers() const
auto getMFTClustersPatterns(int layer=0) const
auto getITSTracksClusterRefs() const
auto getIRFramesITS() const
auto getTPCTRDTOFMatches() const
auto getTPCTRDTrack(GTrackID id) const
auto getPrimaryVertexMatchedTracks() const
const o2::tpc::ClusterNativeAccess & getTPCClusters() const
auto getMCHTrackClusters() const
auto getITSClustersROFRecords(int layer=0) const
void createTracksVariadic(T creator, GTrackID::mask_t srcSel=GTrackID::getSourcesMask("all")) const
auto getTPCTracksClusterRefs() const
auto getPrimaryVertexMatchedTrackRefs() const
const o2::itsmft::TrkClusRef & getITSABRef(GTrackID gid) const
auto getITSClustersPatterns(int layer=0) const
const o2::dataformats::TrackTPCITS & getITSTPCTOFTrack(GTrackID id) const
const o2::dataformats::TrackTPCTOF & getTPCTOFTrack(GTrackID gid) const
const o2::mid::Track & getMIDTrack(GTrackID gid) const
auto getTOFClusters() const
auto getMIDTrackClusters() const
const o2::dataformats::TrackTPCITS & getTPCITSTrack(GTrackID gid) const
auto getHMPClusterTriggers() const
auto getMFTTracksClusterRefs() const
const o2::mft::TrackMFT & getMFTTrack(GTrackID gid) const
auto getTPCTRDTracks() const
const o2::dataformats::PrimaryVertex & getPrimaryVertex(int i) const
const o2::its::TrackITS & getITSTrack(GTrackID gid) const
auto getMFTClustersROFRecords(int layer=0) const
auto getEMCALCells() const
auto getITSTPCTRDTriggers() const
auto getITSTPCTRDTracks() const
auto getITSTPCTRDTrack(GTrackID id) const
auto getHMPClusters() const
auto getMFTClusters(int layer=0) const
auto getITSClusters(int layer=0) const
auto getITSTPCTRDTOFMatches() const
auto getEMCALTriggers() const
auto getITSABClusterRefs() const
auto getPHOSCells() const
gsl::span< const o2::trd::Tracklet64 > getTRDTracklets() const
auto getPHOSTriggers() const
const o2::dataformats::MatchInfoTOF & getTOFMatch(GTrackID id) const
const o2::dataformats::GlobalFwdTrack & getGlobalFwdTrack(GTrackID gid) const
float getTimeOffset() const
float nSigmaTimeTrack
define track time bracket as +- this number of sigmas of its time resolution
float timeMarginTrackTime
additive marginal error in \mus to track time bracket
o2::InteractionRecord ir(0, 0)
std::vector< Cluster > clusters
std::vector< Cell > cells