1 /*
2  *
3  *  Copyright (C) 2015-2020, J. Riesmeier, Oldenburg, Germany
4  *  All rights reserved.  See COPYRIGHT file for details.
5  *
6  *  Source file for class CID4020_PETRadionuclide
7  *
8  *  Generated automatically from DICOM PS 3.16-2020e
9  *  File created on 2020-11-25 11:12:55 by J. Riesmeier
10  *
11  */
12 
13 
14 #include "dcmtk/config/osconfig.h"    /* make sure OS specific configuration is included first */
15 
16 #include "dcmtk/dcmsr/cmr/cid4020.h"
17 
18 
19 // general information on CID 4020 (PET Radionuclide)
20 #define CONTEXT_GROUP_NUMBER  "4020"
21 #define CONTEXT_GROUP_VERSION "20160119"
22 #define CONTEXT_GROUP_UID     "1.2.840.10008.6.1.304"
23 #define CONTEXT_GROUP_TYPE    OFTrue  /* extensible */
24 
25 // initialize global/static variable
26 CID4020_PETRadionuclide::CodeList *CID4020_PETRadionuclide::Codes = NULL;
27 
28 
CID4020_PETRadionuclide(const DSRCodedEntryValue & selectedValue)29 CID4020_PETRadionuclide::CID4020_PETRadionuclide(const DSRCodedEntryValue &selectedValue)
30   : DSRContextGroup(CONTEXT_GROUP_NUMBER, "DCMR", CONTEXT_GROUP_VERSION, CONTEXT_GROUP_UID, selectedValue)
31 {
32     setExtensible(CONTEXT_GROUP_TYPE);
33 }
34 
35 
CID4020_PETRadionuclide(const EnumType selectedValue,const OFBool enhancedEncodingMode)36 CID4020_PETRadionuclide::CID4020_PETRadionuclide(const EnumType selectedValue,
37                                                  const OFBool enhancedEncodingMode)
38   : DSRContextGroup(CONTEXT_GROUP_NUMBER, "DCMR", CONTEXT_GROUP_VERSION, CONTEXT_GROUP_UID, getCodedEntry(selectedValue, enhancedEncodingMode))
39 {
40     setExtensible(CONTEXT_GROUP_TYPE);
41 }
42 
43 
selectValue(const EnumType selectedValue,const OFBool enhancedEncodingMode)44 OFCondition CID4020_PETRadionuclide::selectValue(const EnumType selectedValue,
45                                                  const OFBool enhancedEncodingMode)
46 {
47     /* never check the coded entry */
48     return DSRContextGroup::selectValue(getCodedEntry(selectedValue, enhancedEncodingMode), OFFalse /*check*/, OFFalse /*definedContextGroup*/);
49 }
50 
51 
findCodedEntry(const DSRCodedEntryValue & searchForCodedEntry,DSRCodedEntryValue * foundCodedEntry,const OFBool enhancedEncodingMode) const52 OFCondition CID4020_PETRadionuclide::findCodedEntry(const DSRCodedEntryValue &searchForCodedEntry,
53                                                     DSRCodedEntryValue *foundCodedEntry,
54                                                     const OFBool enhancedEncodingMode) const
55 {
56     OFCondition result = SR_EC_CodedEntryNotInContextGroup;
57     /* first, search for standard codes */
58     CodeList::const_iterator iter = getCodes().begin();
59     CodeList::const_iterator last = getCodes().end();
60     /* iterate over coded entry list */
61     while (iter != last)
62     {
63         /* if found, exit loop */
64         if (searchForCodedEntry == iter->second)
65         {
66             /* return coded entry (if requested) */
67             if (foundCodedEntry != NULL)
68             {
69                 *foundCodedEntry = iter->second;
70                 /* also set enhanced encoding mode (if enabled) */
71                 if (!foundCodedEntry->isEmpty() && enhancedEncodingMode)
72                     setEnhancedEncodingMode(*foundCodedEntry);
73             }
74             result = SR_EC_CodedEntryInStandardContextGroup;
75             break;
76         }
77         ++iter;
78     }
79     /* if not, continue with extended codes */
80     if (result.bad())
81     {
82         result = DSRContextGroup::findCodedEntry(searchForCodedEntry, foundCodedEntry);
83         /* tbd: set "enhanced encoding mode" to mark a local/extended version? */
84     }
85     return result;
86 }
87 
88 
printCodes(STD_NAMESPACE ostream & stream) const89 void CID4020_PETRadionuclide::printCodes(STD_NAMESPACE ostream &stream) const
90 {
91     /* print standard codes */
92     stream << "Standard codes:" << OFendl;
93     CodeList::const_iterator iter = getCodes().begin();
94     CodeList::const_iterator last = getCodes().end();
95     /* iterate over coded entry list */
96     while (iter != last)
97     {
98         stream << "  ";
99         /* print coded entry */
100         DSRCodedEntryValue(iter->second).print(stream);
101         stream << OFendl;
102         ++iter;
103     }
104     /* print extended codes */
105     DSRContextGroup::printCodes(stream);
106 }
107 
108 
109 // static functions
110 
initialize()111 void CID4020_PETRadionuclide::initialize()
112 {
113     /* create and initialize code list */
114     getCodes();
115 }
116 
117 
cleanup()118 void CID4020_PETRadionuclide::cleanup()
119 {
120     /* delete code list, it will be recreated automatically when needed */
121     delete Codes;
122     Codes = NULL;
123 }
124 
125 
getCodedEntry(const EnumType value,const OFBool enhancedEncodingMode)126 DSRCodedEntryValue CID4020_PETRadionuclide::getCodedEntry(const EnumType value,
127                                                           const OFBool enhancedEncodingMode)
128 {
129     DSRCodedEntryValue codedEntry;
130     /* search for given enumerated value */
131     CodeList::iterator iter = getCodes().find(value);
132     /* if found, set the coded entry */
133     if (iter != getCodes().end())
134     {
135         codedEntry = iter->second;
136         /* also set enhanced encoding mode (if enabled) */
137         if (!codedEntry.isEmpty() && enhancedEncodingMode)
138             setEnhancedEncodingMode(codedEntry);
139     }
140     return codedEntry;
141 }
142 
143 
getCodes()144 CID4020_PETRadionuclide::CodeList &CID4020_PETRadionuclide::getCodes()
145 {
146     /* check whether code list has already been created and initialized */
147     if (Codes == NULL)
148     {
149         /* create a new code list (should never fail) */
150         Codes = new CodeList();
151         /* and initialize it by adding the coded entries */
152         Codes->insert(OFMake_pair(_11_Carbon, DSRBasicCodedEntry("40565003", "SCT", "^11^Carbon")));
153         Codes->insert(OFMake_pair(_13_Nitrogen, DSRBasicCodedEntry("21576001", "SCT", "^13^Nitrogen")));
154         Codes->insert(OFMake_pair(_14_Oxygen, DSRBasicCodedEntry("424875009", "SCT", "^14^Oxygen")));
155         Codes->insert(OFMake_pair(_15_Oxygen, DSRBasicCodedEntry("129504001", "SCT", "^15^Oxygen")));
156         Codes->insert(OFMake_pair(_18_Fluorine, DSRBasicCodedEntry("77004003", "SCT", "^18^Fluorine")));
157         Codes->insert(OFMake_pair(_22_Sodium, DSRBasicCodedEntry("71633006", "SCT", "^22^Sodium")));
158         Codes->insert(OFMake_pair(_38_Potassium, DSRBasicCodedEntry("423764008", "SCT", "^38^Potassium")));
159         Codes->insert(OFMake_pair(_43_Scandium, DSRBasicCodedEntry("126605", "DCM", "^43^Scandium")));
160         Codes->insert(OFMake_pair(_44_Scandium, DSRBasicCodedEntry("126600", "DCM", "^44^Scandium")));
161         Codes->insert(OFMake_pair(_45_Titanium, DSRBasicCodedEntry("75696008", "SCT", "^45^Titanium")));
162         Codes->insert(OFMake_pair(_51_Manganese, DSRBasicCodedEntry("126601", "DCM", "^51^Manganese")));
163         Codes->insert(OFMake_pair(_52_Iron, DSRBasicCodedEntry("69089000", "SCT", "^52^Iron")));
164         Codes->insert(OFMake_pair(_52_Manganese, DSRBasicCodedEntry("37225000", "SCT", "^52^Manganese")));
165         Codes->insert(OFMake_pair(_52m_Manganese, DSRBasicCodedEntry("126607", "DCM", "^52m^Manganese")));
166         Codes->insert(OFMake_pair(_60_Copper, DSRBasicCodedEntry("425364008", "SCT", "^60^Copper")));
167         Codes->insert(OFMake_pair(_61_Copper, DSRBasicCodedEntry("71425003", "SCT", "^61^Copper")));
168         Codes->insert(OFMake_pair(_62_Copper, DSRBasicCodedEntry("422934004", "SCT", "^62^Copper")));
169         Codes->insert(OFMake_pair(_62_Zinc, DSRBasicCodedEntry("65054007", "SCT", "^62^Zinc")));
170         Codes->insert(OFMake_pair(_64_Copper, DSRBasicCodedEntry("3932008", "SCT", "^64^Copper")));
171         Codes->insert(OFMake_pair(_66_Gallium, DSRBasicCodedEntry("79477007", "SCT", "^66^Gallium")));
172         Codes->insert(OFMake_pair(_68_Gallium, DSRBasicCodedEntry("35337001", "SCT", "^68^Gallium")));
173         Codes->insert(OFMake_pair(_68_Germanium, DSRBasicCodedEntry("53315004", "SCT", "^68^Germanium")));
174         Codes->insert(OFMake_pair(_70_Arsenic, DSRBasicCodedEntry("126602", "DCM", "^70^Arsenic")));
175         Codes->insert(OFMake_pair(_72_Arsenic, DSRBasicCodedEntry("2705002", "SCT", "^72^Arsenic")));
176         Codes->insert(OFMake_pair(_73_Selenium, DSRBasicCodedEntry("87437000", "SCT", "^73^Selenium")));
177         Codes->insert(OFMake_pair(_75_Bromine, DSRBasicCodedEntry("17910003", "SCT", "^75^Bromine")));
178         Codes->insert(OFMake_pair(_76_Bromine, DSRBasicCodedEntry("79523006", "SCT", "^76^Bromine")));
179         Codes->insert(OFMake_pair(_77_Bromine, DSRBasicCodedEntry("86521004", "SCT", "^77^Bromine")));
180         Codes->insert(OFMake_pair(_82_Rubidium, DSRBasicCodedEntry("79197006", "SCT", "^82^Rubidium")));
181         Codes->insert(OFMake_pair(_86_Yttrium, DSRBasicCodedEntry("10738001", "SCT", "^86^Yttrium")));
182         Codes->insert(OFMake_pair(_89_Zirconium, DSRBasicCodedEntry("63360001", "SCT", "^89^Zirconium")));
183         Codes->insert(OFMake_pair(_90_Niobium, DSRBasicCodedEntry("126603", "DCM", "^90^Niobium")));
184         Codes->insert(OFMake_pair(_90_Yttrium, DSRBasicCodedEntry("14691008", "SCT", "^90^Yttrium")));
185         Codes->insert(OFMake_pair(_94m_Technetium, DSRBasicCodedEntry("424079002", "SCT", "^94m^Technetium")));
186         Codes->insert(OFMake_pair(_124_Iodine, DSRBasicCodedEntry("40937006", "SCT", "^124^Iodine")));
187         Codes->insert(OFMake_pair(_152_Terbium, DSRBasicCodedEntry("126606", "DCM", "^152^Terbium")));
188     }
189     /* should never be NULL */
190     return *Codes;
191 }
192 
193 
setEnhancedEncodingMode(DSRCodedEntryValue & codedEntryValue)194 OFCondition CID4020_PETRadionuclide::setEnhancedEncodingMode(DSRCodedEntryValue &codedEntryValue)
195 {
196     return codedEntryValue.setEnhancedEncodingMode(CONTEXT_GROUP_NUMBER, "DCMR", CONTEXT_GROUP_VERSION, CONTEXT_GROUP_UID);
197 }
198