// ------------------------------------------------------------------------- // ----- PndMvdStripClusterBuilder source file ----- // ----- Converted 27.11.2007 from R.Jaekel by R.Kliemt ----- // ------------------------------------------------------------------------- #include "PndMvdStripClusterBuilder.h" // includes for sort algorithms #include #include #include #include "TMath.h" #include "math.h" // enum SensorSide { kTOP, kBOTTOM }; PndMvdStripClusterBuilder::PndMvdStripClusterBuilder() { // dummy } PndMvdStripClusterBuilder::~PndMvdStripClusterBuilder() { } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ void PndMvdStripClusterBuilder::Reinit() { fSortedDigis.clear(); fClusters.clear(); fTopclusters.clear(); fBotclusters.clear(); fLeftDigis.clear(); } void PndMvdStripClusterBuilder::AddDigi(std::string detName, SensorSide side, Int_t strip, Int_t iPoint) { fSortedDigis[detName][side][strip] = iPoint; } std::vector< PndMvdCluster > PndMvdStripClusterBuilder::SearchClusters() { /// ----- search for clusters ----- /// Take neighbouring fired strips. fClusters.clear(); fTopclusters.clear(); fBotclusters.clear(); std::vector< Int_t > onecluster; Indexpair::iterator tempStrip; //fSortedDigis[sensor][side][stripnr]=digiindex for (Fullmap::iterator itSensors = fSortedDigis.begin(); itSensors != fSortedDigis.end(); ++itSensors) { for (std::map::iterator itSide = (itSensors->second).begin(); itSide != (itSensors->second).end(); ++itSide) { // std::cout<<"clsterfinder: "; // if(itSide->first == kTOP) std::cout<<"top"<second).begin(); itStrip!= (itSide->second).end(); ++itStrip) {flagmap[itStrip->second]=1;} for (Indexpair::iterator itStrip = (itSide->second).begin(); itStrip!= (itSide->second).end();itStrip++) { tempStrip=itStrip; if( !(1==flagmap[itStrip->second]) ) continue; for(Indexpair::iterator itStrip3 = itStrip; itStrip3 != (itSide->second).end(); ++itStrip3) { if( !(1==flagmap[itStrip3->second]) ) continue; if( fabs(tempStrip->first - itStrip3->first) > 1) continue; // TODO parametrize this? onecluster.push_back(itStrip3->second); flagmap[itStrip3->second]=-1;//do not reuse this digi tempStrip=itStrip3; // std::cout<<"add strip "<first << " from digi "<second <first); onecluster.clear(); } // end loop itStrip if (onecluster.size()>0) { std::cout<<"mvd strip clusterfinder: cluster hangover? "<first); onecluster.clear(); } for (Indexpair::iterator itflag = flagmap.begin(); itflag!= flagmap.end(); ++itflag) { if (1==itflag->second) fLeftDigis.push_back(itflag->first); } }// end loop it Side }// end loop sensor return fClusters; } PndMvdCluster PndMvdStripClusterBuilder::GetCluster(Int_t i) { if(0<=i && fClusters.size() < i) return fClusters[i]; } PndMvdCluster PndMvdStripClusterBuilder::GetTopCluster(Int_t i) { if(0<=i && fTopclusters.size() < i) return fClusters[ (fTopclusters[i]) ]; } PndMvdCluster PndMvdStripClusterBuilder::GetBotCluster(Int_t i) { if(0<=i && fBotclusters.size() < i) return fClusters[ (fBotclusters[i]) ]; } void PndMvdStripClusterBuilder::AddCluster(const std::vector< Int_t >& onecluster,SensorSide side) { Int_t clindex = fClusters.size(); if(side == kBOTTOM) { fBotclusters.push_back(clindex); // std::cout<<"Adding Cluster number "<& list){ // double mean = 0.; // if (list.size() == 0){ // std::cout<<" there are no channels in list to form cluster!"<getTot(); // sumChannel += list[loopList]->getTot() * list[loopList]->getColumn(); // } // // calc the weighted mean // mean = sumChannel/sumWeights; // } // return mean; // } // // // double PndMvdStripClusterBuilder::errMeanColumn(std::vector& list, double pitch){ // // // only geometric resolution so far.... // double errMean = list.size()*pitch/sqrt(12); // return errMean; // }