PAASS
Software suite to Acquire and Analyze Data from Pixie16
set2root.cpp
Go to the documentation of this file.
1 
11 #include <iostream>
12 #include <sstream>
13 #include <fstream>
14 
15 #ifdef USE_ROOT_OUTPUT
16 #include "TNamed.h"
17 #include "TFile.h"
18 #endif
19 
20 #include "set2root.hpp"
21 
22 #define FILTER_CLOCK 8E-3 // Filter clock (in us)
23 #define ADC_CLOCK 4E-3 // ADC clock (in us)
24 #define READ_SIZE 1280 // Size of each module in the .set file.
25 
26 #ifdef USE_ROOT_OUTPUT
27 bool parameter::write(TFile *f_, const std::string &dir_/*=""*/){
28  if(!f_ || !f_->IsOpen() || values.empty()){ return false; }
29 
30  if(values.size() == 1){
31  std::stringstream stream;
32  stream << values.front();
33  TNamed named(name.c_str(), stream.str().c_str());
34  named.Write();
35  }
36  else{
37  unsigned int count = 0;
38  for(std::vector<unsigned int>::iterator iter = values.begin(); iter != values.end(); iter++){
39  std::stringstream stream;
40  stream << (*iter);
41 
42  std::stringstream chName;
43  chName << name << "[";
44  if(count < 10)
45  chName << "0";
46  chName << count << "]";
47 
48  TNamed named(chName.str().c_str(), stream.str().c_str());
49  named.Write();
50  count++;
51  }
52  }
53 
54  return true;
55 }
56 #endif
57 
58 std::string parameter::print(){
59  if(values.empty()){ return ""; }
60 
61  std::stringstream stream;
62  if(values.size() == 1){
63  stream << name << "\t" << values.front() << "\n";
64  }
65  else{
66  unsigned int count = 0;
67  for(std::vector<unsigned int>::iterator iter = values.begin(); iter != values.end(); iter++){
68  stream << name << "[";
69  if(count < 10)
70  stream << "0";
71  stream << count << "]" << "\t" << (*iter) << "\n";
72  count++;
73  }
74  }
75 
76  return stream.str();
77 }
78 
85 parameter *findParameter(std::vector<parameter> &params, const unsigned int &offset_){
86  for(std::vector<parameter>::iterator iter = params.begin(); iter != params.end(); iter++){
87  if(iter->getOffset() == offset_){ return &(*iter); }
88  }
89  return NULL;
90 }
91 
98 bool readVarFile(std::vector<parameter> &params, const char *var_filename_){
99  std::ifstream input(var_filename_);
100  if(!input.good()){
101  return false;
102  }
103 
104  params.clear();
105 
106  unsigned int value;
107  std::string hexstr;
108  std::string name;
109  while(true){
110  input >> hexstr >> name;
111  if(input.eof()){ break; }
112 
113  if(hexstr.find("0x") != std::string::npos)
114  hexstr = hexstr.substr(hexstr.find("0x")+2);
115 
116  std::stringstream stream;
117  stream << std::hex << hexstr;
118  stream >> value;
119 
120  params.push_back(parameter(name, value));
121  }
122 
123  input.close();
124 
125  return true;
126 }
127 
136 int readSetFile(std::vector<parameter> &params, const char *set_filename_, const size_t &offset_, const size_t &len_=READ_SIZE){
137  if(params.empty()){ return -1; }
138 
139  std::ifstream input(set_filename_);
140  if(!input.good()){
141  return -1;
142  }
143 
144  input.seekg(offset_*4);
145  if(input.eof()){
146  input.close();
147  return -1;
148  }
149 
150  unsigned int firstValue = params.front().getOffset();
151  int output = 0;
152  parameter *current_param = NULL;
153  unsigned int word;
154 
155  for(size_t i = 0; i < len_; i++){
156  input.read((char*)&word, 4);
157  if(input.eof()){ break; }
158  output++;
159 
160  parameter *param = findParameter(params, firstValue+i);
161  if(param){
162  current_param = param;
163  }
164 
165  if(current_param){
166  current_param->values.push_back(word);
167  }
168  }
169 
170  input.close();
171 
172  return output;
173 }
174 
175 #ifdef USE_ROOT_OUTPUT
176 void closeFile(TFile *f_){
177  if(!f_){ return; }
178  f_->Close();
179 }
180 #else
181 void closeFile(std::ofstream &f_){
182  f_.close();
183 }
184 #endif
185 
186 void help(char * prog_name_){
187  std::cout << " SYNTAX: " << prog_name_ << " <varFile> <setFile> <startMod> <stopMod> [output]\n";
188 }
189 
190 int main(int argc, char *argv[]){
191  if(argc > 1 && (strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "--help") == 0)){
192  help(argv[0]);
193  return 0;
194  }
195  else if(argc < 5){
196  std::cout << " Invalid number of arguments to " << argv[0] << ". Expected 4, received " << argc-1 << ".\n";
197  help(argv[0]);
198  return 1;
199  }
200 
201  int start_mod = atoi(argv[3]);
202  int stop_mod = atoi(argv[4]);
203  if(start_mod < -1){
204  std::cout << " ERROR! Invalid start module specification (" << start_mod << ").\n";
205  return -1;
206  }
207  else if(stop_mod < -1){
208  std::cout << " ERROR! Invalid stop module specification (" << stop_mod << ").\n";
209  return -1;
210  }
211 
212  // Set the input filenames.
213  std::string varFilename = std::string(argv[1]);
214  std::string setFilename = std::string(argv[2]);
215 
216  // Get the output filename.
217  std::string outFilename;
218  if(argc > 5){ outFilename = std::string(argv[5]); }
219  else{
220 #ifdef USE_ROOT_OUTPUT
221  outFilename = "params.root";
222 #else
223  outFilename = "params.dat";
224 #endif
225  }
226 
227  // Open the output file.
228 #ifdef USE_ROOT_OUTPUT
229  TFile *f = new TFile(outFilename.c_str(), "RECREATE");
230  if(!f->IsOpen()){
231  std::cout << " ERROR! Failed to open output root file '" << outFilename << "'!\n";
232  return 1;
233  }
234  TNamed named1("varFile", varFilename.c_str());
235  TNamed named2("setFile", setFilename.c_str());
236  named1.Write();
237  named2.Write();
238 #else
239  std::ofstream f(outFilename.c_str());
240  if(!f.good()){
241  std::cout << " ERROR! Failed to open output file '" << outFilename << "'!\n";
242  return 1;
243  }
244  f << "varFile = " << varFilename << "\n";
245  f << "setFile = " << setFilename << "\n";
246 #endif
247 
248  // Read the .var file.
249  std::vector<parameter> params;
250  if(readVarFile(params, varFilename.c_str())){
251  std::cout << " Successfully read " << params.size() << " entries from .var file.\n";
252  }
253  else{
254  std::cout << " ERROR! Failed to read dsp .var file '" << varFilename << "'!\n";
255  closeFile(f);
256  return 1;
257  }
258 
259  // Read the .set file.
260  int readEntries;
261  for(int i = start_mod; i <= stop_mod; i++){
262  for(std::vector<parameter>::iterator iter = params.begin(); iter != params.end(); iter++){
263  iter->values.clear();
264  }
265 
266  readEntries = readSetFile(params, setFilename.c_str(), i*READ_SIZE);
267  if(readEntries > 0){
268  std::cout << " Successfully read " << readEntries << " words from .set file for module " << i << ".\n";
269  }
270  else if(readEntries == 0){
271  std::cout << " ERROR! Read zero entries from .set file for module " << i << "!\n";
272  continue;
273  }
274  else{
275  std::cout << " ERROR! Failed to read from .set file '" << setFilename << "'!\n";
276  closeFile(f);
277  return 1;
278  }
279 
280  std::stringstream stream;
281  stream << "MODULE";
282  if(i < 10)
283  stream << "0";
284  stream << i;
285 
286 #ifdef USE_ROOT_OUTPUT
287  f->mkdir(stream.str().c_str());
288 #else
289  f << "###############################################################################\n";
290  f << "## " << stream.str() << " ##\n";
291  f << "###############################################################################\n";
292 #endif
293 
294  // Write values to the output file.
295  for(std::vector<parameter>::iterator iter = params.begin(); iter != params.end(); iter++){
296 #ifdef USE_ROOT_OUTPUT
297  if(iter->values.size() > 1){
298  std::string dirname = stream.str()+"/"+iter->getName();
299  f->mkdir(dirname.c_str());
300  f->cd(dirname.c_str());
301  }
302  else{ f->cd(stream.str().c_str()); }
303  iter->write(f);
304 #else
305  f << iter->print();
306 #endif
307  }
308  }
309 
310  closeFile(f);
311  std::cout << " Done! Wrote output file '" << outFilename << "'.\n";
312 
313  return 0;
314 }
void closeFile(std::ofstream &f_)
Definition: set2root.cpp:181
std::vector< unsigned int > values
Definition: set2root.hpp:23
#define READ_SIZE
Definition: set2root.cpp:24
std::string print()
Definition: set2root.cpp:58
bool readVarFile(std::vector< parameter > &params, const char *var_filename_)
Definition: set2root.cpp:98
int readSetFile(std::vector< parameter > &params, const char *set_filename_, const size_t &offset_, const size_t &len_=READ_SIZE)
Definition: set2root.cpp:136
void help(char *prog_name_)
Definition: set2root.cpp:186
parameter * findParameter(std::vector< parameter > &params, const unsigned int &offset_)
Definition: set2root.cpp:85
int main(int argc, char *argv[])
Definition: set2root.cpp:190
A program to convert a pixie16 binary .set file into a root file.
std::string name
Definition: set2root.hpp:40