Skip to content
Merged
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
76 changes: 47 additions & 29 deletions Detectors/GlobalTrackingWorkflow/study/src/TrackingStudy.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ class TrackingStudySpec : public Task
std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOut;
std::unique_ptr<o2::utils::TreeStreamRedirector> mDBGOutVtx;
std::unique_ptr<o2::gpu::GPUO2InterfaceRefit> mTPCRefitter; ///< TPC refitter used for TPC tracks refit during the reconstruction
std::vector<float> mTBinClOccAft, mTBinClOccBef, mTBinClOccWgh; ///< TPC occupancy histo: i-th entry is the integrated occupancy for ~1 orbit starting/preceding from the TB = i*mNTPCOccBinLength
std::vector<float> mMltHistTB, mTBinClOccAft, mTBinClOccBef, mTBinClOccWgh; ///< TPC occupancy histo: i-th entry is the integrated occupancy for ~1 orbit starting/preceding from the TB = i*mNTPCOccBinLength
std::unique_ptr<TF1> mOccWghFun;
float mITSROFrameLengthMUS = 0.f;
float mTPCTBinMUS = 0.f; // TPC bin in microseconds
Expand All @@ -107,6 +107,7 @@ class TrackingStudySpec : public Task
float mMinX = 46.;
float mMaxEta = 0.8;
float mMinPt = 0.1;
int mNOccBinsDrift = 10;
int mMinTPCClusters = 60;
int mNTPCOccBinLength = 0; ///< TPC occ. histo bin length in TBs
int mNHBPerTF = 0;
Expand Down Expand Up @@ -142,6 +143,10 @@ void TrackingStudySpec::init(InitContext& ic)
mDCAYFormula = ic.options().get<std::string>("dcay-vs-pt");
mDCAZFormula = ic.options().get<std::string>("dcaz-vs-pt");
mDoPairsCorr = ic.options().get<bool>("pair-correlations");
mNOccBinsDrift = ic.options().get<int>("noccbins");
if (mNOccBinsDrift < 3) {
mNOccBinsDrift = 3;
}
auto str = ic.options().get<std::string>("occ-weight-fun");
if (!str.empty()) {
mOccWghFun = std::make_unique<TF1>("occFun", str.c_str(), -100., 100.);
Expand Down Expand Up @@ -172,42 +177,23 @@ void TrackingStudySpec::run(ProcessingContext& pc)
mTBinClOccAft.resize(nTPCOccBins);
mTBinClOccBef.resize(nTPCOccBins);
float sm = 0., tb = 0.5 * mNTPCOccBinLength;
/* // at the moment not used
if (mOccWghFun) {
mTBinClOccWgh.resize(nTPCBins);
float occBin2MUS = 8 * o2::constants::lhc::LHCBunchSpacingMUS;
int covWghTB = TMath::NInt(100./occBin2MUS); // coverage of weighted occ. in TBins
for (int i = 0; i < nTPCBins; i++) {
sm = 0.;
for (int j=-covWghTB;j<covWghTB;j++) {
if (j+i<0 || j+i>=nTPCBins) {
continue;
}
sm += mOccWghFun->Eval(j*occBin2MUS)*mTPCRefitter->getParam()->GetUnscaledMult(j+i);
}
mTBinClOccWgh[i] = sm;
}
} else {
mTBinClOccWgh.resize(1);
}
*/
std::vector<float> mltHistTB(nTPCOccBins);
mMltHistTB.resize(nTPCOccBins);
for (int i = 0; i < nTPCOccBins; i++) {
mltHistTB[i] = mTPCRefitter->getParam()->GetUnscaledMult(tb);
mMltHistTB[i] = mTPCRefitter->getParam()->GetUnscaledMult(tb);
tb += mNTPCOccBinLength;
}
for (int i = nTPCOccBins; i--;) {
sm += mltHistTB[i];
sm += mMltHistTB[i];
if (i + sumBins < nTPCOccBins) {
sm -= mltHistTB[i + sumBins];
sm -= mMltHistTB[i + sumBins];
}
mTBinClOccAft[i] = sm;
}
sm = 0;
for (int i = 0; i < nTPCOccBins; i++) {
sm += mltHistTB[i];
sm += mMltHistTB[i];
if (i - sumBins > 0) {
sm -= mltHistTB[i - sumBins];
sm -= mMltHistTB[i - sumBins];
}
mTBinClOccBef[i] = sm;
}
Expand Down Expand Up @@ -271,13 +257,17 @@ void TrackingStudySpec::process(o2::globaltracking::RecoContainer& recoData)
o2::dataformats::PrimaryVertexExt pveDummy;
o2::dataformats::PrimaryVertexExt vtxDummy(mMeanVtx.getPos(), {}, {}, 0);
std::vector<o2::dataformats::PrimaryVertexExt> pveVec(nv);
std::vector<float> tpcOccAftV, tpcOccBefV;
pveVec.back() = vtxDummy;
const auto& alpParams = o2::itsmft::DPLAlpideParam<o2::detectors::DetID::ITS>::Instance();
float tBiasITS = alpParams.roFrameBiasInBC * o2::constants::lhc::LHCBunchSpacingMUS;
const o2::ft0::InteractionTag& ft0Params = o2::ft0::InteractionTag::Instance();
std::vector<o2::dataformats::TrackInfoExt> trcExtVec;
std::vector<o2::trackstudy::TrackPairInfo> trcPairsVec;
auto vdrit = mTPCVDriftHelper.getVDriftObject().getVDrift();
auto vdrift = mTPCVDriftHelper.getVDriftObject().getVDrift();
float maxDriftTB = 250.f / vdrift / (o2::constants::lhc::LHCBunchSpacingMUS * 8);
int groupOcc = std::ceil(maxDriftTB / mNOccBinsDrift / mNTPCOccBinLength);

bool tpcTrackOK = recoData.isTrackSourceLoaded(GTrackID::TPC);

auto fillTPCClInfo = [&recoData, this](const o2::tpc::TrackTPC& trc, o2::dataformats::TrackInfoExt& trExt, float timestampTB = -1e9) {
Expand Down Expand Up @@ -391,6 +381,8 @@ void TrackingStudySpec::process(o2::globaltracking::RecoContainer& recoData)
}
}
};
tpcOccAftV.resize(mNOccBinsDrift);
tpcOccBefV.resize(mNOccBinsDrift);

for (int iv = 0; iv < nv; iv++) {
LOGP(debug, "processing PV {} of {}", iv, nv);
Expand Down Expand Up @@ -455,7 +447,7 @@ void TrackingStudySpec::process(o2::globaltracking::RecoContainer& recoData)
continue;
}
if (iv < nv - 1 && is == GTrackID::TPC && tpcTr && !tpcTr->hasBothSidesClusters()) { // for unconstrained TPC tracks correct track Z
float corz = vdrit * (tpcTr->getTime0() * mTPCTBinMUS - pvvec[iv].getTimeStamp().getTimeStamp());
float corz = vdrift * (tpcTr->getTime0() * mTPCTBinMUS - pvvec[iv].getTimeStamp().getTimeStamp());
if (tpcTr->hasASideClustersOnly()) {
corz = -corz; // A-side
}
Expand Down Expand Up @@ -500,7 +492,7 @@ void TrackingStudySpec::process(o2::globaltracking::RecoContainer& recoData)
} else {
o2::track::TrackParCov tmpTPC(*tpcTr);
if (iv < nv - 1 && is == GTrackID::TPC && tpcTr && !tpcTr->hasBothSidesClusters()) { // for unconstrained TPC tracks correct track Z
float corz = vdrit * (tpcTr->getTime0() * mTPCTBinMUS - pvvec[iv].getTimeStamp().getTimeStamp());
float corz = vdrift * (tpcTr->getTime0() * mTPCTBinMUS - pvvec[iv].getTimeStamp().getTimeStamp());
if (tpcTr->hasASideClustersOnly()) {
corz = -corz; // A-side
}
Expand Down Expand Up @@ -554,10 +546,35 @@ void TrackingStudySpec::process(o2::globaltracking::RecoContainer& recoData)
int tb = pveVec[iv].getTimeStamp().getTimeStamp() * mTPCTBinMUSInv * mNTPCOccBinLengthInv;
tpcOccBef = tb < 0 ? mTBinClOccBef[0] : (tb >= mTBinClOccBef.size() ? mTBinClOccBef.back() : mTBinClOccBef[tb]);
tpcOccAft = tb < 0 ? mTBinClOccAft[0] : (tb >= mTBinClOccAft.size() ? mTBinClOccAft.back() : mTBinClOccAft[tb]);
int tbc = pveVec[iv].getTimeStamp().getTimeStamp() * mTPCTBinMUSInv * mNTPCOccBinLengthInv - groupOcc / 2.;
for (int iob = 0; iob < mNOccBinsDrift; iob++) {
float sm = 0;
for (int ig = 0; ig < groupOcc; ig++) {
int ocb = tbc + ig + groupOcc * iob;
if (ocb < 0 || ocb >= (int)mMltHistTB.size()) {
sm = -1;
break;
}
sm += mMltHistTB[ocb];
}
tpcOccAftV[iob] = sm;
//
sm = 0;
for (int ig = 0; ig < groupOcc; ig++) {
int ocb = tbc + ig - groupOcc * iob;
if (ocb < 0 || ocb >= (int)mMltHistTB.size()) {
sm = -1;
break;
}
sm += mMltHistTB[ocb];
}
tpcOccBefV[iob] = sm;
}
}
(*mDBGOut) << "trpv"
<< "orbit=" << recoData.startIR.orbit << "tfID=" << TFCount
<< "tpcOccBef=" << tpcOccBef << "tpcOccAft=" << tpcOccAft
<< "tpcOccBefV=" << tpcOccBefV << "tpcOccAftV=" << tpcOccAftV
<< "pve=" << pveVec[iv] << "trc=" << trcExtVec << "\n";

if (mDoPairsCorr) {
Expand Down Expand Up @@ -752,6 +769,7 @@ DataProcessorSpec getTrackingStudySpec(GTrackID::mask_t srcTracks, GTrackID::mas
{"with-its-only", VariantType::Bool, false, {"Store tracks with ITS only"}},
{"pair-correlations", VariantType::Bool, false, {"Do pairs correlation"}},
{"occ-weight-fun", VariantType::String, "(x>=-40&&x<-5) ? (1./1225*pow(x+40,2)) : ((x>-5&&x<15) ? 1. : ((x>=15&&x<40) ? (-0.4/25*x+1.24 ) : ( (x>40&&x<100) ? -0.4/60*x+0.6+0.8/3 : 0)))", {"Occupancy weighting f-n vs time in musec"}},
{"noccbins", VariantType::Int, 10, {"Number of occupancy bins per full drift time"}},
{"min-x-prop", VariantType::Float, 100.f, {"track should be propagated to this X at least"}},
};
o2::tpc::VDriftHelper::requestCCDBInputs(dataRequest->inputs);
Expand Down