Ejemplo n.º 1
0
std::vector<Doublet> Higgs::Multiplets(boca::Event const& event, PreCuts const& pre_cuts, TMVA::Reader const& reader)
{
    INFO0;
    auto leptons = event.Leptons();
    return Doublets(event, [&](Doublet & doublet) {
        return Multiplet(doublet, leptons, pre_cuts, reader);
    });
}
Ejemplo n.º 2
0
void MeshGeometry::extract_faces_from_hexes() {
    const VectorI& voxels = m_voxels;
    typedef std::map<Multiplet, int> FaceCounter;
    FaceCounter face_counter;

    for (size_t i=0; i<voxels.size(); i+= m_vertex_per_voxel) {
        VectorI voxel = voxels.segment(i, m_vertex_per_voxel);
        // Note that the order of vertices below are predefined by MSH format,
        // each face should have normal pointing outward.
        assert(voxel.size() == 8);
        Multiplet voxel_faces[6] = {
            Multiplet(Vector4I(voxel[0], voxel[1], voxel[5], voxel[4])), // Bottom
            Multiplet(Vector4I(voxel[2], voxel[3], voxel[7], voxel[6])), // Top
            Multiplet(Vector4I(voxel[0], voxel[4], voxel[7], voxel[3])), // Left
            Multiplet(Vector4I(voxel[1], voxel[2], voxel[6], voxel[5])), // Right
            Multiplet(Vector4I(voxel[4], voxel[5], voxel[6], voxel[7])), // Front
            Multiplet(Vector4I(voxel[0], voxel[3], voxel[2], voxel[1]))  // Back
        };

        for (size_t j=0; j<6; j++) {
            if (face_counter.find(voxel_faces[j]) == face_counter.end()) {
                face_counter[voxel_faces[j]] = 1;
            } else {
                face_counter[voxel_faces[j]] += 1;
            }
        }
    }

    std::vector<int> vertex_buffer;
    for (FaceCounter::const_iterator itr = face_counter.begin();
            itr!=face_counter.end(); itr++) {
        if (itr->second != 1 && itr->second != 2) {
            const Vector4I& face = itr->first.get_ori_data();
            std::stringstream err_msg;
            err_msg << "Non-manifold mesh detected!" << std::endl;
            err_msg << "Face <"
                << face[0] << ", "
                << face[1] << ", "
                << face[2] << ", "
                << face[3] << "> has "
                << itr->second << " adjacent volume elements";
            throw RuntimeError(err_msg.str());
        }
        if (itr->second == 1) {
            const VectorI& f = itr->first.get_ori_data();
            assert(f.size() == 4);
            vertex_buffer.push_back(f[0]);
            vertex_buffer.push_back(f[1]);
            vertex_buffer.push_back(f[2]);
            vertex_buffer.push_back(f[3]);
        }
    }

    m_faces.resize(vertex_buffer.size());
    std::copy(vertex_buffer.begin(), vertex_buffer.end(), m_faces.data());
    m_vertex_per_face = 4;
}