15#include <fairlogger/Logger.h>
17#include "TOFReconstruction/Clusterer.h"
20#include <TStopwatch.h>
27 TStopwatch timerProcess;
34 LOG(
debug) <<
"TOFClusterer got Strip " << mStripData.
stripID <<
" with Ndigits "
35 << mStripData.
digits.size();
36 totNumDigits += mStripData.
digits.size();
39 processStrip(
clusters, digitMCTruth);
42 LOG(
debug) <<
"We had " << totNumDigits <<
" digits in this event";
47void Clusterer::calibrateStrip()
51 for (
int idig = 0; idig < mStripData.
digits.size(); idig++) {
69 Int_t chan, chan2, chan3;
71 Int_t iphi, iphi2, iphi3;
72 Int_t ieta, ieta2, ieta3;
74 for (
int idig = 0; idig < mStripData.
digits.size(); idig++) {
82 mNumberOfContributingDigits = 0;
84 if (mStripData.
digits.size() > 1) {
93 addContributingDigit(dig);
96 for (
int idigNext = idig + 1; idigNext < mStripData.
digits.size(); idigNext++) {
103 LOG(
debug) <<
"Time difference = " << timeDigNext - timeDig;
104 if (timeDigNext - timeDig > mDeltaTforClustering ) {
110 LOG(
debug) <<
"phi difference = " << iphi - iphi2;
111 LOG(
debug) <<
"eta difference = " << ieta - ieta2;
112 if ((std::abs(iphi - iphi2) > 1) || (std::abs(ieta - ieta2) > 1)) {
117 addContributingDigit(digNext);
122 buildCluster(
c, digitMCTruth);
127void Clusterer::addContributingDigit(
Digit* dig)
132 if (mNumberOfContributingDigits == 6) {
133 LOG(
debug) <<
"The cluster has already 6 digits associated to it, we cannot add more; returning without doing anything";
136 for (
int i = 0;
i < mNumberOfContributingDigits;
i++) {
138 LOG(
debug) <<
"digit already in " <<
i <<
", channel = " << mContributingDigit[
i]->
getChannel() <<
",phi,eta = (" <<
phi <<
"," << eta <<
"), TDC = " << mContributingDigit[
i]->
getTDC() <<
", calibrated time = " << mContributingDigit[
i]->
getCalibratedTime();
149 mContributingDigit[mNumberOfContributingDigits] = dig;
150 mNumberOfContributingDigits++;
159 static const float inv12 = 1. / 12.;
164 for (
int idig = 1; idig < mNumberOfContributingDigits; idig++) {
166 if (mContributingDigit[idig]->getTOT() > mContributingDigit[0]->getTOT()) {
167 temp = mContributingDigit[0];
168 mContributingDigit[0] = mContributingDigit[idig];
169 mContributingDigit[idig] = temp;
173 c.setMainContributingChannel(mContributingDigit[0]->getChannel());
174 c.
setTgeant(mContributingDigit[0]->getTgeant());
175 c.setT0true(mContributingDigit[0]->getT0true());
176 c.setTime(mContributingDigit[0]->getCalibratedTime());
185 c.setDigitInfo(0, mContributingDigit[0]->getChannel(), mContributingDigit[0]->getCalibratedTime(), mContributingDigit[0]->getTOT() *
Geo::TOTBIN_NS);
187 int ch1 = mContributingDigit[0]->
getChannel();
188 short tot1 = mContributingDigit[0]->
getTOT() < 20000 ? mContributingDigit[0]->
getTOT() : 20000;
189 double dtime =
c.getTimeRaw();
194 int deltaPhi, deltaEta;
199 for (
int idig = 1; idig < mNumberOfContributingDigits; idig++) {
201 deltaPhi =
phi1 - phi2;
202 deltaEta = eta1 - eta2;
209 }
else if (deltaEta == -1) {
214 }
else if (deltaPhi == -1) {
217 }
else if (deltaEta == -1) {
222 }
else if (deltaPhi == 0) {
225 }
else if (deltaEta == -1) {
228 LOG(
debug) <<
" Check what is going on, the digit you are trying to merge to the cluster must be in a different channels... ";
236 c.setDigitInfo(
c.getNumOfContributingChannels(), mContributingDigit[idig]->getChannel(), mContributingDigit[idig]->getCalibratedTime(), mContributingDigit[idig]->getTOT() *
Geo::TOTBIN_NS);
237 c.addBitInContributingChannels(
mask);
239 if (mCalibFromCluster &&
c.getNumOfContributingChannels() == 2 && !mIsNoisy[mContributingDigit[idig]->getChannel()] && !mIsNoisy[ch1]) {
240 int8_t dch = int8_t(mContributingDigit[idig]->getChannel() - ch1);
241 short tot2 = mContributingDigit[idig]->
getTOT() < 20000 ? mContributingDigit[idig]->
getTOT() : 20000;
249 if (digitMCTruth !=
nullptr) {
252 for (
int i = 0;
i < mNumberOfContributingDigits;
i++) {
253 if (!mContributingDigit[
i]->isUsedInCluster()) {
257 int digitLabel = mContributingDigit[
i]->
getLabel();
259 gsl::span<const o2::MCCompLabel> mcArray = digitMCTruth->
getLabels(digitLabel);
260 for (
int j = 0; j < static_cast<int>(mcArray.size());
j++) {
278 c.setPhi(std::atan2(
pos[1],
pos[0]));
288 c.setErrors(errY2, errZ2, errYZ);
302 mCalibInfosFromCluster.emplace_back(ch1, dch, dtime, tot1, tot2);
Definition of a container to keep Monte Carlo truth external to simulation objects.
bool isChannelError(int channel) const
bool isProblematic(int ich)
float getTimeCalibration(int ich, float tot) const
void addCalibFromCluster(int ch1, int8_t dch, float dtime, short tot1, short tot2)
void setFirstOrbit(uint64_t orb)
void process(DataReader &r, std::vector< Cluster > &clusters, MCLabelContainer const *digitMCTruth)
DataReader class for TOF.
virtual Bool_t getNextStripData(StripData &stripData)=0
TOF digit implementation.
void setTgeant(float val)
bool isProblematic() const
double getCalibratedTime() const
void setIsUsedInCluster(bool val=true)
void getPhiAndEtaIndex(int &phi, int &eta) const
void setCalibratedTime(Double_t time)
void setIsProblematic(bool flag)
Bool_t isUsedInCluster() const
static constexpr Float_t ZPAD
static constexpr Float_t XPAD
static void rotateToSector(Float_t *xyz, Int_t isector)
static void getPos(Int_t *det, Float_t *pos)
static void getVolumeIndices(Int_t index, Int_t *detId)
static constexpr Float_t TOTBIN_NS
static constexpr Float_t TDCBIN
TDC bin width [ps].
static constexpr Double_t LATENCYWINDOW
GLuint GLsizei const GLchar * label
bool isOk(ResultWas::OfType resultType)
constexpr int LHCMaxBunches
constexpr double LHCBunchSpacingNS
return((dphi< 0 &&dphi > -constants::math::PI)||dphi > constants::math::PI) ? true T phi1
std::vector< Digit > digits
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< Cluster > clusters