///////////////////////////////////////////////////////////// // // CbmEmcHitProducer // // Filler of CbmEmcHit // // Created 14/08/06 by S.Spataro // /////////////////////////////////////////////////////////////// #include "TClonesArray.h" #include "CbmRootManager.h" #include "CbmRunAna.h" #include "CbmRuntimeDb.h" #include "CbmDetector.h" #include "CbmEmcHitProducer.h" #include "EmcStructure.h" #include "EmcMapper.h" #include "CbmEmcHit.h" #include "CbmEmcPoint.h" #include "EmcDigiPar.h" #include "TGeoManager.h" #include "CbmEmcReader.h" #include "TGeoVolume.h" #include "TGeoNode.h" #include "TGeoMatrix.h" #include "TVector3.h" #include "CbmRun.h" #include "CbmRuntimeDb.h" #include // ----- Default constructor ------------------------------------------- CbmEmcHitProducer::CbmEmcHitProducer(string fileGeo) : CbmTask("Ideal EMC hit Producer") { fFileGeo=fileGeo; //eneThr = 0.001; // Energy threshold for emc pad (Now taken from DB) } // ------------------------------------------------------------------------- // ----- Destructor ---------------------------------------------------- CbmEmcHitProducer::~CbmEmcHitProducer() { } // ------------------------------------------------------------------------- // ----- Public method Init -------------------------------------------- InitStatus CbmEmcHitProducer::Init() { cout << " INITIALIZATION *********************" << endl; //CbmDetector::Initialize(); //CbmRun* sim = CbmRun::Instance(); //CbmRuntimeDb* rtdb=sim->GetRuntimeDb(); // Get RootManager CbmRootManager* ioman = CbmRootManager::Instance(); if ( ! ioman ) { cout << "-E- CbmEmcHitProducer::Init: " << "RootManager not instantiated!" << endl; return kFATAL; } // Get input array fPointArray = (TClonesArray*) ioman->GetObject("EmcPoint"); if ( ! fPointArray ) { cout << "-W- CbmEmcHitProducer::Init: " << "No EmcPoint array!" << endl; return kERROR; } // Create and register output array fDigiArray = new TClonesArray("CbmEmcHit"); ioman->Register("EmcHit","Emc",fDigiArray,kTRUE); // EmcMapper should be instantiated before EmcStructure int map_ver=0; if (!fFileGeo.compare("emc_module12345.dat")) { map_ver=1; } else { Fatal("CbmEmcHitProducer::Init()", "Mapper for the given geometry file is not defined"); } EmcMapper *map=EmcMapper::Instance(map_ver); fEmcStr=EmcStructure::Instance(fFileGeo); emcX=fEmcStr->GetEmcX(); emcY=fEmcStr->GetEmcY(); emcZ=fEmcStr->GetEmcZ();; emcTheta=fEmcStr->GetEmcTheta();; emcPhi=fEmcStr->GetEmcPhi();; emcTau=fEmcStr->GetEmcTau();; eneThr =fDigiPar->GetEnergyThresholdHit(); cout<<"Energy threshold = "<GetRuntimeDb(); if ( ! db ) Fatal("SetParContainers", "No runtime database"); // Get Emc digitisation parameter container fDigiPar = (EmcDigiPar*) db->getContainer("EmcDigiPar"); } // ------------------------------------------------------------------------- // ----- Public method Exec -------------------------------------------- void CbmEmcHitProducer::Exec(Option_t* opt) { //cout << " DIGI EXECUTION *********************" << endl; // Reset output array if ( ! fDigiArray ) Fatal("Exec", "No DigiArray"); fDigiArray->Clear(); // Declare some variables CbmEmcPoint* point = NULL; map fTrackEnergy; map fTrackTime; //time of first point fTrackEnergy.clear(); fTrackTime.clear(); map::const_iterator p; std::vector fPointList;// to pass to EmcHit // Loop over EmcPoints Int_t nPoints = fPointArray->GetEntriesFast(); Double_t point_time; for (Int_t iPoint=0; iPointAt(iPoint); fTrackEnergy[point->GetDetectorID()] += point->GetEnergyLoss(); point_time=point ->GetTime(); if (point_timeGetDetectorID()]) fTrackTime[point->GetDetectorID()] =point_time; } // Loop over EmcPoint // Loop to register EmcHit for(p=fTrackEnergy.begin(); p!=fTrackEnergy.end(); ++p) { if ((*p).second>eneThr) AddHit(1, (*p).first, (*p).second, fTrackTime[(*p).first]); } } // ------------------------------------------------------------------------- // ----- Private method AddDigi -------------------------------------------- CbmEmcHit* CbmEmcHitProducer::AddHit(Int_t trackID,Int_t detID, Float_t energy, Float_t time){ // It fills the CbmEmcHit category //cout << "CbmEmcHitProducer: track " << trackID << " evt " << eventID << " sec " << sec << " plane " << pla << " strip " << strip << "box " << box << " tube " << tub << endl; TClonesArray& clref = *fDigiArray; Int_t size = clref.GetEntriesFast(); return new(clref[size]) CbmEmcHit(trackID, detID, energy, time, emcX[detID], emcY[detID], emcZ[detID], emcTheta[detID], emcPhi[detID], emcTau[detID]); } // ---- ClassImp(CbmEmcHitProducer)