Example #1
0
//=============================================================================
// 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;

}
Example #2
0
//=============================================================================
// 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::coneView(SmartRefVector<Minerva::IDCluster>& unusedViewClusters,
                         SmartRefVector<Minerva::IDCluster>& showerCand,
                         double vtxT,
                         double min_angle, double max_angle,
                         double zmin, double zmax)
{
    SmartRefVector<Minerva::IDCluster> tmpClusters;
    tmpClusters.swap(unusedViewClusters);
    for (SmartRefVector<Minerva::IDCluster>::iterator c = tmpClusters.begin();
         c != tmpClusters.end(); ++c) {
        const double dZ = (*c)->z() - fZ;
        const double dV = (*c)->position() - vtxT;
        const double theta = std::atan2(dV,dZ)*TMath::RadToDeg();
        const double z_c = (*c)->z();
        
        if ((min_angle <= theta && theta <= max_angle) &&
            (zmin < z_c && z_c < zmax)) {
            showerCand.push_back(*c);
        } else {
            unusedViewClusters.push_back(*c);
        }
    }
}
Example #4
0
//======================================================================
//  PseudoCone
//=======================================================================
StatusCode HTBlob::PseudoCone(SmartRefVector<Minerva::IDCluster> &Seed, SmartRefVector<Minerva::IDCluster> &ClusVectorX,
        Gaudi::XYZVector direction, Gaudi::XYZPoint vert ) const
{

    debug() << " HTBlob::PseudoCone, clusters with Angles < 0.06 will be include in the seed " << endmsg;

    SmartRefVector<Minerva::IDCluster> ClusTemp = ClusVectorX; ClusVectorX.clear();
    SmartRefVector<Minerva::IDCluster>::iterator itClusX;

    double angle;

    for ( itClusX = ClusTemp.begin(); itClusX != ClusTemp.end(); itClusX++ ){
        if ( Angle( *itClusX, direction, vert, angle ) ) { 
            if ( angle < 0.06 && (*itClusX)->z() > vert.z() ) Seed.push_back(*itClusX); // must be carefull with backward showers
            else ClusVectorX.push_back(*itClusX);
        } else ClusVectorX.push_back(*itClusX);
    }

    debug() << endmsg;

    return StatusCode::SUCCESS;

}
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;
 
}
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);
        }
        
    }
    
}
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));

}
Example #8
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;

}