Nymph  v1.5.2
Flow-Based Data Processing Framework
KTCutStatus.cc
Go to the documentation of this file.
1 /*
2  * KTCut.cc
3  *
4  * Created on: Aug 24, 2012
5  * Author: nsoblath
6  */
7 
8 #include "KTCutStatus.hh"
9 
11 #include "KTLogger.hh"
12 
13 namespace Nymph
14 {
15  KTLOGGER(cutlog, "KTCut");
16 
18  fCutResults(new KTCutResultHandle()),
19  fSummary()
20  {
21  }
22 
24  fCutResults(dynamic_cast< KTCutResultHandle* >(orig.fCutResults->Clone())),
25  fSummary()
26  {
27  UpdateStatus();
28  }
29 
31  {}
32 
34  {
35  fCutResults.reset(dynamic_cast< KTCutResultHandle* >(rhs.fCutResults->Clone()));
36  UpdateStatus();
37  return *this;
38  }
39 
41  {
42  KTDEBUG(cutlog, "Updating cut summary");
43  KTCutResult* cut = fCutResults.get()->Next(); // skip over KTCutResultHandle
44  if (cut == NULL)
45  {
46  KTDEBUG(cutlog, "No cuts");
47  fSummary.resize(1, false);
48  return;
49  }
50 
51  // loop through once to count cuts
52  unsigned nCuts = 0;
53  while (cut != NULL)
54  {
55  ++nCuts;
56  cut = cut->Next();
57  }
58  KTDEBUG(cutlog, nCuts << " cuts");
59  fSummary.resize(nCuts, false);
60  // loop through again to set cuts
61  cut = fCutResults.get()->Next(); // skip over KTCutResultHandle
62  for (unsigned iCut = 0; iCut < nCuts; ++iCut)
63  {
64  fSummary[iCut] = cut->GetState();
65  cut = cut->Next();
66  }
67  KTDEBUG(cutlog, "Cut summary bitset: " << fSummary);
68  return;
69  }
70 
71  bool KTCutStatus::AddCutResult(const std::string& cutName, bool state, bool doUpdateStatus)
72  {
73  if (! HasCutResult(cutName))
74  {
76  KTCutResult* newCut = factory->Create(cutName, fCutResults.get());
77  if (newCut == NULL)
78  {
79  KTERROR(cutlog, "Could not create cut of type <" << cutName << ">");
80  return false;
81  }
82  newCut->SetState(state);
83 
84  if (doUpdateStatus) UpdateStatus();
85  return true;
86  }
87  return false;
88 
89  }
90 
91  bool KTCutStatus::HasCutResult(const std::string& cutName) const
92  {
93  if (GetCutResult(cutName) == NULL) return false;
94  return true;
95 
96  }
97 
98  bool KTCutStatus::GetCutState(const std::string& cutName) const
99  {
100  const KTCutResult* cut = GetCutResult(cutName);
101  if (cut == NULL) return false;
102  return cut->GetState();
103  }
104 
105  const KTCutResult* KTCutStatus::GetCutResult(const std::string& cutName) const
106  {
107  const KTCutResult* cut = fCutResults.get()->Next(); // skip over KTCutResultHandle
108  while (cut != NULL)
109  {
110  if (cut->Name() == cutName) return cut;
111  cut = cut->Next();
112  }
113  return NULL;
114  }
115 
116  KTCutResult* KTCutStatus::GetCutResult(const std::string& cutName)
117  {
118  KTCutResult* cut = fCutResults.get()->Next(); // skip over KTCutResultHandle
119  while (cut != NULL)
120  {
121  if (cut->Name() == cutName) return cut;
122  cut = cut->Next();
123  }
124  return NULL;
125  }
126 
127  bool KTCutStatus::SetCutState(const std::string& cutName, bool state, bool doUpdateStatus)
128  {
129  KTCutResult* cut = GetCutResult(cutName);
130  if (cut == NULL)
131  {
132  KTWARN(cutlog, "Cut <" << cutName << "> not found");
133  return false;
134  }
135  cut->SetState(state);
136 
137  if (doUpdateStatus) UpdateStatus();
138  return true;
139  }
140 
141  /*
142  void KTCutStatus::RemoveCutResult(const std::string& cutName, bool doUpdateStatus)
143  {
144  KTCutResult* cut = fCutResults.get(); // don't skip over KTCutResultHandle
145  KTCutResult* nextCut = cut->Next();
146  while (nextCut != NULL)
147  {
148  if (nextCut->Name() == cutName)
149  {
150  // problem: can't pass nextCut->Next() to cut->Next()
151  if (doUpdateStatus) UpdateStatus();
152  }
153  }
154  return;
155  }
156  */
157 
158  std::string KTCutStatus::CutResultsPresent() const
159  {
160  KTCutResult* cut = fCutResults.get()->Next(); // skip over KTCutResultHandle
161  if (cut == NULL ) return "";
162 
163  std::string cutsPresent;
164  while (true)
165  {
166  cutsPresent = cut->Name() + cutsPresent;
167  cut = cut->Next();
168  if (cut != NULL) cutsPresent = " " + cutsPresent;
169  else break;
170  }
171  return cutsPresent;
172  }
173 
174  // private class KTCutStatus::KTCutResultHandle
175  // purposefully not registered with the cut factory
178  {
179  fState = false;
180  }
182  {}
183 
184  const std::string KTCutStatus::KTCutResultHandle::sName("top");
185 
186 
187  std::ostream& operator<<(std::ostream& out, const KTCutStatus& status)
188  {
189  out << "Cut summary: " << status.fSummary << '\n';
190  return out;
191  }
192 
193 
194 } /* namespace Nymph */
KTCutStatus & operator=(const KTCutStatus &rhs)
Definition: KTCutStatus.cc:33
KTExtensibleStructCore< XBaseType > * Create(const std::string &className)
bool SetCutState(bool state, bool doUpdateStatus=true)
friend std::ostream & operator<<(std::ostream &out, const KTCutStatus &status)
Definition: KTCutStatus.cc:187
const KTCutResult * GetCutResult() const
Definition: KTCutStatus.hh:191
bool GetCutState() const
Definition: KTCutStatus.hh:181
bool HasCutResult() const
Definition: KTCutStatus.hh:175
KTExtensibleStructCore * Next() const
Returns the pointer to the next field.
static const std::string sName
Definition: KTCutStatus.hh:68
Provides easy access to cut information.
Definition: KTCutStatus.hh:54
#define KTDEBUG(...)
Definition: KTLogger.hh:343
KTLOGGER(applog, "KTApplication")
bool AddCutResult(bool state, bool doUpdateStatus=true)
Definition: KTCutStatus.hh:146
bitset_type fSummary
Definition: KTCutStatus.hh:124
std::string CutResultsPresent() const
Returns a string with the names of the cuts that are present in bitset order.
Definition: KTCutStatus.cc:158
#define KTERROR(...)
Definition: KTLogger.hh:347
#define KTWARN(...)
Definition: KTLogger.hh:346
Contains the logger class and macros, based on Kasper&#39;s KLogger class.
boost::scoped_ptr< KTCutResultHandle > fCutResults
Definition: KTCutStatus.hh:122
virtual const std::string & Name() const =0