TkN 2.4
Toolkit for Nuclei
Loading...
Searching...
No Matches
tkensdf_reader.cpp
1/********************************************************************************
2 * Copyright (c) : Université de Lyon 1, CNRS/IN2P3, UMR5822, *
3 * IP2I, F-69622 Villeurbanne Cedex, France *
4 * Normandie Université, ENSICAEN, UNICAEN, CNRS/IN2P3, *
5 * LPC Caen, F-14000 Caen, France *
6 * Contibutor(s) : *
7 * Jérémie Dudouet jeremie.dudouet@cnrs.fr [2020] *
8 * Diego Gruyer diego.gruyer@cnrs.fr [2020] *
9 * *
10 * Licensed under the MIT License <http://opensource.org/licenses/MIT>. *
11 * SPDX-License-Identifier: MIT *
12 ********************************************************************************/
13
14#include <dirent.h>
15
16#include "tkensdf_reader.h"
17#include "tklog.h"
18
19namespace tkn {
26}
27
28using namespace tkn;
29using namespace std;
30
31bool tkensdf_reader::open_nuc(const tkstring &_nuc_name , const ensdf_data_type &_ftype)
32{
33 glog.set_class("ensdf_ascii_reader");
34 glog.set_method(tkstring::form("open_nuc(%s,%d)",_nuc_name.data(),_ftype));
35
36 if(TKN_SYS == nullptr) {
37 glog << error_v << " TKN_SYS environment variable not defined, cannot find the repository of the data bases !" << do_endl;
38 glog.clear();
39 return false;
40 }
41
42 tkstring testnuc = _nuc_name.copy().to_lower();
43 testnuc.capitalize();
44
45 tkstring file_name;
46 if(_ftype == kensdf) file_name = tkstring::Form("%s/ENSDF/%s.ens",finput_folder.data(),_nuc_name.data());
47 else if(_ftype == kxundl) file_name = tkstring::Form("%s/XUNDL/%s.ens",finput_folder.data(),_nuc_name.data());
48 else {
49 glog << warning_v << " database for nucleus " << _nuc_name << " not found" << do_endl;
50 glog.clear();
51 return false;
52 }
53
54 fdata_type = _ftype;
55 fNucleus = testnuc;
56 glog.clear();
57
58 return open_file(file_name);
59}
60
61bool tkensdf_reader::open_file(const tkstring &_file_name)
62{
63 glog.set_class("ensdf_ascii_reader");
64 glog.set_method(tkstring::form("open_file(%s)", _file_name.data()));
65
66 if ( fEnsdf_file.is_open() ) {
67 close_file() ;
68 }
69 fEnsdf_file.open(_file_name);
70
71 tkstring record;
72 tkensdf_record the_record;
73 tkensdf_ident_rec the_identification_record;
74
75 // counters
76 int read_record = 0;
77
78 // true if a new data set is found
79 bool new_dataset = false;
80
81 // read the file and create the list of data sets.
82 while( true ) {
83 getline(fEnsdf_file,record);
84
85 if(! fEnsdf_file.good()) break;
86
87 if(!the_record.set_record(record)) {
88 glog << error_v << "error in : " << record << do_endl;
89 continue;
90 }
91
92 if(!the_record.is_continuation_record()) frecords_counter[the_record.get_record_type()].first++;
93 frecords_counter[the_record.get_record_type()].second++;
94
95
96 // end of file
97 if ( !fEnsdf_file && new_dataset) {
98 the_identification_record.fposition.second = read_record;
99 fDataSets.push_back(the_identification_record);
100 the_identification_record.clear();
101 break;
102 }
103
104 read_record++;
105
106 if(the_record.get_record_type() == tkensdf_record::kident && !new_dataset) {
107 the_identification_record.set_record(record);
108 the_identification_record.set_current_position(read_record);
109 the_identification_record.set_start_position(read_record);
110
111 if(fVerbose) the_identification_record.print(std::cout);
112 new_dataset = true;
113 }
114 if ( the_record.get_record_type() == tkensdf_record::kend && new_dataset ) {
115 the_identification_record.set_stpop_position(read_record);
116 fDataSets.push_back(the_identification_record);
117 the_identification_record.clear();
118 new_dataset = false;
119 }
120 } // is_open
121 if(fVerbose) glog << info << fDataSets.size() << " datasets have been found in the ENSDF file " << _file_name << do_endl;
122
123 glog.clear();
124 return fEnsdf_file.is_open();
125}
126
128{
129 if(!fEnsdf_file.is_open()) {
130 glog << error << "No ENSDF database opened" << do_endl;
131 return;
132 }
133 tkstring data_type = "ENSDF";
134 if(fdata_type==kxundl) data_type = "XUNDL";
135 glog << info << "Database type: "<< data_type << do_endl;
136 glog << info << fDataSets.size() << " datasets have been found for nucleus " << fNucleus << ":"<< do_endl;
137 for(auto &key: fDataSets) key.print(std::cout);
138}
139
141{
142 // to remove any error flag
143 fEnsdf_file.clear();
144
145 if(_dataset == nullptr) return false;
146 _dataset->set_current_position(_dataset->get_start_position());
147 fEnsdf_file.seekg(_dataset->get_current_position()*tkensdf_record::RSIZE,std::ios::beg);
148 getline(fEnsdf_file,record);
149 return fEnsdf_file.good();
150}
151
153{
154 if(_dataset == nullptr) return false;
155 _dataset->set_current_position(_dataset->get_current_position()+1);
156 if(_dataset->get_current_position() >= _dataset->get_stop_position()) return false;
157 getline(fEnsdf_file,record);
158 return fEnsdf_file.good();
159}
160
161void tkensdf_reader::close_file()
162{
163 fDataSets.clear();
164 fEnsdf_file.close();
165 fEnsdf_file.clear();
166 fNucleus.clear();
167}
168
170{
171 std::cout<<std::endl;
172 glog << info << "Record counters:" << do_endl;
173
174 size_t maxsize1=0;
175 size_t maxsize2=0;
176 for(auto i: frecords_counter) {
177 if(tkstring::Form("%lld",i.second.first).length()>maxsize1) maxsize1 = tkstring::Form("%lld",i.second.first).length();
178 if(tkstring::Form("%lld",i.second.second).length()>maxsize2) maxsize2 = tkstring::Form("%lld",i.second.second).length();
179 }
180 std::cout<< left << " - Record Type : counts without(with) continuation records" << std::endl;
181 for(auto i: frecords_counter) {
182 if(i.first == tkensdf_record::kident) std::cout<< left << " - identification : " << setw(maxsize1+1) << i.second.first << " (" << setw(maxsize2) << i.second.second << ")" << std::endl;
183 else if(i.first == tkensdf_record::khistory) std::cout<< left << " - History : " << setw(maxsize1+1) << i.second.first << " (" << setw(maxsize2) << i.second.second << ")" << std::endl;
184 else if(i.first == tkensdf_record::kq_value) std::cout<< left << " - Q-value : " << setw(maxsize1+1) << i.second.first << " (" << setw(maxsize2) << i.second.second << ")" << std::endl;
185 else if(i.first == tkensdf_record::kxref) std::cout<< left << " - X-ref : " << setw(maxsize1+1) << i.second.first << " (" << setw(maxsize2) << i.second.second << ")" << std::endl;
186 else if(i.first == tkensdf_record::kcomment) std::cout<< left << " - Comment : " << setw(maxsize1+1) << i.second.first << " (" << setw(maxsize2) << i.second.second << ")" << std::endl;
187 else if(i.first == tkensdf_record::kparent) std::cout<< left << " - Parent : " << setw(maxsize1+1) << i.second.first << " (" << setw(maxsize2) << i.second.second << ")" << std::endl;
188 else if(i.first == tkensdf_record::knorm) std::cout<< left << " - Normalisation : " << setw(maxsize1+1) << i.second.first << " (" << setw(maxsize2) << i.second.second << ")" << std::endl;
189 else if(i.first == tkensdf_record::kprodnorm) std::cout<< left << " - Production norm : " << setw(maxsize1+1) << i.second.first << " (" << setw(maxsize2) << i.second.second << ")" << std::endl;
190 else if(i.first == tkensdf_record::klevel) std::cout<< left << " - Level : " << setw(maxsize1+1) << i.second.first << " (" << setw(maxsize2) << i.second.second << ")" << std::endl;
191 else if(i.first == tkensdf_record::kbeta) std::cout<< left << " - Beta : " << setw(maxsize1+1) << i.second.first << " (" << setw(maxsize2) << i.second.second << ")" << std::endl;
192 else if(i.first == tkensdf_record::kec) std::cout<< left << " - EC : " << setw(maxsize1+1) << i.second.first << " (" << setw(maxsize2) << i.second.second << ")" << std::endl;
193 else if(i.first == tkensdf_record::kalpha) std::cout<< left << " - Alpha : " << setw(maxsize1+1) << i.second.first << " (" << setw(maxsize2) << i.second.second << ")" << std::endl;
194 else if(i.first == tkensdf_record::kparticle) std::cout<< left << " - Particle : " << setw(maxsize1+1) << i.second.first << " (" << setw(maxsize2) << i.second.second << ")" << std::endl;
195 else if(i.first == tkensdf_record::kgamma) std::cout<< left << " - Gamma : " << setw(maxsize1+1) << i.second.first << " (" << setw(maxsize2) << i.second.second << ")" << std::endl;
196 else if(i.first == tkensdf_record::kreference)std::cout<< left << " - Reference : " << setw(maxsize1+1) << i.second.first << " (" << setw(maxsize2) << i.second.second << ")" << std::endl;
197 else if(i.first == tkensdf_record::kend) std::cout<< left << " - End : " << setw(maxsize1+1) << i.second.first << " (" << setw(maxsize2) << i.second.second << ")" << std::endl;
198 else if(i.first == tkensdf_record::kunknown) std::cout<< left << " - Unknown : " << setw(maxsize1+1) << i.second.first << " (" << setw(maxsize2) << i.second.second << ")" << std::endl;
199 }
200 std::cout<<std::endl;
201}
Decodding of the ENSDF identification record properties.
void print(std::ostream &) const override
virtual bool set_record(const tkstring &_record) override
define the record from a string
std::pair< int, int > fposition
void set_stpop_position(int _pos)
void set_current_position(int _pos)
void set_start_position(int _pos)
void print_datasets()
print the list of loaded data sets for the current nucleus and data type
bool open_nuc(const tkstring &_nuc_name, const ensdf_data_type &_ftype=kensdf)
open the file for the slected nucleus and data type, and extract the available data sets
bool first_record(tkensdf_ident_rec *_dataset, tkstring &record)
move in the current file to the first record of the selected data set
void print_record_counters()
print record counters
bool next_record(tkensdf_ident_rec *_dataset, tkstring &record)
get the next record of the selected data set
Decodding of the ENSDF records.
virtual bool set_record(const tkstring &_record)
define the record from a string. Option false only checks if the record is an identification record
bool is_continuation_record()
to now if the record is a continuation record or not
record_type get_record_type()
get record type
static const int RSIZE
std::string with usefull tricks from TString (ROOT) and KVString (KaliVeda) and more....
Definition tkstring.h:31
tkstring copy() const
Returns a copy of this string.
Definition tkstring.cpp:347
tkstring & to_lower()
Change all letters to lower case.
Definition tkstring.cpp:36
static const char * form(const char *_format,...)
Definition tkstring.cpp:408
static tkstring Form(const char *_format,...)
Definition tkstring.cpp:322
tkstring & capitalize()
Change first letter of string from lower to upper case.
Definition tkstring.cpp:353
Definition tklog.cpp:16
tklog & error_v(tklog &log)
Definition tklog.h:407
tklog & info(tklog &log)
Definition tklog.h:313
tklog & warning_v(tklog &log)
Definition tklog.h:386
ensdf_data_type
tklog & error(tklog &log)
Definition tklog.h:344
tklog & do_endl(tklog &log)
Definition tklog.h:212