//-------------------------------------------------------------------------- // File and Version Information: // $Id:$ // // Description: // This module takes Clusters (Connected Regions) and slits them // up into Bumps. There are defined by local maxima // // Environment: // Software developed for the BaBar Detector at the SLAC B-Factory. // Adapted for the PANDA experiment at GSI // // Author List: // Stephen J. Gowdy University of Edinburgh // Phil Strother Imperial College // // Dima Melnychuk, adaption for PANDA //------------------------------------------------------------------------ //----------------------- // This Class's Header -- //----------------------- #include "PndEmcMakeBump.h" //------------------------------- // Collaborating Class Headers -- //------------------------------- #include "PndEmcStructure.h" #include "PndEmcMapper.h" #include "PndEmcDigiPar.h" #include "PndEmcRecoPar.h" #include "PndEmcBump.h" #include "PndEmcCluster.h" #include "PndEmcDigi.h" #include "PndEmc2DLocMaxFinder.h" #include "PndEmcExpClusterSplitter.h" #include "PndEmcTwoCoordIndex.h" #include "CbmRootManager.h" #include "CbmRunAna.h" #include "CbmRuntimeDb.h" #include "TClonesArray.h" #include "TROOT.h" //--------------- // C++ Headers -- //--------------- #include #include #include using std::endl; using std::cout; Int_t PndEmcMakeBump::fEventCounter=0; //---------------- // Constructors -- //---------------- PndEmcMakeBump::PndEmcMakeBump(Int_t verbose) { fVerbose=verbose; } //-------------- // Destructor -- //-------------- PndEmcMakeBump::~PndEmcMakeBump() { } // ----- Public method Init ------------------------------- InitStatus PndEmcMakeBump::Init() { // Get RootManager CbmRootManager* ioman = CbmRootManager::Instance(); if ( ! ioman ) { cout << "-E- PndEmcMakeBump::Init: " << "RootManager not instantiated!" << endl; return kFATAL; } // Get input array fClusterArray = (TClonesArray*) ioman->GetObject("EmcCluster"); if ( ! fClusterArray ) { cout << "-W- PndEmcMakeBump::Init: " << "No PndEmcCluster array!" << endl; return kERROR; } // Create and register output array fBumpArray = new TClonesArray("PndEmcBump"); ioman->Register("EmcBump","Emc",fBumpArray,kTRUE); // fSharedDigiArray = new TClonesArray("PndEmcDigi"); // ioman->Register("EmcSharedDigi","Emc",fSharedDigiArray,kTRUE); // Geometry loading TGeoManager *geoMan = (TGeoManager*) gROOT->FindObject("CBMGeom"); fMapVersion=fDigiPar->GetMapperVersion(); PndEmcMapper::Instance(fMapVersion); PndEmcStructure::Instance(geoMan); // Fill structure with parameters from RunTime DB for local maximum finder PndEmc2DLocMaxFinderData locMaxData; locMaxData.MaxECut=fRecoPar->GetMaxECut(); locMaxData.NeighbourECut=fRecoPar->GetNeighbourECut(); locMaxData.CutSlope=fRecoPar->GetCutSlope(); locMaxData.CutOffset=fRecoPar->GetCutOffset(); locMaxData.ERatioCorr=fRecoPar->GetERatioCorr(); locMaxData.TheNeighbourLevel=fRecoPar->GetTheNeighbourLevel(); // Create PndEmc2DLocMaxFinder object with correspondent parameters theLocalMaxFinder = new PndEmc2DLocMaxFinder(locMaxData,fVerbose); // Fill structure with parameters from RunTime DB for bump splitter PndEmcExpClusterSplitterData expClusterSplitterData; expClusterSplitterData.MoliereRadius=fRecoPar->GetMoliereRadius(); expClusterSplitterData.ExponentialConstant=fRecoPar->GetExponentialConstant(); expClusterSplitterData.MaxIterations=fRecoPar->GetMaxIterations(); expClusterSplitterData.CentroidShift=fRecoPar->GetCentroidShift(); expClusterSplitterData.MaxBumps=fRecoPar->GetMaxBumps(); expClusterSplitterData.MinDigiEnergy=fRecoPar->GetMinDigiEnergy(); // Create PndEmcExpClusterSplitter object with correspondent parameters theClusterSplitter = new PndEmcExpClusterSplitter(expClusterSplitterData,fVerbose); cout << "-I- PndEmcMakeBump: Intialization successfull" << endl; return kSUCCESS; } void PndEmcMakeBump::Exec(Option_t* opt) { // Reset output array if ( ! fBumpArray ) Fatal("Exec", "No Bump Array"); fBumpArray->Delete(); // if ( ! fSharedDigiArray ) Fatal("Exec", "No SharedDigi Array"); // fSharedDigiArray->Delete(); Int_t nClusters = fClusterArray->GetEntriesFast(); //loop over Clusters for (Int_t iCluster=0; iClusterAt(iCluster); theCluster->ValidateDigiMap(); // we need it since fMemberDigiMap is transient element Int_t NDigis = theCluster->numberOfDigis(); std::vector theBumps; const EmcCoordIndexSet & emcMaxDigis(theLocalMaxFinder->findMaxima(theCluster)); theClusterSplitter->splitCluster(emcMaxDigis, theCluster, theBumps); if (fVerbose>=1) { std::cout<<"Energy of the cluster = "<energy()<GetRuntimeDb(); if ( ! db ) Fatal("SetParContainers", "No runtime database"); // Get Emc digitisation parameter container fDigiPar = (PndEmcDigiPar*) db->getContainer("PndEmcDigiPar"); // Get Emc reconstruction parameter container fRecoPar = (PndEmcRecoPar*) db->getContainer("PndEmcRecoPar"); } ClassImp(PndEmcMakeBump)