//----------------------------------------------------------- // File and Version Information: // $Id$ // // Description: // Implementation of class PndTpcDigitizationPolicy // see PndTpcDigitizationPolicy.h for details // // Environment: // Software developed for the PANDA Detector at FAIR. // // Author List: // Sebastian Neubert TUM (original author) // // //----------------------------------------------------------- // This Class' Header ------------------ #include "PndTpcDigitizationPolicy.h" // Collaborating Class Headers -------- #include "TError.h" #include "PndTpcSignal.h" #include "PndTpcSignalAge.h" #include "PndTpcSample.h" #include "McIdCollection.h" #include "PndTpcFrontend.h" #include "PndTpcAbsPulseshape.h" // C/C++ Headers ---------------------- #include "assert.h" #include #include using std::numeric_limits; using std::vector; // Class Member definitions ----------- void PndTpcDigitizationPolicy::Digitize(vector< PndTpcSignal* >* Signals, vector< PndTpcSample* >* Samples, const PndTpcFrontend* Frontend, const PndTpcAbsPulseshape* pulseshape){ // Digitize // TODO: Refactorize the PadID out of this function! // Sort Signals according to PadID while preserving time order in one Pad sort(Signals->begin(),Signals->end(),PndTpcSignalComparePadID()); // when using PndTpcElectronicsTask this should not be necessary double tstep=Frontend->dt(); //std::cout << "tstep: " << tstep << std::endl; double t=0; double nextsignalt=std::numeric_limits::max(); assert(pulseshape!=0); std::vector::iterator it_Padbegin=Signals->begin(); std::vector::iterator it_Padend=Signals->begin(); unsigned int iPadbegin=0; unsigned int iPadend=0; unsigned int nSignals=Signals->size(); unsigned int PadID=(*it_Padbegin)->padId(); double tint=Frontend->tint(); //use for a rough estimate on how many samples should be at least tried const int nMinSamplesTrys = (int)(tint/tstep); // necessary because if only one signal is there, the time of this signal // will be to early to get something else from pulseshape->value than zero //std::cout << "nMinSamplesTrys: " << nMinSamplesTrys << std::endl; while(iPadendpadId(); if(newPadID!=PadID || iPadend+1==nSignals){ // process the last pad // sort the signals on this pad in time //std::cout << "PadIDs: " << newPadID << " " << PadID << std::endl; sort(it_Padbegin+iPadbegin,it_Padend+(iPadend),PndTpcSignalAge()); t=Frontend->TimeAtClock((*Signals)[iPadbegin]->t()); unsigned int iSig=iPadbegin; while(iSig<=iPadend){//loop over signals on one pad if(iSigTimeAtClock((*Signals)[iSig+1]->t()); int nSamplesTrys=0; while(tvalue(t,sig->amp(),sig->t()); //std::cout << "value: " << pulseshape->value(t,sig->amp(),sig->t()) << " t: " << t; //std::cout << " sig->amp(): " << sig->amp() << " sig->t(): " << sig->t() << std::endl; mcid.AddID(sig->mcId()); } //std::cout << "amp: " << amp << " ADCThreshold: " << Frontend->adcThreshold() << std::endl; if(amp>Frontend->adcThreshold()) Samples->push_back(new PndTpcSample(Frontend->Clock(t), Frontend->A2D(amp), PadID, mcid.DominantID())); else if (nSamplesTrys > nMinSamplesTrys) { t=nextsignalt; break; } t+=tstep; nSamplesTrys++; } ++iSig; }// end loop over Signals on one pad // cleanup signals on current pad //iSig=iPadbegin; //while(iSig