17#include "FairEventHeader.h"
19#include "FairRootManager.h"
20#include "FairRunAna.h"
21#include "FairRuntimeDb.h"
37using std::setprecision;
56 :
FairTask(
"STSRealFindHits", iVerbose)
101 cerr <<
"-E- " << fName <<
"::Exec: No digi scheme!" << endl;
113 Int_t nClustersF = 0;
114 Int_t nClustersB = 0;
118 for (
Int_t iStation = 0; iStation < nStations; iStation++) {
122 Int_t nClustersFInStation = 0;
123 Int_t nClustersBInStation = 0;
124 Int_t nHitsInStation = 0;
126 for (
Int_t iSector = 0; iSector < nSectors; iSector++) {
128 set<Int_t> fSet, bSet;
130 cout <<
"-E- " << fName <<
"::Exec: sector " << sector->
GetSectorNr() <<
" of station "
131 << station->
GetStationNr() <<
"not found in front map!" << endl;
138 cout <<
"-E- " << fName <<
"::Exec: sector " << sector->
GetSectorNr() <<
" of station "
139 << station->
GetStationNr() <<
"not found in back map!" << endl;
145 Int_t nClustersFInSector = fSet.size();
146 Int_t nClustersBInSector = bSet.size();
149 cout <<
"Sector " << sector->
GetSectorNr() <<
", Clusters front " << nClustersFInSector
150 <<
", Clusters Back " << nClustersBInSector <<
", Hits " << nHitsInSector << endl;
151 nHitsInStation += nHitsInSector;
152 nClustersFInStation += nClustersFInSector;
153 nClustersBInStation += nClustersBInSector;
157 cout <<
"Total for station " << station->
GetStationNr() <<
": Clusters front " << nClustersFInStation
158 <<
", clusters back " << nClustersBInStation <<
", hits " << nHitsInStation << endl;
159 nClustersB += nClustersBInStation;
160 nClustersF += nClustersFInStation;
161 nHits += nHitsInStation;
169 cout <<
"-I- " << fName <<
":Event " << FairRunAna::Instance()->GetEventHeader()->GetMCEntryNumber()
170 <<
" summary" << endl;
171 cout <<
" Clusters front side : " << nClustersF << endl;
172 cout <<
" Clusters back side : " << nClustersB << endl;
173 cout <<
" Hits created : " << nHits << endl;
174 cout <<
" Real time : " <<
fTimer.RealTime() << endl;
180 cout << setw(15) << left << fName <<
": " << setprecision(4) << setw(8) << fixed << right <<
fTimer.RealTime()
181 <<
" s, clusters " << nClustersF <<
" / " << nClustersB <<
", hits: " << nHits << endl;
193 FairRunAna* run = FairRunAna::Instance();
195 Fatal(
"SetParContainers",
"No analysis run");
197 FairRuntimeDb* db = run->GetRuntimeDb();
199 Fatal(
"SetParContainers",
"No runtime database");
214 FairRootManager* ioman = FairRootManager::Instance();
216 Fatal(
"Init",
"No FairRootManager");
221 ioman->Register(
"StsHit",
"Hit in STS",
fHits,
kTRUE);
233 if (fVerbose == 1 || fVerbose == 2)
235 else if (fVerbose > 2)
237 cout <<
"-I- " << fName <<
"::Init: "
238 <<
"STS digitisation scheme succesfully initialised" << endl;
240 <<
", Channels: " <<
fDigiScheme->GetNChannels() << endl;
262 if (fVerbose == 1 || fVerbose == 2)
264 else if (fVerbose > 2)
266 cout <<
"-I- " << fName <<
"::Init: "
267 <<
"STS digitisation scheme succesfully reinitialised" << endl;
269 <<
", Channels: " <<
fDigiScheme->GetNChannels() << endl;
282 for (
Int_t iStation = 0; iStation < nStations; iStation++) {
285 for (
Int_t iSector = 0; iSector < nSectors; iSector++) {
304 cout <<
"-E- " << fName <<
"::SortClusters: No input array!" << endl;
309 map<CbmStsSector*, set<Int_t>>::iterator mapIt;
311 ((*mapIt).second).clear();
313 ((*mapIt).second).clear();
318 Int_t stationNr = -1;
322 for (
Int_t iClus = 0; iClus < nClusters; iClus++) {
327 if (
fDigiScheme->GetStationByNr(stationNr) == NULL)
329 sector =
fDigiScheme->GetSector(stationNr, sectorNr);
332 cerr <<
"-E- " << fName <<
"::SortClusters:: sector " << sectorNr <<
" of station " << stationNr
333 <<
" not found in digi scheme (F)!" << endl;
337 }
else if (iSide == 1) {
339 cerr <<
"-E- " << fName <<
"::SortClusters:: sector " << sectorNr <<
" of station " << stationNr
340 <<
" not found in digi scheme (B)!" << endl;
354 static Int_t ifield = -1;
356 FairRunAna* run = FairRunAna::Instance();
428 set<Int_t>::iterator it1;
429 set<Int_t>::iterator it2;
433 Fatal(
"FindHits",
"Sorry, not implemented yet");
447 else if (iType == 2 || iType == 3)
458 CbmStsCluster* clusterF = NULL;
459 CbmStsCluster* clusterB = NULL;
462 if (stereoF == 0. && stereoB * 180 /
TMath::Pi() < 80) {
465 vXY = -1. * dx * dx / 12. /
TMath::Tan(stereoB);
466 }
else if (stereoF == 0. && stereoB * 180 /
TMath::Pi() > 80) {
476 for (it1 = fSet.begin(); it1 != fSet.end(); it1++) {
478 clusterF = (CbmStsCluster*)
fClusters->At(iClusF);
480 cout <<
"-W- " << GetName() <<
"::FindHits: Invalid cluster index " << iClusF
486 for (it2 = bSet.begin(); it2 != bSet.end(); it2++) {
488 clusterB = (CbmStsCluster*)
fClusters->At(iClusB);
490 cout <<
"-W- " << GetName() <<
"::FindHits: Invalid cluster index " << iClusB
491 <<
" in back set of sector " << sector->
GetSectorNr() <<
", station "
507 if (sensorDetId == -1)
521 Double_t lorShift = 0.1575, zShift = -0.27;
526 else if (ifield == 6)
532 else if (ifield == 7)
537 else if (ifield == 9)
545 if (sector->
GetDx() < 0.02)
546 lorShift = zShift = 0.0;
558 pos.
SetXYZ(xHit, yHit, zHit);
562 Double_t wX = vX * vX * cosrot * cosrot - 2. * vXY * cosrot * sinrot + vY * vY * sinrot * sinrot;
563 Double_t wY = vX * vX * sinrot * sinrot + 2. * vXY * cosrot * sinrot + vY * vY * cosrot * cosrot;
564 Double_t wXY = (vX * vX - vY * vY) * cosrot * sinrot + vXY * (cosrot * cosrot - sinrot * sinrot);
568 if (stereoF == 0. && stereoB * 180 /
TMath::Pi() < 80) {
574 vXYTemp = -vXTemp * vXTemp / (
TMath::Tan(stereoB));
576 wX = vXTemp * vXTemp * cosrot * cosrot - 2. * vXYTemp * cosrot * sinrot
577 + vYTemp * vYTemp * sinrot * sinrot;
578 wY = vXTemp * vXTemp * sinrot * sinrot + 2. * vXYTemp * cosrot * sinrot
579 + vYTemp * vYTemp * cosrot * cosrot;
580 wXY = (vXTemp * vXTemp - vYTemp * vYTemp) * cosrot * sinrot
581 + vXYTemp * (cosrot * cosrot - sinrot * sinrot);
595 if (sector->
GetDx() < 0.02)
599 dpos.
SetXYZ(0.015, 0.058, 0.);
604 }
else if (stereoF == 0. && stereoB * 180 /
TMath::Pi() > 80) {
614 wX = vXTemp * vXTemp * cosrot * cosrot - 2. * vXYTemp * cosrot * sinrot
615 + vYTemp * vYTemp * sinrot * sinrot;
616 wY = vXTemp * vXTemp * sinrot * sinrot + 2. * vXYTemp * cosrot * sinrot
617 + vYTemp * vYTemp * cosrot * cosrot;
618 wXY = (vXTemp * vXTemp - vYTemp * vYTemp) * cosrot * sinrot
619 + vXYTemp * (cosrot * cosrot - sinrot * sinrot);
621 dpos.
SetXYZ(vX * 6, vX * 6, 0.);
634 vXYTemp = (vX * vX / (4. * (
TMath::Tan(stereoB))))
638 wX = vXTemp * vXTemp * cosrot * cosrot - 2. * vXYTemp * cosrot * sinrot
639 + vYTemp * vYTemp * sinrot * sinrot;
640 wY = vXTemp * vXTemp * sinrot * sinrot + 2. * vXYTemp * cosrot * sinrot
641 + vYTemp * vYTemp * cosrot * cosrot;
642 wXY = (vXTemp * vXTemp - vYTemp * vYTemp) * cosrot * sinrot
643 + vXYTemp * (cosrot * cosrot - sinrot * sinrot);
647 Int_t statLayer = -1;
648 for (Int_t istatL = station->
GetNofZ(); istatL > 0; istatL--)
650 statLayer = istatL - 1;
655 cout <<
"unknown layer for hit at z = " << zHit << endl;
657 if (sector->
GetDx() > 0.03)
660 CbmStsHit* hhNew =
new ((*fHits)[nHits++])
661 CbmStsHit(sensorDetId, pos, dpos, wXY, iClusF, iClusB, (Int_t)chanF, (Int_t)chanB, statLayer);
667 cout <<
"New StsHit at (" << xHit <<
", " << yHit <<
", " << zHit <<
"), station " << stationNr
668 <<
", sector " << sectorNr <<
", channel " << chanF <<
" / " << chanB << endl;
684 cout <<
"============================================================" << endl;
685 cout <<
"===== " << fName <<
": Run summary " << endl;
686 cout <<
"===== " << endl;
687 cout <<
"===== Number of hits : " << setw(8) << setprecision(2) <<
fNHits << endl;
688 cout <<
"============================================================" << endl;
void Fatal(const char *location, const char *msgfmt,...)
Int_t GetStationNr() const
Int_t GetSectorNr() const
Double_t GetMeanError() const
void MakeSets()
Make sectorwise sets for sigis.
void SortClusters()
Sort digis sectorwise.
Int_t FindHits(CbmStsStation *station, CbmStsSector *sector, std::set< Int_t > &fSet, std::set< Int_t > &bSet)
Find hits in one sector.
virtual ~CbmStsFindHits()
Destructor.
std::map< CbmStsSector *, std::set< Int_t > > fClusterMapB
sector clusters (front)
CbmStsFindHits()
Default constructor.
virtual InitStatus ReInit()
Reinitialisation.
std::map< CbmStsSector *, std::set< Int_t > > fClusterMapF
Output array of CbmStsHit.
TClonesArray * fHits
SM - Input array of BMN Silicon hits.
virtual void Finish()
Virtual method Finish.
TClonesArray * fClusters
Digitisation scheme.
CbmStsDigiPar * fDigiPar
Geometry parameters.
TStopwatch fTimer
sector clusters (back)
virtual void Exec(Option_t *opt)
Execution.
virtual InitStatus Init()
Intialisation.
CbmStsDigiScheme * fDigiScheme
Digitisation parameters.
virtual void SetParContainers()
Get parameter containers.
void SetSignalDiv(Double_t sigDiv)
Int_t GetSectorNr() const
Int_t IntersectClusters(Double_t fChan, Double_t bChan, Double_t &xCross, Double_t &yCross, Double_t &zCross)
Double_t GetStereoF() const
Double_t GetRotation() const
Double_t GetStereoB() const
Int_t GetNSectors() const
Double_t GetZ(Int_t it=0)
Int_t GetStationNr() const
CbmStsSector * GetSector(Int_t iSector)
void SetXYZ(Double_t x, Double_t y, Double_t z)
Double_t Min(Double_t a, Double_t b)
constexpr Double_t DegToRad()
Double_t Sqrt(Double_t x)
Double_t Max(Double_t a, Double_t b)