void AngleScan_V::addClustersToBlob(SmartRefVector<Minerva::IDCluster>& xshowerCand, SmartRefVector<Minerva::IDCluster>& uclusters, SmartRefVector<Minerva::IDCluster>& vclusters, SmartRefVector<Minerva::IDCluster>& showerCand, double epsilon) { for (SmartRefVector<Minerva::IDCluster>::iterator c = xshowerCand.begin(); c != xshowerCand.end(); ++c) { Minerva::IDCluster* cluster_x = *c; double min = 1e3; SmartRefVector<Minerva::IDCluster>::iterator ucluster = uclusters.end(); SmartRefVector<Minerva::IDCluster>::iterator vcluster = vclusters.end(); for (SmartRefVector<Minerva::IDCluster>::iterator itU = uclusters.begin(); itU != uclusters.end(); ++itU) { if (std::abs( cluster_x->z() - (*itU)->z() ) > 50.0 ) continue; for (SmartRefVector<Minerva::IDCluster>::iterator itV = vclusters.begin(); itV != vclusters.end(); ++itV) { if ( std::abs( cluster_x->z() - (*itV)->z() ) > 50.0 ) continue; double delta = std::abs((*itU)->tpos1()+(*itU)->tpos2()+ /* |u+v-x| */ (*itV)->tpos1()+(*itV)->tpos2()- cluster_x->tpos1()-cluster_x->tpos2()); if ( delta < min ) { min = delta; ucluster = itU; vcluster = itV; } } } if (min <= epsilon && (ucluster != uclusters.end() && vcluster != vclusters.end())) { showerCand.push_back(*ucluster); showerCand.push_back(*vcluster); uclusters.erase(ucluster); vclusters.erase(vcluster); } } }
//====================================================================== // XUVMatch overload //======================================================================= StatusCode HTBlob::XUVMatch( SmartRef<Minerva::IDCluster> Cluster, SmartRefVector<Minerva::IDCluster> &Seed, SmartRefVector<Minerva::IDCluster> &ClusVectorU, SmartRefVector<Minerva::IDCluster> &ClusVectorV, double zmin, double zmax, double match) const { debug() << " HTBlob::XUVMatch - Overload with match = " << match <<endmsg; SmartRefVector<Minerva::IDCluster>::iterator itClusU, itClusV; SmartRef<Minerva::IDCluster> U, V; double dmin = 1000, distance; debug() << " MATCH, X cluster, pe " << Cluster->pe() << "; z " << Cluster->z() << "; position " << Cluster->position() << "; sum pos " << Cluster->position()+Cluster->tpos1()+Cluster->tpos2() << endmsg; for ( itClusU = ClusVectorU.begin(); itClusU != ClusVectorU.end(); itClusU++ ){ if ( fabs( Cluster->z() - (*itClusU)->z() ) > 50 ) continue; for ( itClusV = ClusVectorV.begin(); itClusV != ClusVectorV.end(); itClusV++ ) { if ( fabs( Cluster->z() - (*itClusV)->z() ) > 50 ) continue; distance = Cluster->position()+Cluster->tpos1()+Cluster->tpos2(); distance -= ((*itClusU)->position()+(*itClusU)->tpos1()+(*itClusU)->tpos2()); distance -= ((*itClusV)->position()+(*itClusV)->tpos1()+(*itClusV)->tpos2()); distance = fabs(distance); if ( distance < dmin) { debug() << " MATCH Cand. " << " U, pe " << (*itClusU)->pe() << "; z " << (*itClusU)->z() << "; position " << (*itClusU)->position() << "; sum pos " << (*itClusU)->position()+(*itClusU)->tpos1()+(*itClusU)->tpos2() << endmsg; debug() << " V, pe " << (*itClusV)->pe() << "; z " << (*itClusV)->z() << "; position " << (*itClusV)->position() << "; sum pos " << (*itClusV)->position()+(*itClusV)->tpos1()+(*itClusV)->tpos2() << endmsg; dmin = distance; U = *itClusU; V = *itClusV; } } } double efmatch = fabs(zmax-zmin) < 190 ? match*2 : match; // High angles or shorts? if ( dmin <= efmatch && Cluster->z() >= zmin && Cluster->z() <= zmax ) { debug() << " FOUND MATCH " << U << " " << V << " Match " << efmatch << endmsg; SmartRefVector<Minerva::IDCluster>::iterator itU, itV; itU = remove(ClusVectorU.begin(),ClusVectorU.end(),U); // move elements to the end to can erase itV = remove(ClusVectorV.begin(),ClusVectorV.end(),V); ClusVectorU.erase(itU,ClusVectorU.end()); // found it in doxygen ClusVectorV.erase(itV,ClusVectorV.end()); // found it in doxygen Seed.push_back(U); Seed.push_back(V); } return StatusCode::SUCCESS; }