19 #include "FairRootManager.h"
20 #include "FairRunAna.h"
21 #include "FairRuntimeDb.h"
24 #include "TClonesArray.h"
25 #include "TObjArray.h"
27 #include "TGeoManager.h"
47 using std::setprecision;
51 FairTask(
"Ideal GEM hit Producer") {
61 : FairTask(name, iVerbose) {
83 FairRunAna*
run = FairRunAna::Instance();
84 if ( ! run ) Fatal(
"SetParContainers",
"No analysis run");
86 FairRuntimeDb* db = run->GetRuntimeDb();
87 if ( ! db ) Fatal(
"SetParContainers",
"No runtime database");
99 std::cout <<
" INITIALIZATION OF Ideal Gem Hit Producer***************" << std::endl;
102 FairRootManager* ioman = FairRootManager::Instance();
104 std::cout <<
"-E- PndGemIdealHitProducer::Init: "
105 <<
"RootManager not instantiated!" << std::endl;
110 fPointArray = (TClonesArray*) ioman->GetObject(
"GEMPoint");
112 std::cout <<
"-W- PndGemIdealHitProducer::Init: "
113 <<
"Array of GEMPoints not found!" << std::endl;
118 fHitArray =
new TClonesArray(
"PndGemHit");
120 ioman->Register(
"GEMHit",
"GEM ideal hit",
fHitArray,kTRUE);
122 std::cout <<
"-I- PndGemIdealHitProducer: Intialization successfull" << std::endl;
131 if( !
fHitArray ) Fatal(
"Exec",
"No hit array");
142 for ( Int_t iPoint = 0 ; iPoint <
fPointArray->GetEntriesFast() ; iPoint++ ) {
145 Double_t posIn[3] = {currentPndGemMCPoint->GetX(),
146 currentPndGemMCPoint->GetY(),
147 currentPndGemMCPoint->GetZ()};
149 Int_t sensorId = currentPndGemMCPoint->
GetSensorId();
162 curNode->MasterToLocal(posIn,locPosIn);
164 radius =
TMath::Sqrt(locPosIn[0]*locPosIn[0]+locPosIn[1]*locPosIn[1]);
175 Double_t xh = - innerR*cosAng +
TMath::Sqrt(innerR*innerR*cosAng*cosAng-innerR*innerR+radius*radius);
176 Double_t backAng = TMath::ACos((radius*radius+xh*xh-innerR*innerR)/(2.*radius*xh));
180 Double_t phiAValue = TMath::ATan(locPosIn[0]/locPosIn[1]);
181 if ( locPosIn[1] < 0 ) phiAValue +=
TMath::Pi();
182 else if ( locPosIn[0] < 0 ) phiAValue += 2.*
TMath::Pi();
186 gRandom->Rannor(rSmear,pSmear);
187 rSmear = radius + rSmear*dr;
188 pSmear = 0. + pSmear*dp;
190 if ( rSmear < innerR || rSmear > sensor->
GetOuterRadius() ) rSmear = radius;
195 TVector3
pos(locPosIn[0],locPosIn[1],sensor->
GetZ0());
198 if ( dr > sigma ) sigma = dr;
199 TVector3 dpos(sigma, sigma, sensor->
GetD());
203 -1, -1, dr, dp, iPoint);
212 cout <<
"-------------------- " << fName.Data() <<
" : Summary ---------------" << endl;
213 cout <<
" Events: " << setw(10) <<
fTNofEvents << endl;
218 cout <<
"---------------------------------------------------------------------" << endl;
virtual void Exec(Option_t *opt)
virtual ~PndGemIdealHitProducer()
static T Sqrt(const T &x)
Double_t GetInnerRadius() const
Digitization Parameter Class for GEM part.
TClonesArray * fHitArray
Output array of PndGemHits.
TGeoManager * gGeoManager
Class for conversion points to hits.
PndGemSensor * GetSensor(Int_t stationNr, Int_t sensorNr)
virtual InitStatus Init()
Int_t GetSensorId() const
virtual void SetParContainers()
TString GetNodeName(Int_t sensorId)
TClonesArray * fPointArray
Input array of PndGemMCPoints.
Double_t GetOuterRadius() const
Double_t GetPitch(Int_t index) const
Double_t GetStripAngle(Int_t index) const