Skip to content

Commit 52192a2

Browse files
committed
AOD: Add optional streamer to producer
1 parent f185250 commit 52192a2

File tree

2 files changed

+75
-1
lines changed

2 files changed

+75
-1
lines changed

Detectors/AOD/include/AODProducerWorkflow/AODProducerWorkflowSpec.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
#include "TStopwatch.h"
3131
#include "ZDCBase/Constants.h"
3232
#include "GlobalTracking/MatchGlobalFwd.h"
33+
#include "CommonUtils/TreeStreamRedirector.h"
34+
#include "CommonUtils/EnumBitOperators.h"
3335

3436
#include <cstdint>
3537
#include <limits>
@@ -205,7 +207,15 @@ class BunchCrossings
205207

206208
std::vector<TimeWindow> mTimeWindows; // the time window structure covering the complete duration of mBCTimeVector
207209
double mWindowSize; // the size of a single time window
208-
}; // end internal class
210+
}; // end internal class
211+
212+
// Steering bits for additional output during AOD production
213+
enum struct AODProducerStreamerMask : uint8_t {
214+
None = 0,
215+
TrackQA = O2_ENUM_SET_BIT(0),
216+
All = std::numeric_limits<std::underlying_type_t<AODProducerStreamerMask>>::max(),
217+
};
218+
O2_DEFINE_ENUM_BIT_OPERATORS(AODProducerStreamerMask)
209219

210220
class AODProducerWorkflowDPL : public Task
211221
{
@@ -243,6 +253,9 @@ class AODProducerWorkflowDPL : public Task
243253
std::unordered_set<GIndex> mGIDUsedBySVtx;
244254
std::unordered_set<GIndex> mGIDUsedByStr;
245255

256+
AODProducerStreamerMask mStreamerMask;
257+
std::shared_ptr<o2::utils::TreeStreamRedirector> mStreamer;
258+
246259
int mNThreads = 1;
247260
bool mUseMC = true;
248261
bool mEnableSV = true; // enable secondary vertices

Detectors/AOD/src/AODProducerWorkflowSpec.cxx

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
#include "Framework/DataTypes.h"
5252
#include "Framework/TableBuilder.h"
5353
#include "Framework/CCDBParamSpec.h"
54+
#include "CommonUtils/TreeStreamRedirector.h"
5455
#include "FT0Base/Geometry.h"
5556
#include "GlobalTracking/MatchTOF.h"
5657
#include "ReconstructionDataFormats/Cascade.h"
@@ -1687,6 +1688,14 @@ void AODProducerWorkflowDPL::init(InitContext& ic)
16871688
mThinTracks = ic.options().get<bool>("thin-tracks");
16881689
mPropTracks = ic.options().get<bool>("propagate-tracks");
16891690
mPropMuons = ic.options().get<bool>("propagate-muons");
1691+
if (auto s = ic.options().get<std::string>("with-streamers"); !ic.options().isDefault("with-streamers") && !s.empty()) {
1692+
mStreamerMask = static_cast<AODProducerStreamerMask>(std::stoul(s, nullptr, 2));
1693+
if (O2_ENUM_ANY_BIT(mStreamerMask)) {
1694+
LOGP(info, "Writing streamer data with mask {:0{}b}", static_cast<std::underlying_type_t<AODProducerStreamerMask>>(mStreamerMask), std::numeric_limits<std::underlying_type_t<AODProducerStreamerMask>>::digits);
1695+
} else {
1696+
LOGP(warn, "Specified non-default empty streamer mask!");
1697+
}
1698+
}
16901699
mTrackQCFraction = ic.options().get<float>("trackqc-fraction");
16911700
mTrackQCNTrCut = ic.options().get<int64_t>("trackqc-NTrCut");
16921701
if (auto seed = ic.options().get<int>("seed"); seed == 0) {
@@ -1772,6 +1781,10 @@ void AODProducerWorkflowDPL::init(InitContext& ic)
17721781
mHeavyIonUpdate = when;
17731782

17741783
mTimer.Reset();
1784+
1785+
if (O2_ENUM_ANY_BIT(mStreamerMask)) {
1786+
mStreamer = std::make_unique<o2::utils::TreeStreamRedirector>("AO2DStreamer.root", "RECREATE");
1787+
}
17751788
}
17761789

17771790
void AODProducerWorkflowDPL::run(ProcessingContext& pc)
@@ -2643,6 +2656,51 @@ AODProducerWorkflowDPL::TrackQA AODProducerWorkflowDPL::processBarrelTrackQA(int
26432656
trackQAHolder.dRefGloSnp = safeInt8Clamp(((itsCopy.getSnp() + tpcCopy.getSnp()) * 0.5f - gloCopy.getSnp()) * scaleGlo(2));
26442657
trackQAHolder.dRefGloTgl = safeInt8Clamp(((itsCopy.getTgl() + tpcCopy.getTgl()) * 0.5f - gloCopy.getTgl()) * scaleGlo(3));
26452658
trackQAHolder.dRefGloQ2Pt = safeInt8Clamp(((itsCopy.getQ2Pt() + tpcCopy.getQ2Pt()) * 0.5f - gloCopy.getQ2Pt()) * scaleGlo(4));
2659+
2660+
if (O2_ENUM_TEST_BIT(mStreamerMask, AODProducerStreamerMask::TrackQA)) {
2661+
(*mStreamer) << "trackQA"
2662+
<< "trackITSOrig=" << itsOrig
2663+
<< "trackTPCOrig=" << tpcOrig
2664+
<< "trackITSTPCOrig=" << trackPar
2665+
<< "trackITSProp=" << itsCopy
2666+
<< "trackTPCProp=" << tpcCopy
2667+
<< "trackITSTPCProp=" << gloCopy
2668+
<< "refRadius=" << o2::aod::track::trackQARefRadius
2669+
<< "scaleBins=" << o2::aod::track::trackQAScaleBins
2670+
<< "scaleCont0=" << scaleCont(0)
2671+
<< "scaleCont1=" << scaleCont(1)
2672+
<< "scaleCont2=" << scaleCont(2)
2673+
<< "scaleCont3=" << scaleCont(3)
2674+
<< "scaleCont4=" << scaleCont(4)
2675+
<< "scaleGlo0=" << scaleGlo(0)
2676+
<< "scaleGlo1=" << scaleGlo(1)
2677+
<< "scaleGlo2=" << scaleGlo(2)
2678+
<< "scaleGlo3=" << scaleGlo(3)
2679+
<< "scaleGlo4=" << scaleGlo(4)
2680+
<< "trackQAHolder.tpcTime0=" << trackQAHolder.tpcTime0
2681+
<< "trackQAHolder.tpcdcaR=" << trackQAHolder.tpcdcaR
2682+
<< "trackQAHolder.tpcdcaZ=" << trackQAHolder.tpcdcaZ
2683+
<< "trackQAHolder.tpcdcaClusterByteMask=" << trackQAHolder.tpcClusterByteMask
2684+
<< "trackQAHolder.tpcdEdxMax0R=" << trackQAHolder.tpcdEdxMax0R
2685+
<< "trackQAHolder.tpcdEdxMax1R=" << trackQAHolder.tpcdEdxMax1R
2686+
<< "trackQAHolder.tpcdEdxMax2R=" << trackQAHolder.tpcdEdxMax2R
2687+
<< "trackQAHolder.tpcdEdxMax3R=" << trackQAHolder.tpcdEdxMax3R
2688+
<< "trackQAHolder.tpcdEdxTot0R=" << trackQAHolder.tpcdEdxTot0R
2689+
<< "trackQAHolder.tpcdEdxTot1R=" << trackQAHolder.tpcdEdxTot1R
2690+
<< "trackQAHolder.tpcdEdxTot2R=" << trackQAHolder.tpcdEdxTot2R
2691+
<< "trackQAHolder.tpcdEdxTot3R=" << trackQAHolder.tpcdEdxTot3R
2692+
<< "trackQAHolder.dRefContY=" << trackQAHolder.dRefContY
2693+
<< "trackQAHolder.dRefContZ=" << trackQAHolder.dRefContZ
2694+
<< "trackQAHolder.dRefContSnp=" << trackQAHolder.dRefContSnp
2695+
<< "trackQAHolder.dRefContTgl=" << trackQAHolder.dRefContTgl
2696+
<< "trackQAHolder.dRefContQ2Pt=" << trackQAHolder.dRefContQ2Pt
2697+
<< "trackQAHolder.dRefGloY=" << trackQAHolder.dRefGloY
2698+
<< "trackQAHolder.dRefGloZ=" << trackQAHolder.dRefGloZ
2699+
<< "trackQAHolder.dRefGloSnp=" << trackQAHolder.dRefGloSnp
2700+
<< "trackQAHolder.dRefGloTgl=" << trackQAHolder.dRefGloTgl
2701+
<< "trackQAHolder.dRefGloQ2Pt=" << trackQAHolder.dRefGloQ2Pt
2702+
<< "\n";
2703+
}
26462704
}
26472705
}
26482706
}
@@ -3012,6 +3070,8 @@ void AODProducerWorkflowDPL::endOfStream(EndOfStreamContext& /*ec*/)
30123070
{
30133071
LOGF(info, "aod producer dpl total timing: Cpu: %.3e Real: %.3e s in %d slots",
30143072
mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
3073+
3074+
mStreamer.reset();
30153075
}
30163076

30173077
DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, bool enableStrangenessTracking, bool useMC, bool CTPConfigPerRun)
@@ -3144,6 +3204,7 @@ DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, boo
31443204
ConfigParamSpec{"thin-tracks", VariantType::Bool, false, {"Produce thinned track tables"}},
31453205
ConfigParamSpec{"trackqc-fraction", VariantType::Float, float(0.1), {"Fraction of tracks to QC"}},
31463206
ConfigParamSpec{"trackqc-NTrCut", VariantType::Int64, 4L, {"Minimal length of the track - in amount of tracklets"}},
3207+
ConfigParamSpec{"with-streamers", VariantType::String, "", {"Bit-mask to steer writing of intermediate streamer files"}},
31473208
ConfigParamSpec{"seed", VariantType::Int, 0, {"Set seed for random generator used for sampling (0 (default) means using a random_device)"}},
31483209
}};
31493210
}

0 commit comments

Comments
 (0)