13#include "CbmStsPoint.h"
20#include "FairRootManager.h"
21#include "FairRunAna.h"
22#include "FairRuntimeDb.h"
24#include "TClonesArray.h"
37using std::setprecision;
43 : FairTask(
"STS Ideal Hit Finder", 1),
64 : FairTask(
"STSIdealFindHits", iVerbose),
85 : FairTask(name, iVerbose),
119 Bool_t warn = kFALSE;
122 if ( ! fDigiScheme ) {
123 cerr <<
"-E- " << fName <<
"::Exec: No digi scheme!" << endl;
140 for (Int_t iStation=0; iStation<nStations; iStation++) {
143 Int_t nDigisFInStation = 0;
144 Int_t nDigisBInStation = 0;
145 Int_t nHitsInStation = 0;
147 for (Int_t iSector=0; iSector<nSectors; iSector++) {
149 set <Int_t> fSet, bSet;
150 if ( fDigiMapF.find(sector) == fDigiMapF.end() ) {
151 cout <<
"-E- " << fName <<
"::Exec: sector "
158 fSet = fDigiMapF[sector];
160 if ( fDigiMapB.find(sector) == fDigiMapB.end() ) {
161 cout <<
"-E- " << fName <<
"::Exec: sector "
169 bSet = fDigiMapB[sector];
170 Int_t nDigisFInSector = fSet.size();
171 Int_t nDigisBInSector = bSet.size();
172 Int_t nHitsInSector = FindHits(station, sector, fSet, bSet);
175 <<
", Digis front " << nDigisFInSector
176 <<
", Digis Back " << nDigisBInSector
177 <<
", Hits " << nHitsInSector << endl;
178 nHitsInStation += nHitsInSector;
179 nDigisFInStation += nDigisFInSector;
180 nDigisBInStation += nDigisBInSector;
183 if ( fVerbose > 1 ) cout <<
"Total for station "
185 << nDigisFInStation <<
", digis back "
186 << nDigisBInStation <<
", hits "
187 << nHitsInStation << endl;
188 nDigisB += nDigisBInStation;
189 nDigisF += nDigisFInStation;
190 nHits += nHitsInStation;
195 if ( fVerbose > 1 ) {
197 cout <<
"-I- " << fName <<
":Event summary" << endl;
198 cout <<
" Active channels front side: " << nDigisF << endl;
199 cout <<
" Active channels back side : " << nDigisB << endl;
200 cout <<
" Hits created : " << nHits << endl;
201 cout <<
" Real time : " << fTimer.RealTime()
204 if ( fVerbose == 1 ) {
205 if ( warn ) cout <<
"- ";
207 cout << setw(15) << left << fName <<
": " << setprecision(4) << setw(8)
208 << fixed << right << fTimer.RealTime()
209 <<
" s, digis " << nDigisF <<
" / " << nDigisB <<
", hits: "
221void CbmStsIdealFindHits::SetParContainers() {
224 FairRunAna*
run = FairRunAna::Instance();
225 if ( !
run ) Fatal(
"SetParContainers",
"No analysis run");
227 FairRuntimeDb* db =
run->GetRuntimeDb();
228 if ( ! db ) Fatal(
"SetParContainers",
"No runtime database");
231 fGeoPar = (
CbmGeoStsPar*) db->getContainer(
"CbmGeoStsPar");
234 fDigiPar = (
CbmStsDigiPar*) db->getContainer(
"CbmStsDigiPar");
243InitStatus CbmStsIdealFindHits::Init() {
246 FairRootManager* ioman = FairRootManager::Instance();
247 if ( ! ioman ) Fatal(
"Init",
"No FairRootManager");
248 fDigis = (TClonesArray*) ioman->GetObject(
"StsDigi");
249 fDigiMatch = (TClonesArray*) ioman->GetObject(
"StsDigiMatch");
250 fPoints = (TClonesArray*) ioman->GetObject(
"StsPoint");
253 fHits =
new TClonesArray(
"CbmStsHit", 1000);
254 ioman->Register(
"StsHit",
"Hit in STS", fHits, kTRUE);
257 Bool_t success = fDigiScheme->
Init(fGeoPar, fDigiPar);
258 if ( ! success )
return kERROR;
264 if (fVerbose == 1 || fVerbose == 2) fDigiScheme->
Print(kFALSE);
265 else if (fVerbose > 2) fDigiScheme->
Print(kTRUE);
266 cout <<
"-I- " << fName <<
"::Init: "
267 <<
"STS digitisation scheme succesfully initialised" << endl;
269 <<
", Sectors: " << fDigiScheme->
GetNSectors() <<
", Channels: "
280InitStatus CbmStsIdealFindHits::ReInit() {
283 fDigiScheme->
Clear();
286 Bool_t success = fDigiScheme->
Init(fGeoPar, fDigiPar);
287 if ( ! success )
return kERROR;
293 if (fVerbose == 1 || fVerbose == 2) fDigiScheme->
Print(kFALSE);
294 else if (fVerbose > 2) fDigiScheme->
Print(kTRUE);
295 cout <<
"-I- " << fName <<
"::Init: "
296 <<
"STS digitisation scheme succesfully reinitialised" << endl;
298 <<
", Sectors: " << fDigiScheme->
GetNSectors() <<
", Channels: "
309void CbmStsIdealFindHits::MakeSets() {
314 for (Int_t iStation=0; iStation<nStations; iStation++) {
317 for (Int_t iSector=0; iSector<nSectors; iSector++) {
320 fDigiMapF[sector] = a;
323 fDigiMapB[sector] = b;
335void CbmStsIdealFindHits::SortDigis() {
339 cout <<
"-E- " << fName <<
"::SortDigis: No input array!" << endl;
344 map<CbmStsSector*, set<Int_t> >::iterator mapIt;
345 for (mapIt=fDigiMapF.begin(); mapIt!=fDigiMapF.end(); mapIt++)
346 ((*mapIt).second).clear();
347 for (mapIt=fDigiMapB.begin(); mapIt!=fDigiMapB.end(); mapIt++)
348 ((*mapIt).second).clear();
353 Int_t stationNr = -1;
356 Int_t nDigis = fDigis->GetEntriesFast();
357 for (Int_t iDigi=0; iDigi<nDigis; iDigi++) {
362 sector = fDigiScheme->
GetSector(stationNr, sectorNr);
364 if ( fDigiMapF.find(sector) == fDigiMapF.end() ) {
365 cerr <<
"-E- " << fName <<
"::SortDigits:: sector " << sectorNr
366 <<
" of station " << stationNr
367 <<
" not found in digi scheme (F)!" << endl;
370 fDigiMapF[sector].insert(iDigi);
372 else if (iSide == 1 ) {
373 if ( fDigiMapB.find(sector) == fDigiMapB.end() ) {
374 cerr <<
"-E- " << fName <<
"::SortDigits:: sector " << sectorNr
375 <<
" of station " << stationNr
376 <<
" not found in digi scheme (B)!" << endl;
379 fDigiMapB[sector].insert(iDigi);
392 set<Int_t>& fSet, set<Int_t>& bSet) {
399 Int_t iType = sector->
GetType();
402 Double_t dx = sector->
GetDx();
403 Double_t dy = sector->
GetDy();
412 Double_t sinrot = TMath::Sin(rot);
413 Double_t cosrot = TMath::Cos(rot);
414 Double_t tanstrB = TMath::Tan(stereoB);
415 Double_t tanstrF = TMath::Tan(stereoF);
418 Double_t vX, vY, vXY;
420 if ( iType == 1 || TMath::Abs(stereoF) < 0.01 && (TMath::Abs(stereoB*TMath::RadToDeg()-90) < 0.01 ||
421 TMath::Abs(stereoB*TMath::RadToDeg()+90) < 0.01)) {
422 vX = dx / TMath::Sqrt(12.);
423 vY = dy / TMath::Sqrt(12.);
426 else if ( iType == 2 || iType == 3 ) {
428 vX = dx / TMath::Sqrt(12.);
429 vY = dx / TMath::Sqrt(6.) / TMath::Abs(tanstrB);
430 vXY = -1. * dx * dx / 12. / tanstrB;
433 vX = dx / TMath::Sqrt(24.);
434 vY = dx / TMath::Sqrt(24.) / TMath::Abs(tanstrB);
439 cerr <<
"-E- " << fName <<
"::FindHits: Illegal sector type "
445 Double_t wX = vX * vX * cosrot * cosrot
446 - 2. * vXY * cosrot * sinrot
447 + vY * vY * sinrot * sinrot;
448 Double_t wY = vX * vX * sinrot * sinrot
449 + 2. * vXY * cosrot * sinrot
450 + vY * vY * cosrot * cosrot;
451 Double_t wXY = (vX*vX - vY*vY) * cosrot * sinrot
452 + vXY * ( cosrot*cosrot - sinrot*sinrot );
453 Double_t sigmaX = TMath::Sqrt(wX);
454 Double_t sigmaY = TMath::Sqrt(wY);
457 set<Int_t>::iterator it1;
458 set<Int_t>::iterator it2;
462 Fatal(
"FindHits",
"Sorry, not implemented yet");
467 else if ( iType == 2 ) {
468 Fatal(
"FindHits",
"Sorry, not implemented yet");
473 else if (iType == 3 ) {
478 Int_t nHits = fHits->GetEntriesFast();
487 for (it1=fSet.begin(); it1!=fSet.end(); it1++) {
491 cout <<
"-W- " << GetName() <<
"::FindHits: Invalid digi index "
492 << iDigiF <<
" in front set of sector "
500 for (it2=bSet.begin(); it2!=bSet.end(); it2++ ) {
504 cout <<
"-W- " << GetName() <<
"::FindHits: Invalid digi index "
505 << iDigiB <<
" in back set of sector "
536 Int_t sensorDetId = sector->
Intersect(iChanF,iChanB,xHit,yHit,zHit);
538 if ( sensorDetId == -1 )
continue;
540 pos.SetXYZ(xHit, yHit, zHit);
541 dpos.SetXYZ(sigmaX, sigmaY, 0.);
543 Int_t statLayer = -1;
544 for ( Int_t istatL = station->
GetNofZ() ; istatL > 0 ; istatL-- )
545 if ( TMath::Abs(zHit-station->
GetZ(istatL-1)) < 0.00001 ) {
546 statLayer = istatL-1;
550 if ( statLayer == -1 )
551 cout <<
"unknown layer for hit at z = " << zHit << endl;
553 new ((*fHits)[nHits++])
CbmStsHit(sensorDetId, pos, dpos, wXY,
554 iDigiF, iDigiB, iChanF, iChanB, statLayer);
557 if ( fVerbose > 3 ) cout <<
"New StsHit at (" << xHit <<
", " << yHit
558 <<
", " << zHit <<
"), station "
559 << stationNr <<
", sector " << sectorNr
560 <<
", channel " << iChanF <<
" / "
BmnSsdDigitizeParameters * fDigiPar
Digitisation parameters.
void Print(Bool_t kLong=kFALSE)
CbmStsSector * GetSector(Int_t stationNr, Int_t sectorNr)
CbmStsStation * GetStation(Int_t iStation)
Int_t GetSectorNr() const
Int_t GetChannelNr() const
Int_t GetStationNr() const
virtual void Exec(Option_t *opt)
virtual ~CbmStsIdealFindHits()
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)