Ejemplo n.º 1
0
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());
    
}
Ejemplo n.º 2
0
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;
 
}
Ejemplo n.º 3
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;

}
Ejemplo n.º 4
0
//======================================================================
//  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;

}
Ejemplo n.º 5
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;

}
Ejemplo n.º 6
0
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));

}