18#ifndef ALICEO2_IDCFACTORIZATION_H_
19#define ALICEO2_IDCFACTORIZATION_H_
27#include <boost/property_tree/ptree.hpp>
51 IDCFactorization(
const std::array<unsigned char, Mapper::NREGIONS>& groupPads,
const std::array<unsigned char, Mapper::NREGIONS>& groupRows,
const std::array<unsigned char, Mapper::NREGIONS>& groupLastRowsThreshold,
const std::array<unsigned char, Mapper::NREGIONS>& groupLastPadsThreshold,
const unsigned int groupNotnPadsSectorEdges,
const unsigned int timeFrames,
const unsigned int timeframesDeltaIDC,
const std::vector<uint32_t>& crus);
56 IDCFactorization(
const unsigned int timeFrames,
const unsigned int timeframesDeltaIDC,
const std::vector<uint32_t>& crus) :
IDCFactorization(
std::
array<unsigned
char,
Mapper::NREGIONS>{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, std::array<unsigned char, Mapper::NREGIONS>{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, std::array<unsigned char, Mapper::NREGIONS>{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, std::array<unsigned char, Mapper::NREGIONS>{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 0, timeFrames, timeframesDeltaIDC, crus){};
69 static std::vector<o2::tpc::Side>
getSides(
const std::vector<uint32_t>& crus);
94 void checkFECs(
const float maxOutliersPerFEC = 0.7);
109 template <
typename DataVec>
110 static void calcIDCOne(
const DataVec& idcsData,
const int idcsPerCRU,
const int integrationIntervalOffset,
const unsigned int indexOffset,
const CRU cru, std::vector<std::vector<float>>& idcOneTmp,
const IDCZero* idcZero,
const CalDet<PadFlags>* flagMap =
nullptr,
const bool usePadStatusMap =
false);
118 float getIDCValGrouped(
const unsigned int sector,
const unsigned int region,
const unsigned int grow,
unsigned int gpad,
unsigned int integrationInterval)
const {
return mIDCs[sector *
Mapper::NREGIONS + region][integrationInterval][
mOffsRow[region][grow] + gpad]; }
126 float getIDCValUngrouped(
const unsigned int sector,
const unsigned int region,
unsigned int urow,
unsigned int upad,
unsigned int integrationInterval)
const;
133 float getIDCZeroVal(
const unsigned int sector,
const unsigned int region,
unsigned int urow,
unsigned int upad)
const {
return mIDCZero[mSideIndex[
Sector(sector).
side()]].getValueIDCZero(
getIndexUngrouped(sector, region, urow, upad, 0)); }
142 float getIDCDeltaVal(
const unsigned int sector,
const unsigned int region,
unsigned int urow,
unsigned int upad,
unsigned int chunk,
unsigned int localintegrationInterval)
const {
return mIDCDelta[mSideIndex[
Sector(sector).
side()]][chunk].getValue(
getIndexUngrouped(sector, region, urow, upad, localintegrationInterval)); }
148 void getLocalIntegrationInterval(
const unsigned int integrationInterval,
unsigned int& chunk,
unsigned int& localintegrationInterval)
const;
232 void setRun(
const int run) { mRun = run; }
247 void setIDCs(std::vector<float>&& idcs,
const unsigned int cru,
const unsigned int timeframe) { mIDCs[cru][timeframe] = std::move(idcs); }
251 static void setNThreads(
const int nThreads) { sNThreads = nThreads; }
254 static void setMinCompressedIDCDelta(
const float minIDCDeltaValue) { o2::conf::ConfigurableParam::setValue<float>(
"TPCIDCCompressionParam",
"minIDCDeltaValue", minIDCDeltaValue); }
257 static void setMaxCompressedIDCDelta(
const float maxIDCDeltaValue) { o2::conf::ConfigurableParam::setValue<float>(
"TPCIDCCompressionParam",
"maxIDCDeltaValue", maxIDCDeltaValue); }
275 void drawIDCDeltaSector(
const unsigned int sector,
const unsigned int integrationInterval,
const float minZ = 0,
const float maxZ = -1,
const IDCDeltaCompression compression =
IDCDeltaCompression::NO,
const std::string
filename =
"IDCDeltaSector.pdf")
const { drawIDCDeltaHelper(
false,
Sector(sector), integrationInterval, compression,
filename,
minZ,
maxZ); }
285 void drawIDCsSideGIF(
const unsigned int integrationIntervals = 0,
const float minZ = 0,
const float maxZ = -1,
const int run = -1,
const std::string
filename =
"IDCsSideGIF")
const { drawIDCHelper(
true,
Sector(0), integrationIntervals,
filename,
minZ,
maxZ,
true, run); }
297 void drawIDCDeltaSide(
const o2::tpc::Side side,
const unsigned int integrationInterval,
const float minZ = 0,
const float maxZ = -1,
const IDCDeltaCompression compression =
IDCDeltaCompression::NO,
const std::string
filename =
"IDCDeltaSide.pdf")
const { drawIDCDeltaHelper(
true,
side ==
Side::A ?
Sector(0) :
Sector(
Sector::MAXSECTOR - 1), integrationInterval, compression,
filename,
minZ,
maxZ); }
314 void dumpToFile(
const char* outFileName =
"IDCFactorized.root",
const char* outName =
"IDCFactorized")
const;
319 void dumpLargeObjectToFile(
const char* outFileName =
"IDCFactorized.root",
const char* outName =
"IDCFactorized")
const;
325 static std::unique_ptr<IDCFactorization>
getLargeObjectFromFile(
const char* inpFileName =
"IDCFactorized.root",
const char* inName =
"IDCFactorized");
331 void dumpIDCOneToFile(
const Side side,
const char* outFileName =
"IDCOne.root",
const char* outName =
"IDC1")
const;
340 void dumpToTreeIDC1(
const float integrationTimeOrbits = 12,
const char* outFileName =
"IDC1Tree.root")
const;
358 void setGainMap(
const char* inpFile,
const char* mapName);
366 void setPadFlagMap(
const char* inpFile,
const char* mapName);
386 std::unique_ptr<CalDet<PadFlags>>
getPadStatusMap() {
return std::move(mPadFlagsMap); }
389 const std::vector<Side>&
getSides()
const {
return mSides; }
413 const unsigned int mTimeFrames{};
414 const unsigned int mTimeFramesDeltaIDC{};
415 std::array<std::vector<std::vector<float>>,
CRU::MaxCRU> mIDCs{};
416 std::vector<IDCZero> mIDCZero{};
417 std::vector<IDCOne> mIDCOne{};
418 std::vector<std::vector<IDCDelta<float>>> mIDCDelta{};
419 inline static int sNThreads{1};
420 std::unique_ptr<CalDet<float>> mGainMap;
421 std::unique_ptr<CalDet<PadFlags>> mPadFlagsMap;
422 bool mInputGrouped{
false};
423 bool mUsePadStatusMap{
true};
424 const std::vector<uint32_t> mCRUs{};
425 std::array<unsigned int, SIDES> mSideIndex{0, 1};
426 std::vector<Side> mSides{};
427 std::vector<unsigned int> mIntegrationIntervalsPerTF{};
432 void drawIDCDeltaHelper(
const bool type,
const Sector sector,
const unsigned int integrationInterval,
const IDCDeltaCompression compression,
const std::string
filename,
const float minZ,
const float maxZ)
const;
435 void drawIDCHelper(
const bool type,
const Sector sector,
const unsigned int integrationInterval,
const std::string
filename,
const float minZ,
const float maxZ,
const bool drawGIF =
false,
const int run = 0)
const;
438 void drawIDCZeroHelper(
const bool type,
const Sector sector,
const std::string
filename,
const float minZ,
const float maxZ)
const;
441 void getTF(
unsigned int integrationInterval,
unsigned int& timeFrame,
unsigned int& interval)
const;
444 unsigned int getChunk(
const unsigned int timeframe)
const;
447 unsigned int getNTFsPerChunk(
const unsigned int chunk)
const;
450 void drawPadFlagMap(
const bool type,
const Sector sector,
const std::string
filename,
const PadFlags flag)
const;
453 void normIDCZero(
const int type);
457 bool checkReceivedIDCs();
This file provides the structs for storing the factorized IDC values and fourier coefficients to be s...
helper class for grouping of pads and rows for one sector
static IDCDelta< DataT > getCompressedIDCs(const IDCDelta< float > &idcDeltaUncompressed)
std::array< float, o2::tpc::GEMSTACKS > getStackMedian() const
void setGainMap(const char *inpFile, const char *mapName)
const std::vector< Side > & getSides() const
void calcIDCOne()
calculate I_1(t) = <I(r,\phi,t) / I_0(r,\phi)>_{r,\phi}
void dumpIDCDeltaToTree(const Side side, const int chunk=0, const char *outFileName="IDCDeltaTree.root")
dump IDCDelta to a TTree
unsigned int getNTimeframes() const
void setIDCDelta(const Side side, const IDCDelta< float > &idcDelta, const int index=0)
set the IDCDelta
void setRun(const int run)
long getTimeStamp() const
void drawIDCZeroSide(const o2::tpc::Side side, const float minZ=0, const float maxZ=-1, const std::string filename="IDCZeroSide.pdf") const
void reset()
resetting aggregated IDCs
void fillIDCZeroDeadPads()
fill I_0 values in case of dead pads,FECs etc.
void drawPadStatusFlagsMapSide(const o2::tpc::Side side, const PadFlags flag=PadFlags::flagSkip, const std::string filename="PadStatusFlags_Side.pdf") const
const auto & getIDCOne() const &
const auto & getIDCs() const
unsigned long getNIntegrationIntervalsInChunk(const unsigned int chunk) const
void dumpToTree(const Side side, const char *outFileName="IDCTree.root")
unsigned int getTimeFramesDeltaIDC() const
IDCFactorization()=default
default constructor for ROOT I/O
float getIDCDeltaVal(const unsigned int sector, const unsigned int region, unsigned int urow, unsigned int upad, unsigned int chunk, unsigned int localintegrationInterval) const
void drawIDCsSideGIF(const unsigned int integrationIntervals=0, const float minZ=0, const float maxZ=-1, const int run=-1, const std::string filename="IDCsSideGIF") const
IDCFactorization(IDCFactorization &&)=default
default move constructor
static void setMinCompressedIDCDelta(const float minIDCDeltaValue)
static void setNThreads(const int nThreads)
float getIDCZeroVal(const unsigned int sector, const unsigned int region, unsigned int urow, unsigned int upad) const
void drawIDCDeltaSector(const unsigned int sector, const unsigned int integrationInterval, const float minZ=0, const float maxZ=-1, const IDCDeltaCompression compression=IDCDeltaCompression::NO, const std::string filename="IDCDeltaSector.pdf") const
const auto & getIDCZero() const
unsigned long getNIntegrationIntervalsToChunk(const unsigned int chunk) const
const std::vector< float > & getIDCOneVec(const o2::tpc::Side side) const
void factorizeIDCs(const bool norm, const bool calcDeltas)
void dumpPadFlagMap(const char *outFile, const char *mapName)
void dumpIDCZeroToFile(const Side side, const char *outFileName="IDCZero.root", const char *outName="IDC0") const
dump the IDC0 to file
float getIDCValUngrouped(const unsigned int sector, const unsigned int region, unsigned int urow, unsigned int upad, unsigned int integrationInterval) const
void checkNeighbourOutliers(const int maxIter=10, const int nOutliersNeighbours=8)
void setIDCZero(const Side side, const IDCZero &idcZero)
set the IDCZero object
auto getIDCDeltaMediumCompressed(const unsigned int chunk, const Side side) const
std::vector< unsigned int > getIntegrationIntervalsPerTF(const int cru=-1) const
~IDCFactorization()
destructor
unsigned int getNChunks(const Side side) const
auto getIDCDeltaUncompressed(const unsigned int chunk, const Side side) &&
std::vector< unsigned int > getAllIntegrationIntervalsPerTF() const
void drawIDCZeroSector(const unsigned int sector, const float minZ=0, const float maxZ=-1, const std::string filename="IDCZeroSector.pdf") const
float getIDCValGrouped(const unsigned int sector, const unsigned int region, const unsigned int grow, unsigned int gpad, unsigned int integrationInterval) const
unsigned long getNIntegrationIntervals() const
void dumpToFile(const char *outFileName="IDCFactorized.root", const char *outName="IDCFactorized") const
void calcIDCZero(const bool norm)
void setIDCs(std::vector< float > &&idcs, const unsigned int cru, const unsigned int timeframe)
void normIDCZeroGain()
normalize IDC0 with the set gain map
static std::unique_ptr< IDCFactorization > getLargeObjectFromFile(const char *inpFileName="IDCFactorized.root", const char *inName="IDCFactorized")
static void setMaxCompressedIDCDelta(const float maxIDCDeltaValue)
void dumpLargeObjectToFile(const char *outFileName="IDCFactorized.root", const char *outName="IDCFactorized") const
void drawIDCsSector(const unsigned int sector, const unsigned int integrationInterval, const float minZ=0, const float maxZ=-1, const std::string filename="IDCsSector.pdf") const
void setUsePadStatusMap(const bool usePadStatusMap)
setting the usage of the pad-by-pad status map during the factorization of the IDCs
const auto & getIDCDeltaUncompressed(const unsigned int chunk, const Side side) const &
void calcIDCDelta()
calculate \Delta I(r,\phi,t) = I(r,\phi,t) / ( I_0(r,\phi) * I_1(t) )
void checkFECs(const float maxOutliersPerFEC=0.7)
void getLocalIntegrationInterval(const unsigned int integrationInterval, unsigned int &chunk, unsigned int &localintegrationInterval) const
void drawIDCDeltaSide(const o2::tpc::Side side, const unsigned int integrationInterval, const float minZ=0, const float maxZ=-1, const IDCDeltaCompression compression=IDCDeltaCompression::NO, const std::string filename="IDCDeltaSide.pdf") const
void normIDCZeroStackMedian()
normalize IDC0 with the median per stack
const std::vector< float > & getIDCDeltaValuesUncompressed(const unsigned int chunk, const o2::tpc::Side side) const
auto getIDCZero(const o2::tpc::Side side) &&
CalDet< PadFlags > * getPadStatusMapPtr() const
void setIDCOne(const Side side, const IDCOne &idcOne)
set the IDCOne
bool getUsePadStatusMap() const
float getMeanZ(const Side side) const
void drawIDCsSide(const o2::tpc::Side side, const unsigned int integrationInterval, const float minZ=0, const float maxZ=-1, const std::string filename="IDCsSide.pdf") const
const IDCZero & getIDCZero(const o2::tpc::Side side) const &
void dumpToTreeIDC1(const float integrationTimeOrbits=12, const char *outFileName="IDC1Tree.root") const
void dumpIDCOneToFile(const Side side, const char *outFileName="IDCOne.root", const char *outName="IDC1") const
dump the IDC1 to file
IDCFactorization(const unsigned int timeFrames, const unsigned int timeframesDeltaIDC, const std::vector< uint32_t > &crus)
void createStatusMapOutlier(const bool debug=false)
const IDCOne & getIDCOne(const o2::tpc::Side side) const
std::unique_ptr< CalDet< PadFlags > > getPadStatusMap()
void setTimeStamp(const long timeStamp)
void setPadFlagMap(const char *inpFile, const char *mapName)
const std::vector< float > & getIDCZeroVec(const o2::tpc::Side side) const
void drawPadStatusFlagsMapSector(const unsigned int sector, const PadFlags flag=PadFlags::flagSkip, const std::string filename="PadStatusFlags_Sector.pdf") const
auto getIDCDeltaHighCompressed(const unsigned int chunk, const Side side) const
Helper class for accessing grouped pads for one sector.
std::array< std::vector< unsigned int >, Mapper::NREGIONS > mOffsRow
offset to calculate the index in the data from row and pad per region
unsigned int getIndexUngrouped(const unsigned int sector, const unsigned int region, unsigned int ulrow, unsigned int upad, unsigned int integrationInterval) const
static constexpr unsigned int NREGIONS
total number of regions in one sector
static constexpr int MAXSECTOR
GLint GLint GLsizei GLint GLenum GLenum type
GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat maxZ
Global TPC definitions and constants.
IDCDeltaCompression
IDC Delta IDC Compression types.
@ NO
no compression using floats
@ flagSkip
flag for defining a pad which is just ignored during the calculation of I1 and IDCDelta
Defining DataPointCompositeObject explicitly as copiable.
struct to access and set Delta IDCs
std::array< std::vector< float >, CRU::MaxCRU > idcs
struct containing the ITPC0 values (integrated TPC clusters)