CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
AlgorithmEvaluation.cc
Go to the documentation of this file.
1 
15 // this class header
17 
18 // system include files
19 #include <string>
20 
21 #include <stack>
22 #include <queue>
23 #include <vector>
24 
25 #include <iostream>
26 #include <iomanip>
27 
28 #include <boost/algorithm/string.hpp>
29 #include <ext/hash_map>
30 
31 // user include files
32 
33 
34 //
36 
38 
41 
42 
45  m_algoResult(false),
46  m_logicalExpression(alg.algoLogicalExpression()),
47  m_rpnVector(alg.algoRpnVector()){
48 
49  // the rest is properly initialized by default
50 
51 }
52 
53 
54 // methods
55 
58  const std::vector<ConditionEvaluationMap>& conditionResultMaps) {
59 
60  // set result to false if there is no expression
61  if (m_rpnVector.empty() ) {
62  m_algoResult = false;
63 
64  // it should never be happen
65  throw cms::Exception("FailModule")
66  << "\nEmpty RPN vector for the logical expression = "
67  << m_logicalExpression
68  << std::endl;
69 
70  }
71 
72  // reserve memory
73  int rpnVectorSize = m_rpnVector.size();
74 
75  m_algoCombinationVector.reserve(rpnVectorSize);
76  m_operandTokenVector.reserve(rpnVectorSize);
77 
78  // stack containing temporary results
79  // FIXME we shall find a better solution than static
80  static std::stack<bool, std::vector<bool> > resultStack;
81  bool b1, b2;
82 
83  int opNumber = 0;
84 
85  for (RpnVector::const_iterator it = m_rpnVector.begin(); it != m_rpnVector.end(); it++) {
86 
87  //LogTrace("L1TGlobal")
88  //<< "\nit->operation = " << it->operation
89  //<< "\nit->operand = '" << it->operand << "'\n"
90  //<< std::endl;
91 
92  switch (it->operation) {
93 
95 
96  CItEvalMap itCond = (conditionResultMaps.at(chipNumber)).find(it->operand);
97  if (itCond != (conditionResultMaps[chipNumber]).end()) {
98 
99  if (0 == itCond->second) {
100  // it should never be happen, only valid conditions are in the maps
101  throw cms::Exception("FailModule") << "\nCondition "
102  << (it->operand)
103  << " NULL pointer found in condition map"
104  << std::endl;
105  }
106 
107  //
108  bool condResult = (itCond->second)->condLastResult();
109 
110  resultStack.push(condResult);
111 
112  // only conditions are added to /counted in m_operandTokenVector
113  // opNumber is the index of the condition in the logical expression
114  OperandToken opToken;
115  opToken.tokenName = it->operand;
116  opToken.tokenNumber = opNumber;
117  opToken.tokenResult = condResult;
118 
119  m_operandTokenVector.push_back(opToken);
120  opNumber++;
121 
122  //
123  CombinationsInCond const & combInCondition = (itCond->second)->getCombinationsInCond();
124  m_algoCombinationVector.push_back(combInCondition);
125 
126  }
127  else {
128 
129  // it should never be happen, all conditions are in the maps
130  throw cms::Exception("FailModule")
131  << "\nCondition " << (it->operand) << " not found in condition map"
132  << std::endl;
133 
134  }
135 
136  }
137 
138  break;
140  b1 = resultStack.top();
141  resultStack.pop(); // pop the top
142  resultStack.push(!b1); // and push the result
143  }
144 
145  break;
147  b1 = resultStack.top();
148  resultStack.pop();
149  b2 = resultStack.top();
150  resultStack.pop();
151  resultStack.push(b1 || b2);
152  }
153 
154  break;
156  b1 = resultStack.top();
157  resultStack.pop();
158  b2 = resultStack.top();
159  resultStack.pop();
160  resultStack.push(b1 && b2);
161  }
162 
163  break;
164  default: {
165  // should not arrive here
166  }
167 
168  break;
169  }
170 
171  }
172 
173  // get the result in the top of the stack
174 
175  m_algoResult = resultStack.top();
176 
177  // clear resultStack
178  while(!resultStack.empty()) resultStack.pop();
179 
180 }
181 
182 // print algorithm evaluation
183 void l1t::AlgorithmEvaluation::print(std::ostream& myCout) const {
184 
185  myCout << std::endl;
186 
187  myCout << " Algorithm result: " << m_algoResult << std::endl;
188 
189  myCout << " CombinationVector size: " << m_algoCombinationVector.size() << std::endl;
190 
191  int operandTokenVectorSize = m_operandTokenVector.size();
192 
193  myCout << " Operand token vector size: " << operandTokenVectorSize;
194 
195  if (operandTokenVectorSize == 0) {
196  myCout << " - not properly initialized! " << std::endl;
197  }
198  else {
199  myCout << std::endl;
200 
201  for (int i = 0; i < operandTokenVectorSize; ++i) {
202 
203  myCout << " " << std::setw(5) << (m_operandTokenVector[i]).tokenNumber << "\t"
204  << std::setw(25) << (m_operandTokenVector[i]).tokenName << "\t"
205  << (m_operandTokenVector[i]).tokenResult
206  << std::endl;
207 
208  }
209 
210  }
211 
212  myCout << std::endl;
213 }
214 
int i
Definition: DBlmapReader.cc:9
ConditionEvaluationMap::const_iterator CItEvalMap
void print(std::ostream &myCout) const
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:7
AlgorithmEvaluation(const GlobalAlgorithm &)
constructor
void evaluateAlgorithm(const int chipNumber, const std::vector< ConditionEvaluationMap > &)
evaluate an algorithm
volatile std::atomic< bool > shutdown_flag false
std::vector< SingleCombInCond > CombinationsInCond
all the object combinations evaluated to true in the condition