// -------------------------------------------------------------------------------------- // ----- CbmRichRingFinderTrack source file ----- // ----- implementation: Simeon Lebedev (salebedev@jinr.ru) ----- // ------------------------------------------------------------------------- #include "CbmRichRingFinderTrack.h" #include "CbmRichHit.h" #include "CbmRichRing.h" #include "CbmTrackParam.h" #include #include using std::cout; using std::endl; //-------------------------------------------------------------------------- // ----- Default constructor ------------------------------------------- CbmRichRingFinderTrack::CbmRichRingFinderTrack() { fVerbose = 1; } // ----- Standard constructor ------------------------------------------ CbmRichRingFinderTrack::CbmRichRingFinderTrack ( Int_t verbose ) { fVerbose = verbose; } // ----- Destructor ---------------------------------------------------- CbmRichRingFinderTrack::~CbmRichRingFinderTrack() {} void CbmRichRingFinderTrack::Init () { cout << "CbmRichRingFinderTrack::init() "<GetEntriesFast(); if(!nhits) { cout << "No hits in this event." << endl; return -1; } for(Int_t iHit = 0; iHit < nhits; iHit++) { CbmRichHit * hit = (CbmRichHit*)rHitArray->At(iHit); if(hit){ CbmRichTrackMyPoint tempPoint; tempPoint.fX = hit->X(); tempPoint.fY = hit->Y(); tempPoint.fId = iHit; tempPoint.fRefIndex = hit->GetRefIndex(); fData.push_back(tempPoint); } } cout << "fData.size() = "<< fData.size()<GetEntriesFast(); if(!npoints) { cout << "No projections in this event." << endl; return -1; } for(Int_t iPoint = 0; iPoint < npoints; iPoint++) { CbmTrackParam * point = (CbmTrackParam*)rProjArray->At(iPoint); if(point) { CbmRichTrackMyPoint tempPoint; tempPoint.fX = point->GetX(); tempPoint.fY = point->GetY(); tempPoint.fId = iPoint; fGuidance.push_back(tempPoint); //cout<<"X="<At(foundRingsCount); double xc = fFoundRings[iRing].GetCenterX(); double yc = fFoundRings[iRing].GetCenterY(); double radius = fFoundRings[iRing].GetRadius(); //cout << "(X,Y,R, NHits) = "<SetCenterX(xc); r->SetCenterY(yc); r->SetRadius(radius); for (int ith = 0; ith < fFoundRings[iRing].GetNofHits();ith ++){ r->AddHit(fFoundRings[iRing].GetHit(ith)); } foundRingsCount++; } cout<<"found Rings = "<::iterator it1; std::vector::iterator it2; std::vector::iterator it3; std::vector::iterator it4; //find all hits which are in the corridor mpnt.fX = fGuidance[cpinc].fX - fMaxRadius; it1 = std::lower_bound(fData.begin(), fData.end(), mpnt, CbmRichTrackMyPoint::CmpUp); mpnt.fX = fGuidance[cpinc].fX - fMinRadius; it2 = std::lower_bound(fData.begin(), fData.end(), mpnt, CbmRichTrackMyPoint::CmpUp); mpnt.fX = fGuidance[cpinc].fX + fMinRadius; it3 = std::lower_bound(fData.begin(), fData.end(), mpnt, CbmRichTrackMyPoint::CmpUp)- 1 ; mpnt.fX = fGuidance[cpinc].fX + fMaxRadius; it4 = std::lower_bound(fData.begin(), fData.end(), mpnt, CbmRichTrackMyPoint::CmpUp)- 1 ; //first index of the hit in the corridor Int_t ind1 = it1 - fData.begin(); Int_t ind2 = it2 - fData.begin(); Int_t ind3 = it3 - fData.begin(); Int_t ind4 = it4 - fData.begin(); //cout << ind1 <<" "< fMinRadius && r < fMaxRadius) { modf(r / dx, &ir); if (ir < nbins && ir > 0 ) fHist[ (int)ir ].push_back(i); } } } //cout << " hitCntY = "<< hitCntY<< " "; for (i = ind2+1; i < ind3 + 1; i++){ if ( fData[i].fY < fGuidance[cpinc].fY + fMaxRadius && fData[i].fY > fGuidance[cpinc].fY - fMaxRadius && !(fData[i].fY < fGuidance[cpinc].fY + fMinRadius/1.4 && fData[i].fY > fGuidance[cpinc].fY - fMinRadius/1.4) ){ Double_t r = pow((fData[i].fX - fGuidance[cpinc].fX)*(fData[i].fX - fGuidance[cpinc].fX) + (fData[i].fY - fGuidance[cpinc].fY)*(fData[i].fY - fGuidance[cpinc].fY), 0.5); if (r > fMinRadius && r < fMaxRadius) { modf(r / dx, &ir); if (ir < nbins && ir > 0 ) fHist[ (int)ir ].push_back(i); } } } for (i = ind3+1; i < ind4 + 1; i++){ if (fData[i].fY < fGuidance[cpinc].fY + fMaxRadius && fData[i].fY > fGuidance[cpinc].fY - fMaxRadius){ Double_t r = pow((fData[i].fX - fGuidance[cpinc].fX)*(fData[i].fX - fGuidance[cpinc].fX) + (fData[i].fY - fGuidance[cpinc].fY)*(fData[i].fY - fGuidance[cpinc].fY), 0.5); if (r > fMinRadius && r < fMaxRadius) { modf(r / dx, &ir); if (ir < nbins && ir > 0 ) fHist[ (int)ir ].push_back(i); } } } } } void CbmRichRingFinderTrack::FindCenters(Double_t nbins) { Int_t i; UInt_t j; UInt_t max = 0; Int_t ii = 0; Double_t dx = (fMaxRadius) / nbins; for (j = 0; j < fGuidance.size(); j++){ max = 0; InitHist1D(nbins,j); for (i = 0; i < nbins; i++) if (fHist[i].size() > max) { max = fHist[i].size(); ii = i; } Int_t maxsum = (Int_t)fHist[ii].size(); if (ii+1 < nbins) maxsum += fHist[ii+1].size(); if (ii-1 > 0) maxsum += fHist[ii-1].size(); if (maxsum > fCut){ CbmRichRing tempRing; tempRing.SetCenterX(fGuidance[j].fX); tempRing.SetCenterY(fGuidance[j].fY); double tr = dx * (fHist[ii].size() * ii + fHist[ii-1].size() * (ii-1) + fHist[ii+1].size() * (ii+1)) / maxsum; if (ii+1 < nbins ) tempRing.SetRadius(tr); else tempRing.SetRadius( dx * ii );// don't crash the programm for (unsigned int ih = 0; ih < fHist[ii].size(); ih++){ tempRing.AddHit(fData[fHist[ii][ih]].fId); } if (ii+1 < nbins) for (unsigned int ih=0; ih < fHist[ii + 1].size(); ih++){ tempRing.AddHit(fData[fHist[ii+1][ih]].fId); } if (ii-1 > 0) for (unsigned int ih=0; ih < fHist[ii - 1].size(); ih++){ tempRing.AddHit(fData[fHist[ii-1][ih]].fId); } fFoundRings.push_back(tempRing); } } } // ------------------------------------------------------------------------- ClassImp(CbmRichRingFinderTrack)