15#include <fairlogger/Logger.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.
Definition of the TOF cluster finder.
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