//----------------------------------------------------------- // File and Version Information: // $Id$ // // Description: // Implementation of class PndTpcClusterFinderTask // see PndTpcClusterFinderTask.hh for details // // Environment: // Software developed for the PANDA Detector at FAIR. // // Author List: // Sebastian Neubert TUM (original author) // // //----------------------------------------------------------- // Panda Headers ---------------------- // This Class' Header ------------------ #include "PndTpcClusterFinderTask.h" // C/C++ Headers ---------------------- #include #include // Collaborating Class Headers -------- #include "FairRootManager.h" #include "FairRunAna.h" #include "FairRuntimeDb.h" #include "PndTpcDigiPar.h" #include "TClonesArray.h" #include "PndTpcDigi.h" #include "PndTpcDigiAge.h" #include "PndTpcFrontend.h" #include "PndTpcGas.h" #include "PndTpcGem.h" #include "PndTpcPadPlane.h" #include "PndTpcDigiMapper.h" #include "GFRecoHitFactory.h" #include "PndTpcClusterFinder.h" // Class Member definitions ----------- PndTpcClusterFinderTask::PndTpcClusterFinderTask() : FairTask("TPC Cluster Finder"), fpersistence(kFALSE),ftrivial(kFALSE), ftimeslice(2), fmode(0) { fdigiBranchName = "PndTpcDigi"; } PndTpcClusterFinderTask::~PndTpcClusterFinderTask() {} void PndTpcClusterFinderTask::SetParContainers() { std::cout<<"PndTpcClusterFinderTask::SetParContainers"<GetRuntimeDb(); if ( ! db ) Fatal("SetParContainers", "No runtime database"); // Get PndTpc digitisation parameter container fpar= (PndTpcDigiPar*) db->getContainer("PndTpcDigiPar"); if (! fpar ) Fatal("SetParContainers", "PndTpcDigiPar not found"); } InitStatus PndTpcClusterFinderTask::Init() { //Get ROOT Manager FairRootManager* ioman= FairRootManager::Instance(); if(ioman==0) { Error("PndTpcClusterFinderTask::Init","RootManager not instantiated!"); return kERROR; } // Get input collection fdigiArray=(TClonesArray*) ioman->GetObject(fdigiBranchName); if(fdigiArray==0) { Error("PndTpcClusterFinderTask::Init","Digi-array not found!"); return kERROR; } // create and register output array fclusterArray = new TClonesArray("PndTpcCluster"); ioman->Register("PndTpcCluster","PndTpc",fclusterArray,fpersistence); //TODO: Get this from Database! fpar->printParams(); ffrontend= fpar->getFrontend(); fpadplane= fpar->getPadPlane(); fgas= fpar->getGas(); fzGem= fpar->getZGem(); double sf= fpar->getFrontend()->samplingFrequency(); double t0= fpar->getFrontend()->t0(); PndTpcDigiMapper::getInstance(false)->init(fpadplane,fgem,fgas,fzGem,t0,sf); fcluster_buffer=new std::vector; ffinder=new PndTpcClusterFinder(PndTpcDigiMapper::getInstance()->getPadPlane(), fcluster_buffer, ftimeslice, fmode); ffinder->checkConsistency(); ffinder->setTrivialClustering(ftrivial); return kSUCCESS; } void PndTpcClusterFinderTask::Exec(Option_t* opt) { std::cout<<"PndTpcClusterFinderTask::Exec"<Delete(); ffinder->reset(); //for sorting std::vectordigis; // For now: trivial clustering; Int_t ndigis=fdigiArray->GetEntriesFast(); for(Int_t i=0;iAt(i); digis.push_back(digi); } ffinder->process(digis); //sort(digis.begin(),digis.end(),PndTpcDigiAge()); /*for(Int_t i=0;imap(digi,pos); PndTpcCluster* c=new((*fclusterArray)[i]) PndTpcCluster(pos,digi->amp()); c->SetMcId(digi->mcId().DominantID()); }*/ // put clusters into array and clean up buffer unsigned int ncl=fcluster_buffer->size(); unsigned int ndig=0; for(unsigned int icl=0;iclSetIndex(icl); ndig+=(*fcluster_buffer)[icl]->size(); delete (*fcluster_buffer)[icl]; } std::cout<GetEntriesFast()<<" cluster created " <<" containing "<clear(); digis.clear(); return; } ClassImp(PndTpcClusterFinderTask)