#include "CbmKolkataDetectorHitProducerSmearing.h" #include "CbmKolkataDetectorPoint.h" #include "CbmKolkataDetectorHit.h" #include "CbmKolkataDetectorDigiPar.h" #include "FairRunAna.h" #include "FairRuntimeDb.h" #include "TClonesArray.h" #include "TRandom.h" // ---- Default constructor ------------------------------------------- CbmKolkataDetectorHitProducerSmearing::CbmKolkataDetectorHitProducerSmearing() :FairTask("CbmKolkataDetectorHitProducerSmearing"), fPointsArray(NULL), fHitsArray(new TClonesArray("CbmKolkataDetectorHit",100)), fDigiPar(NULL), fXSmearing(), fYSmearing() { fLogger->Debug(MESSAGE_ORIGIN,"Default Constructor of CbmKolkataDetectorHitProducerSmearing"); } // ---- Destructor ---------------------------------------------------- CbmKolkataDetectorHitProducerSmearing::~CbmKolkataDetectorHitProducerSmearing() { fLogger->Debug(MESSAGE_ORIGIN,"Destructor of CbmKolkataDetectorHitProducerSmearing"); fHitsArray->Delete(); delete fHitsArray; } // ---- Initialisation ---------------------------------------------- void CbmKolkataDetectorHitProducerSmearing::SetParContainers() { fLogger->Debug(MESSAGE_ORIGIN,"SetParContainers of CbmKolkataDetectorHitProducerSmearing"); // Load all necessary parameter containers from the runtime data base FairRunAna* ana = FairRunAna::Instance(); FairRuntimeDb* rtdb=ana->GetRuntimeDb(); fDigiPar = (CbmKolkataDetectorDigiPar*) (rtdb->getContainer("CbmKolkataDetectorDigiPar")); } // ---- Init ---------------------------------------------------------- InitStatus CbmKolkataDetectorHitProducerSmearing::Init() { fLogger->Debug(MESSAGE_ORIGIN,"Initilization of CbmKolkataDetectorHitProducerSmearing"); // Get a handle from the IO manager FairRootManager* ioman = FairRootManager::Instance(); // Get a pointer to the previous already existing data level fPointsArray = (TClonesArray*) ioman->GetObject("CbmKolkataDetectorPoint"); if ( ! fPointsArray ) { fLogger->Error(MESSAGE_ORIGIN,"No CbmKolkataDetectorPoint array!\n CbmKolkataDetectorHitProducerSmearing will be inactive"); return kERROR; } // Create the TClonesArray for the output data and register // it in the IO manager // fHitsArray = new TClonesArray("CbmKolkataDetectorHit", 100); ioman->Register("CbmKolkataDetectorHit","CbmKolkataDetHit",fHitsArray,kTRUE); // Do whatever else is needed at the initilization stage // Create histograms to be filled // initialize variables Int_t noLayers = fDigiPar->GetNrOfLayers(); fXSmearing.Set(noLayers); fYSmearing.Set(noLayers); for (Int_t i=0; iGetXSmearing(i),i); fYSmearing.AddAt(fDigiPar->GetYSmearing(i),i); fLogger->Info(MESSAGE_ORIGIN,"X-Smearing for detector layer %i: %f",i+1,fDigiPar->GetXSmearing(i)); fLogger->Info(MESSAGE_ORIGIN,"X-Smearing for detector layer %i: %f",i+1,fXSmearing.At(i)); fLogger->Info(MESSAGE_ORIGIN,"Y-Smearing for detector layer %i: %f",i+1,fYSmearing.At(i)); } return kSUCCESS; } // ---- ReInit ------------------------------------------------------- InitStatus CbmKolkataDetectorHitProducerSmearing::ReInit() { fLogger->Debug(MESSAGE_ORIGIN,"Initilization of CbmKolkataDetectorHitProducerSmearing"); return kSUCCESS; } // ---- Exec ---------------------------------------------------------- void CbmKolkataDetectorHitProducerSmearing::Exec(Option_t* option) { fLogger->Debug(MESSAGE_ORIGIN,"Exec of CbmKolkataDetectorHitProducerSmearing"); fHitsArray->Delete(); // fill the map CbmKolkataDetectorPoint *point = NULL; CbmKolkataDetectorHit *hit = NULL; for(int iPoint = 0; iPoint < fPointsArray->GetEntriesFast(); iPoint++) { point = (CbmKolkataDetectorPoint*) fPointsArray->At(iPoint); if(!point) continue; TVector3 position; point->Position(position); TVector3 dposition; // simulate the detector response: smear position with gaussians dposition.SetXYZ(0.05, 0.05, 0.); position.SetXYZ(gRandom->Gaus(position.X(), 0.05), gRandom->Gaus(position.Y(), 0.05), position.Z()); hit = new ((*fHitsArray)[iPoint]) CbmKolkataDetectorHit(point->GetDetectorID(), iPoint, position, dposition); } } // ---- Finish -------------------------------------------------------- void CbmKolkataDetectorHitProducerSmearing::Finish() { fLogger->Debug(MESSAGE_ORIGIN,"Finish of CbmKolkataDetectorHitProducerSmearing"); } ClassImp(CbmKolkataDetectorHitProducerSmearing)