ATTPCROOT  0.3.0-alpha
A ROOT-based framework for analyzing data from active target detectors
AtParsers.cxx
Go to the documentation of this file.
1 #include "AtParsers.h"
2 
3 #include <Rtypes.h> // for Int_t, UInt_t, ClassImp, Double_t, TGeneri...
4 #include <TCollection.h> // for TIter
5 #include <TDOMParser.h> // for TDOMParser
6 #include <TList.h> // for TList
7 #include <TXMLAttr.h> // for TXMLAttr
8 #include <TXMLDocument.h> // for TXMLDocument
9 #include <TXMLNode.h> // for TXMLNode, TXMLNode::kXMLElementNode
10 
11 #include <algorithm> // for max
12 #include <cstdlib> // for atoi
13 #include <cstring> // for strcmp
14 #include <iostream> // for cerr
15 #include <memory> // for shared_ptr, __shared_ptr_access, make_shared
16 
18 
21 
22 Int_t AtTools::AtParsers::ParseIonFitXML(TString filename)
23 {
24 
25  std::shared_ptr<TDOMParser> parser = std::make_shared<TDOMParser>();
26  Int_t parsecode = parser->ParseFile(filename);
27 
28  if (parsecode < 0) {
29  std::cerr << parser->GetParseCodeMessage(parsecode) << "\n";
30  return -1;
31  }
32 
33  TXMLNode *node = parser->GetXMLDocument()->GetRootNode();
34  ParseIonList(node);
35  return 0;
36 }
37 
38 void AtTools::AtParsers::ParseIonList(TXMLNode *node)
39 {
40 
41  for (; node; node = node->GetNextNode()) {
42 
43  if (node->GetNodeType() == TXMLNode::kXMLElementNode) { // Element Node
44 
45  if (strcmp(node->GetNodeName(), "ion") == 0) {
46 
47  Int_t id = 0;
48  if (node->HasAttributes()) {
49  TList *attrList = node->GetAttributes();
50  TXMLAttr *attr = nullptr;
51  TIter next(attrList);
52  while ((attr = dynamic_cast<TXMLAttr *>(next()))) {
53  if (strcmp(attr->GetName(), "ID") == 0) {
54  id = atoi(attr->GetValue());
55  break;
56  }
57  }
58  } // Attributes
59 
60  ionList.push_back(ParseIon(node->GetChildren(), id));
61 
62  } // ion
63 
64  } // Element node
65 
66  ParseIonList(node->GetChildren());
67  }
68 }
69 
70 AtTools::IonFitInfo AtTools::AtParsers::ParseIon(TXMLNode *node, Int_t id)
71 {
72 
73  std::string ionName;
74  UInt_t PDG;
75  Double_t mass;
76  Int_t atomicNumber;
77  UInt_t MassNumber;
78  std::string eLossFile;
79 
80  for (; node; node = node->GetNextNode()) {
81  if (node->GetNodeType() == TXMLNode::kXMLElementNode) { // Element Node
82  if (strcmp(node->GetNodeName(), "Ion") == 0) {
83  ionName = node->GetText();
84  }
85  if (strcmp(node->GetNodeName(), "PDG") == 0) {
86  PDG = std::atoi(node->GetText());
87  }
88  if (strcmp(node->GetNodeName(), "Mass") == 0) {
89  mass = std::stod(node->GetText());
90  }
91  if (strcmp(node->GetNodeName(), "AtomicNumber") == 0) {
92  atomicNumber = std::atoi(node->GetText());
93  }
94  if (strcmp(node->GetNodeName(), "MassNumber") == 0) {
95  MassNumber = std::atoi(node->GetText());
96  }
97  if (strcmp(node->GetNodeName(), "ElossFile") == 0) {
98  eLossFile = node->GetText();
99  }
100  }
101  }
102 
103  AtTools::IonFitInfo ionInfo = {ionName, PDG, mass, atomicNumber, MassNumber, eLossFile};
104 
105  return ionInfo;
106 }
stod
double stod(const char *s)
Definition: util.cxx:20
node
Definition: fastcluster_dm.cxx:213
ClassImp
ClassImp(AtTools::AtParsers)
AtTools::AtParsers
Definition: AtParsers.h:49
AtTools::AtParsers::AtParsers
AtParsers()
AtTools::AtParsers::~AtParsers
~AtParsers()
AtTools::IonFitInfo
Definition: AtParsers.h:28
AtTools::AtParsers::ParseIonFitXML
Int_t ParseIonFitXML(TString filename)
Definition: AtParsers.cxx:22
AtParsers.h