23#include "FairRootManager.h"
24#include "TClonesArray.h"
27#include "TStopwatch.h"
48 : FairTask(
"MuchFindHitsGem", 1)
63 ,
fClusters(new TClonesArray(
"CbmMuchCluster", 1000))
64 ,
fHits(new TClonesArray(
"CbmMuchPixelHit", 1000))
79 FairRootManager* ioman = FairRootManager::Instance();
102 fEvents =
dynamic_cast<TClonesArray*
>(FairRootManager::Instance()->GetObject(
"Event"));
103 if (!
fEvents)
fEvents =
dynamic_cast<TClonesArray*
>(FairRootManager::Instance()->GetObject(
"CbmEvent"));
106 LOG(info) << GetName() <<
": No event branch present.";
112 LOG(info) << GetName() <<
"TimeSlice: Event-by-event mode after Event Building selected. ";
115 ioman->Register(
"MuchCluster",
"Cluster in MUCH",
fClusters, IsOutputBranchPersistent(
"MuchCluster"));
116 ioman->Register(
"MuchPixelHit",
"Hit in MUCH",
fHits, IsOutputBranchPersistent(
"MuchPixelHit"));
120 TFile* oldFile = gFile;
121 TDirectory* oldDir = gDirectory;
124 LOG_IF(fatal, !file) <<
"Could not open file " <<
fDigiFile;
125 TObjArray* stations = file->Get<TObjArray>(
"stations");
126 LOG_IF(fatal, !stations) <<
"TObjArray stations not found in file " <<
fDigiFile;
207 LOG(info) << setw(20) << left << GetName() <<
": processing time is " << timer.RealTime()
211 <<
" clusters " <<
fClusters->GetEntriesFast() <<
" total hits " <<
fHits->GetEntriesFast();
217 for (
Int_t iEvent = 0; iEvent < nEvents; iEvent++) {
225 LOG(debug) << setw(20) << left
228 <<
": Time slice " <<
fNofTimeslices <<
" with " << nEvents << (nEvents == 1 ?
" event" :
" events")
229 <<
" and processing event nubmer " << iEvent <<
" digis "
235 LOG(info) << setw(20) << left << GetName() <<
": Processing Time is " << timer.RealTime() <<
": Time slice "
236 <<
fNofTimeslices <<
" with " << nEvents << (nEvents == 1 ?
" event" :
" events") <<
"s digis "
239 <<
" and event wise total "
240 <<
" clusters " <<
fClusters->GetEntriesFast() <<
" total hits " <<
fHits->GetEntriesFast();
255 TStopwatch EventTimer;
264 for (
Int_t clusterIndex = 0; clusterIndex < NuOfClusterInEvent; ++clusterIndex) {
286 LOG(fatal) << GetName() <<
"::Exec: The algorithm index does not exist.";
304 LOG(debug2) <<
" Timeslice " <<
fNofTimeslices <<
" event : " <<
event->GetNumber() <<
" nDigi : " << nDigis;
305 if (nDigis < 0)
return;
307 for (
Int_t iDigi = 0; iDigi < nDigis; iDigi++) {
336 for (UInt_t m = 0; m < modules.size(); m++)
337 modules[m]->ClearDigis();
341 for (
Int_t iDigi = 0; iDigi < nDigis; iDigi++) {
351 Double_t time = digi->
GetTime();
384 if (
fGeoScheme->GetModuleByDetId(address) == NULL) {
389 fGeoScheme->GetModuleByDetId(address)->AddDigi(time, digiIndex);
393 for (UInt_t m = 0; m < modules.size(); m++) {
396 multimap<Double_t, Int_t> digis = modules[m]->GetDigis();
397 multimap<Double_t, Int_t>::iterator it, itmin, itmax;
401 Double_t tlast = -10000;
403 for (it = digis.begin(); it != digis.end(); ++it) {
404 Double_t t = it->first;
408 slices.push_back(it);
409 for (UInt_t s = 1; s < slices.size(); s++) {
411 for (it = slices[s - 1]; it != slices[s]; it++) {
412 Int_t iDigi = it->second;
427 CbmMuchPad* pad =
module->GetPad(digi->GetAddress());
433 for (UInt_t p = 0; p <
fFiredPads.size(); p++) {
468 if (digiIndex < 0)
return;
472 for (UInt_t i = 0; i < neighbours.size(); i++)
504 if (charge > maxCharge) maxCharge = charge;
519 if (digi->
GetAdc() <= threshold)
continue;
525 CbmMuchPad* pad =
module->GetPad(digi->GetAddress());
529 for (UInt_t p = 0; p <
fFiredPads.size(); p++) {
556 for (
Int_t i = 0; i < nDigis; i++) {
581 for (
Int_t i = 0; i < nDigis; i++) {
585 for (UInt_t ip = 0; ip < neighbours.size(); ip++) {
589 selected_neighbours.push_back(it -
fClusterPads.begin());
595 for (
Int_t i = 0; i < nDigis; i++) {
597 for (UInt_t n = 0; n <
fNeighbours[i].size(); n++) {
606 for (
Int_t i = 0; i < nDigis; i++) {
614 for (UInt_t p = 0; p <
fFiredPads.size(); p++) {
630 Double_t sumq = 0, sumx = 0, sumy = 0, sumdx2 = 0, sumdy2 = 0, sumdxy2 = 0,
632 Double_t q = 0,
x = 0,
y = 0, t = 0, z = 0, dx = 0, dy = 0, dxy = 0, dt = 0;
633 Double_t nX = 0, nY = 0, nZ = 0;
640 for (
Int_t i = 0; i < nDigis; i++) {
652 planeId =
fGeoScheme->GetLayerSideNr(address);
654 module = (CbmMuchModuleGem*) fGeoScheme->GetModuleByDetId(digi->GetAddress());
656 z =
module->GetPosition()[2];
666 CbmMuchPad* pad =
module->GetPad(digi->GetAddress());
671 Double_t gemDriftTimeCorrc = 15.0;
672 Double_t rpcDriftTimeCorrc = 8.33;
673 Double_t gemHitTimeError = 4.0;
674 Double_t rpcHitTimeError =
676 Double_t timeShift = 0.5;
681 t = digi->
GetTime() - gemDriftTimeCorrc + timeShift;
684 dt = gemHitTimeError;
688 t = digi->
GetTime() - rpcDriftTimeCorrc + timeShift;
689 dt = rpcHitTimeError;
692 if (tmin < 0) tmin = t;
693 if (tmin < t) tmin = t;
703 sumdx2 += q * q * dx * dx;
704 sumdy2 += q * q * dy * dy;
705 sumdxy2 += q * q * dxy * dxy;
706 sumdt2 += q * q * dt * dt;
714 dx =
sqrt(sumdx2 / 12) / sumq;
715 dy =
sqrt(sumdy2 / 12) / sumq;
716 dxy =
sqrt(sumdxy2 / 12) / sumq;
717 dt =
sqrt(sumdt2) / sumq;
722 Double_t tX = 8.5, tY = 81.0;
743 LOG(error) <<
"Unknown detector type";
752 new ((*fHits)[iHit])
CbmMuchPixelHit(address, nX, nY, nZ, dx, dy, 0, dxy, iCluster, planeId, t, dt);
755 new ((*fHits)[iHit])
CbmMuchPixelHit(address,
x,
y, z, dx, dy, 0, dxy, iCluster, planeId, t, dt);
ClassImp(CbmConverterManager)
@ kMuch
Muon detection system.
Data container for MUCH clusters.
Class for pixel hits in MUCH detector.
friend fvec sqrt(const fvec &a)
void SetAddress(int32_t address)
int32_t GetDigi(int32_t index) const
Get digi at position index.
void AddDigis(const std::vector< int32_t > &indices)
Add array of digi to cluster.
int32_t GetNofDigis() const
Number of digis in cluster.
static CbmDigiManager * Instance()
Static instance.
Class characterising one event by a collection of links (indices) to data objects,...
static int32_t GetModuleIndex(int32_t address)
static int32_t GetSectorIndex(int32_t address)
static int32_t GetChannelIndex(int32_t address)
static int32_t GetLayerIndex(int32_t address)
static int32_t GetLayerSideIndex(int32_t address)
static int32_t GetElementAddress(int32_t address, int32_t level)
static uint32_t GetAddress(int32_t station=0, int32_t layer=0, int32_t side=0, int32_t module=0, int32_t sector=0, int32_t channel=0)
static int32_t GetStationIndex(int32_t address)
Data container for MUCH clusters.
int32_t GetAddress() const
CbmDigiManager * fDigiManager
std::vector< Int_t > fClusterCharges
Double_t fClusterSeparationTime
virtual void Exec(Option_t *opt)
void CreateHits(CbmMuchCluster *cluster, Int_t iCluster, CbmEvent *event)
void ExecClusteringPeaks(CbmMuchCluster *cluster, Int_t iCluster, CbmEvent *event)
std::vector< Bool_t > fLocalMax
void ProcessData(CbmEvent *)
std::vector< Double_t > IgnoredAddresses
std::vector< CbmMuchPad * > fClusterPads
std::vector< CbmMuchPad * > fFiredPads
void CreateCluster(CbmMuchPad *pad)
CbmMuchGeoScheme * fGeoScheme
CbmMuchFindHitsGem(const char *digiFileName, Int_t flag)
void FindClusters(CbmEvent *)
std::vector< Int_t > fDigiIndices
virtual InitStatus Init()
std::vector< std::vector< Int_t > > fNeighbours
TClonesArray * fEvents
Interface to digi branch.
void ExecClusteringSimple(CbmMuchCluster *cluster, Int_t iCluster, CbmEvent *event)
CbmMuchPad * GetPad(Int_t address)
Int_t GetDetectorId() const
Int_t GetDetectorType() const
void SetDigiIndex(Int_t iDigi)
std::vector< CbmMuchPad * > GetNeighbours() const
Int_t GetDigiIndex() const