GCC Code Coverage Report


Directory: ./
File: libs/io/dicom/helper/tags.cpp
Date: 2024-04-15 21:28:46
Exec Total Coverage
Lines: 20 32 62.5%
Branches: 79 214 36.9%

Line Branch Exec Source
1 /************************************************************************
2 *
3 * Copyright (C) 2017-2023 IRCAD France
4 * Copyright (C) 2017-2020 IHU Strasbourg
5 *
6 * This file is part of Sight.
7 *
8 * Sight is free software: you can redistribute it and/or modify it under
9 * the terms of the GNU Lesser General Public License as published by
10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * Sight is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with Sight. If not, see <https://www.gnu.org/licenses/>.
20 *
21 ***********************************************************************/
22
23 #include "io/dicom/helper/tags.hpp"
24
25 #include "io/__/reader/csv_reader.hpp"
26 #include "io/dicom/exception/invalid_tag.hpp"
27
28 #include <core/exceptionmacros.hpp>
29
30 #include <boost/numeric/conversion/cast.hpp>
31
32 #include <filesystem>
33 #include <fstream>
34
35 namespace sight::io::dicom::helper
36 {
37
38 //------------------------------------------------------------------------------
39
40 823 gdcm::Tag get_gdcm_tag(const std::string& _group, const std::string& _element)
41 {
42 823 SIGHT_ASSERT("Group and element can not be empty", !_group.empty() && !_element.empty());
43
44 823 using dest_t = std::uint16_t;
45 823 dest_t group_dest = 0;
46 823 dest_t element_dest = 0;
47
48 823 try
49 {
50
2/2
✓ Branch 1 taken 822 times.
✓ Branch 2 taken 1 times.
823 const std::uint64_t group_l = std::stoul(_group, nullptr, 16);
51
2/2
✓ Branch 1 taken 821 times.
✓ Branch 2 taken 1 times.
822 const std::uint64_t element_l = std::stoul(_element, nullptr, 16);
52
53
2/2
✓ Branch 0 taken 820 times.
✓ Branch 1 taken 1 times.
821 group_dest = boost::numeric_cast<dest_t>(group_l);
54
1/2
✓ Branch 0 taken 820 times.
✗ Branch 1 not taken.
820 element_dest = boost::numeric_cast<dest_t>(element_l);
55 }
56
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
3 catch(std::out_of_range& e)
57 {
58
23/46
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 44 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 51 taken 1 times.
✗ Branch 52 not taken.
✓ Branch 54 taken 1 times.
✗ Branch 55 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 60 not taken.
✓ Branch 62 taken 1 times.
✗ Branch 63 not taken.
✓ Branch 65 taken 1 times.
✗ Branch 66 not taken.
✓ Branch 68 taken 1 times.
✗ Branch 69 not taken.
✓ Branch 71 taken 1 times.
✗ Branch 72 not taken.
✓ Branch 74 taken 1 times.
✗ Branch 75 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
6 SIGHT_THROW_EXCEPTION(
59 io::dicom::exception::invalid_tag(
60 std::string("Unable to read DICOM tag from '") + _group + "," + _element + "' : " + e.what()
61 )
62
63 );
64 1 }
65 1 catch(std::invalid_argument& e)
66 {
67
23/46
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 44 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 51 taken 1 times.
✗ Branch 52 not taken.
✓ Branch 54 taken 1 times.
✗ Branch 55 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 60 not taken.
✓ Branch 62 taken 1 times.
✗ Branch 63 not taken.
✓ Branch 65 taken 1 times.
✗ Branch 66 not taken.
✓ Branch 68 taken 1 times.
✗ Branch 69 not taken.
✓ Branch 71 taken 1 times.
✗ Branch 72 not taken.
✓ Branch 74 taken 1 times.
✗ Branch 75 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
6 SIGHT_THROW_EXCEPTION(
68 io::dicom::exception::invalid_tag(
69 std::string("Unable to read DICOM tag from '") + _group + "," + _element + "' : " + e.what()
70 )
71
72 );
73 1 }
74 1 catch(boost::bad_numeric_cast& e)
75 {
76
23/46
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 44 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 51 taken 1 times.
✗ Branch 52 not taken.
✓ Branch 54 taken 1 times.
✗ Branch 55 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 60 not taken.
✓ Branch 62 taken 1 times.
✗ Branch 63 not taken.
✓ Branch 65 taken 1 times.
✗ Branch 66 not taken.
✓ Branch 68 taken 1 times.
✗ Branch 69 not taken.
✓ Branch 71 taken 1 times.
✗ Branch 72 not taken.
✓ Branch 74 taken 1 times.
✗ Branch 75 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
6 SIGHT_THROW_EXCEPTION(
77 io::dicom::exception::invalid_tag(
78 std::string("Unable to read DICOM tag from '") + _group + "," + _element + "' : " + e.what()
79 )
80
81 );
82 1 }
83
84 820 return {group_dest, element_dest};
85 }
86
87 //------------------------------------------------------------------------------
88
89 private_tag_vec_t load_private_tags(const std::filesystem::path& _tags_path)
90 {
91 SIGHT_ASSERT(
92 "File '" + _tags_path.string() + "' must exists",
93 std::filesystem::exists(_tags_path) && std::filesystem::is_regular_file(_tags_path)
94 );
95
96 private_tag_vec_t private_tags;
97 io::reader::csv_reader reader(_tags_path);
98 io::reader::csv_reader::token_container_t tag = reader.get_line();
99
100 while(!tag.empty())
101 {
102 SIGHT_WARN_IF(
103 "Unexpected token count : " << tag.size() << " (3 expected : group, element, manufacturer)",
104 tag.size() != 3
105 );
106 SIGHT_THROW_IF("Unable to read private tag file", tag.size() < 2);
107
108 private_tags.push_back(io::dicom::helper::get_gdcm_tag(tag[0], tag[1]));
109 tag = reader.get_line();
110 }
111
112 return private_tags;
113 }
114
115 //------------------------------------------------------------------------------
116
117 } // namespace sight::io::dicom::helper
118