Skip to content

Commit 8838e1d

Browse files
committed
AOD: Add optional streamer to producer
1 parent 5b81412 commit 8838e1d

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-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: 49 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,12 @@ 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"); !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+
}
1696+
}
16901697
mTrackQCFraction = ic.options().get<float>("trackqc-fraction");
16911698
mTrackQCNTrCut = ic.options().get<int64_t>("trackqc-NTrCut");
16921699
if (auto seed = ic.options().get<int>("seed"); seed == 0) {
@@ -1772,6 +1779,10 @@ void AODProducerWorkflowDPL::init(InitContext& ic)
17721779
mHeavyIonUpdate = when;
17731780

17741781
mTimer.Reset();
1782+
1783+
if (O2_ENUM_ANY_BIT(mStreamerMask)) {
1784+
mStreamer = std::make_unique<o2::utils::TreeStreamRedirector>("AO2DStreamer.root", "RECREATE");
1785+
}
17751786
}
17761787

17771788
void AODProducerWorkflowDPL::run(ProcessingContext& pc)
@@ -2642,6 +2653,41 @@ AODProducerWorkflowDPL::TrackQA AODProducerWorkflowDPL::processBarrelTrackQA(int
26422653
trackQAHolder.dRefGloSnp = safeInt8Clamp(((itsCopy.getSnp() + tpcCopy.getSnp()) * 0.5f - gloCopy.getSnp()) * scaleGlo(2));
26432654
trackQAHolder.dRefGloTgl = safeInt8Clamp(((itsCopy.getTgl() + tpcCopy.getTgl()) * 0.5f - gloCopy.getTgl()) * scaleGlo(3));
26442655
trackQAHolder.dRefGloQ2Pt = safeInt8Clamp(((itsCopy.getQ2Pt() + tpcCopy.getQ2Pt()) * 0.5f - gloCopy.getQ2Pt()) * scaleGlo(4));
2656+
2657+
if (O2_ENUM_TEST_BIT(mStreamerMask, AODProducerStreamerMask::TrackQA)) {
2658+
(*mStreamer) << "trackQA"
2659+
<< "trackITSOrig=" << itsOrig
2660+
<< "trackTPCOrig=" << tpcOrig
2661+
<< "trackITSTPCOrig=" << trackPar
2662+
<< "trackITSProp=" << itsCopy
2663+
<< "trackTPCProp=" << tpcCopy
2664+
<< "trackITSTPCProp=" << gloCopy
2665+
<< "refRadius=" << o2::aod::track::trackQARefRadius
2666+
<< "scaleBins=" << o2::aod::track::trackQAScaleBins
2667+
<< "trackQAHolder.tpcTime0=" << trackQAHolder.tpcTime0
2668+
<< "trackQAHolder.tpcdcaR=" << trackQAHolder.tpcdcaR
2669+
<< "trackQAHolder.tpcdcaZ=" << trackQAHolder.tpcdcaZ
2670+
<< "trackQAHolder.tpcdcaClusterByteMask=" << trackQAHolder.tpcClusterByteMask
2671+
<< "trackQAHolder.tpcdEdxMax0R=" << trackQAHolder.tpcdEdxMax0R
2672+
<< "trackQAHolder.tpcdEdxMax1R=" << trackQAHolder.tpcdEdxMax1R
2673+
<< "trackQAHolder.tpcdEdxMax2R=" << trackQAHolder.tpcdEdxMax2R
2674+
<< "trackQAHolder.tpcdEdxMax3R=" << trackQAHolder.tpcdEdxMax3R
2675+
<< "trackQAHolder.tpcdEdxTot0R=" << trackQAHolder.tpcdEdxTot0R
2676+
<< "trackQAHolder.tpcdEdxTot1R=" << trackQAHolder.tpcdEdxTot1R
2677+
<< "trackQAHolder.tpcdEdxTot2R=" << trackQAHolder.tpcdEdxTot2R
2678+
<< "trackQAHolder.tpcdEdxTot3R=" << trackQAHolder.tpcdEdxTot3R
2679+
<< "trackQAHolder.dRefContY=" << trackQAHolder.dRefContY
2680+
<< "trackQAHolder.dRefContZ=" << trackQAHolder.dRefContZ
2681+
<< "trackQAHolder.dRefContSnp=" << trackQAHolder.dRefContSnp
2682+
<< "trackQAHolder.dRefContTgl=" << trackQAHolder.dRefContTgl
2683+
<< "trackQAHolder.dRefContQ2Pt=" << trackQAHolder.dRefContQ2Pt
2684+
<< "trackQAHolder.dRefGloY=" << trackQAHolder.dRefGloY
2685+
<< "trackQAHolder.dRefGloZ=" << trackQAHolder.dRefGloZ
2686+
<< "trackQAHolder.dRefGloSnp=" << trackQAHolder.dRefGloSnp
2687+
<< "trackQAHolder.dRefGloTgl=" << trackQAHolder.dRefGloTgl
2688+
<< "trackQAHolder.dRefGloQ2Pt=" << trackQAHolder.dRefGloQ2Pt
2689+
<< "\n";
2690+
}
26452691
}
26462692
}
26472693
}
@@ -3011,6 +3057,8 @@ void AODProducerWorkflowDPL::endOfStream(EndOfStreamContext& /*ec*/)
30113057
{
30123058
LOGF(info, "aod producer dpl total timing: Cpu: %.3e Real: %.3e s in %d slots",
30133059
mTimer.CpuTime(), mTimer.RealTime(), mTimer.Counter() - 1);
3060+
3061+
mStreamer.reset();
30143062
}
30153063

30163064
DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, bool enableStrangenessTracking, bool useMC, bool CTPConfigPerRun)
@@ -3143,6 +3191,7 @@ DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool enableSV, boo
31433191
ConfigParamSpec{"thin-tracks", VariantType::Bool, false, {"Produce thinned track tables"}},
31443192
ConfigParamSpec{"trackqc-fraction", VariantType::Float, float(0.1), {"Fraction of tracks to QC"}},
31453193
ConfigParamSpec{"trackqc-NTrCut", VariantType::Int64, 4L, {"Minimal length of the track - in amount of tracklets"}},
3194+
ConfigParamSpec{"with-streamers", VariantType::String, "", {"Bit-mask to steer writing of intermediate streamer files"}},
31463195
ConfigParamSpec{"seed", VariantType::Int, 0, {"Set seed for random generator used for sampling (0 (default) means using a random_device)"}},
31473196
}};
31483197
}

0 commit comments

Comments
 (0)