33#include "FairRootManager.h"
35#include "TClonesArray.h"
38#include "TStopwatch.h"
55 , fModulesGeometryArray()
56 , fDigiFile(digiFileName)
81 std::cout <<
"CbmMuchClustering::Init" << std::endl;
85 TFile* oldFile = gFile;
86 TDirectory* oldDir = gDirectory;
89 LOG_IF(fatal, !file) <<
"Could not open file " <<
fDigiFile;
90 TObjArray* stations = file->Get<TObjArray>(
"stations");
91 LOG_IF(fatal, !stations) <<
"TObjArray stations could not be read from file " <<
fDigiFile;
116 cout <<
"-I- " << GetName() <<
"::Exec: No digis found, event skipped. " << endl;
131 std::cout <<
"CbmMuchClustering: time " << timer.RealTime() <<
"; clusters: " <<
fNofClusters <<
"\n";
138 FairRootManager* ioman = FairRootManager::Instance();
139 assert(ioman != NULL);
142 fCluster =
new TClonesArray(
"CbmMuchCluster", 1000);
143 ioman->Register(
"MuchCluster",
"Cluster in MUCH",
fCluster, IsOutputBranchPersistent(
"MuchCluster"));
144 fHit =
new TClonesArray(
"CbmMuchPixelHit", 1000);
145 ioman->Register(
"MuchPixelHit",
"Hit in MUCH",
fHit, IsOutputBranchPersistent(
"MuchPixelHit"));
158 for (Int_t iL = 0; iL < nLayers; iL++) {
163 for (Int_t iMod = 0; iMod < nModules; iMod++) {
173 for (Int_t iMod = 0; iMod < nModules; iMod++) {
180 std::cout <<
"Layer " << iL <<
" geometry created successful.\n";
182 std::cout <<
"Station " << iSt <<
" geometry created successful.\n";
236 std::cout <<
"CbmMuchClustering: Error! Algorithm not tested\n";
239 default: std::cout <<
"CbmMuchClustering: Error! Wrong version of the algorithm.\n";
break;
253 vector<Int_t> digiIndices;
256 Double_t sumq = 0, sumx = 0, sumy = 0, sumt = 0, sumdx2 = 0, sumdy2 = 0, sumdxy2 = 0, sumdt2 = 0;
257 Double_t q = 0,
x = 0,
y = 0, t = 0, z = 0, dx = 0, dy = 0, dxy = 0, dt = 0;
259 x = clustersA1->
GetX0(iCl);
260 y = clustersA1->
GetY0(iCl);
265 for (Int_t iPad = 0; iPad < clustersA1->
GetNofPads(iCl); iPad++) {
272 digiIndices.push_back(iDigi);
274 pad = m2->
GetPad(channelId);
276 if (tmin < 0) tmin = t;
277 if (tmin < t) tmin = t;
285 sumdx2 += q * q * dx * dx;
286 sumdy2 += q * q * dy * dy;
287 sumdxy2 += q * q * dxy * dxy;
288 sumdt2 += q * q * dt * dt;
291 dx =
sqrt(sumdx2 / 12) / sumq;
292 dy =
sqrt(sumdy2 / 12) / sumq;
293 dxy =
sqrt(sumdxy2 / 12) / sumq;
294 dt =
sqrt(sumdt2) / sumq;
295 Int_t nCluster =
fCluster->GetEntriesFast();
298 Int_t nHit =
fHit->GetEntriesFast();
299 new ((*fHit)[nHit])
CbmMuchPixelHit(address,
x,
y, z, dx, dy, 0, dxy, nCluster, planeId, t, dt);
313 vector<Int_t> digiIndices;
316 Double_t sumq = 0, sumx = 0, sumy = 0, sumt = 0, sumdx2 = 0, sumdy2 = 0, sumdxy2 = 0, sumdt2 = 0;
317 Double_t q = 0,
x = 0,
y = 0, t = 0, z = 0, dx = 0, dy = 0, dxy = 0, dt = 0;
319 x = clustersSL->
GetX0(iCl);
320 y = clustersSL->
GetY0(iCl);
325 for (Int_t iPad = 0; iPad < clustersSL->
GetNofPads(iCl); iPad++) {
332 digiIndices.push_back(iDigi);
334 pad = m2->
GetPad(channelId);
336 if (tmin < 0) tmin = t;
337 if (tmin < t) tmin = t;
345 sumdx2 += q * q * dx * dx;
346 sumdy2 += q * q * dy * dy;
347 sumdxy2 += q * q * dxy * dxy;
348 sumdt2 += q * q * dt * dt;
351 dx =
sqrt(sumdx2 / 12) / sumq;
352 dy =
sqrt(sumdy2 / 12) / sumq;
353 dxy =
sqrt(sumdxy2 / 12) / sumq;
354 dt =
sqrt(sumdt2) / sumq;
355 Int_t nCluster =
fCluster->GetEntriesFast();
358 Int_t nHit =
fHit->GetEntriesFast();
359 new ((*fHit)[nHit])
CbmMuchPixelHit(address,
x,
y, z, dx, dy, 0, dxy, nCluster, planeId, t, dt);
369 for (Int_t iCl = 0; iCl < clustersWard->
GetNofClusters(); iCl++) {
371 vector<Int_t> digiIndices;
375 Double_t sumq = 0, sumx = 0, sumy = 0, sumt = 0, sumdx2 = 0, sumdy2 = 0, sumdxy2 = 0, sumdt2 = 0;
376 Double_t q = 0,
x = 0,
y = 0, t = 0, z = 0, dx = 0, dy = 0, dxy = 0, dt = 0;
378 x = clustersWard->
GetX0(iCl);
379 y = clustersWard->
GetY0(iCl);
384 for (Int_t iPad = 0; iPad < clustersWard->
GetNofPads(iCl); iPad++) {
389 digiIndices.push_back(iDigi);
393 pad = m2->
GetPad(channelId);
408 sumdx2 += q * q * dx * dx;
409 sumdy2 += q * q * dy * dy;
410 sumdxy2 += q * q * dxy * dxy;
411 sumdt2 += q * q * dt * dt;
416 dx =
sqrt(sumdx2 / 12) / sumq;
417 dy =
sqrt(sumdy2 / 12) / sumq;
418 dxy =
sqrt(sumdxy2 / 12) / sumq;
419 dt =
sqrt(sumdt2) / sumq;
421 Int_t nCluster =
fCluster->GetEntriesFast();
428 Int_t nHit =
fHit->GetEntriesFast();
429 std::cout <<
"\nCluster: " << nHit <<
"; detId: " << detId <<
"; NofPads: " << clustersWard->
GetNofPads(iCl)
431 std::cout <<
"x: " <<
x <<
"; y: " <<
y <<
"; z: " << z <<
"\n";
432 std::cout <<
"dx: " << dx <<
"; dy: " << dy <<
"; dxy: " << dxy <<
"\n";
433 std::cout <<
"planeId: " << planeId <<
"; t: " << t <<
"; dt: " << dt <<
"\n";
434 std::cout <<
"-------\n";
436 new ((*fHit)[nHit])
CbmMuchPixelHit(detId,
x,
y, z, dx, dy, 0, dxy, nCluster, planeId, t, dt);
@ kMuch
Muon detection system.
Helper functions for drawing 1D and 2D histograms and graphs.
Data container for MUCH clusters.
ClassImp(CbmMuchClustering)
Class for pixel hits in MUCH detector.
friend fvec sqrt(const fvec &a)
void AddDigis(const std::vector< int32_t > &indices)
Add array of digi to cluster.
Int_t GetPadInCluster(Int_t iCluster, Int_t iPad)
Int_t GetNofClusters() const
void MainClusteringA1(CbmClusteringGeometry *moduleGeo, Int_t algVersion)
Float_t GetX0(Int_t iCluster)
Float_t GetY0(Int_t iCluster)
Float_t GetY0(Int_t iCluster)
void MainClusteringSL(CbmClusteringGeometry *moduleGeo, Int_t algVersion)
Int_t GetPadInCluster(Int_t iCluster, Int_t iPad)
Float_t GetX0(Int_t iCluster)
Int_t GetNofClusters() const
void WardMainFunction(CbmClusteringGeometry *moduleGeo, Float_t maxDistance)
Float_t GetX0(Int_t iCluster)
Int_t GetNofClusters() const
Int_t GetPadInCluster(Int_t iCluster, Int_t iPad)
Float_t GetY0(Int_t iCluster)
static Int_t GetNofDigis(ECbmModuleId systemId)
InitStatus Init()
Initialisation.
const Digi * Get(Int_t index) const
Get a digi object.
static CbmDigiManager * Instance()
Static instance.
static int32_t GetElementAddress(int32_t address, int32_t level)
Data container for MUCH clusters.
std::map< Int_t, Int_t > fModulesByDetId
virtual ~CbmMuchClustering()
void ClusteringA1(CbmClusteringGeometry *m1, CbmMuchModuleGem *m2, Int_t Ver)
CbmMuchGeoScheme * fScheme
TClonesArray * fCluster
Interface to digi data.
virtual void Exec(Option_t *opt)
CbmDigiManager * fDigiMan
CbmMuchClustering(const char *digiFileName)
void ClusteringMainFunction()
void CreateModulesGeometryArray()
void ClusteringSL(CbmClusteringGeometry *m1, CbmMuchModuleGem *m2, Int_t Ver)
virtual InitStatus Init()
void ClusteringWard(CbmClusteringGeometry *m1, CbmMuchModuleGem *m2)
std::vector< CbmClusteringGeometry * > fModulesGeometryArray
int32_t GetAddress() const
int32_t GetADCCharge() const
int32_t GetChannelId() const
Int_t GetLayerSideNr(Int_t detId) const
CbmMuchStation * GetStation(Int_t iStation) const
void Init(TObjArray *stations, Int_t flag)
Int_t GetNStations() const
CbmMuchModule * GetModuleByDetId(Int_t detId) const
Int_t GetNModules() const
CbmMuchLayerSide * GetSideF()
CbmMuchLayerSide * GetSideB()
CbmMuchPad * GetPad(Int_t address)
Int_t GetDetectorId() const
TVector3 GetPosition() const
CbmMuchLayer * GetLayer(Int_t iLayer) const