///////////////////////////////////////////////////////////// // PndDchIdealHitProducer // Filler of PndDchHit ///////////////////////////////////////////////////////////////// #include "TClonesArray.h" #include "CbmRootManager.h" #include "CbmRunAna.h" #include "CbmRuntimeDb.h" #include "CbmRun.h" #include "CbmDetector.h" #include "PndDchIdealHitProducer.h" #include "PndDchHit.h" #include "PndDchPoint.h" #include "PndDchStructure.h" #include "TGeoManager.h" #include "TGeoVolume.h" #include "TGeoNode.h" #include "TGeoMatrix.h" #include "TVector3.h" #include "TRandom.h" // ----- Default constructor ------------------------------------------- PndDchIdealHitProducer::PndDchIdealHitProducer() : CbmTask("Ideal DCH hit Producer") { } // ----- Destructor ---------------------------------------------------- PndDchIdealHitProducer::~PndDchIdealHitProducer() { if(fHitArray){ fHitArray->Delete(); delete fHitArray; } } // ----- Public method Init -------------------------------------------- InitStatus PndDchIdealHitProducer::Init() { std::cout << " INITIALIZATION OF Ideal Dch Hit Producer***************" << std::endl; // Get RootManager CbmRootManager* ioman = CbmRootManager::Instance(); if ( ! ioman ) { std::cout << "-E- PndDchIdealHitProducer::Init: " << "RootManager not instantiated!" << std::endl; return kFATAL; } // Get input array fPointArray = (TClonesArray*) ioman->GetObject("PndDchPoint"); if ( ! fPointArray ) { std::cout << "-W- PndDchIdealHitProducer::Init: " << "Array of PndDchPoints not found!" << std::endl; return kERROR; } // Create and register output array fHitArray = new TClonesArray("PndDchHit"); ioman->Register("PndDchHit","Dch",fHitArray,kTRUE); // Geometry loading TFile *infile = ioman->GetInFile(); TGeoManager *geoMan = (TGeoManager*) infile->Get("CBMGeom"); fDchStructure = PndDchStructure::Instance(geoMan); std::cout << "-I- PndDchIdealHitProducer: Intialization successfull" << std::endl; return kSUCCESS; } // ----- Public method Exec -------------------------------------------- void PndDchIdealHitProducer::Exec(Option_t* opt) { // Reset output array if ( ! fHitArray ) Fatal("Exec", "No hit array"); fHitArray->Clear(); // Loop over Points PndDchPoint* point = 0; Int_t nPoints = fPointArray->GetEntriesFast(); for (Int_t iPoint=0; iPointAt(iPoint); AddHit(point, iPoint); } // end of loop over Points } // ----- Private method AddHit -------------------------------------------- PndDchHit* PndDchIdealHitProducer::AddHit(const PndDchPoint* point , Int_t idx){ // Fills the PndDchHit array TClonesArray& clref = *fHitArray; Int_t size = clref.GetEntriesFast(); Int_t trackID = point->GetTrackID(); Int_t detID = point->GetDetectorID(); Int_t chamber = point->GetChamber(); TVector3 pos(point->GetX(),point->GetY(),point->GetZ()); Double_t res = 0.02; // cm, default for drift chambers if(fDchStructure->GetCellSize(detID)<0.8) //dummy GEM res = 0.005; //cm, defalut for GEMs TVector3 dpos(res,res,res); Smear(pos, dpos); //smear here return new(clref[size]) PndDchHit(trackID, detID, pos, dpos , idx); } // ----- Private Method Smear ---------------------------------------------- void PndDchIdealHitProducer::Smear(TVector3& pos, const TVector3 dpos)const { Double_t dX, dY; gRandom->Rannor(dX, dY); dX *= dpos.X(); dY *= dpos.Y(); pos.SetX(pos.X() + dX); pos.SetY(pos.Y() + dY); pos.SetZ( gRandom->Gaus(pos.Z(), dpos.Z())); } ClassImp(PndDchIdealHitProducer)