16#include "CbmStsPoint.h"
19#include "FairRootManager.h"
20#include "FairRunAna.h"
21#include "FairRuntimeDb.h"
36using std::setprecision;
41 :
FairTask(
"STS Ideal Hit Finder", 1)
62 :
FairTask(
"STSIdealFindHits", iVerbose)
121 cerr <<
"-E- " << fName <<
"::Exec: No digi scheme!" << endl;
138 for (
Int_t iStation = 0; iStation < nStations; iStation++) {
141 Int_t nDigisFInStation = 0;
142 Int_t nDigisBInStation = 0;
143 Int_t nHitsInStation = 0;
145 for (
Int_t iSector = 0; iSector < nSectors; iSector++) {
147 set<Int_t> fSet, bSet;
149 cout <<
"-E- " << fName <<
"::Exec: sector " << sector->
GetSectorNr() <<
" of station "
150 << station->
GetStationNr() <<
"not found in front map!" << endl;
157 cout <<
"-E- " << fName <<
"::Exec: sector " << sector->
GetSectorNr() <<
" of station "
158 << station->
GetStationNr() <<
"not found in back map!" << endl;
164 Int_t nDigisFInSector = fSet.size();
165 Int_t nDigisBInSector = bSet.size();
168 cout <<
"Sector " << sector->
GetSectorNr() <<
", Digis front " << nDigisFInSector <<
", Digis Back "
169 << nDigisBInSector <<
", Hits " << nHitsInSector << endl;
170 nHitsInStation += nHitsInSector;
171 nDigisFInStation += nDigisFInSector;
172 nDigisBInStation += nDigisBInSector;
176 cout <<
"Total for station " << station->
GetStationNr() <<
": Digis front " << nDigisFInStation
177 <<
", digis back " << nDigisBInStation <<
", hits " << nHitsInStation << endl;
178 nDigisB += nDigisBInStation;
179 nDigisF += nDigisFInStation;
180 nHits += nHitsInStation;
187 cout <<
"-I- " << fName <<
":Event summary" << endl;
188 cout <<
" Active channels front side: " << nDigisF << endl;
189 cout <<
" Active channels back side : " << nDigisB << endl;
190 cout <<
" Hits created : " << nHits << endl;
191 cout <<
" Real time : " <<
fTimer.RealTime() << endl;
198 cout << setw(15) << left << fName <<
": " << setprecision(4) << setw(8) << fixed << right <<
fTimer.RealTime()
199 <<
" s, digis " << nDigisF <<
" / " << nDigisB <<
", hits: " << nHits << endl;
209 FairRunAna* run = FairRunAna::Instance();
211 Fatal(
"SetParContainers",
"No analysis run");
213 FairRuntimeDb* db = run->GetRuntimeDb();
215 Fatal(
"SetParContainers",
"No runtime database");
230 FairRootManager* ioman = FairRootManager::Instance();
232 Fatal(
"Init",
"No FairRootManager");
239 ioman->Register(
"StsHit",
"Hit in STS",
fHits,
kTRUE);
250 if (fVerbose == 1 || fVerbose == 2)
252 else if (fVerbose > 2)
254 cout <<
"-I- " << fName <<
"::Init: "
255 <<
"STS digitisation scheme succesfully initialised" << endl;
257 <<
", Channels: " <<
fDigiScheme->GetNChannels() << endl;
279 if (fVerbose == 1 || fVerbose == 2)
281 else if (fVerbose > 2)
283 cout <<
"-I- " << fName <<
"::Init: "
284 <<
"STS digitisation scheme succesfully reinitialised" << endl;
286 <<
", Channels: " <<
fDigiScheme->GetNChannels() << endl;
299 for (
Int_t iStation = 0; iStation < nStations; iStation++) {
302 for (
Int_t iSector = 0; iSector < nSectors; iSector++) {
321 cout <<
"-E- " << fName <<
"::SortDigis: No input array!" << endl;
326 map<CbmStsSector*, set<Int_t>>::iterator mapIt;
328 ((*mapIt).second).clear();
330 ((*mapIt).second).clear();
335 Int_t stationNr = -1;
339 for (
Int_t iDigi = 0; iDigi < nDigis; iDigi++) {
344 sector =
fDigiScheme->GetSector(stationNr, sectorNr);
347 cerr <<
"-E- " << fName <<
"::SortDigits:: sector " << sectorNr <<
" of station " << stationNr
348 <<
" not found in digi scheme (F)!" << endl;
352 }
else if (iSide == 1) {
354 cerr <<
"-E- " << fName <<
"::SortDigits:: sector " << sectorNr <<
" of station " << stationNr
355 <<
" not found in digi scheme (B)!" << endl;
402 }
else if (iType == 2 || iType == 3) {
406 vXY = -1. * dx * dx / 12. / tanstrB;
413 cerr <<
"-E- " << fName <<
"::FindHits: Illegal sector type " << iType << endl;
418 Double_t wX = vX * vX * cosrot * cosrot - 2. * vXY * cosrot * sinrot + vY * vY * sinrot * sinrot;
419 Double_t wY = vX * vX * sinrot * sinrot + 2. * vXY * cosrot * sinrot + vY * vY * cosrot * cosrot;
420 Double_t wXY = (vX * vX - vY * vY) * cosrot * sinrot + vXY * (cosrot * cosrot - sinrot * sinrot);
425 set<Int_t>::iterator it1;
426 set<Int_t>::iterator it2;
430 Fatal(
"FindHits",
"Sorry, not implemented yet");
437 Fatal(
"FindHits",
"Sorry, not implemented yet");
457 for (it1 = fSet.begin(); it1 != fSet.end(); it1++) {
461 cout <<
"-W- " << GetName() <<
"::FindHits: Invalid digi index " << iDigiF <<
" in front set of sector "
468 for (it2 = bSet.begin(); it2 != bSet.end(); it2++) {
472 cout <<
"-W- " << GetName() <<
"::FindHits: Invalid digi index " << iDigiB
473 <<
" in back set of sector " << sector->
GetSectorNr() <<
", station "
503 Int_t sensorDetId = sector->
Intersect(iChanF, iChanB, xHit, yHit, zHit);
505 if (sensorDetId == -1)
508 pos.
SetXYZ(xHit, yHit, zHit);
509 dpos.
SetXYZ(sigmaX, sigmaY, 0.);
511 Int_t statLayer = -1;
512 for (
Int_t istatL = station->
GetNofZ(); istatL > 0; istatL--)
514 statLayer = istatL - 1;
519 cout <<
"unknown layer for hit at z = " << zHit << endl;
521 new ((*fHits)[nHits++])
522 CbmStsHit(sensorDetId, pos, dpos, wXY, iDigiF, iDigiB, iChanF, iChanB, statLayer);
526 cout <<
"New StsHit at (" << xHit <<
", " << yHit <<
", " << zHit <<
"), station " << stationNr
527 <<
", sector " << sectorNr <<
", channel " << iChanF <<
" / " << iChanB << endl;
void Fatal(const char *location, const char *msgfmt,...)
Int_t GetSide() const
Side ( 0 = front, 1 = back ).
Int_t GetSectorNr() const
Sector number.
Int_t GetChannelNr() const
Channel number.
Int_t GetStationNr() const
Station number.
CbmStsDigiPar * fDigiPar
Geometry parameters.
virtual void Exec(Option_t *opt)
Execution.
virtual ~CbmStsIdealFindHits()
Destructor.
CbmStsDigiScheme * fDigiScheme
Digitisation parameters.
Int_t FindHits(CbmStsStation *station, CbmStsSector *sector, std::set< Int_t > &fSet, std::set< Int_t > &bSet)
Find hits in one sector.
CbmStsIdealFindHits()
Default constructor.
TStopwatch fTimer
sector digis (back)
Double_t fTime1
Number of events with success.
virtual InitStatus Init()
Intialisation.
virtual InitStatus ReInit()
Reinitialisation.
TClonesArray * fPoints
AZ: Input array of CbmStsDigiMatch.
void MakeSets()
Make sectorwise sets for sigis.
TClonesArray * fHits
AZ: Input array of CbmStsPoint.
TClonesArray * fDigiMatch
Input array of CbmStsDigi.
void SortDigis()
Sort digis sectorwise.
TClonesArray * fDigis
Digitisation scheme.
std::map< CbmStsSector *, std::set< Int_t > > fDigiMapB
sector digis (front)
std::map< CbmStsSector *, std::set< Int_t > > fDigiMapF
Output array of CbmStsHit.
virtual void SetParContainers()
Get parameter containers.
Int_t GetSectorNr() const
Double_t GetStereoF() const
Int_t GetDetectorId() const
Double_t GetRotation() const
Int_t Intersect(Int_t iFStrip, Int_t iBStrip, Double_t &xCross, Double_t &yCross, Double_t &zCross)
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 Sqrt(Double_t x)
constexpr Double_t RadToDeg()