Alexandria 2.25.0
SDC-CH common library for the Euclid project
CatalogFromTable.cpp
Go to the documentation of this file.
1/*
2 * Copyright (C) 2012-2021 Euclid Science Ground Segment
3 *
4 * This library is free software; you can redistribute it and/or modify it under
5 * the terms of the GNU Lesser General Public License as published by the Free
6 * Software Foundation; either version 3.0 of the License, or (at your option)
7 * any later version.
8 *
9 * This library is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12 * details.
13 *
14 * You should have received a copy of the GNU Lesser General Public License
15 * along with this library; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
28#include "Table/CastVisitor.h"
29#include "Table/ColumnInfo.h"
31#include <vector>
32
33namespace Euclid {
34namespace SourceCatalog {
35
37 const std::string& source_id_column_name,
38 std::vector<std::shared_ptr<AttributeFromRow>> attribute_from_row_ptr_vector) {
39
40 std::unique_ptr<size_t> source_id_index_ptr = column_info_ptr->find(source_id_column_name);
41 if (source_id_index_ptr == nullptr) {
42 throw Elements::Exception() << "Column info does not have the column " << source_id_column_name;
43 }
44 m_source_id_index = *(source_id_index_ptr);
45
46 m_attribute_from_row_ptr_vector = std::move(attribute_from_row_ptr_vector);
47}
48
50}
51
53
54 std::vector<Source> source_vector;
55
56 // Figure out the type of the first row, and then assume all following
57 // must be of the same
58 CastSourceIdVisitor castVisitor;
59
60 for (auto row : input_table) {
61
62 auto source_id = boost::apply_visitor(castVisitor, row[m_source_id_index]);
63
64 std::vector<std::shared_ptr<Attribute>> attribute_ptr_vector;
65 try {
66 for (auto& attribute_from_table_ptr : m_attribute_from_row_ptr_vector) {
67 attribute_ptr_vector.push_back(attribute_from_table_ptr->createAttribute(row));
68 }
69 } catch (const PhotometryParsingException& parsing_exception) {
70 throw Elements::Exception()<< "Parsing error while parsing the source with Id = " << source_id << " : " << parsing_exception.what();
71 } catch(const std::exception& e) {
72 throw Elements::Exception() << "Error while parsing the source with Id = " << source_id << " : " << e.what();
73 } catch (...) {
74 throw Elements::Exception() << "Error while parsing the source with Id = " << source_id;
75 }
76
77 source_vector.push_back(Source{source_id, move(attribute_ptr_vector)});
78 }
79
80 return Catalog{source_vector};
81}
82
83} // namespace SourceCatalog
84} // end of namespace Euclid
const char * what() const noexcept override
This type can be used together with boost::apply_visitor to cast boost::variant with an unknown under...
Definition: Source.h:105
std::vector< std::shared_ptr< AttributeFromRow > > m_attribute_from_row_ptr_vector
CatalogFromTable(std::shared_ptr< Euclid::Table::ColumnInfo > column_info_ptr, const std::string &source_id_column_name, std::vector< std::shared_ptr< AttributeFromRow > > attribute_from_row_ptr_vector)
Euclid::SourceCatalog::Catalog createCatalog(const Euclid::Table::Table &input_table)
Catalog contains a container of sources.
Definition: Catalog.h:47
The Source class includes all information related to a sky source.
Definition: Source.h:48
std::unique_ptr< std::size_t > find(const std::string &name) const
Returns the index of a column, given the name of it, or nullptr if there is no column with this name.
Definition: ColumnInfo.cpp:77
Represents a table.
Definition: Table.h:49
T move(T... args)
constexpr double e
T push_back(T... args)