void AngleScan_V::FormVShowerCand() { for (std::vector<TVector2>::const_iterator peak = fPeaks.begin(); peak != fPeaks.end(); ++peak) { const double lower_edge = peak->X(); const double upper_edge = peak->Y(); const double zmin = 4500.0; const double zmax = 10000.0; SmartRefVector<Minerva::IDCluster> showerCand; coneView(fRemainingVClusters, showerCand, fV, lower_edge, upper_edge, zmin, zmax); if (showerCand.empty()) continue; if (showerCand.size() == 1 && showerCand.front()->pe() > 30) { fVShowerCandidates.push_back(showerCand); fGoodPeaks.push_back(*peak); } else if (showerCand.size() > 1) { fVShowerCandidates.push_back(showerCand); fGoodPeaks.push_back(*peak); } } // Calculate the distance from the shower candidates to the event vertex // Try two definitions of distance: closest and energy weighted for (std::vector<SmartRefVector<Minerva::IDCluster> >::iterator s = fVShowerCandidates.begin(); s != fVShowerCandidates.end(); ++s) { SmartRefVector<Minerva::IDCluster>& vshowerCand = *s; double d_min = 1.e6; double d_weighted = 0.0; double total_energy = 0.0; for (SmartRefVector<Minerva::IDCluster>::iterator c = vshowerCand.begin(); c != vshowerCand.end(); ++c) { double v = (*c)->position(); double z = (*c)->z(); double d = std::sqrt(std::pow(v-fV,2) + std::pow(z-fZ,2)); if (d < d_min) { d_min = d; } d_weighted += d * (*c)->energy(); total_energy += (*c)->energy(); } fVShowerClosestDistances.push_back(d_min); fVShowerWeightedDistances.push_back(d_weighted/total_energy); } std::sort(fVShowerCandidates.begin(),fVShowerCandidates.end(), greaterShower()); }
void AngleScan_V::completeView(SmartRefVector<Minerva::IDCluster>& unusedViewClusters, SmartRefVector<Minerva::IDCluster>& showerCand, double vtxT) { if (unusedViewClusters.empty()) return; double z_min = 10000; double z_max = -10000; double angle_min = 180; double angle_max = -180; SmartRefVector<Minerva::IDCluster> viewShowerCand; SmartRefVector<Minerva::IDCluster>::iterator it_view = unusedViewClusters.begin(); for (SmartRefVector<Minerva::IDCluster>::iterator c = showerCand.begin(); c != showerCand.end(); ++c){ if ( (*c)->view() == (*it_view)->view() ) viewShowerCand.push_back(*c); if ( (*c)->view() == Minerva::IDCluster::U && (*c)->z() < z_min ) z_min = (*c)->z(); if ( (*c)->view() == Minerva::IDCluster::U && (*c)->z() > z_max ) z_max = (*c)->z(); } if (viewShowerCand.empty()) { std::cout << "\tAngleScan_V::completeView: no view cluster" << std::endl; return; } for ( it_view = viewShowerCand.begin(); it_view != viewShowerCand.end(); ++it_view){ const double z = (*it_view)->z() - fZ; const double u = (*it_view)->position() - vtxT; const double ang = std::atan2(u,z)*TMath::RadToDeg(); if ( ang >= angle_max ) angle_max = ang; if ( ang <= angle_min ) angle_min = ang; } z_min = z_min - 100; z_max = z_max + 100; angle_max = angle_max + 10.0; angle_min = angle_min - 10.0; /* Move clusters between (angle_min,angle_max) and (z_min,z_max) from 'unusedClusters' to blob */ std::cout << "\tAngleScan_V::completeView:oldsize: " << showerCand.size() << std::endl; coneView(unusedViewClusters, showerCand, vtxT, angle_min, angle_max, z_min, z_max ); std::cout << "\tAngleScan_V::completeView:newsize: " << showerCand.size() << std::endl; }
//============================================================================= // GetClusters //============================================================================= StatusCode HTBlob::GetViewClustersAboveThreshold( SmartRefVector<Minerva::IDCluster> &idClusterVec, SmartRefVector<Minerva::IDCluster> &idClusterView, Minerva::IDCluster::View view, double pecut ) const { if( !idClusterVec.size() ) { debug() << " ALERT: Input Vector of Clusters to the Get_Clusters tool is empty " << endmsg; return StatusCode::FAILURE; } SmartRefVector<Minerva::IDCluster> ClusTemp = idClusterVec; SmartRefVector<Minerva::IDCluster>::iterator itClus = ClusTemp.begin(); idClusterVec.clear(); for ( ; itClus != ClusTemp.end(); itClus++ ){ if ( (*itClus)->view()==view && (*itClus)->pe()/(*itClus)->iddigs()>3 && (*itClus)->pe()>pecut ) { idClusterView.push_back(*itClus); } else idClusterVec.push_back(*itClus); } return StatusCode::SUCCESS; }
//====================================================================== // XUVMatch //======================================================================= StatusCode HTBlob::XUVMatch(SmartRefVector<Minerva::IDCluster> &Seed, SmartRefVector<Minerva::IDCluster> &ClusVectorU, SmartRefVector<Minerva::IDCluster> &ClusVectorV, double match) const { debug() << " == HTBlob::XUVMatch " << endmsg; SmartRefVector<Minerva::IDCluster> ClusTemp = Seed; SmartRefVector<Minerva::IDCluster>::iterator itClusX; double zmin = 10000, zmax = 0; debug() << " Seed size = " << Seed.size() << endmsg; for ( itClusX = ClusTemp.begin(); itClusX != ClusTemp.end(); itClusX++ ){ double z = (*itClusX)->z(); if ( z < zmin ) zmin = z; if ( z > zmax ) zmax = z; } debug() << " Finding clusters with macth and zmin " << zmin << "; zmax " << zmax << endmsg; for ( itClusX = ClusTemp.begin(); itClusX != ClusTemp.end(); itClusX++ ) { if ( (*itClusX)->view() != Minerva::IDCluster::X ) continue; XUVMatch( *itClusX, Seed, ClusVectorU, ClusVectorV, zmin, zmax, match ); } debug() << " == HTBlob::XUVMatch - NO MORE SEED CLUSTERS to Match, leaving seed with size: " << Seed.size() << endmsg << endmsg; return StatusCode::SUCCESS; }
//============================================================================= // Create2dHTBlob //============================================================================= StatusCode HTBlob::Create2dHTSeed( SmartRefVector<Minerva::IDCluster> &idClusterView, SmartRefVector<Minerva::IDCluster> &HT2dClusters, double r, double theta, Gaudi::XYZPoint ref, double &spX, double &spZ ) const { debug() << " HTtool::Create2dHTSeed " << endmsg; double rmin, rmax, x, z, zmin = 10000, Total_e = 0; SmartRefVector<Minerva::IDCluster> ClusTemp = idClusterView; SmartRefVector<Minerva::IDCluster>::iterator itClus = ClusTemp.begin(); idClusterView.clear(); debug() << " Will study " << ClusTemp.size() << " clusters " << endmsg; debug() << " Seed with, r: " << r << ", theta = " << theta << ";contains these clusters: " << endmsg; for ( ; itClus != ClusTemp.end(); itClus++ ){ z = (*itClus)->z() - ref.z(); x = (*itClus)->tpos1() - ref.x(); rmin = x*sin(theta*CLHEP::pi/180) + z*cos(theta*CLHEP::pi/180); x = (*itClus)->tpos2() - ref.x(); rmax = x*sin(theta*CLHEP::pi/180) + z*cos(theta*CLHEP::pi/180); if ( fabs ( 2*r - rmin - rmax ) <= 90 ){ if ( (*itClus)->z()< zmin ) { zmin = (*itClus)->z(); spZ = (*itClus)->z(); spX = (*itClus)->position(); } debug() << " pe = " << (*itClus)->pe() << "; z = " << (*itClus)->z() << "; pos = " << (*itClus)->position() << endmsg; HT2dClusters.push_back(*itClus); Total_e += (*itClus)->energy(); continue; } idClusterView.push_back(*itClus); } debug() << " Total energy comming from seed = " << Total_e << "; this energy must be bigger than 19" << endmsg << endmsg; if ( Total_e < 19 ) { idClusterView.insert(idClusterView.end(),HT2dClusters.begin(),HT2dClusters.end()); return StatusCode::FAILURE; } return StatusCode::SUCCESS; }
void AngleScan_V::FormXUVShowerCand() { std::vector<SmartRefVector<Minerva::IDCluster> > nogrowShowerCandidates; std::cout << "AngleScan_V::total V candidates: " << fVShowerCandidates.size() << std::endl; for (std::vector<SmartRefVector<Minerva::IDCluster> >::iterator s = fVShowerCandidates.begin(); s != fVShowerCandidates.end(); ++s) { std::cout << "\tAngleScan_V::V cand: " << s->size() << std::endl; SmartRefVector<Minerva::IDCluster>& vshowerCand = *s; SmartRefVector<Minerva::IDCluster> showerCand = vshowerCand; double zmin = +1e6; double zmax = -1e6; double ztot = 0.0; for (SmartRefVector<Minerva::IDCluster>::iterator c = vshowerCand.begin(); c != vshowerCand.end(); ++c) { zmin = std::min(zmin,(*c)->z()); zmax = std::max(zmax,(*c)->z()); ztot += (*c)->z(); } if (zmax-zmin < 50.0) { const double zcenter = ztot/vshowerCand.size(); std::cout << "\t AngleScan_V::Candidate with small z extend at: " << zcenter << std::endl; SmartRefVector<Minerva::IDCluster> xclusters_tmp; SmartRefVector<Minerva::IDCluster> uclusters_tmp; fRemainingXClusters.swap(xclusters_tmp); fRemainingUClusters.swap(uclusters_tmp); for (SmartRefVector<Minerva::IDCluster>::iterator c = xclusters_tmp.begin(); c != xclusters_tmp.end(); ++c) { if (std::abs((*c)->z()-zcenter) < 50.0) { std::cout << "\t\t AngleScan_V::adding a X cluster " << (*c)->z() << " " << (*c)->pe() << std::endl; showerCand.push_back(*c); } else fRemainingXClusters.push_back(*c); } for (SmartRefVector<Minerva::IDCluster>::iterator c = uclusters_tmp.begin(); c != uclusters_tmp.end(); ++c) { if (std::abs((*c)->z()-zcenter) < 50.0) { std::cout << "\t\t AngleScan_V::adding a U cluster " << (*c)->z() << " " << (*c)->pe() << std::endl; showerCand.push_back(*c); } else fRemainingUClusters.push_back(*c); } fShowerCandidates.push_back(showerCand); } else { std::cout << "\t AngleScan_V::Candidate with large z extent " << std::endl; addClustersToBlob(vshowerCand,fRemainingXClusters,fRemainingUClusters,showerCand, fUVMatchTolerance); if (showerCand.size() > vshowerCand.size()) fShowerCandidates.push_back(showerCand); else if (vshowerCand.size() >= 3) nogrowShowerCandidates.push_back(vshowerCand); else { std::cout << "\t AngleScan_V::Throw away V shower candidate" << std::endl; } } } std::cout << "AngleScan_V::Shower candidates: " << fShowerCandidates.size() << std::endl; std::cout << "AngleScan_V::Nogrow candidates: " << nogrowShowerCandidates.size() << std::endl; if (fAllowUVMatchWithMoreTolerance) { for (std::vector<SmartRefVector<Minerva::IDCluster> >::iterator s = nogrowShowerCandidates.begin(); s != nogrowShowerCandidates.end(); ++s) { SmartRefVector<Minerva::IDCluster>& vshowerCand = *s; SmartRefVector<Minerva::IDCluster> showerCand = vshowerCand; addClustersToBlob(vshowerCand,fRemainingXClusters,fRemainingUClusters,showerCand, fUVMatchMoreTolerance); fShowerCandidates.push_back(showerCand); } } std::cout << "AngleScan_V::Shower candidates(10x): " << fShowerCandidates.size() << std::endl; for (std::vector<SmartRefVector<Minerva::IDCluster> >::iterator s = fShowerCandidates.begin(); s != fShowerCandidates.end(); ++s) { std::cout << "\tAngleScan_V:: cand: " << std::distance(fShowerCandidates.begin(),s) << " " << fRemainingXClusters.size() << " " << fRemainingUClusters.size() << std::endl; completeView(fRemainingXClusters, *s, fX); completeView(fRemainingUClusters, *s, fU); } std::cout << "AngleScan_V::Final showers: " << fShowerCandidates.size() << std::endl; std::sort(fShowerCandidates.begin(), fShowerCandidates.end(), greaterShower()); std::copy(fRemainingVClusters.begin(),fRemainingVClusters.end(), std::back_inserter(fRemainingClusters)); std::copy(fRemainingXClusters.begin(),fRemainingXClusters.end(), std::back_inserter(fRemainingClusters)); std::copy(fRemainingUClusters.begin(),fRemainingUClusters.end(), std::back_inserter(fRemainingClusters)); }