18#include <boost/algorithm/string/predicate.hpp>
50 void connectTree(
const std::string&
filename);
52 bool revalidateTrack(
const TrackData& trk)
const;
56 void fillResiduals(
const int iSec);
58 std::unique_ptr<TFile> mFile;
59 std::unique_ptr<TTree> mTreeResiduals;
60 std::unique_ptr<TTree> mTreeStats;
61 std::unique_ptr<TTree> mTreeUnbinnedResiduals;
62 std::unique_ptr<TTree> mTreeTrackData;
64 bool mDoBinning{
false};
65 bool mStoreBinnedResiduals{
false};
67 TrackResiduals mTrackResiduals;
68 std::vector<std::string> mFileNames;
69 std::string mOutfile{
"debugVoxRes.root"};
70 std::vector<TrackResiduals::LocalResid> mResiduals, *mResidualsPtr = &mResiduals;
71 std::array<std::vector<TrackResiduals::LocalResid>,
SECTORSPERSIDE *
SIDES> mResidualsSector;
72 std::array<std::vector<TrackResiduals::LocalResid>*,
SECTORSPERSIDE *
SIDES> mResidualsSectorPtr;
74 std::vector<UnbinnedResid> mUnbinnedResiduals, *mUnbinnedResidualsPtr = &mUnbinnedResiduals;
75 std::vector<TrackDataCompact> mTrackData, *mTrackDataPtr = &mTrackData;
76 std::vector<TrackData> mTrackDataExtra, *mTrackDataExtraPtr = &mTrackDataExtra;
79void TPCResidualReader::fillResiduals(
const int iSec)
81 auto brStats = mTreeStats->GetBranch(Form(
"sec%d", iSec));
83 brStats->GetEntry(mTreeStats->GetEntries() - 1);
87 auto brResid = mTreeResiduals->GetBranch(Form(
"sec%d", iSec));
88 brResid->SetAddress(&mResidualsPtr);
90 for (
int iEntry = 0; iEntry < brResid->GetEntries(); ++iEntry) {
91 brResid->GetEntry(iEntry);
92 LOGF(
debug,
"Pushing %lu TPC residuals at entry %i for sector %i", mResiduals.size(), iEntry, iSec);
93 for (
const auto&
res : mResiduals) {
94 LOGF(
debug,
"Adding residual from Voxel %i-%i-%i. dy(%i), dz(%i), tg(%i)",
res.bvox[0],
res.bvox[1],
res.bvox[2],
res.dy,
res.dz,
res.tgSlp);
102 const auto dontCheckFileAccess = ic.
options().
get<
bool>(
"dont-check-file-access");
104 auto fileList = o2::RangeTokenizer::tokenize<std::string>(ic.
options().
get<std::string>(
"residuals-infiles"));
105 mOutfile = ic.
options().
get<std::string>(
"outfile");
106 mTrackResiduals.
init();
109 if (fileList.size() == 1) {
110 if (boost::algorithm::ends_with(fileList.front(),
"txt")) {
111 LOGP(info,
"Reading files from input file {}", fileList.front());
112 std::ifstream is(fileList.front());
113 std::istream_iterator<std::string>
start(is);
114 std::istream_iterator<std::string>
end;
115 std::vector<std::string> fileNamesTmp(
start,
end);
116 fileList = fileNamesTmp;
121 for (
const auto&
file : fileList) {
122 if ((
file.find(
"alien://") == 0) && !gGrid && !TGrid::Connect(
"alien://")) {
123 LOG(fatal) <<
"Failed to open alien connection";
126 if (!dontCheckFileAccess) {
127 std::unique_ptr<TFile> filePtr(TFile::Open(fileDir.data()));
128 if (!filePtr || !filePtr->IsOpen() || filePtr->IsZombie()) {
129 LOGP(warning,
"Could not open file {}", fileDir);
133 mFileNames.emplace_back(fileDir);
136 if (mFileNames.size() == 0) {
137 LOGP(error,
"No input files to process");
140 mStoreBinnedResiduals = ic.
options().
get<
bool>(
"store-binned");
149 LOGP(info,
"Preparing the binning of residuals. Storing the afterwards is set to {}", mStoreBinnedResiduals);
150 mTreeResiduals = std::make_unique<TTree>(
"resid",
"TPC binned residuals");
151 if (!mStoreBinnedResiduals) {
153 mTreeResiduals->SetDirectory(
nullptr);
156 mResidualsSectorPtr[iSec] = &mResidualsSector[iSec];
158 for (
int ix = 0; ix < mTrackResiduals.
getNXBins(); ++ix) {
159 for (
int ip = 0; ip < mTrackResiduals.
getNY2XBins(); ++ip) {
160 for (
int iz = 0; iz < mTrackResiduals.
getNZ2XBins(); ++iz) {
161 auto& statsVoxel = mVoxStatsSector[iSec][mTrackResiduals.
getGlbVoxBin(ix, ip, iz)];
167 mTreeResiduals->Branch(Form(
"sec%d", iSec), &mResidualsSectorPtr[iSec]);
170 for (
const auto&
file : mFileNames) {
171 LOGP(info,
"Processing residuals from file {}",
file);
173 for (
int iEntry = 0; iEntry < mTreeUnbinnedResiduals->GetEntries(); ++iEntry) {
174 mTreeUnbinnedResiduals->GetEntry(iEntry);
176 mTreeTrackData->GetEntry(iEntry);
178 auto nTracks = mTrackData.size();
179 for (
size_t iTrack = 0; iTrack < nTracks; ++iTrack) {
180 const auto& trkInfo = mTrackData[iTrack];
181 if (!GID::includesSource(trkInfo.sourceId, mSources)) {
185 const auto& trkInfoExtra = mTrackDataExtra[iTrack];
186 if (!revalidateTrack(trkInfoExtra)) {
190 for (
int i = trkInfo.idxFirstResidual;
i < trkInfo.idxFirstResidual + trkInfo.nResiduals; ++
i) {
191 const auto& residIn = mUnbinnedResiduals[
i];
192 int sec = residIn.sec;
193 auto& residVecOut = mResidualsSector[sec];
194 auto& statVecOut = mVoxStatsSector[sec];
195 std::array<unsigned char, TrackResiduals::VoxDim> bvox;
196 float xPos = param::RowX[residIn.row];
197 float yPos = residIn.y * param::MaxY / 0x7fff + residIn.dy * param::MaxResid / 0x7fff;
198 float zPos = residIn.z * param::MaxZ / 0x7fff + residIn.dz * param::MaxResid / 0x7fff;
199 if (!mTrackResiduals.
findVoxelBin(sec, xPos, yPos, zPos, bvox)) {
201 LOGF(
debug,
"Dropping residual in sec(%i), x(%f), y(%f), z(%f)", sec, xPos, yPos, zPos);
204 residVecOut.emplace_back(residIn.dy, residIn.dz, residIn.tgSlp, bvox);
205 auto& stat = statVecOut[mTrackResiduals.
getGlbVoxBin(bvox)];
206 float& binEntries = stat.nEntries;
207 float oldEntries = binEntries++;
208 float norm = 1.f / binEntries;
210 float xPosInv = 1.f / xPos;
217 mTreeResiduals->Fill();
218 for (
auto& residuals : mResidualsSector) {
227 auto brResid = mTreeResiduals->GetBranch(Form(
"sec%d", iSec));
228 brResid->SetAddress(&mResidualsPtr);
229 for (
int iEntry = 0; iEntry < brResid->GetEntries(); ++iEntry) {
230 brResid->GetEntry(iEntry);
233 mTrackResiduals.
setStats(mVoxStatsSector[iSec], iSec);
236 for (
const auto&
file : mFileNames) {
237 LOGP(info,
"Processing residuals from file {}",
file);
248 mTrackResiduals.
clear();
260void TPCResidualReader::connectTree(
const std::string&
filename)
265 mTreeResiduals.reset(
nullptr);
266 mTreeStats.reset(
nullptr);
268 mTreeUnbinnedResiduals.reset(
nullptr);
269 mTreeTrackData.reset(
nullptr);
270 mFile.reset(TFile::Open(
filename.c_str()));
271 assert(mFile && !mFile->IsZombie());
274 mTreeResiduals.reset((TTree*)mFile->Get(
"resid"));
275 assert(mTreeResiduals);
276 mTreeStats.reset((TTree*)mFile->Get(
"stats"));
278 LOG(info) <<
"Loaded tree from " <<
filename <<
" with " << mTreeResiduals->GetEntries() <<
" entries";
281 LOG(info) <<
"Loading the binned residuals";
282 mTreeUnbinnedResiduals.reset((TTree*)mFile->Get(
"unbinnedResid"));
283 assert(mTreeUnbinnedResiduals);
284 mTreeUnbinnedResiduals->SetBranchAddress(
"res", &mUnbinnedResidualsPtr);
285 mTreeUnbinnedResiduals->SetBranchAddress(
"trackInfo", &mTrackDataPtr);
286 LOG(info) <<
"Loaded tree from " <<
filename <<
" with " << mTreeUnbinnedResiduals->GetEntries() <<
" entries";
288 mTreeTrackData.reset((TTree*)mFile->Get(
"trackData"));
289 mTreeTrackData->SetBranchAddress(
"trk", &mTrackDataExtraPtr);
290 LOG(info) <<
"Loaded the trackData tree in addition with " << mTreeTrackData->GetEntries() <<
" entries";
291 assert(mTreeUnbinnedResiduals->GetEntries() == mTreeTrackData->GetEntries());
296bool TPCResidualReader::revalidateTrack(
const TrackData& trk)
const
312 std::vector<InputSpec> inputs;
313 std::vector<OutputSpec> outputs;
316 "tpc-residual-reader",
321 {
"residuals-infiles", VariantType::String,
"o2tpc_residuals.root", {
"comma-separated list of input files or .txt file containing list of input files"}},
322 {
"input-dir", VariantType::String,
"none", {
"Input directory"}},
323 {
"outfile", VariantType::String,
"debugVoxRes.root", {
"Output file name"}},
324 {
"store-binned", VariantType::Bool,
false, {
"Store the binned residuals together with the voxel results"}},
325 {
"dont-check-file-access", VariantType::Bool,
false, {
"Deactivate check if all files are accessible before adding them to the list of files"}},
Helper function to tokenize sequences and ranges of integral numbers.
Definition of the TrackInterpolation class.
Definition of the TrackResiduals class.
static const SpacePointsCalibConfParam & Instance()
T get(const char *key) const
ConfigParamRegistry const & options()
ServiceRegistryRef services()
The services registry associated with this processing context.
void run(ProcessingContext &pc) final
~TPCResidualReader() override=default
void init(InitContext &ic) final
TPCResidualReader(bool doBinning, GID::mask_t src)
std::vector< LocalResid > & getLocalResVec()
void processSectorResiduals(Int_t iSec)
size_t getGlbVoxBin(int ix, int ip, int iz) const
void setStats(const std::vector< TrackResiduals::VoxStats > &statsIn, int iSec)
Set the voxel statistics directly from outside.
void closeOutputFile()
Closes the file with the debug output.
void clear()
clear member to be able to process new sector or new input files
void fillStats(int iSec)
Fill statistics from TTree.
int getNVoxelsPerSector() const
Get the total number of voxels per TPC sector (mNXBins * mNY2XBins * mNZ2XBins)
void createOutputFile(const char *filename="debugVoxRes.root")
Creates a file for the debug output.
void getVoxelCoordinates(int isec, int ix, int ip, int iz, float &x, float &p, float &z) const
bool findVoxelBin(int secID, float x, float y, float z, std::array< unsigned char, VoxDim > &bvox) const
Calculates the bin indices for given x, y, z in sector coordinates.
void init(bool doBinning=true)
std::vector< VoxStats > ** getVoxStatPtr()
Defining PrimaryVertex explicitly as messageable.
std::vector< ConfigParamSpec > Options
constexpr unsigned char SECTORSPERSIDE
constexpr unsigned char SIDES
framework::DataProcessorSpec getTPCResidualReaderSpec(bool doBinning, GID::mask_t src)
create a processor spec
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
int minTRDNTrklts
min number of TRD space points
int minTPCNCls
min number of TPC clusters
bool useTrackData
if we have the track data available, we can redefine the above cuts for the map creation,...
int minITSNCls
min number of ITS clusters
Structure filled for each track with track quality information and a vector with TPCClusterResiduals.
static std::string rectifyDirectory(const std::string_view p)
static std::string concat_string(Ts const &... ts)
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"