//----------------------------------------------------------- // 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=fpproc.begin(); while(ipad!=fpproc.end()){ delete ipad->second; ++ipad; } fpproc.clear(); } void PndTpcSectorProcessor::Init(PndTpcPadPlane* p, unsigned int id, std::vector* ob) { fpadplane=p; fSectorId=id; foutput_buffer=ob; // Build PadProcessors std::map* pads=fpadplane->GetSectorList(fSectorId); std::map::iterator ipad=pads->begin(); while(ipad!=pads->end()){ fpproc[ipad->second->id()]=new padprocessor(ipad->second->id()); fpproc[ipad->second->id()]->setClusterBuffer(&fcluster_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(fpproc[neighID]!=0){ fpproc[ipad->second->id()]->addNeighbour(fpproc[neighID]); //cout << "Pad " << ipad->second->id() << " connects to Pad " << neighID <0)std::cout<padId()<GetPad((fdigi_buffer[i])->padId())->sectorId(); //std::cout<<"in sector digisid="<padId()]; assert(pp!=NULL); pp->setData(fdigi_buffer[i]); // activate pad processor by putting it into active list // this way only thos pads that have been hit are processing factivepads[fdigi_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=factivepads.begin(); for(;ip!=factivepads.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"<::iterator ppit=factivepads.begin(); while(ppit!=factivepads.end()){ //std::cout<<"still "<second->ndata()<<" data on padproc"<second->reset(); ++ppit; } factivepads.clear(); } void PndTpcSectorProcessor::cog(){ assert(fpadplane!=NULL); assert(foutput_buffer!=NULL); // Calculate COG for(unsigned int ic=0;ic* digis=fcluster_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(;idamp(); mcid.AddIDCollection(adigi->mcId(),a); 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); mcid.Renormalize(); cl->SetMcId(mcid); // loop again over the digis to calculate 2nd moment TMatrixD cov(3,3); for(id=0;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; cl->addDigi(*adigi); } cov*=1./(double)ndigis; cl->SetCov(cov); foutput_buffer->push_back(cl); } }