Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
#include "CommonDataFormat/BunchFilling.h"
#include "DetectorsCommonDataFormats/DetID.h"
#include "DataFormatsParameters/GRPObject.h"
#include <FairLogger.h>
#include <GPUCommonLogger.h>

namespace o2
{
Expand Down
3 changes: 3 additions & 0 deletions GPU/GPUTracking/SliceTracker/GPUTPCMCInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ struct GPUTPCMCInfo {
float pY;
float pZ;
float genRadius;
#ifdef GPUCA_TPC_GEOMETRY_O2
float t0;
#endif
};
} // namespace gpu
} // namespace GPUCA_NAMESPACE
Expand Down
89 changes: 70 additions & 19 deletions GPU/GPUTracking/Standalone/qa/GPUQA.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,18 @@
#include "GPUO2DataTypes.h"
#include "GPUParam.inc"
#include "GPUTPCClusterRejection.h"
#include "TPCFastTransform.h"
#ifdef HAVE_O2HEADERS
#include "SimulationDataFormat/ConstMCTruthContainer.h"
#include "SimulationDataFormat/MCCompLabel.h"
#endif
#ifdef GPUCA_O2_LIB
#include "DetectorsRaw/HBFUtils.h"
#include "DataFormatsTPC/TrackTPC.h"
#include "DataFormatsTPC/Constants.h"
#include "SimulationDataFormat/MCTrack.h"
#include "SimulationDataFormat/TrackReference.h"
#include "SimulationDataFormat/DigitizationContext.h"
#include "DetectorsCommonDataFormats/DetID.h"
#include "DetectorsCommonDataFormats/NameConf.h"
#include "TPDGCode.h"
Expand Down Expand Up @@ -208,6 +212,7 @@ int GPUQA::initColors()
}
static constexpr Color_t defaultColorNUms[COLORCOUNT] = {kRed, kBlue, kGreen, kMagenta, kOrange, kAzure, kBlack, kYellow, kGray, kTeal, kSpring, kPink};

#define TRACK_EXPECTED_REFERENCE_X_DEFAULT 81
#ifdef GPUCA_TPC_GEOMETRY_O2
inline unsigned int GPUQA::GetNMCCollissions()
{
Expand Down Expand Up @@ -257,7 +262,7 @@ inline float GPUQA::GetMCLabelWeight(const mcLabel_t& label) { return label.fWei
inline int GPUQA::FakeLabelID(int id) { return id < 0 ? id : (-2 - id); }
inline int GPUQA::AbsLabelID(int id) { return id >= 0 ? id : (-id - 2); }
inline bool GPUQA::mcPresent() { return !mConfig.noMC && mTracking && GetNMCLabels() && GetNMCTracks(0); }
#define TRACK_EXPECTED_REFERENCE_X 81
#define TRACK_EXPECTED_REFERENCE_X TRACK_EXPECTED_REFERENCE_X_DEFAULT
#endif
template <class T>
inline auto& GPUQA::GetMCTrackObj(T& obj, const GPUQA::mcLabelI_t& l)
Expand Down Expand Up @@ -580,6 +585,8 @@ int GPUQA::InitQA(int tasks)
}

#ifdef GPUCA_O2_LIB
static constexpr float PRIM_MAX_T = 0.01f;

TFile fileSim(o2::base::NameConf::getMCKinematicsFileName("o2sim").c_str());
TTree* treeSim = (TTree*)fileSim.Get("o2sim");
std::vector<o2::MCTrack>* tracksX;
Expand All @@ -598,7 +605,15 @@ int GPUQA::InitQA(int tasks)
mMCInfos.resize(nSimEvents);
mNColTracks.resize(nSimEvents);
std::vector<int> refId;

auto dc = o2::steer::DigitizationContext::loadFromFile("collisioncontext.root");
auto evrec = dc->getEventRecords();

for (int i = 0; i < nSimEvents; i++) {
auto ir = evrec[i];
auto ir0 = o2::raw::HBFUtils::Instance().getFirstIRofTF(ir);
float timebin = (float)ir.differenceInBC(ir0) / o2::tpc::constants::LHCBCPERTIMEBIN;

treeSim->GetEntry(i);
const std::vector<o2::MCTrack>& tracks = *tracksX;
const std::vector<o2::TrackReference>& trackRefs = *trackRefsX;
Expand Down Expand Up @@ -637,9 +652,18 @@ int GPUQA::InitQA(int tasks)
}

info.charge = particle ? particle->Charge() : 0;
info.prim = 1;
info.prim = trk.T() < PRIM_MAX_T;
info.primDaughters = 0;
if (trk.getFirstDaughterTrackId() != -1) {
for (int k = trk.getFirstDaughterTrackId(); k <= trk.getLastDaughterTrackId(); k++) {
if (tracks[k].T() < PRIM_MAX_T) {
info.primDaughters = 1;
break;
}
}
}
info.pid = pid;
info.t0 = timebin;
if (refId[j] >= 0) {
const auto& trkRef = trackRefs[refId[j]];
info.x = trkRef.X();
Expand Down Expand Up @@ -851,7 +875,18 @@ void GPUQA::RunQA(bool matchOnly, const std::vector<o2::tpc::TrackTPC>* tracksEx
GetMCTrackObj(mRecTracks, label)++;
if (mMCTrackMin == -1 || (label.getTrackID() >= mMCTrackMin && label.getTrackID() < mMCTrackMax)) {
int& revLabel = GetMCTrackObj(mTrackMCLabelsReverse, label);
if (revLabel == -1 || !mTracking->mIOPtrs.mergedTracks[revLabel].OK() || (mTracking->mIOPtrs.mergedTracks[i].OK() && fabsf(mTracking->mIOPtrs.mergedTracks[i].GetParam().GetZ()) < fabsf(mTracking->mIOPtrs.mergedTracks[revLabel].GetParam().GetZ()))) {
const auto* trks = mTracking->mIOPtrs.mergedTracks;
bool comp;
if (revLabel == -1) {
comp = true;
} else if (mTracking->GetParam().par.earlyTpcTransform) {
comp = fabsf(trks[i].GetParam().GetZ() + trks[i].GetParam().GetTZOffset()) < fabsf(trks[revLabel].GetParam().GetZ() + trks[revLabel].GetParam().GetTZOffset());
} else {
float shift1 = mTracking->GetTPCTransform()->convDeltaTimeToDeltaZinTimeFrame(trks[i].CSide() * GPUChainTracking::NSLICES / 2, trks[i].GetParam().GetTZOffset());
float shift2 = mTracking->GetTPCTransform()->convDeltaTimeToDeltaZinTimeFrame(trks[revLabel].CSide() * GPUChainTracking::NSLICES / 2, trks[revLabel].GetParam().GetTZOffset());
comp = fabsf(trks[i].GetParam().GetZ() + shift1) < fabsf(trks[revLabel].GetParam().GetZ() + shift2);
}
if (revLabel == -1 || !trks[revLabel].OK() || (trks[i].OK() && comp)) {
revLabel = i;
}
}
Expand Down Expand Up @@ -993,7 +1028,7 @@ void GPUQA::RunQA(bool matchOnly, const std::vector<o2::tpc::TrackTPC>* tracksEx
const float& mcphi = mc2.phi;
const float& mceta = mc2.eta;

if (info.prim && info.primDaughters) {
if (info.primDaughters) {
continue;
}
if (mc2.nWeightCls < MIN_WEIGHT_CLS) {
Expand Down Expand Up @@ -1078,6 +1113,9 @@ void GPUQA::RunQA(bool matchOnly, const std::vector<o2::tpc::TrackTPC>* tracksEx
const mcInfo_t& mc1 = GetMCTrack(mTrackMCLabels[i]);
const additionalMCParameters& mc2 = GetMCTrackObj(mMCParam, mTrackMCLabels[i]);

if (mc1.primDaughters) {
continue;
}
if (!tracksExternal) {
if (!mTracking->mIOPtrs.mergedTracks[i].OK()) {
continue;
Expand Down Expand Up @@ -1107,9 +1145,9 @@ void GPUQA::RunQA(bool matchOnly, const std::vector<o2::tpc::TrackTPC>* tracksEx
if (mc2.nWeightCls < MIN_WEIGHT_CLS) {
continue;
}
if (mConfig.resPrimaries == 1 && (!mc1.prim || mc1.primDaughters)) {
if (mConfig.resPrimaries == 1 && !mc1.prim) {
continue;
} else if (mConfig.resPrimaries == 2 && (mc1.prim || mc1.primDaughters)) {
} else if (mConfig.resPrimaries == 2 && mc1.prim) {
continue;
}
if (GetMCTrackObj(mTrackMCLabelsReverse, mTrackMCLabels[i]) != (int)i) {
Expand All @@ -1118,6 +1156,7 @@ void GPUQA::RunQA(bool matchOnly, const std::vector<o2::tpc::TrackTPC>* tracksEx

GPUTPCGMTrackParam param;
float alpha = 0.f;
int side;
if (tracksExternal) {
#ifdef GPUCA_O2_LIB
for (int k = 0; k < 5; k++) {
Expand All @@ -1127,11 +1166,14 @@ void GPUQA::RunQA(bool matchOnly, const std::vector<o2::tpc::TrackTPC>* tracksEx
param.Cov()[k] = (*tracksExternal)[i].getCov()[k];
}
param.X() = (*tracksExternal)[i].getX();
param.TZOffset() = (*tracksExternal)[i].getTime0();
alpha = (*tracksExternal)[i].getAlpha();
side = (*tracksExternal)[i].hasBothSidesClusters() ? 2 : ((*tracksExternal)[i].hasCSideClusters() ? 1 : 0);
#endif
} else {
param = mTracking->mIOPtrs.mergedTracks[i].GetParam();
alpha = mTracking->mIOPtrs.mergedTracks[i].GetAlpha();
side = mTracking->mIOPtrs.mergedTracks[i].CCE() ? 2 : (mTracking->mIOPtrs.mergedTracks[i].CSide() ? 1 : 0);
}

float mclocal[4]; // Rotated x,y,Px,Py mc-coordinates - the MC data should be rotated since the track is propagated best along x
Expand All @@ -1156,31 +1198,40 @@ void GPUQA::RunQA(bool matchOnly, const std::vector<o2::tpc::TrackTPC>* tracksEx
continue;
}

auto getdz = [this, &mclocal, &param, &mc1, &side]() {
if (!mTracking->GetParam().par.continuousMaxTimeBin) {
return param.Z() - mc1.z;
}
#ifdef GPUCA_TPC_GEOMETRY_O2
if (!mTracking->GetParam().par.earlyTpcTransform) {
float shift = side == 2 ? 0 : mTracking->GetTPCTransform()->convDeltaTimeToDeltaZinTimeFrame(side * GPUChainTracking::NSLICES / 2, param.GetTZOffset() - mc1.t0);
return param.GetZ() + shift - mc1.z;
}
#endif
return param.Z() + param.TZOffset() - mc1.z;
};

prop.SetTrack(&param, alpha);
bool inFlyDirection = 0;
#ifdef GPUCA_TPC_GEOMETRY_O2 // ignore z here, larger difference in X due to shifted reference
if (mConfig.strict && (param.X() - mclocal[0]) * (param.X() - mclocal[0]) + (param.Y() - mclocal[1]) * (param.Y() - mclocal[1]) + (mTracking->GetParam().par.continuousMaxTimeBin ? 0 : ((param.Z() - mc1.z) * (param.Z() - mc1.z))) > (5 + abs(81 - TRACK_EXPECTED_REFERENCE_X)) * (5 + abs(81 - TRACK_EXPECTED_REFERENCE_X))) {
#else // Consider Z offset (pseudo-tf mc tracks have shifted z)
if (mConfig.strict && (param.X() - mclocal[0]) * (param.X() - mclocal[0]) + (param.Y() - mclocal[1]) * (param.Y() - mclocal[1]) + (param.Z() + param.TZOffset() - mc1.z) * (param.Z() + param.TZOffset() - mc1.z) > 25) { // TODO: fix TZOffset
#endif
continue;
if (mConfig.strict) {
const float dx = param.X() - std::max<float>(mclocal[0], TRACK_EXPECTED_REFERENCE_X_DEFAULT); // Limit distance check if the O2 MC position is farther inside than the AliRoot MC position.
const float dy = param.Y() - mclocal[1];
const float dz = getdz();
if (dx * dx + dy * dy + dz * dz > 5.f * 5.f) {
continue;
}
}

if (prop.PropagateToXAlpha(mclocal[0], alpha, inFlyDirection)) {
continue;
}
#ifdef GPUCA_TPC_GEOMETRY_O2 // ignore z here, larger difference in X due to shifted reference
if (fabsf(param.Y() - mclocal[1]) > (mConfig.strict ? 1.f : 4.f) || (mTracking->GetParam().par.continuousMaxTimeBin == 0 && fabsf(param.Z() + param.TZOffset() - mc1.z) > (mConfig.strict ? 1.f : 4.f))) { // TODO: fix TZOffset here
#else
if (fabsf(param.Y() - mclocal[1]) > (mConfig.strict ? 1.f : 4.f) || fabsf(param.Z() + param.TZOffset() - mc1.z) > (mConfig.strict ? 1.f : 4.f)) { // TODO: fix TZOffset here
#endif
if (fabsf(param.Y() - mclocal[1]) > (mConfig.strict ? 1.f : 4.f) || fabsf(getdz()) > (mConfig.strict ? 1.f : 4.f)) {
continue;
}

float charge = mc1.charge > 0 ? 1.f : -1.f;

float deltaY = param.GetY() - mclocal[1];
float deltaZ = param.GetZ() + param.TZOffset() - mc1.z; // TODO: fix TZOffset here
float deltaZ = getdz();
float deltaPhiNative = param.GetSinPhi() - mclocal[3] / mc2.pt;
float deltaPhi = std::asin(param.GetSinPhi()) - std::atan2(mclocal[3], mclocal[2]);
float deltaLambdaNative = param.GetDzDs() - mc1.pZ / mc2.pt;
Expand Down