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