//----------------------------------------------------------- // File and Version Information: // $Id$ // // Description: // Implementation of class PndTpcSectorProcessor // see PndTpcSectorProcessor.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 "PndTpcSectorProcessor.h" // C/C++ Headers ---------------------- #include #include "assert.h" // Collaborating Class Headers -------- #include "PndTpcPadPlane.h" #include "PndTpcDigiMapper.h" #include "TORPadProcessor.h" #include "PndTpcCluster.h" #include "TMatrixD.h" // Class Member definitions ----------- PndTpcSectorProcessor::~PndTpcSectorProcessor() { // clean up PadProcessors std::map::iterator ipad=_pproc.begin(); while(ipad!=_pproc.end()){ delete ipad->second; ++ipad; } _pproc.clear(); } void PndTpcSectorProcessor::Init(PndTpcPadPlane* p, unsigned int id, std::vector* ob) { _padplane=p; _SectorId=id; _output_buffer=ob; // Build PadProcessors std::map* pads=_padplane->GetSectorList(_SectorId); std::map::iterator ipad=pads->begin(); while(ipad!=pads->end()){ _pproc[ipad->second->id()]=new padprocessor(ipad->second->id()); _pproc[ipad->second->id()]->setClusterBuffer(&_cluster_buffer); ++ipad; } // Connect PadProcessor neighbours ipad=pads->begin(); while(ipad!=pads->end()){ unsigned int nneighb=ipad->second->nNeighbours(); for(unsigned int in=0; insecond->getNeighbour(in); if(_pproc[neighID]!=0){ _pproc[ipad->second->id()]->addNeighbour(_pproc[neighID]); //cout << "Pad " << ipad->second->id() << " connects to Pad " << neighID <0)std::cout<padId()<GetPad((_digi_buffer[i])->padId())->sectorId(); //std::cout<<"in sector digisid="<padId()]; assert(pp!=NULL); pp->setData(_digi_buffer[i]); // activate pad processor by putting it into active list // this way only thos pads that have been hit are processing _activepads[_digi_buffer[i]->padId()]=pp; } // end loop over digis // run padProcessors // TODO: stop criterion, how many heartbeats???? bool GoOn=true; int counter=0; while(GoOn && counter<40){ //cout<<"beat! ***************"<::iterator ip=_activepads.begin(); for(;ip!=_activepads.end(); ++ip){ std::string nextstate=ip->second->heartbeat(); if(nextstate!="end"){ GoOn=true; //std::cout<<"padproc_"<first<<" in state: "<size(); } int dif=(int)ndigis-(int)numdig; if(numdig!=ndigis)std::cout<<"SectorProc"<<_SectorId <<" lost "<::iterator ppit=_activepads.begin(); while(ppit!=_activepads.end()){ //std::cout<<"still "<second->ndata()<<" data on padproc"<second->reset(); ++ppit; } _activepads.clear(); } void PndTpcSectorProcessor::cog(){ assert(_padplane!=NULL); assert(_output_buffer!=NULL); // Calculate COG for(unsigned int ic=0;ic<_cluster_buffer.size();++ic){ std::vector* digis=_cluster_buffer[ic]; TVector3 pos(0,0,0); double amp=0; TVector3 sig(0,0,0); unsigned int id=0; McIdCollection mcid; unsigned int ndigis=digis->size(); for(;idmcId()); double a=(double)adigi->amp(); TVector3 thispos; PndTpcDigiMapper::getInstance()->map(adigi,thispos); double dx; double dy; PndTpcDigiMapper::getInstance()->padsize(adigi->padId(),dx,dy); McId dummyID(1,1); McIdCollection dummyColl; dummyColl.AddID(dummyID); //this block is to define the z jitter TVector3 zDiff1,zDiff2; PndTpcDigi zDiffDigi1(1,1,1,dummyColl),zDiffDigi2(1,2,1,dummyColl); PndTpcDigiMapper::getInstance()->map(&zDiffDigi1,zDiff1); PndTpcDigiMapper::getInstance()->map(&zDiffDigi2,zDiff2); double zDiff = zDiff2.z() - zDiff1.z(); //end of z jitter double Dl = PndTpcDigiMapper::getInstance()->getGas()->Dl(); double Dt = PndTpcDigiMapper::getInstance()->getGas()->Dt(); double driftl=thispos.z()-PndTpcDigiMapper::getInstance()->zGem(); //assert(driftl>=0); double absdriftl=fabs(driftl); double diffSigmaL = Dl * sqrt(absdriftl); double diffSigmaT = Dt * sqrt(absdriftl); double sigmaX_sq = dx*dx/12. + diffSigmaT*diffSigmaT; double sigmaY_sq = dy*dy/12. + diffSigmaT*diffSigmaT; double sigmaZ_sq = zDiff*zDiff/12. + diffSigmaL*diffSigmaL; TVector3 thissig(sigmaX_sq,sigmaY_sq,sigmaZ_sq); sig+=a*a*thissig; pos+=a*thispos; amp+=a; } pos*=1./amp; sig.SetX(sqrt(sig.X())/amp); sig.SetY(sqrt(sig.Y())/amp); sig.SetZ(sqrt(sig.Z())/amp); PndTpcCluster* cl=new PndTpcCluster(pos,sig,amp,id,ndigis); cl->SetMcId(mcid); // loop again over the digis to calculate 2nd moment TMatrixD cov(3,3); for(;idmap(adigi,thispos); TMatrixD c(3,1); for(int i=0; i<3; ++i)c[i][0]=thispos[i]-pos[i]; TMatrixD c_t(TMatrixD::kTransposed,c); TMatrixD acov(c,TMatrixD::kMult,c_t); cov+=acov; } cov*=1./(double)ndigis; cl->SetCov(cov); _output_buffer->push_back(cl); } }