19#include "FairRootManager.h"
20#include "FairRunAna.h"
21#include "FairRuntimeDb.h"
22#include "FairEventHeader.h"
24#include "TClonesArray.h"
38using std::setprecision;
44: FairTask(
"STS Hit Finder", 1),
58: FairTask(
"STSRealFindHits", iVerbose),
72: FairTask(name, iVerbose),
102 if ( ! fDigiScheme ) {
103 cerr <<
"-E- " << fName <<
"::Exec: No digi scheme!" << endl;
115 Int_t nClustersF = 0;
116 Int_t nClustersB = 0;
120 for (Int_t iStation=0; iStation<nStations; iStation++) {
124 Int_t nClustersFInStation = 0;
125 Int_t nClustersBInStation = 0;
126 Int_t nHitsInStation = 0;
128 for (Int_t iSector=0; iSector<nSectors; iSector++) {
130 set <Int_t> fSet, bSet;
131 if ( fClusterMapF.find(sector) == fClusterMapF.end() ) {
132 cout <<
"-E- " << fName <<
"::Exec: sector "
139 fSet = fClusterMapF[sector];
141 if ( fClusterMapB.find(sector) == fClusterMapB.end() ) {
142 cout <<
"-E- " << fName <<
"::Exec: sector "
150 bSet = fClusterMapB[sector];
151 Int_t nClustersFInSector = fSet.size();
152 Int_t nClustersBInSector = bSet.size();
153 Int_t nHitsInSector = FindHits(station, sector, fSet, bSet);
156 <<
", Clusters front " << nClustersFInSector
157 <<
", Clusters Back " << nClustersBInSector
158 <<
", Hits " << nHitsInSector << endl;
159 nHitsInStation += nHitsInSector;
160 nClustersFInStation += nClustersFInSector;
161 nClustersBInStation += nClustersBInSector;
164 if ( fVerbose > 1 ) cout <<
"Total for station "
166 << nClustersFInStation <<
", clusters back "
167 << nClustersBInStation <<
", hits "
168 << nHitsInStation << endl;
169 nClustersB += nClustersBInStation;
170 nClustersF += nClustersFInStation;
171 nHits += nHitsInStation;
179 cout <<
"-I- " << fName <<
":Event " << FairRunAna::Instance()->GetEventHeader()->GetMCEntryNumber() <<
" summary" << endl;
180 cout <<
" Clusters front side : " << nClustersF << endl;
181 cout <<
" Clusters back side : " << nClustersB << endl;
182 cout <<
" Hits created : " << nHits << endl;
183 cout <<
" Real time : " << fTimer.RealTime()
187 if ( warn ) cout <<
"- ";
189 cout << setw(15) << left << fName <<
": " << setprecision(4) << setw(8)
190 << fixed << right << fTimer.RealTime()
191 <<
" s, clusters " << nClustersF <<
" / " << nClustersB <<
", hits: "
203void CbmStsFindHits::SetParContainers() {
206 FairRunAna*
run = FairRunAna::Instance();
207 if ( !
run ) Fatal(
"SetParContainers",
"No analysis run");
209 FairRuntimeDb* db =
run->GetRuntimeDb();
210 if ( ! db ) Fatal(
"SetParContainers",
"No runtime database");
213 fGeoPar = (
CbmGeoStsPar*) db->getContainer(
"CbmGeoStsPar");
216 fDigiPar = (
CbmStsDigiPar*) db->getContainer(
"CbmStsDigiPar");
225InitStatus CbmStsFindHits::Init() {
228 FairRootManager* ioman = FairRootManager::Instance();
229 if ( ! ioman ) Fatal(
"Init",
"No FairRootManager");
230 fClusters = (TClonesArray*) ioman->GetObject(
"StsCluster");
233 fHits =
new TClonesArray(
"CbmStsHit", 1000);
234 ioman->Register(
"StsHit",
"Hit in STS", fHits, kTRUE);
237 Bool_t success = fDigiScheme->
Init(fGeoPar, fDigiPar);
238 if ( ! success )
return kERROR;
245 if (fVerbose == 1 || fVerbose == 2) fDigiScheme->
Print(kFALSE);
246 else if (fVerbose > 2) fDigiScheme->
Print(kTRUE);
247 cout <<
"-I- " << fName <<
"::Init: "
248 <<
"STS digitisation scheme succesfully initialised" << endl;
250 <<
", Sectors: " << fDigiScheme->
GetNSectors() <<
", Channels: "
261InitStatus CbmStsFindHits::ReInit() {
264 fDigiScheme->
Clear();
267 Bool_t success = fDigiScheme->
Init(fGeoPar, fDigiPar);
268 if ( ! success )
return kERROR;
274 if (fVerbose == 1 || fVerbose == 2) fDigiScheme->
Print(kFALSE);
275 else if (fVerbose > 2) fDigiScheme->
Print(kTRUE);
276 cout <<
"-I- " << fName <<
"::Init: "
277 <<
"STS digitisation scheme succesfully reinitialised" << endl;
279 <<
", Sectors: " << fDigiScheme->
GetNSectors() <<
", Channels: "
290void CbmStsFindHits::MakeSets() {
292 fClusterMapF.clear();
293 fClusterMapB.clear();
295 for (Int_t iStation=0; iStation<nStations; iStation++) {
298 for (Int_t iSector=0; iSector<nSectors; iSector++) {
301 fClusterMapF[sector] = a;
304 fClusterMapB[sector] = b;
316void CbmStsFindHits::SortClusters() {
320 cout <<
"-E- " << fName <<
"::SortClusters: No input array!" << endl;
325 map<CbmStsSector*, set<Int_t> >::iterator mapIt;
326 for (mapIt=fClusterMapF.begin(); mapIt!=fClusterMapF.end(); mapIt++)
327 ((*mapIt).second).clear();
328 for (mapIt=fClusterMapB.begin(); mapIt!=fClusterMapB.end(); mapIt++)
329 ((*mapIt).second).clear();
334 Int_t stationNr = -1;
337 Int_t nClusters = fClusters->GetEntriesFast();
338 for (Int_t iClus=0; iClus<nClusters ; iClus++) {
344 sector = fDigiScheme->
GetSector(stationNr, sectorNr);
346 if ( fClusterMapF.find(sector) == fClusterMapF.end() ) {
347 cerr <<
"-E- " << fName <<
"::SortClusters:: sector " << sectorNr
348 <<
" of station " << stationNr
349 <<
" not found in digi scheme (F)!" << endl;
352 fClusterMapF[sector].insert(iClus);
354 else if (iSide == 1 ) {
355 if ( fClusterMapB.find(sector) == fClusterMapB.end() ) {
356 cerr <<
"-E- " << fName <<
"::SortClusters:: sector " << sectorNr
357 <<
" of station " << stationNr
358 <<
" not found in digi scheme (B)!" << endl;
361 fClusterMapB[sector].insert(iClus);
374 set<Int_t>& fSet, set<Int_t>& bSet) {
377 static Int_t ifield = -1;
379 FairRunAna*
run = FairRunAna::Instance();
380 FairField *magField =
run->GetField();
381 ifield = TMath::Nint(TMath::Abs(magField->GetBy(0,0,135.0)));
390 Int_t iType = sector->
GetType();
393 Double_t dx = sector->
GetDx();
403 Double_t sinrot = TMath::Sin(rot);
404 Double_t cosrot = TMath::Cos(rot);
451 set<Int_t>::iterator it1;
452 set<Int_t>::iterator it2;
456 Fatal(
"FindHits",
"Sorry, not implemented yet");
470 else if ( iType == 2 || iType == 3 ) {
475 Int_t nHits = fHits->GetEntriesFast();
483 Double_t vX, vY, vXY;
484 if (stereoF==0.&&stereoB*180/TMath::Pi()<80) {
485 vX = dx / TMath::Sqrt(12.);
486 vY = dx / TMath::Sqrt(6.) / TMath::Abs(TMath::Tan(stereoB));
487 vXY = -1. * dx * dx / 12. / TMath::Tan(stereoB);
489 else if (stereoF==0.&&stereoB*180/TMath::Pi()>80) {
490 vX = dx / TMath::Sqrt(12.);
491 vY = dx / TMath::Sqrt(12.);
495 vX = dx / TMath::Sqrt(12.);
496 vY = dx / TMath::Sqrt(12.) / TMath::Abs(TMath::Tan(stereoB));
500 for (it1=fSet.begin(); it1!=fSet.end(); it1++) {
504 cout <<
"-W- " << GetName() <<
"::FindHits: Invalid cluster index "
505 << iClusF <<
" in front set of sector "
511 for (it2=bSet.begin(); it2!=bSet.end(); it2++ ) {
515 cout <<
"-W- " << GetName() <<
"::FindHits: Invalid cluster index "
516 << iClusB <<
" in back set of sector "
533 if ( sensorDetId == -1 )
continue;
546 Double_t lorShift = 0.1575, zShift = -0.27;
547 if (ifield == 4) { lorShift = 0.0765; zShift = -0.27; }
548 else if (ifield == 6) { lorShift = 0.1145; zShift = -0.27; }
550 else if (ifield == 7) { lorShift = 0.1360; zShift = -0.27; }
551 else if (ifield == 9) { lorShift = 0.1800; zShift = -0.27; }
555 if (sector->
GetDx() < 0.02) lorShift = zShift = 0.0;
567 pos.SetXYZ(xHit, yHit, zHit);
569 Double_t vXTemp, vYTemp, vXYTemp;
571 Double_t wX = vX * vX * cosrot * cosrot
572 - 2. * vXY * cosrot * sinrot
573 + vY * vY * sinrot * sinrot;
574 Double_t wY = vX * vX * sinrot * sinrot
575 + 2. * vXY * cosrot * sinrot
576 + vY * vY * cosrot * cosrot;
577 Double_t wXY = (vX*vX - vY*vY) * cosrot * sinrot
578 + vXY * ( cosrot*cosrot - sinrot*sinrot );
582 if (stereoF==0.&&stereoB*180/TMath::Pi()<80) {
586 vXYTemp = - vXTemp * vXTemp / (TMath::Tan(stereoB));
588 wX = vXTemp * vXTemp * cosrot * cosrot
589 - 2. * vXYTemp * cosrot * sinrot
590 + vYTemp * vYTemp * sinrot * sinrot;
591 wY = vXTemp * vXTemp * sinrot * sinrot
592 + 2. * vXYTemp * cosrot * sinrot
593 + vYTemp * vYTemp * cosrot * cosrot;
594 wXY = (vXTemp*vXTemp - vYTemp*vYTemp) * cosrot * sinrot
595 + vXYTemp * ( cosrot*cosrot - sinrot*sinrot );
609 if (sector->
GetDx() < 0.02)
610 dpos.SetXYZ(sector->
GetDx()/TMath::Sqrt(12.),
611 sector->
GetDx()/TMath::Sqrt(12.)/TMath::Sin(7.5*TMath::DegToRad()), 0.);
612 else dpos.SetXYZ(0.015, 0.058, 0.);
618 else if (stereoF==0.&&stereoB*180/TMath::Pi()>80) {
628 wX = vXTemp * vXTemp * cosrot * cosrot
629 - 2. * vXYTemp * cosrot * sinrot
630 + vYTemp * vYTemp * sinrot * sinrot;
631 wY = vXTemp * vXTemp * sinrot * sinrot
632 + 2. * vXYTemp * cosrot * sinrot
633 + vYTemp * vYTemp * cosrot * cosrot;
634 wXY = (vXTemp*vXTemp - vYTemp*vYTemp) * cosrot * sinrot
635 + vXYTemp * ( cosrot*cosrot - sinrot*sinrot );
637 dpos.SetXYZ(vX*6, vX*6, 0.);
647 wX = vXTemp * vXTemp * cosrot * cosrot
648 - 2. * vXYTemp * cosrot * sinrot
649 + vYTemp * vYTemp * sinrot * sinrot;
650 wY = vXTemp * vXTemp * sinrot * sinrot
651 + 2. * vXYTemp * cosrot * sinrot
652 + vYTemp * vYTemp * cosrot * cosrot;
653 wXY = (vXTemp*vXTemp - vYTemp*vYTemp) * cosrot * sinrot
654 + vXYTemp * ( cosrot*cosrot - sinrot*sinrot );
655 dpos.SetXYZ(TMath::Sqrt(wX),TMath::Sqrt(wY), 0.);
659 Int_t statLayer = -1;
660 for ( Int_t istatL = station->
GetNofZ() ; istatL > 0 ; istatL-- )
661 if ( TMath::Abs(zHit-station->
GetZ(istatL-1)) < 0.00001 ) {
662 statLayer = istatL-1;
666 if ( statLayer == -1 )
667 cout <<
"unknown layer for hit at z = " << zHit << endl;
669 if (sector->
GetDx() > 0.03) pos[2] += zShift;
672 iClusF, iClusB, (Int_t)chanF, (Int_t)chanB, statLayer);
677 if ( fVerbose > 3 ) cout <<
"New StsHit at (" << xHit <<
", " << yHit
678 <<
", " << zHit <<
"), station "
679 << stationNr <<
", sector " << sectorNr
680 <<
", channel " << chanF <<
" / "
698 cout <<
"============================================================"
700 cout <<
"===== " << fName <<
": Run summary " << endl;
701 cout <<
"===== " << endl;
702 cout <<
"===== Number of hits : "
703 << setw(8) << setprecision(2)
705 cout <<
"============================================================"
BmnSsdDigitizeParameters * fDigiPar
Digitisation parameters.
Int_t GetStationNr() const
Int_t GetSectorNr() const
Double_t GetMeanError() const
void Print(Bool_t kLong=kFALSE)
CbmStsStation * GetStationByNr(Int_t stationNr)
CbmStsSector * GetSector(Int_t stationNr, Int_t sectorNr)
CbmStsStation * GetStation(Int_t iStation)
virtual ~CbmStsFindHits()
virtual void Exec(Option_t *opt)
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)