#include "QFramework/TQNFManualSetter.h"
#include "QFramework/TQStringUtils.h"
#include "QFramework/TQIterator.h"
#include "QFramework/TQUtils.h"
#include "QFramework/TQFolder.h"
#include "TMath.h"
#include "TRandom.h"
#include "QFramework/TQHistogramUtils.h"
#include "QFramework/TQNFChainloader.h"
#include <limits>
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <cmath>
#include <fstream>
#include "QFramework/TQLibrary.h"
ClassImp(TQNFManualSetter)
TQNFManualSetter::TQNFManualSetter(TQSampleFolder* f):
TQNFBase("TQNFManual"),
status(-999)
{
this->setSampleFolder(f);
}
TQNFManualSetter::TQNFManualSetter(TQSampleDataReader* rd):
TQNFBase("TQNFManual"),
status(-999)
{
this->setReader(rd);
}
TQNFManualSetter::~TQNFManualSetter(){
this->finalize();
this->clear();
}
int TQNFManualSetter::deployNF(const TString& name, const TString& cutName, TQFolder* config) {
std::vector<TString> vecStart;
vecStart.push_back(cutName);
return this->deployNF(name, vecStart, std::vector<TString>(), config);
}
int TQNFManualSetter::deployNF(const TString& name, const std::vector<TString>& startAtCutNames, const std::vector<TString>& stopAtCutNames, TQFolder* config, bool applyToStopCut){
if (!config) {
ERRORclass("Invalid pointer to configuration object!");
return -1;
}
if(!this->success()){
WARNclassargs(TQStringUtils::concat(3,name.Data(),TQListUtils::makeCSV(startAtCutNames).Data(),(config->getTagBoolDefault("overwrite",true) ? "true":"false")),"cannot deploy NF, no results available, status is %d!",this->status);
return -1;
}
bool overwrite = config->getTagBoolDefault("overwrite",true);
DEBUGclass("deploying NF for %s (overwrite=%d)",name.Data(),overwrite?1:0);
double nf = config->getTagDoubleDefault("value",1.);
double sigma = config->getTagDoubleDefault("uncertainty",0.);
double simpleScaleUncertainty = config->getTagBoolDefault("simpleScaleUncertainty", false);
if (!simpleScaleUncertainty && ! (iterationNumber < 0)) {
double variation = this->chainLoader->getRelVariation(TQStringUtils::concat(3,"NFManualSetter::",config->getPath().Data(),config->getName().Data()),nf,sigma);
nf *=variation;
}
int retval = 0;
TString readScheme;
bool hasReadScheme = config->getTagString("readScaleScheme",readScheme);
if (name.IsNull()) {
ERRORclass("No target path given for config %s",config->getName().Data());
return -1;
}
std::vector<TString> writeScaleSchemes = config->getTagVString("writeScaleScheme");
if(writeScaleSchemes.size() < 1){
writeScaleSchemes.push_back(config->getTagStringDefault("writeScaleScheme",".default"));
}
std::vector<TString> targets = this->getTargetCuts(startAtCutNames,stopAtCutNames,applyToStopCut);
for (size_t c=0; c<targets.size(); ++c) {
TString cutName = targets.at(c);
TQSampleFolderIterator sItr(this->fReader->getListOfSampleFolders(name),true);
while(sItr.hasNext()){
TQSampleFolder* s = sItr.readNext();
if(!s) continue;
double readFactor = 1.;
double readSigma = 0.;
if (hasReadScheme) {
if (!s->getScaleFactor(readScheme+":"+cutName,readFactor,readSigma,false)) {
WARNclass("Failed to read scheme '%s' at cut '%s'",readScheme.Data(),cutName.Data());
readFactor = 1.;
readSigma = 0.;
}
}
for(size_t k=0; k<writeScaleSchemes.size(); k++){
int n = s->setScaleFactor(writeScaleSchemes[k]+":"+cutName+(overwrite>0?"":"<<"), nf*readFactor,sqrt(pow(sigma*readFactor,2) + pow(readSigma*nf,2)) );
#ifdef _DEBUG_
if (s->getFolder(".scalefactors")) s->getFolder(".scalefactors")->print();
#endif
if(n == 0){
ERRORclass("unable to set scale factor for cut '%s' on path '%s' with scheme '%s'",cutName.Data(),s->getPath().Data(),writeScaleSchemes[k].Data());
}
this->addNFPath(s->getPath(),cutName,writeScaleSchemes[k]);
retval += n;
}
}
if(this->infoFolder){
TQFolder * sfProcessList = this->infoFolder->getFolder(TString::Format(this->getTagStringDefault("nfListPattern",".cut.%s+").Data(),cutName.Data()));
TList* sflist = this->fReader->getListOfSampleFolders(name);
TQSampleFolder * processSampleFolder = ( sflist && sflist->GetEntries() > 0 ) ? (TQSampleFolder*)(sflist->First()) : NULL;
if(sflist) delete sflist;
TString processTitle = name;
if (processSampleFolder)
processSampleFolder->getTagString(this->getTagStringDefault("processTitleKey","style.default.title"), processTitle);
sfProcessList->setTagString(TQFolder::makeValidIdentifier(processTitle),processTitle);
}
}
return retval;
}
int TQNFManualSetter::deployResult(const std::vector<TString>& startAtCutNames, const std::vector<TString>& stopAtCutNames, int overwrite, bool applyToStopCut){
if(!this->success()){
WARNclassargs(TQStringUtils::concat(3,TQListUtils::makeCSV(startAtCutNames).Data(),TQStringUtils::concat(stopAtCutNames).Data(),TQStringUtils::getStringFromBool(overwrite).Data(),TQStringUtils::getStringFromBool(applyToStopCut).Data()),"cannot deploy NFs, no results available, status is %d!",this->status);
return -1;
}
int retval = 0;
for(int i=0; i<configs->GetEntries(); i++){
TQFolder* config = dynamic_cast<TQFolder*> (configs->At(i));
retval += this->deployNF(config->getTagStringDefault("path",""), config->getTagVString("applyToCut"), config->getTagVString("stopAtCut"), config);
}
return retval;
}
void TQNFManualSetter::clear(){
this->initialized = false;
this->status = -999;
}
bool TQNFManualSetter::finalizeSelf(){
return true;
}
bool TQNFManualSetter::initializeSelf(){
if(!this->fReader){
return false;
}
this->status = 0;
return true;
}
int TQNFManualSetter::getStatus(){
return this->status;
}
TString TQNFManualSetter::getStatusMessage(){
switch(this->status){
case -999:
return "uninitialized";
case -10:
return "error during initialization";
case 0:
return "all OK";
default:
return "unkown error";
}
}
void TQNFManualSetter::printStatus(){
INFOclass("current status of instance '%s' is '%d': %s",this->GetName(),(int)(this->status),this->getStatusMessage().Data());
}
int TQNFManualSetter::execute(int itrNumber) {
this->iterationNumber = itrNumber;
return 0;
}
bool TQNFManualSetter::success(){
if(this->initialized && (this->status == 0))
return true;
return false;
}
bool TQNFManualSetter::readConfiguration(TQFolder* f){
if(!f) return false;
this->configs = f->getListOfFolders("?");
if(!configs || configs->GetEntries()<1) {
ERRORclass("Invalid configuration for TQNFManualSetter");
return false;
}
this->initialized = true;
this->status = 0;
return true;
}