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);
        }
        
    }
    
}
Exemple #2
0
//======================================================================
//  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;

}