//----------------------------------------------------------- // File and Version Information: // $Id$ // // Description: // Implementation of class TpcDigiAnalysisTask // see TpcDigiAnalysisTask.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 "TpcDigiAnalysisTask.h" // C/C++ Headers ---------------------- #include #include #include "TH1D.h" #include "TH2D.h" // Collaborating Class Headers -------- #include "FairRootManager.h" #include "FairRun.h" #include "FairRuntimeDb.h" #include "TClonesArray.h" #include "TpcDigi.h" #include "TpcDigiPar.h" #include "TpcDigiAge.h" #include "TpcFrontend.h" #include "TpcDigiMapper.h" // Class Member definitions ----------- TpcDigiAnalysisTask::TpcDigiAnalysisTask() : FairTask("TPC DigiAnalysis"), fpersistence(kFALSE) { fdigiBranchName = "TpcDigi"; } TpcDigiAnalysisTask::~TpcDigiAnalysisTask() { } InitStatus TpcDigiAnalysisTask::Init() { //Get ROOT Manager FairRootManager* ioman= FairRootManager::Instance(); if(ioman==0) { Error("TpcDigiAnalysisTask::Init","RootManager not instantiated!"); return kERROR; } // Get input collection fdigiArray=(TClonesArray*) ioman->GetObject(fdigiBranchName); if(fdigiArray==0) { Error("TpcDigiAnalysisTask::Init","Digi-array not found!"); return kERROR; } fhTimesOverThres=new TH1D("TimesOverThres","Total TimesOverThres",800,0,20000); fhContOT=new TH1D("ContOT","Continuous TimesOverThres",200,0,5000); fhTimesXY=new TH2D("TimesXY","TimesOverThres on Pads",420,-42.01,39.99,420,-42.01,39.99); fhTimesR=new TH2D("TimesR","TimesOverThres vs R",42,0,42,800,0,20000); fhContOTR=new TH2D("ContTimesR","Continuous TimesOverThres vs R",42,0,42,200,0,5000); fhDigiLengthR=new TH2D("DigiLengthR","DigiLength vs R",42,0,42,80,0,2000); fhDigiLengthXY=new TH2D("DigiLengthXY","DigiLength on Pads",420,-42.01,39.99,420,-42.01,39.99); ffrontend= fpar->getFrontend(); fmapper=TpcDigiMapper::getInstance(); return kSUCCESS; } void TpcDigiAnalysisTask::Exec(Option_t* opt) { std::cout<<"TpcDigiAnalysisTask::Exec"< times; std::map conttimes; std::map lastdigi; int ndigi=fdigiArray->GetEntriesFast(); std::cout<At(i); unsigned int padId=digi->padId(); double dt=ffrontend->dt(); double l=digi->tlength()*dt; meanl+=l; times[padId]+=l; double x=fmapper->getPad(padId)->x(); double y=fmapper->getPad(padId)->y(); double r=sqrt(x*x+y*y); fhDigiLengthR->Fill(r,l); fhDigiLengthXY->Fill(x,y,l); // check if last contiuous pulse is over if(lastdigi[padId]!=0){ TpcDigi* ldigi=(TpcDigi*)fdigiArray->At(lastdigi[padId]-1); if(digi->t()*dt-0.3*l>ldigi->t()*dt+(0.7*ldigi->tlength()+1.0)*dt){ fhContOT->Fill(conttimes[padId]); fhContOTR->Fill(r,conttimes[padId]); conttimes[padId]=0; } } lastdigi[padId]=i+1; // +1 to avoid putting 0 conttimes[padId]+=l; } // end loop over digis std::cout<::iterator it=times.begin(); while(it!=times.end()){ meantimeoverthres+=it->second; fhTimesOverThres->Fill(it->second); double x=fmapper->getPad(it->first)->x(); double y=fmapper->getPad(it->first)->y(); fhTimesXY->Fill(x,y,it->second); double r=sqrt(x*x+y*y); fhTimesR->Fill(r,it->second); ++it; } meantimeoverthres/=(double)times.size(); std::cout<<"Mean time over threshold: "<::iterator itc=conttimes.begin(); while(itc!=conttimes.end()){ meanctimeot+=itc->second; fhContOT->Fill(itc->second); double x=fmapper->getPad(itc->first)->x(); double y=fmapper->getPad(itc->first)->y(); double r=sqrt(x*x+y*y); fhContOTR->Fill(r,itc->second); ++itc; } meanctimeot/=(double)conttimes.size(); std::cout<<"Mean continuous time over threshold: "<GetRuntimeDb(); if ( ! db ) Fatal("SetParContainers", "No runtime database"); // Get Tpc digitisation parameter container fpar= (TpcDigiPar*) db->getContainer("TpcDigiPar"); if (! fpar ) Fatal("SetParContainers", "TpcDigiPar not found"); } void TpcDigiAnalysisTask::WriteHistos() { TFile* outfile=FairRootManager::Instance()->GetOutFile(); outfile->cd(); fhTimesOverThres->Write(); fhTimesXY->Write(); fhTimesR->Write(); fhDigiLengthR->Write(); fhDigiLengthXY->Write(); fhContOT->Write(); fhContOTR->Write(); } ClassImp(TpcDigiAnalysisTask)