Project
Loading...
Searching...
No Matches
CollisionTimeRecoTask.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
14
16#include <fairlogger/Logger.h> // for LOG
18#include "FT0Base/Geometry.h"
19#include "FT0Base/FT0DigParam.h"
24#include <cmath>
25#include <bitset>
26#include <cassert>
27#include <iostream>
29#include <Framework/Logger.h>
30
31using namespace o2::ft0;
33
34void CollisionTimeRecoTask::processTF(const gsl::span<const o2::ft0::Digit>& digits,
35 const gsl::span<const o2::ft0::ChannelData>& channels,
36 std::vector<o2::ft0::RecPoints>& vecRecPoints,
37 std::vector<o2::ft0::ChannelDataFloat>& vecChData)
38{
39 for (const auto& digit : digits) {
40 if (!ChannelFilterParam::Instance().checkTCMbits(digit.getTriggers().getTriggersignals())) {
41 continue;
42 }
43 const auto channelsPerDigit = digit.getBunchChannelData(channels);
44 vecRecPoints.emplace_back(processDigit(digit, channelsPerDigit, vecChData));
45 }
46}
48 const gsl::span<const o2::ft0::ChannelData> inChData,
49 std::vector<o2::ft0::ChannelDataFloat>& outChData)
50{
51 LOG(debug) << "Running reconstruction on new event";
52 const int firstEntry = outChData.size();
53 unsigned int ndigitsA = 0;
54 unsigned int ndigitsC = 0;
55 float sideAtime = 0;
56 float sideCtime = 0;
57
58 constexpr int nMCPsA = 4 * Geometry::NCellsA;
59
60 int nch{0};
61 for (const auto& channelData : inChData) {
62 if (channelData.ChId >= NCHANNELS) {
63 // Reference channels shouldn't participate in reco at all!
64 continue;
65 }
66 const float timeInPS = getTimeInPS(channelData);
67 if (ChannelFilterParam::Instance().checkAll(channelData)) {
68 outChData.emplace_back(channelData.ChId, timeInPS, (float)channelData.QTCAmpl, channelData.ChainQTC);
69 nch++;
70 }
71 // only signals which satisfy conditions may participate in time calculation
72 if (TimeFilterParam::Instance().checkAll(channelData)) {
73 if (channelData.ChId < nMCPsA) {
74 sideAtime += timeInPS;
75 ndigitsA++;
76 } else {
77 sideCtime += timeInPS;
78 ndigitsC++;
79 }
80 }
81 }
83
84 mCollisionTime[TimeA] = (ndigitsA > 0) ? std::round(sideAtime / ndigitsA) : RP::sDummyCollissionTime; // 2 * o2::InteractionRecord::DummyTime;
85 mCollisionTime[TimeC] = (ndigitsC > 0) ? std::round(sideCtime / ndigitsC) : RP::sDummyCollissionTime; // 2 * o2::InteractionRecord::DummyTime;
86
87 if (ndigitsA > 0 && ndigitsC > 0) {
88 mCollisionTime[Vertex] = (mCollisionTime[TimeA] - mCollisionTime[TimeC]) / 2.;
89 mCollisionTime[TimeMean] = (mCollisionTime[TimeA] + mCollisionTime[TimeC]) / 2.;
90 } else {
91 mCollisionTime[TimeMean] = std::min(mCollisionTime[TimeA], mCollisionTime[TimeC]);
92 }
93 return RecPoints{mCollisionTime, firstEntry, nch, digit.mIntRecord, digit.mTriggers};
94}
95//______________________________________________________
97{
98 // finalize digitization, if needed, flash remaining digits
99 // if (!mContinuous) return;
100}
101
103{
104 // Getting time offset
105 float offsetChannel{0};
106 if (mTimeCalibObject) {
107 // Temporary, will be changed to status bit checking
108 // Check statistics
109 const auto& stat = mTimeCalibObject->mTime[channelData.ChId].mStat;
110 const bool isEnoughStat = stat > CalibParam::Instance().mMaxEntriesThreshold;
111 const bool isNotGoogStat = stat > CalibParam::Instance().mMinEntriesThreshold && !isEnoughStat;
112 // Check fit quality
113 const auto& meanGaus = mTimeCalibObject->mTime[channelData.ChId].mGausMean;
114 const auto& meanHist = mTimeCalibObject->mTime[channelData.ChId].mStatMean;
115 const auto& sigmaGaus = mTimeCalibObject->mTime[channelData.ChId].mGausRMS;
116 const auto& rmsHist = mTimeCalibObject->mTime[channelData.ChId].mStatRMS;
117 const bool isGoodFitResult = (mTimeCalibObject->mTime[channelData.ChId].mStatusBits & 1) > 0;
118 const bool isBadFit = std::abs(meanGaus - meanHist) > CalibParam::Instance().mMaxDiffMean || rmsHist < CalibParam::Instance().mMinRMS || sigmaGaus > CalibParam::Instance().mMaxSigma;
119
120 if (isEnoughStat && isGoodFitResult && !isBadFit) {
121 offsetChannel = meanGaus;
122 } else if ((isNotGoogStat || isEnoughStat) && isBadFit) {
123 offsetChannel = meanHist;
124 }
125 }
126 // Getting slewing offset
127 float slewoffset{0};
128 const auto& gr = mCalibSlew[static_cast<int>(channelData.getFlag(o2::ft0::ChannelData::EEventDataBit::kNumberADC))][channelData.ChId];
129 slewoffset = gr.Eval(channelData.QTCAmpl);
130
131 // Final calculation
132 const float globalOffset = offsetChannel + slewoffset;
133 return (static_cast<float>(channelData.CFDTime) - globalOffset) * Geometry::ChannelWidth;
134}
Definition of the FDD reconstruction.
Configurable digit filtering.
Class to describe fired and stored channels for the BC and to refer to channel data.
Configurable digitization parameters.
Definition of the FIT RecPoints class.
std::ostringstream debug
float getTimeInPS(const o2::ft0::ChannelData &channelData)
o2::ft0::RecPoints processDigit(const o2::ft0::Digit &digit, const gsl::span< const o2::ft0::ChannelData > inChData, std::vector< o2::ft0::ChannelDataFloat > &outChData)
void processTF(const gsl::span< const o2::ft0::Digit > &digits, const gsl::span< const o2::ft0::ChannelData > &channels, std::vector< o2::ft0::RecPoints > &vecRecPoints, std::vector< o2::ft0::ChannelDataFloat > &vecChData)
static constexpr int NCellsA
Definition Geometry.h:52
static constexpr float ChannelWidth
Definition Geometry.h:56
static short constexpr sDummyCollissionTime
Definition RecPoints.h:97
gsl::span< const ChannelDataFloat > getBunchChannelData(const gsl::span< const ChannelDataFloat > tfdata) const
Definition RecPoints.cxx:24
std::size_t mMaxEntriesThreshold
Definition CalibParam.h:29
std::size_t mMinEntriesThreshold
Definition CalibParam.h:28
bool getFlag(EEventDataBit bitFlag) const
Definition ChannelData.h:65
bool checkTCMbits(uint8_t tcmBits) const
o2::InteractionRecord mIntRecord
Definition Digit.h:64
Triggers mTriggers
Definition Digit.h:62
std::array< SpectraInfoObject, o2::ft0::Geometry::Nchannels > mTime
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< ChannelData > channels
std::vector< Digit > digits