#include "QFramework/TQFilterObservable.h"
#include <limits>
#include <vector>
#include "TTreeFormula.h"
#include "TString.h"
#include "QFramework/TQSample.h"
#include "QFramework/TQStringUtils.h"
#include "QFramework/TQUtils.h"
#include "QFramework/TQLibrary.h"
ClassImp(TQFilterObservable)
TQFilterObservable::TQFilterObservable(){
DEBUGclass("default constructor called");
}
TQFilterObservable::~TQFilterObservable(){
DEBUGclass("destructor called");
}
TObjArray* TQFilterObservable::getBranchNames() const {
DEBUGclass("retrieving branch names");
TObjArray* bnames = new TObjArray();
if (!this->fCutObs) {
ERROR("there is no fCutObs");
} else {
TCollection* c = this->fCutObs->getBranchNames();
if(c){
c->SetOwner(false);
bnames->AddAll(c);
delete c;
}
}
if (!this->fValueObs) {
ERROR("there is no fValueObs");
} else {
TCollection* c = this->fValueObs->getBranchNames();
if(c){
c->SetOwner(false);
bnames->AddAll(c);
delete c;
}
}
return bnames;
}
bool TQFilterObservable::makeCache() const {
if (this->fCachedEntry == this->getCurrentEntry() && this->fCachedEntry>0) return true;
this->fCachedValues.clear();
if (!this->fCutObs) {
ERRORclass("No cut observable present! (Was this observable correctly initialized?)");
return false;
}
if (!this->fValueObs) {
ERRORclass("No value observable present! (Was this observable correctly initialized?)");
return false;
}
if (this->fCutObs->getObservableType() == TQObservable::ObservableType::scalar) {
if (std::fabs(this->fCutObs->getValue()) > 2*std::numeric_limits<double>::epsilon()) {
for (int i=0; i<this->fValueObs->getNevaluations(); i++) {
this->fCachedValues.push_back(this->fValueObs->getValueAt(i));
}
}
} else if (this->fValueObs->getObservableType() == TQObservable::ObservableType::vector) {
int nEval = this->fCutObs->getNevaluations();
if (nEval != this->fValueObs->getNevaluations()) {
ERRORclass(TString::Format("Cut and value observables have different number of evaluations in TQFilterObservable with expression '%s'",this->getExpression().Data()).Data());
return false;
}
for (int i=0; i<nEval; i++) {
if (std::fabs(this->fCutObs->getValueAt(i)) > 2*std::numeric_limits<double>::epsilon()) {
this->fCachedValues.push_back(this->fValueObs->getValueAt(i));
}
}
} else {
ERRORclass("Illegal combination of observable types: Trying to filter a scalar value based on a vector type cut is highly ambiguous!");
return false;
}
this->fCachedEntry = this->getCurrentEntry();
return true;
}
double TQFilterObservable::getValue() const {
throw std::runtime_error("Called vector type observable TQFilterObservable in scalar context.");
return -999.;
}
int TQFilterObservable::getNevaluations() const {
if (!this->makeCache()) {
throw std::runtime_error(TString::Format("Failed to create return value(s) in TQFilterObservable with expression '%s'",this->getExpression().Data()).Data());
return -1;
}
return this->fCachedValues.size();
}
double TQFilterObservable::getValueAt(int index) const {
if (index >= TQFilterObservable::getNevaluations()) {
throw std::runtime_error("Caught attempt to evaluate TQFilterObservable out of bounds!");
return -999.;
} else {
return this->fCachedValues.at(index);
}
}
TQFilterObservable::TQFilterObservable(const TString& expression):
TQObservable(expression)
{
DEBUGclass("constructor called with '%s'",expression.Data());
this->SetName(TQObservable::makeObservableName(expression));
this->setExpression(expression);
}
const TString& TQFilterObservable::getExpression() const {
return this->fExpression;
}
bool TQFilterObservable::hasExpression() const {
return true;
}
void TQFilterObservable::setExpression(const TString& expr){
if (!this->parseExpression(expr)) this->fExpression = expr;
else this->fExpression = TString("Filter("+this->fValueString+","+this->fCutString+")");
}
bool TQFilterObservable::parseExpression(const TString& expr){
if (!expr.BeginsWith("Filter(") || !expr.EndsWith(")")) {
return false;
}
TString exprArgs = expr(7, expr.Length() - 8);
std::vector<TString> tokens = TQStringUtils::tokenizeVector(exprArgs, ",", true, "()[]{}", "'\"");
if (tokens.size() != 2) {
return false;
}
this->fValueString = tokens[0];
this->fCutString = tokens[1];
return true;
}
void TQFilterObservable::clearParsedExpression(){
this->fValueString.Clear();
this->fCutString.Clear();
}
TString TQFilterObservable::getActiveExpression() const {
return this->fActiveExpression;
}
Long64_t TQFilterObservable::getCurrentEntry() const {
if (this->fCutObs && this->fCutObs->getCurrentEntry()>0) return this->fCutObs->getCurrentEntry();
if (this->fValueObs && this->fValueObs->getCurrentEntry()>0) return this->fValueObs->getCurrentEntry();
return -1;
}
bool TQFilterObservable::initializeSelf(){
this->fActiveExpression = TQObservable::compileExpression(this->fExpression,this->fSample);
if (!this->parseExpression(this->fExpression)) {
return false;
}
DEBUGclass("Initializing observable with active expression '%s'",this->fActiveExpression.Data());
this->fValueObs = TQObservable::getObservable(this->fValueString, this->fSample);
if (!this->fValueObs) {
ERROR("Failed to retrieve value-observable.");
return false;
}
if (!this->fValueObs->initialize(this->fSample)) {
ERROR("Failed to initialize value-observable.");
return false;
}
this->fCutObs = TQObservable::getObservable(this->fCutString, this->fSample);
if (!this->fCutObs) {
ERROR("Failed to retrieve cut-observable.");
return false;
}
if (!this->fCutObs->initialize(this->fSample)) {
ERROR("Failed to initialize cut-observable.");
return false;
}
return true;
}
bool TQFilterObservable::finalizeSelf(){
if (this->fCutObs != NULL) {
if (!this->fCutObs->finalize()) {
ERROR("finalizing CutObs failed");
}
this->fCutObs = NULL;
}
if (this->fValueObs != NULL) {
if (!this->fValueObs->finalize()) {
ERROR("finalizing ValueObs failed");
}
this->fValueObs = NULL;
}
this->clearParsedExpression();
this->fActiveExpression.Clear();
return true;
}
int TQFilterObservable::registerFactory() {
TQObservable::manager.registerFactory(TQFilterObservable::getFactory(),true);
ERROR("registerFactory");
return 0;
}
DEFINE_OBSERVABLE_FACTORY(TQFilterObservable,TString expr){
if (!expr.BeginsWith("Filter(") || !expr.EndsWith(")")) {
return NULL;
}
TString exprArgs = expr(7, expr.Length() - 8);
std::vector<TString> tokens = TQStringUtils::tokenizeVector(exprArgs, ",", true, "()[]{}", "'\"");
if (tokens.size() != 2) {
return NULL;
}
return new TQFilterObservable(expr);
return NULL;
}
TQFilterObservable.cxx:10 TQFilterObservable.cxx:11 TQFilterObservable.cxx:12 TQFilterObservable.cxx:13 TQFilterObservable.cxx:14 TQFilterObservable.cxx:15 TQFilterObservable.cxx:16 TQFilterObservable.cxx:17 TQFilterObservable.cxx:18 TQFilterObservable.cxx:19 TQFilterObservable.cxx:20 TQFilterObservable.cxx:21 TQFilterObservable.cxx:22 TQFilterObservable.cxx:23 TQFilterObservable.cxx:24 TQFilterObservable.cxx:25 TQFilterObservable.cxx:26 TQFilterObservable.cxx:27 TQFilterObservable.cxx:28 TQFilterObservable.cxx:29 TQFilterObservable.cxx:30 TQFilterObservable.cxx:31 TQFilterObservable.cxx:32 TQFilterObservable.cxx:33 TQFilterObservable.cxx:34 TQFilterObservable.cxx:35 TQFilterObservable.cxx:36 TQFilterObservable.cxx:37 TQFilterObservable.cxx:38 TQFilterObservable.cxx:39 TQFilterObservable.cxx:40 TQFilterObservable.cxx:41 TQFilterObservable.cxx:42 TQFilterObservable.cxx:43 TQFilterObservable.cxx:44 TQFilterObservable.cxx:45 TQFilterObservable.cxx:46 TQFilterObservable.cxx:47 TQFilterObservable.cxx:48 TQFilterObservable.cxx:49 TQFilterObservable.cxx:50 TQFilterObservable.cxx:51 TQFilterObservable.cxx:52 TQFilterObservable.cxx:53 TQFilterObservable.cxx:54 TQFilterObservable.cxx:55 TQFilterObservable.cxx:56 TQFilterObservable.cxx:57 TQFilterObservable.cxx:58 TQFilterObservable.cxx:59 TQFilterObservable.cxx:60 TQFilterObservable.cxx:61 TQFilterObservable.cxx:62 TQFilterObservable.cxx:63 TQFilterObservable.cxx:64 TQFilterObservable.cxx:65 TQFilterObservable.cxx:66 TQFilterObservable.cxx:67 TQFilterObservable.cxx:68 TQFilterObservable.cxx:69 TQFilterObservable.cxx:70 TQFilterObservable.cxx:71 TQFilterObservable.cxx:72 TQFilterObservable.cxx:73 TQFilterObservable.cxx:74 TQFilterObservable.cxx:75 TQFilterObservable.cxx:76 TQFilterObservable.cxx:77 TQFilterObservable.cxx:78 TQFilterObservable.cxx:79 TQFilterObservable.cxx:80 TQFilterObservable.cxx:81 TQFilterObservable.cxx:82 TQFilterObservable.cxx:83 TQFilterObservable.cxx:84 TQFilterObservable.cxx:85 TQFilterObservable.cxx:86 TQFilterObservable.cxx:87 TQFilterObservable.cxx:88 TQFilterObservable.cxx:89 TQFilterObservable.cxx:90 TQFilterObservable.cxx:91 TQFilterObservable.cxx:92 TQFilterObservable.cxx:93 TQFilterObservable.cxx:94 TQFilterObservable.cxx:95 TQFilterObservable.cxx:96 TQFilterObservable.cxx:97 TQFilterObservable.cxx:98 TQFilterObservable.cxx:99 TQFilterObservable.cxx:100 TQFilterObservable.cxx:101 TQFilterObservable.cxx:102 TQFilterObservable.cxx:103 TQFilterObservable.cxx:104 TQFilterObservable.cxx:105 TQFilterObservable.cxx:106 TQFilterObservable.cxx:107 TQFilterObservable.cxx:108 TQFilterObservable.cxx:109 TQFilterObservable.cxx:110 TQFilterObservable.cxx:111 TQFilterObservable.cxx:112 TQFilterObservable.cxx:113 TQFilterObservable.cxx:114 TQFilterObservable.cxx:115 TQFilterObservable.cxx:116 TQFilterObservable.cxx:117 TQFilterObservable.cxx:118 TQFilterObservable.cxx:119 TQFilterObservable.cxx:120 TQFilterObservable.cxx:121 TQFilterObservable.cxx:122 TQFilterObservable.cxx:123 TQFilterObservable.cxx:124 TQFilterObservable.cxx:125 TQFilterObservable.cxx:126 TQFilterObservable.cxx:127 TQFilterObservable.cxx:128 TQFilterObservable.cxx:129 TQFilterObservable.cxx:130 TQFilterObservable.cxx:131 TQFilterObservable.cxx:132 TQFilterObservable.cxx:133 TQFilterObservable.cxx:134 TQFilterObservable.cxx:135 TQFilterObservable.cxx:136 TQFilterObservable.cxx:137 TQFilterObservable.cxx:138 TQFilterObservable.cxx:139 TQFilterObservable.cxx:140 TQFilterObservable.cxx:141 TQFilterObservable.cxx:142 TQFilterObservable.cxx:143 TQFilterObservable.cxx:144 TQFilterObservable.cxx:145 TQFilterObservable.cxx:146 TQFilterObservable.cxx:147 TQFilterObservable.cxx:148 TQFilterObservable.cxx:149 TQFilterObservable.cxx:150 TQFilterObservable.cxx:151 TQFilterObservable.cxx:152 TQFilterObservable.cxx:153 TQFilterObservable.cxx:154 TQFilterObservable.cxx:155 TQFilterObservable.cxx:156 TQFilterObservable.cxx:157 TQFilterObservable.cxx:158 TQFilterObservable.cxx:159 TQFilterObservable.cxx:160 TQFilterObservable.cxx:161 TQFilterObservable.cxx:162 TQFilterObservable.cxx:163 TQFilterObservable.cxx:164 TQFilterObservable.cxx:165 TQFilterObservable.cxx:166 TQFilterObservable.cxx:167 TQFilterObservable.cxx:168 TQFilterObservable.cxx:169 TQFilterObservable.cxx:170 TQFilterObservable.cxx:171 TQFilterObservable.cxx:172 TQFilterObservable.cxx:173 TQFilterObservable.cxx:174 TQFilterObservable.cxx:175 TQFilterObservable.cxx:176 TQFilterObservable.cxx:177 TQFilterObservable.cxx:178 TQFilterObservable.cxx:179 TQFilterObservable.cxx:180 TQFilterObservable.cxx:181 TQFilterObservable.cxx:182 TQFilterObservable.cxx:183 TQFilterObservable.cxx:184 TQFilterObservable.cxx:185 TQFilterObservable.cxx:186 TQFilterObservable.cxx:187 TQFilterObservable.cxx:188 TQFilterObservable.cxx:189 TQFilterObservable.cxx:190 TQFilterObservable.cxx:191 TQFilterObservable.cxx:192 TQFilterObservable.cxx:193 TQFilterObservable.cxx:194 TQFilterObservable.cxx:195 TQFilterObservable.cxx:196 TQFilterObservable.cxx:197 TQFilterObservable.cxx:198 TQFilterObservable.cxx:199 TQFilterObservable.cxx:200 TQFilterObservable.cxx:201 TQFilterObservable.cxx:202 TQFilterObservable.cxx:203 TQFilterObservable.cxx:204 TQFilterObservable.cxx:205 TQFilterObservable.cxx:206 TQFilterObservable.cxx:207 TQFilterObservable.cxx:208 TQFilterObservable.cxx:209 TQFilterObservable.cxx:210 TQFilterObservable.cxx:211 TQFilterObservable.cxx:212 TQFilterObservable.cxx:213 TQFilterObservable.cxx:214 TQFilterObservable.cxx:215 TQFilterObservable.cxx:216 TQFilterObservable.cxx:217 TQFilterObservable.cxx:218 TQFilterObservable.cxx:219 TQFilterObservable.cxx:220 TQFilterObservable.cxx:221 TQFilterObservable.cxx:222 TQFilterObservable.cxx:223 TQFilterObservable.cxx:224 TQFilterObservable.cxx:225 TQFilterObservable.cxx:226 TQFilterObservable.cxx:227 TQFilterObservable.cxx:228 TQFilterObservable.cxx:229 TQFilterObservable.cxx:230 TQFilterObservable.cxx:231 TQFilterObservable.cxx:232 TQFilterObservable.cxx:233 TQFilterObservable.cxx:234 TQFilterObservable.cxx:235 TQFilterObservable.cxx:236 TQFilterObservable.cxx:237 TQFilterObservable.cxx:238 TQFilterObservable.cxx:239 TQFilterObservable.cxx:240 TQFilterObservable.cxx:241 TQFilterObservable.cxx:242 TQFilterObservable.cxx:243 TQFilterObservable.cxx:244 TQFilterObservable.cxx:245 TQFilterObservable.cxx:246 TQFilterObservable.cxx:247 TQFilterObservable.cxx:248 TQFilterObservable.cxx:249 TQFilterObservable.cxx:250 TQFilterObservable.cxx:251 TQFilterObservable.cxx:252 TQFilterObservable.cxx:253 TQFilterObservable.cxx:254 TQFilterObservable.cxx:255 TQFilterObservable.cxx:256 TQFilterObservable.cxx:257 TQFilterObservable.cxx:258 TQFilterObservable.cxx:259 TQFilterObservable.cxx:260 TQFilterObservable.cxx:261 TQFilterObservable.cxx:262 TQFilterObservable.cxx:263 TQFilterObservable.cxx:264 TQFilterObservable.cxx:265 TQFilterObservable.cxx:266 TQFilterObservable.cxx:267 TQFilterObservable.cxx:268 TQFilterObservable.cxx:269 TQFilterObservable.cxx:270 TQFilterObservable.cxx:271 TQFilterObservable.cxx:272 TQFilterObservable.cxx:273 TQFilterObservable.cxx:274 TQFilterObservable.cxx:275 TQFilterObservable.cxx:276 TQFilterObservable.cxx:277 TQFilterObservable.cxx:278 TQFilterObservable.cxx:279 TQFilterObservable.cxx:280 TQFilterObservable.cxx:281 TQFilterObservable.cxx:282 TQFilterObservable.cxx:283 TQFilterObservable.cxx:284 TQFilterObservable.cxx:285 TQFilterObservable.cxx:286 TQFilterObservable.cxx:287 TQFilterObservable.cxx:288 TQFilterObservable.cxx:289 TQFilterObservable.cxx:290 TQFilterObservable.cxx:291 TQFilterObservable.cxx:292 TQFilterObservable.cxx:293 TQFilterObservable.cxx:294 TQFilterObservable.cxx:295 TQFilterObservable.cxx:296 TQFilterObservable.cxx:297 TQFilterObservable.cxx:298 TQFilterObservable.cxx:299 TQFilterObservable.cxx:300 TQFilterObservable.cxx:301 TQFilterObservable.cxx:302 TQFilterObservable.cxx:303 TQFilterObservable.cxx:304 TQFilterObservable.cxx:305 TQFilterObservable.cxx:306 TQFilterObservable.cxx:307 TQFilterObservable.cxx:308 TQFilterObservable.cxx:309 TQFilterObservable.cxx:310 TQFilterObservable.cxx:311 TQFilterObservable.cxx:312 TQFilterObservable.cxx:313 TQFilterObservable.cxx:314 TQFilterObservable.cxx:315 TQFilterObservable.cxx:316 TQFilterObservable.cxx:317 TQFilterObservable.cxx:318 TQFilterObservable.cxx:319 TQFilterObservable.cxx:320 TQFilterObservable.cxx:321 TQFilterObservable.cxx:322 TQFilterObservable.cxx:323 TQFilterObservable.cxx:324 TQFilterObservable.cxx:325 TQFilterObservable.cxx:326 TQFilterObservable.cxx:327 TQFilterObservable.cxx:328 TQFilterObservable.cxx:329 TQFilterObservable.cxx:330 TQFilterObservable.cxx:331 TQFilterObservable.cxx:332 TQFilterObservable.cxx:333 TQFilterObservable.cxx:334 TQFilterObservable.cxx:335 TQFilterObservable.cxx:336 TQFilterObservable.cxx:337 TQFilterObservable.cxx:338 TQFilterObservable.cxx:339 TQFilterObservable.cxx:340 TQFilterObservable.cxx:341 TQFilterObservable.cxx:342 TQFilterObservable.cxx:343 TQFilterObservable.cxx:344 TQFilterObservable.cxx:345 TQFilterObservable.cxx:346 TQFilterObservable.cxx:347 TQFilterObservable.cxx:348 TQFilterObservable.cxx:349 TQFilterObservable.cxx:350 TQFilterObservable.cxx:351 TQFilterObservable.cxx:352 TQFilterObservable.cxx:353 TQFilterObservable.cxx:354 TQFilterObservable.cxx:355 TQFilterObservable.cxx:356 TQFilterObservable.cxx:357 TQFilterObservable.cxx:358 TQFilterObservable.cxx:359 TQFilterObservable.cxx:360 TQFilterObservable.cxx:361 TQFilterObservable.cxx:362 TQFilterObservable.cxx:363 TQFilterObservable.cxx:364 TQFilterObservable.cxx:365 TQFilterObservable.cxx:366