16#include "FairRootFileSink.h"
17#include "FairRootManager.h"
18#include "FairRunAna.h"
19#include "FairRuntimeDb.h"
24#include "TClonesArray.h"
25#include "TStopwatch.h"
39 : FairTask(TString(name), verbose)
43 , fbWriteHitsInOut(writeDataInOut)
44 , fbWriteDigisInOut(writeDataInOut)
46 , fTofDigiMatchColl(NULL)
47 , fTofHitsCollOut(NULL)
48 , fTofDigiMatchCollOut(NULL)
51 , fbSwapChannelSides(false)
52 , fiOutputTreeEntry(0)
63 LOG(info) <<
"CbmTaskTofClusterizer initializing... expect Digis in ns units! ";
86 int32_t iNbCalDigis = 0;
90 for (int32_t iEvent = 0; iEvent <
fEventsColl->GetEntriesFast(); iEvent++) {
118 for (uint32_t index = 0; index <
fTofCalDigiVec->size(); index++) {
126 LOG(debug) <<
"Assign " <<
fTofHitsColl->GetEntriesFast() <<
" hits to event " << tEvent->
GetNumber();
127 for (int32_t index = 0; index <
fTofHitsColl->GetEntriesFast(); index++) {
129 new ((*fTofHitsCollOut)[iNbHits])
CbmTofHit(*pHit);
136 for (int32_t iLink = 0; iLink < pDigiMatch->
GetNofLinks(); iLink++) {
142 new ((*fTofDigiMatchCollOut)[iNbHits])
CbmMatch(*mDigiMatch);
156 LOG(debug) << GetName() <<
"::Exec: real time=" << timerTs.RealTime() <<
" CPU time=" << timerTs.CpuTime();
162 std::stringstream logOut;
163 logOut << std::setw(20) << std::left << GetName() <<
" [";
164 logOut << std::fixed << std::setw(8) << std::setprecision(1) << std::right << timerTs.RealTime() * 1000. <<
" ms] ";
165 logOut <<
"TS " <<
iNbTs;
166 logOut <<
", events " <<
fEventsColl->GetEntriesFast();
167 logOut <<
", hits " <<
fiHitStart <<
", time/1k-hit " << std::setprecision(4)
168 << timerTs.RealTime() * 1e6 /
fiHitStart <<
" [ms]";
169 LOG(info) << logOut.str();
180 for (int32_t iDigi = 0; iDigi < (int) (
fBmonDigiVec->size()); iDigi++) {
183 LOG(fatal) <<
"Wrong Bmon type " << tDigi.
GetType() <<
", Addr 0x" << std::hex << tDigi.
GetAddress();
206 FairRootFileSink* sink = (FairRootFileSink*) FairRootManager::Instance()->GetSink();
219 LOG(info) <<
"Finish with " <<
fdEvent <<
" processed events";
222 LOG(info) <<
"=====================================";
223 LOG(info) << GetName() <<
": Finish run";
224 LOG(info) << GetName() <<
": Run summary ";
225 LOG(info) << GetName() <<
": Processing time : " << std::fixed << std::setprecision(3) <<
fProcessTime;
226 LOG(info) << GetName() <<
": Nr of events : " <<
fdEvent;
227 LOG(info) << GetName() <<
": Nr of input digis : " <<
fuNbDigis;
228 LOG(info) << GetName() <<
": Nr of produced hits : " <<
fuNbHits;
229 LOG(info) << GetName() <<
": Nr of hits / event : " << std::fixed << std::setprecision(2)
231 LOG(info) << GetName() <<
": Nr of hits / digis : " << std::fixed << std::setprecision(2)
233 LOG(info) <<
"=====================================";
246 FairRootManager* fManager = FairRootManager::Instance();
248 if (NULL == fManager) {
249 LOG(error) <<
"CbmTaskTofClusterizer::RegisterInputs => Could not find "
250 "FairRootManager!!!";
254 fEventsColl =
dynamic_cast<TClonesArray*
>(fManager->GetObject(
"Event"));
257 if (NULL ==
fEventsColl) LOG(info) <<
"CbmEvent not found in input file, assume eventwise input";
262 LOG(error) << GetName() <<
": No Tof digi input!";
266 LOG(info) << GetName() <<
": separate Bmon digi input!";
270 LOG(info) <<
"No separate Bmon digi input found.";
275 LOG(info) <<
"CbmTaskTofClusterizer::RegisterInputs => Could not get TsHeader Object";
282 FairRootManager*
rootMgr = FairRootManager::Instance();
318 fAlgo = std::make_unique<cbm::algo::tof::Hitfind>(
322 fCalibrate = std::make_unique<cbm::algo::tof::Calibrate>(
333 LOG(info) <<
" No RawDigis defined ! Check! ";
336 LOG(info) <<
"Build clusters from " <<
fTofDigiVec.size() <<
" digis in event " <<
fdEvent + 1;
340 for (
size_t iDigInd = 0; iDigInd <
fTofDigiVec.size(); iDigInd++) {
345 LOG(info) <<
"Start counter digi duplication disabled";
352 LOG(debug) <<
"Duplicated digi " <<
fTofDigiVec.size() <<
" with address 0x" << std::hex
359 auto [caldigis, calmonitor] = (*fCalibrate)(
fTofDigiVec);
361 LOG(info) << calmonitor.print();
364 auto [clusters, monitor, indices] = (*fAlgo)(*fTofCalDigiVec);
365 LOG(info) << monitor.print();
368 size_t indexOffset = 0;
369 for (
auto const& cluster : clusters.Data()) {
370 const int32_t hitIndex =
fTofHitsColl->GetEntriesFast();
371 TVector3 hitpos = TVector3(cluster.hitPos.X(), cluster.hitPos.Y(), cluster.hitPos.Z());
372 TVector3 hiterr = TVector3(cluster.hitPosErr.X(), cluster.hitPosErr.Y(), cluster.hitPosErr.Z());
373 new ((*fTofHitsColl)[hitIndex])
374 CbmTofHit(cluster.address, hitpos, hiterr,
fiNbHits, cluster.hitTime, cluster.hitTimeErr, cluster.numChan() * 2,
375 int32_t(cluster.weightsSum * 10.));
381 for (int32_t i = 0; i < cluster.numChan() * 2; i++) {
382 size_t digiInd = indices.at(indexOffset + i);
386 indexOffset += cluster.numChan() * 2;
@ kTof
Time-of-flight Detector.
static FairRootManager * rootMgr
TClonesArray * fTofHitsColl
TClonesArray * fEventsColl
CbmDigiManager * fDigiMan
Data class for a signal in the t-zero detector.
static Int_t GetNofDigis(ECbmModuleId systemId)
static Bool_t IsPresent(ECbmModuleId systemId)
Presence of a digi branch.
InitStatus Init()
Initialisation.
const Digi * Get(Int_t index) const
Get a digi object.
static CbmDigiManager * Instance()
Static instance.
Class characterising one event by a collection of links (indices) to data objects,...
size_t GetNofData() const
int32_t GetNumber() const
uint32_t GetIndex(ECbmDataType type, uint32_t iData) const
void AddData(ECbmDataType type, uint32_t index)
void SetIndex(int32_t index)
const CbmLink & GetLink(int32_t i) const
int32_t GetNofLinks() const
void AddLink(const CbmLink &newLink)
std::unique_ptr< cbm::algo::tof::Calibrate > fCalibrate
virtual void ExecEvent(Option_t *option)
bool RegisterOutputs()
Create and register output TClonesArray of Tof Hits.
std::vector< CbmTofDigi > fTofDigiVec
bool InitAlgos()
Create one algo object for each RPC.
TClonesArray * fEventsColl
const CbmTsEventHeader * fTsHeader
bool BuildClusters()
Build clusters out of ToF Digis and store the resulting info in a TofHit.
TClonesArray * fTofHitsCollOut
// Calibrated TOF Digis
TClonesArray * fTofHitsColl
// Calibrated TOF Digis
CbmTaskTofClusterizer()
Constructor.
std::vector< CbmTofDigi > * fBmonDigiVec
int32_t fiOutputTreeEntry
bool RegisterInputs()
Recover pointer on input TClonesArray: TofPoints, TofDigis...
std::vector< CbmTofDigi > * fTofCalDigiVecOut
virtual void Exec(Option_t *option)
Inherited from FairTask.
virtual InitStatus Init()
Inherited from FairTask.
virtual void Finish()
Inherited from FairTask.
TClonesArray * fTofDigiMatchColl
CbmDigiManager * fDigiMan
TOF Digis.
TClonesArray * fTofDigiMatchCollOut
std::vector< CbmTofDigi > * fTofCalDigiVec
virtual ~CbmTaskTofClusterizer()
Destructor.
bool bAddBeamCounterSideDigi
std::unique_ptr< cbm::algo::tof::Hitfind > fAlgo
Data class for expanded digital TOF information.
double GetSide() const
Channel Side.
double GetChannel() const
Channel .
int32_t GetAddress() const
Inherited from CbmDigi.
double GetType() const
Sm Type .
double GetRpc() const
Detector aka Module aka RPC .
void SetAddress(int32_t address)
T ReadFromFile(fs::path path)