//----------------------------------------------------------- // File and Version Information: // $Id$ // // Description: // Implementation of class TpcElectronicsTask // see TpcElectronicsTask.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 "TpcElectronicsTask.h" // C/C++ Headers ---------------------- #include #include #include "TGraph.h" #include "TROOT.h" #include "TSystem.h" #include "TCanvas.h" #include "TLine.h" #include "TApplication.h" // Collaborating Class Headers -------- #include "CbmRootManager.h" #include "TClonesArray.h" #include "TpcSignal.h" #include "TpcSample.h" #include "TpcDigi.h" #include "TpcDigiAge.h" #include "TpcFrontend.h" #include "TpcSimplePSAStrategy.h" #include "TpcDigitizationPolicy.h" #include "TpcCRRCPulseshape.h" #include "TpcPSAplot.h" // Class Member definitions ----------- TpcElectronicsTask::TpcElectronicsTask() : CbmTask("TPC Electronics response"), _persistence(kFALSE),_adcthres(100), _adcmax(100000), _adcbits(10), _samplefreq(40), _t0(-60000), _timebits(30), _psathres(10), _tdiff(50), _tint(50), _tsig(0.01) { _signalBranchName = "TpcSignal"; } TpcElectronicsTask::~TpcElectronicsTask() { if(_frontend!=0)delete _frontend; if(_psa!=0)delete _psa; } InitStatus TpcElectronicsTask::Init() { //Get ROOT Manager CbmRootManager* ioman= CbmRootManager::Instance(); if(ioman==0) { Error("TpcElectronicsTask::Init","RootManager not instantiated!"); return kERROR; } // Get input collection _signalArray=(TClonesArray*) ioman->GetObject(_signalBranchName); if(_signalArray==0) { Error("TpcElectronicsTask::Init","Signal-array not found!"); return kERROR; } // create and register output array _digiArray = new TClonesArray("TpcDigi"); ioman->Register("TpcDigi","Tpc",_digiArray,_persistence); //TODO: Get this from Database! _frontend= new TpcFrontend(_adcthres, // AdcThreshold _adcmax, // adcmax _adcbits, // adcbits _samplefreq, // SamplingFreq_Mhz _t0, // t0 _timebits, // timebits _psathres); // PSAthreshold _pulseshape= new TpcCRRCPulseshape(_tdiff,_tint,_tsig); // tdiff,tint,tsig _psa= new TpcSimplePSAStrategy(_psathres); // threshold (in adc channels) return kSUCCESS; } void TpcElectronicsTask::Exec(Option_t* opt) { std::cout<<"TpcElectronicsTask::Exec"<Delete(); //partition data according to pads std::cout<<"Building up padmap ..."; std::map* > padmap; Int_t ns=_signalArray->GetEntriesFast(); for(Int_t is=0;isAt(is); unsigned int id=sig->padId(); if(padmap[id]==NULL)padmap[id]=new std::vector; padmap[id]->push_back(sig); } std::cout<<"finished. "<Clear(); // process each pad individually: std::map* >::iterator padIt=padmap.begin(); int counter=0; while(padIt!=padmap.end()){ if(counter++%5000==0){ std::cout<<"."; std::cout.flush(); } // --- ADC ------------------------------------------ std::vector* sv=padIt->second; std::vector samplelist; TpcDigitizationPolicy().Digitize(sv,&samplelist,_frontend,_pulseshape); // cleanup signals int nsig=sv->size(); //for(int isig=0; isigclear(); //std::cout< digis; _psa->Process(samplelist,digis); int nsamp=samplelist.size(); int ndigi=digis.size(); /* for(int i=0;iamp() << " " << digis[i]->t() << " " << digis[i]->padId() << std::endl; } for(int iSig=0;iSigt() << " " << _frontend->ClockFine( ((*sv)[iSig])->t() ) << std::endl; } if(nsamp>0) { TpcPSAplot myplot(&samplelist,&digis,sv,_frontend); myplot.Draw(); } */ sv->clear(); // cleanup samples for(int isamp=0;isampGetEntriesFast(); for(int idigi=0;idigiGetEntriesFast()<<" Digis created"<