Skip to content

Commit 6fe62b6

Browse files
martenoleshahor02
authored andcommitted
Add CTP lumi information to TPC SCD calib
1 parent e7b1cbb commit 6fe62b6

6 files changed

Lines changed: 49 additions & 10 deletions

File tree

Detectors/GlobalTrackingWorkflow/tpcinterpolationworkflow/include/TPCInterpolationWorkflow/TPCResidualAggregatorSpec.h

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include <chrono>
3131

3232
using namespace o2::framework;
33+
using GID = o2::dataformats::GlobalTrackID;
3334

3435
namespace o2
3536
{
@@ -39,7 +40,7 @@ namespace calibration
3940
class ResidualAggregatorDevice : public o2::framework::Task
4041
{
4142
public:
42-
ResidualAggregatorDevice(std::shared_ptr<o2::base::GRPGeomRequest> req, bool trackInput, bool writeOutput, bool writeUnbinnedResiduals, bool writeBinnedResiduals, bool writeTrackData) : mCCDBRequest(req), mTrackInput(trackInput), mWriteOutput(writeOutput), mWriteUnbinnedResiduals(writeUnbinnedResiduals), mWriteBinnedResiduals(writeBinnedResiduals), mWriteTrackData(writeTrackData) {}
43+
ResidualAggregatorDevice(std::shared_ptr<o2::base::GRPGeomRequest> req, bool trackInput, bool ctpInput, bool writeOutput, bool writeUnbinnedResiduals, bool writeBinnedResiduals, bool writeTrackData, std::shared_ptr<o2::globaltracking::DataRequest> dataRequest) : mCCDBRequest(req), mTrackInput(trackInput), mCTPInput(ctpInput), mWriteOutput(writeOutput), mWriteUnbinnedResiduals(writeUnbinnedResiduals), mWriteBinnedResiduals(writeBinnedResiduals), mWriteTrackData(writeTrackData), mDataRequest(dataRequest) {}
4344

4445
void init(o2::framework::InitContext& ic) final
4546
{
@@ -92,11 +93,12 @@ class ResidualAggregatorDevice : public o2::framework::Task
9293
void run(o2::framework::ProcessingContext& pc) final
9394
{
9495
auto runStartTime = std::chrono::high_resolution_clock::now();
96+
o2::globaltracking::RecoContainer recoCont;
97+
recoCont.collectData(pc, *mDataRequest);
9598
updateTimeDependentParams(pc);
9699
std::chrono::duration<double, std::milli> ccdbUpdateTime = std::chrono::high_resolution_clock::now() - runStartTime;
97100

98101
auto residualsData = pc.inputs().get<gsl::span<o2::tpc::UnbinnedResid>>("unbinnedRes");
99-
100102
// track data input is optional
101103
const gsl::span<const o2::tpc::TrackData>* trkDataPtr = nullptr;
102104
using trkDataType = std::decay_t<decltype(pc.inputs().get<gsl::span<o2::tpc::TrackData>>(""))>;
@@ -105,11 +107,20 @@ class ResidualAggregatorDevice : public o2::framework::Task
105107
trkData.emplace(pc.inputs().get<gsl::span<o2::tpc::TrackData>>("trkData"));
106108
trkDataPtr = &trkData.value();
107109
}
110+
// CTP lumi input (optional)
111+
const o2::ctp::LumiInfo* lumi = nullptr;
112+
using lumiDataType = std::decay_t<decltype(pc.inputs().get<o2::ctp::LumiInfo>(""))>;
113+
std::optional<lumiDataType> lumiInput;
114+
if (mCTPInput) {
115+
recoCont.getCTPLumi();
116+
lumiInput = recoCont.getCTPLumi();
117+
lumi = &lumiInput.value();
118+
}
108119

109120
auto data = std::make_pair<gsl::span<const o2::tpc::TrackData>, gsl::span<const o2::tpc::UnbinnedResid>>(std::move(*trkData), std::move(residualsData));
110121
o2::base::TFIDInfoHelper::fillTFIDInfo(pc, mAggregator->getCurrentTFInfo());
111122
LOG(info) << "Processing TF " << mAggregator->getCurrentTFInfo().tfCounter << " with " << trkData->size() << " tracks and " << residualsData.size() << " unbinned residuals associated to them";
112-
mAggregator->process(data);
123+
mAggregator->process(data, lumi);
113124
std::chrono::duration<double, std::milli> runDuration = std::chrono::high_resolution_clock::now() - runStartTime;
114125
LOGP(info, "Duration for run method: {} ms. From this taken for time dependent param update: {} ms",
115126
std::chrono::duration_cast<std::chrono::milliseconds>(runDuration).count(),
@@ -135,7 +146,9 @@ class ResidualAggregatorDevice : public o2::framework::Task
135146
}
136147
std::unique_ptr<o2::tpc::ResidualAggregator> mAggregator; ///< the TimeSlotCalibration device
137148
std::shared_ptr<o2::base::GRPGeomRequest> mCCDBRequest;
149+
std::shared_ptr<o2::globaltracking::DataRequest> mDataRequest; ///< optional CTP input
138150
bool mTrackInput{false}; ///< flag whether to expect track data as input
151+
bool mCTPInput{false}; ///< flag whether to expect luminosity input from CTP
139152
bool mWriteOutput{true}; ///< if false, no output file will be written
140153
bool mWriteBinnedResiduals{false}; ///< flag, whether to write binned residuals to output file
141154
bool mWriteUnbinnedResiduals{false}; ///< flag, whether to write unbinned residuals to output file
@@ -147,9 +160,13 @@ class ResidualAggregatorDevice : public o2::framework::Task
147160
namespace framework
148161
{
149162

150-
DataProcessorSpec getTPCResidualAggregatorSpec(bool trackInput, bool writeOutput, bool writeUnbinnedResiduals, bool writeBinnedResiduals, bool writeTrackData)
163+
DataProcessorSpec getTPCResidualAggregatorSpec(bool trackInput, bool ctpInput, bool writeOutput, bool writeUnbinnedResiduals, bool writeBinnedResiduals, bool writeTrackData)
151164
{
152-
std::vector<InputSpec> inputs;
165+
std::shared_ptr<o2::globaltracking::DataRequest> dataRequest = std::make_shared<o2::globaltracking::DataRequest>();
166+
if (ctpInput) {
167+
dataRequest->requestClusters(GID::getSourcesMask("CTP"), false);
168+
}
169+
auto& inputs = dataRequest->inputs;
153170
inputs.emplace_back("unbinnedRes", "GLO", "UNBINNEDRES");
154171
if (trackInput) {
155172
inputs.emplace_back("trkData", "GLO", "TRKDATA");
@@ -165,7 +182,7 @@ DataProcessorSpec getTPCResidualAggregatorSpec(bool trackInput, bool writeOutput
165182
"residual-aggregator",
166183
inputs,
167184
Outputs{},
168-
AlgorithmSpec{adaptFromTask<o2::calibration::ResidualAggregatorDevice>(ccdbRequest, trackInput, writeOutput, writeUnbinnedResiduals, writeBinnedResiduals, writeTrackData)},
185+
AlgorithmSpec{adaptFromTask<o2::calibration::ResidualAggregatorDevice>(ccdbRequest, trackInput, ctpInput, writeOutput, writeUnbinnedResiduals, writeBinnedResiduals, writeTrackData, dataRequest)},
169186
Options{
170187
{"tf-per-slot", VariantType::UInt32, 6'000u, {"number of TFs per calibration time slot (put 0 for infinite slot length)"}},
171188
{"updateInterval", VariantType::UInt32, 6'000u, {"update interval in number of TFs in case slot length is infinite"}},

Detectors/GlobalTrackingWorkflow/tpcinterpolationworkflow/src/TPCResidualWriterSpec.cxx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "SpacePoints/TrackInterpolation.h"
1717
#include "SpacePoints/TrackResiduals.h"
1818
#include "TPCInterpolationWorkflow/TPCResidualWriterSpec.h"
19+
#include "DataFormatsCTP/LumiInfo.h"
1920
#include "DPLUtils/MakeRootTreeWriterSpec.h"
2021

2122
using namespace o2::framework;

Detectors/GlobalTrackingWorkflow/tpcinterpolationworkflow/src/tpc-residual-aggregator.cxx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,18 @@
1313
#include "SpacePoints/ResidualAggregator.h"
1414
#include "TPCInterpolationWorkflow/TPCResidualAggregatorSpec.h"
1515
#include "TPCInterpolationWorkflow/TPCUnbinnedResidualReaderSpec.h"
16+
#include "GlobalTrackingWorkflowHelpers/InputHelper.h"
1617

1718
using namespace o2::framework;
19+
using GID = o2::dataformats::GlobalTrackID;
1820

1921
// we need to add workflow options before including Framework/runDataProcessing
2022
void customize(std::vector<o2::framework::ConfigParamSpec>& workflowOptions)
2123
{
2224
std::vector<o2::framework::ConfigParamSpec> options{
2325
{"output-type", VariantType::String, "binnedResid", {"Comma separated list of outputs (without spaces). Valid strings: unbinnedResid, binnedResid, trackParams"}},
2426
{"enable-track-input", VariantType::Bool, false, {"Whether to expect track data from interpolation workflow"}},
27+
{"enable-ctp", VariantType::Bool, false, {"Subscribe to lumi info from CTP"}},
2528
{"disable-root-input", VariantType::Bool, false, {"disable root-files input readers"}},
2629
{"disable-root-output", VariantType::Bool, false, {"Disables ROOT file writing"}},
2730
{"configKeyValues", VariantType::String, "", {"Semicolon separated key=value strings ..."}}};
@@ -36,6 +39,7 @@ WorkflowSpec defineDataProcessing(ConfigContext const& configcontext)
3639
{
3740
o2::conf::ConfigurableParam::updateFromString(configcontext.options().get<std::string>("configKeyValues"));
3841
auto trkInput = configcontext.options().get<bool>("enable-track-input");
42+
auto ctpInput = configcontext.options().get<bool>("enable-ctp");
3943

4044
bool writeUnbinnedResiduals = false;
4145
bool writeBinnedResiduals = false;
@@ -69,6 +73,14 @@ WorkflowSpec defineDataProcessing(ConfigContext const& configcontext)
6973
if (!configcontext.options().get<bool>("disable-root-input")) {
7074
specs.emplace_back(o2::tpc::getUnbinnedTPCResidualsReaderSpec(trkInput));
7175
}
72-
specs.emplace_back(getTPCResidualAggregatorSpec(trkInput, fileOutput, writeUnbinnedResiduals, writeBinnedResiduals, writeTrackData));
76+
specs.emplace_back(getTPCResidualAggregatorSpec(trkInput, ctpInput, fileOutput, writeUnbinnedResiduals, writeBinnedResiduals, writeTrackData));
77+
78+
// CTP input
79+
if (ctpInput) {
80+
auto maskClusters = GID::getSourcesMask("CTP");
81+
auto maskNone = GID::getSourcesMask(GID::NONE);
82+
o2::globaltracking::InputHelper::addInputSpecs(configcontext, specs, maskClusters, maskNone, maskNone, false);
83+
}
84+
7385
return specs;
7486
}

Detectors/TPC/calibration/SpacePoints/include/SpacePoints/ResidualAggregator.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
#include "DetectorsCalibration/TimeSlotCalibration.h"
2020
#include "DetectorsCalibration/TimeSlot.h"
21+
#include "DataFormatsCTP/LumiInfo.h"
2122
#include "DataFormatsTPC/Defs.h"
2223
#include "SpacePoints/TrackResiduals.h"
2324
#include "CommonUtils/StringUtils.h"
@@ -46,7 +47,7 @@ struct ResidualsContainer {
4647
void fillStatisticsBranches();
4748
uint64_t getNEntries() const { return nResidualsTotal; }
4849

49-
void fill(const o2::dataformats::TFIDInfo& ti, const std::pair<gsl::span<const o2::tpc::TrackData>, gsl::span<const UnbinnedResid>> data);
50+
void fill(const o2::dataformats::TFIDInfo& ti, const std::pair<gsl::span<const o2::tpc::TrackData>, gsl::span<const UnbinnedResid>> data, const o2::ctp::LumiInfo* lumiInput);
5051
void merge(ResidualsContainer* prev);
5152
void print();
5253
void writeToFile(bool closeFileAfterwards);
@@ -59,6 +60,7 @@ struct ResidualsContainer {
5960
uint32_t runNumber; ///< run number (required for meta data file)
6061
std::vector<uint32_t> tfOrbits, *tfOrbitsPtr{&tfOrbits}; ///< first TF orbit
6162
std::vector<uint32_t> sumOfResiduals, *sumOfResidualsPtr{&sumOfResiduals}; ///< sum of residuals for each TF
63+
std::vector<o2::ctp::LumiInfo> lumi, *lumiPtr{&lumi}; ///< luminosity information from CTP per TF
6264
std::vector<UnbinnedResid> unbinnedRes, *unbinnedResPtr{&unbinnedRes}; // unbinned residuals
6365
std::vector<TrackData> trkData, *trkDataPtr{&trkData}; // track data and cluster ranges
6466

Detectors/TPC/calibration/SpacePoints/src/ResidualAggregator.cxx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ ResidualsContainer::ResidualsContainer(ResidualsContainer&& rhs)
6666
runNumber = rhs.runNumber;
6767
tfOrbits = std::move(rhs.tfOrbits);
6868
sumOfResiduals = std::move(rhs.sumOfResiduals);
69+
lumi = std::move(rhs.lumi);
6970
}
7071

7172
void ResidualsContainer::init(const TrackResiduals* residualsEngine, std::string outputDir, bool wFile, bool wBinnedResid, bool wUnbinnedResid, bool wTrackData, int autosave, int compression)
@@ -113,6 +114,7 @@ void ResidualsContainer::init(const TrackResiduals* residualsEngine, std::string
113114
}
114115
treeOutRecords->Branch("firstTForbit", &tfOrbitsPtr);
115116
treeOutRecords->Branch("sumOfResiduals", &sumOfResidualsPtr);
117+
treeOutRecords->Branch("lumi", &lumiPtr);
116118
}
117119
}
118120

@@ -127,7 +129,7 @@ void ResidualsContainer::fillStatisticsBranches()
127129
}
128130
}
129131

130-
void ResidualsContainer::fill(const o2::dataformats::TFIDInfo& ti, const std::pair<gsl::span<const o2::tpc::TrackData>, gsl::span<const UnbinnedResid>> data)
132+
void ResidualsContainer::fill(const o2::dataformats::TFIDInfo& ti, const std::pair<gsl::span<const o2::tpc::TrackData>, gsl::span<const UnbinnedResid>> data, const o2::ctp::LumiInfo* lumiInput)
131133
{
132134
// receives large vector of unbinned residuals and fills the sector-wise vectors
133135
// with binned residuals and statistics
@@ -190,6 +192,9 @@ void ResidualsContainer::fill(const o2::dataformats::TFIDInfo& ti, const std::pa
190192
}
191193
runNumber = ti.runNumber;
192194
tfOrbits.push_back(ti.firstTForbit);
195+
if (lumiInput) {
196+
lumi.push_back(*lumiInput);
197+
}
193198

194199
if (autosaveInterval > 0 && (tfOrbits.size() % autosaveInterval) == 0 && writeToRootFile) {
195200
writeToFile(false);
@@ -292,6 +297,8 @@ void ResidualsContainer::merge(ResidualsContainer* prev)
292297
std::swap(prev->tfOrbits, tfOrbits);
293298
prev->sumOfResiduals.insert(prev->sumOfResiduals.end(), sumOfResiduals.begin(), sumOfResiduals.end());
294299
std::swap(prev->sumOfResiduals, sumOfResiduals);
300+
prev->lumi.insert(prev->lumi.end(), lumi.begin(), lumi.end());
301+
std::swap(prev->lumi, lumi);
295302
}
296303

297304
void ResidualsContainer::print()

prodtests/full-system-test/aggregator-workflow.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ if [[ $AGGREGATOR_TASKS == BARREL_TF ]] || [[ $AGGREGATOR_TASKS == ALL ]]; then
176176
if [[ $CALIB_TPC_SCDCALIB == 1 ]]; then
177177
# TODO: the residual aggregator should have --output-dir and --meta-output-dir defined
178178
# without that the residuals will be stored in the local working directory (and deleted after a week)
179-
add_W o2-calibration-residual-aggregator "--disable-root-input $ENABLE_TRACK_INPUT --output-type trackParams,unbinnedResid,binnedResid --autosave-interval $RESIDUAL_AGGREGATOR_AUTOSAVE"
179+
add_W o2-calibration-residual-aggregator "--disable-root-input $ENABLE_TRACK_INPUT $CALIB_TPC_SCDCALIB_CTP_INPUT --output-type trackParams,unbinnedResid,binnedResid --autosave-interval $RESIDUAL_AGGREGATOR_AUTOSAVE"
180180
fi
181181
if [[ $CALIB_TPC_VDRIFTTGL == 1 ]]; then
182182
# options available via ARGS_EXTRA_PROCESS_o2_tpc_vdrift_tgl_calibration_workflow="--nbins-tgl 20 --nbins-dtgl 50 --max-tgl-its 2. --max-dtgl-itstpc 0.15 --min-entries-per-slot 1000 --time-slot-seconds 600 <--vdtgl-histos-file-name name> "

0 commit comments

Comments
 (0)