#include "QFramework/TQNFBase.h"
#include "QFramework/TQNFChainloader.h"
#include "TROOT.h"
#include "QFramework/TQNamedTaggable.h"
#include "TMath.h"
#include "QFramework/TQUtils.h"
#include "QFramework/TQIterator.h"
#include "QFramework/TQLibrary.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include <cstdlib>
#include <cmath>
ClassImp(TQNFBase)
TQNFBase::TQNFBase() : TQNamedTaggable(),
fReader(NULL),
fOwnerOfReader(false),
verbosity(1),
infoFolder(NULL),
cutInfoFolder(NULL),
initialized(false),
iterationNumber(-1)
{
}
TQNFBase::TQNFBase(const TString& name) : TQNamedTaggable(name),
fReader(NULL),
fOwnerOfReader(false),
verbosity(1),
infoFolder(NULL),
cutInfoFolder(NULL),
initialized(false),
iterationNumber(-1)
{
}
void TQNFBase::addNFPath(const TString& path, const TString& cutname, const TString& scalescheme){
if(this->iterationNumber != 0) return;
this->vNFpaths.push_back(path+"/"+scalescheme+":"+cutname);
}
const std::vector<TString>& TQNFBase::getNFpaths() {
return vNFpaths;
}
void TQNFBase::printNFPaths(){
std::cout << TQStringUtils::makeBoldWhite(this->GetName()) << std::endl;
for(size_t i=0; i<vNFpaths.size(); ++i){
std::cout << vNFpaths[i] << std::endl;
}
}
void TQNFBase::setChainLoader(TQNFChainloader* loader) {
this->chainLoader = loader;
}
TString TQNFBase::getPathTag(const TString& tagname){
TString path;
if(!this->getTagString(tagname,path)) return "";
if(!path.BeginsWith("/")){
return TQFolder::concatPaths(this->getTagStringDefault(tagname+".prefix", TQLibrary::getWorkingDirectory()),path);
}
return path;
}
bool TQNFBase::initialize(){
if(this->initialized) return true;
this->initialized = this->initializeSelf();
TString logfilename = this->getPathTag("saveLog");
if(!logfilename.IsNull()){
this->setOutputStream(logfilename,this->verbosity);
}
return this->initialized;
}
bool TQNFBase::finalize(){
this->initialized=false;
if(this->finalizeSelf()){
if(this->hasTag("saveLog")) this->closeOutputStream();
return true;
}
if(this->hasTag("saveLog")) this->closeOutputStream();
return false;
}
int TQNFBase::getStatus(){
return 0;
}
TString TQNFBase::getStatusMessage(){
return "<status unknown>";
}
int TQNFBase::deployResult(const std::vector<TString>& startAtCutNames, const std::vector<TString>& stopAtCuts ){
return this->deployResult(startAtCutNames,stopAtCuts,this->getTagIntegerDefault("overwrite",1),this->getTagBoolDefault("applyToStopCut",true));
}
void TQNFBase::setInfoFolder(TQFolder* f){
this->infoFolder = f;
}
void TQNFBase::setCutInfoFolder(TQFolder* f){
this->cutInfoFolder = f;
}
TQNFBase::~TQNFBase(){
if(this->fReader && this->fOwnerOfReader) delete fReader;
}
void TQNFBase::setSampleFolder(TQSampleFolder* sf){
if(this->fReader && this->fOwnerOfReader){
delete this->fReader;
}
if(sf){
this->fReader = new TQSampleDataReader(sf);
this->fOwnerOfReader = true;
} else {
this->fReader = NULL;
}
}
void TQNFBase::setReader(TQSampleDataReader* rd){
if(this->fOwnerOfReader){
delete this->fReader;
}
this->fReader = rd;
this->fOwnerOfReader = false;
}
TQSampleFolder* TQNFBase::getSampleFolder(){
if(!this->fReader) return NULL;
return this->fReader->getSampleFolder();
}
TQSampleDataReader* TQNFBase::getReader(){
return this->fReader;
}
void TQNFBase::setVerbosity(int verbosity){
this->verbosity = verbosity;
}
void TQNFBase::setOutputStream(const TString& outfile, int verbosity){
bool ok = this->messages.open(outfile);
if(ok) this->messages.sendMessage(TQMessageStream::INFO,"%s '%s' opening log file",this->Class()->GetName(),this->GetName());
this->messages.sendMessage(TQMessageStream::INFO,TQUtils::getTimeStamp());
this->messages.newline();
this->verbosity = verbosity;
}
void TQNFBase::closeOutputStream(){
this->messages.close();
}
std::vector<TString> TQNFBase::getTargetCuts(const std::vector<TString>& startCuts, const std::vector<TString>& stopCuts, bool applyToStopCut) {
std::vector<TString> retVec;
if (!this->cutInfoFolder) {
WARNclass("Missing cut info folder, returning an empty vector of target cuts!");
return retVec;
}
TList* stopFolders = NULL;
TList* startFolders = NULL;
for(size_t i=0; i<startCuts.size(); ++i) {
if (!startFolders) startFolders = new TList();
startFolders->AddAll(this->cutInfoFolder->getListOfFolders(TString::Format("*/%s",startCuts.at(i).Data())));
}
for(size_t i=0; i<stopCuts.size(); ++i) {
if (!stopFolders) stopFolders = new TList();
stopFolders->AddAll(this->cutInfoFolder->getListOfFolders(TString::Format("*/%s",stopCuts.at(i).Data())));
}
TList* lTargets = new TList();
TQFolderIterator itr(startFolders);
while(itr.hasNext()) {
TQFolder* f = itr.readNext();
if (!f) continue;
this->getTargetCutsWorker(lTargets, f, stopFolders, applyToStopCut);
}
std::map<TQFolder*,bool> map;
TQFolderIterator targetItr(lTargets);
while(targetItr.hasNext()) {
TQFolder* f = targetItr.readNext();
if (!f) continue;
map[f] = true;
}
delete lTargets;
for(std::map<TQFolder*,bool>::iterator iter = map.begin(); iter != map.end(); ++iter) {
if (!iter->first) continue;
retVec.push_back((iter->first)->GetName());
}
return retVec;
}
void TQNFBase::getTargetCutsWorker(TList* targets, TQFolder* startCut, TList* stopCuts, bool applyToStopCut) {
if (!startCut) return;
if (!targets) targets = new TList();
targets->Add(startCut);
if (!stopCuts) return;
TQFolderIterator stopItr(stopCuts);
while(stopItr.hasNext()) {
if (stopItr.readNext() == startCut) {
return;
}
}
TList * subFolder = startCut->getListOfFolders();
TQFolderIterator subItr(subFolder);
bool flagSubFolder;
while(subItr.hasNext()) {
TQFolder* f = subItr.readNext();
flagSubFolder = false;
if (!applyToStopCut){
for(const auto&& stopCutName: *stopCuts){
if (f->GetName() == stopCutName->GetName()){
flagSubFolder = true;
break;
}
}
if (!flagSubFolder){
this->getTargetCutsWorker(targets, f, stopCuts, applyToStopCut);
}
}
else{
this->getTargetCutsWorker(targets, f, stopCuts, applyToStopCut);
}
}
return;
}