#include <iostream>
#include <fstream>
#include <sstream>
#include <cstdlib>
#include <vector>
#include <iterator>
#include <algorithm>

#include "SFramework/TSModelFactory.h"
#include "RooStats/HistFactory/PiecewiseInterpolation.h"
#include "RooStats/HistFactory/FlexibleInterpVar.h"
#include "RooStats/ModelConfig.h"
#include "RooRealVar.h"
#include "RooRealSumPdf.h"
#include "QFramework/TQStringUtils.h"
#include "QFramework/TQTaggable.h"
#include "QFramework/TQIterator.h"
#include "QFramework/TQPathManager.h"
#include "QFramework/TQUtils.h"
#include "TSystem.h"
#include "TMath.h"
#include "TFile.h"

#ifdef __cpp_generic_lambdas
#if __cpp_generic_lambdas >= 201304
#define HAS_GENERIC_LAMBDAS
#endif
#endif

#include "SFramework/TSIterator.h"

using namespace RooStats::HistFactory;

ClassImp(TSModelFactory)

#ifdef HAS_GENERIC_LAMBDAS    
namespace {
  namespace SFINAE {
    // SFINAE test
    // https://stackoverflow.com/questions/257288/is-it-possible-to-write-a-template-to-check-for-a-functions-existence
    
    class true_val    {char dummy[1];};
    class false_val   {char dummy[2];};

    template <typename T>
    class hasStackLabel {
    public:
      template <typename C> static true_val    test(decltype(&C::SetStackLabel));
      template <typename C> static false_val   test(...);    

      enum { value = sizeof(test<T>(0)) == sizeof(true_val) };
    };

    // static_if
    //https://stackoverflow.com/questions/37617677/implementing-a-compile-time-static-if-logic-for-different-string-types-in-a-co
    template <typename T, typename F>          auto static_if(std::true_type, T t, F /*f*/) { return t; }
    template <typename T, typename F>          auto static_if(std::false_type, T /*t*/, F f) { return f; }
    template <bool B, typename T, typename F>  auto static_if(T t, F f) { return static_if(std::integral_constant<bool, B>{}, t, f); }
    template <bool B, typename T>              auto static_if(T t) { return static_if(std::integral_constant<bool, B>{}, t, [](auto&&...){}); }
    
    template <class C> inline void trySetStackLabel(C& staterr, const char* stackLabel){
      static_if<hasStackLabel<C>::value>
        ([&](auto& s) {
           s.SetStackLabel(stackLabel);
         })
        (staterr);
    }
  }
}
#endif

//__________________________________________________________________________________|___________

TSModelFactory::TSModelFactory() {

  fShowInfo  = false;
  fShowError  = true;
  fShowWarn  = false;
}


//__________________________________________________________________________________|___________

TSModelFactory::~TSModelFactory() {
}


//__________________________________________________________________________________|___________

void TSModelFactory::info(TString message) {
  if (fShowInfo) {
    std::cout << "SFramework/TSModelFactory: " << message.Data() << std::endl;
  }
}


//__________________________________________________________________________________|___________

void TSModelFactory::error(TString message) {
  if (fShowError) {
    std::cout << "SFramework/TSModelFactory: " << TQStringUtils::makeBoldRed(TString("ERROR: ") + message) << std::endl;
  }
}


//__________________________________________________________________________________|___________

void TSModelFactory::warn(TString message) {
  if (fShowWarn) {
    std::cout << "SFramework/TSModelFactory: " << TQStringUtils::makeBoldYellow(TString("WARNING: ") + message) << std::endl;
  }
}


//__________________________________________________________________________________|___________

Bool_t TSModelFactory::createXML(TQFolder * model, const TString& xmlDir) {

  /* create model */
  RooStats::HistFactory::Measurement * ms = createMeasurement(model);

  /* write XML */
  if (ms) {
    Bool_t success = createXML(ms, xmlDir, model->getTagStringDefault(".HistogramFile", TQFolder::concatPaths(xmlDir,"histograms.root")));
    delete ms;
    return success;
  } else {
    return false;
  }
}

//__________________________________________________________________________________|___________

Bool_t TSModelFactory::writeHistograms(TQFolder* model, const TString& hfname){
  TQFolder * histos = model->getFolder(".Histograms");
  if (!histos) return false;
  /* replace parameter in filenames */
  TString histosFilename = model->replaceInText(hfname);

  histosFilename = TQPathManager::getPathManager()->getTargetPath(histosFilename);
  /* make sure directory exists */
  if (!TQUtils::ensureDirectoryForFile(histosFilename)) return false;

  TFile * histosFile = TFile::Open(histosFilename, "RECREATE", histosFilename.Data());
  if (!histosFile || !histosFile->IsOpen()) {
    if (histosFile) {
      delete histosFile;
    }
    return false;
  }
    
  TString targetName = TString::Format("%s_histograms", model->GetName());
  
  model->setTagString(".HistogramFile", histosFilename);
  model->setTagString(".HistogramPathPrefix", targetName);
  
  // delete existing object in file with same name
  TDirectory* target = histosFile->mkdir(targetName);
  TQFolder* nominal = histos->getFolder("Nominal");
  if(nominal){
    nominal->writeDirectory(target);
  } else {
    return false;
  }
  TQFolder* shapesysts = histos->getFolder("Systematics");
  if(shapesysts){
    shapesysts->writeDirectory(target);
  }
  histosFile->Write();
  histosFile->Close();
  delete histosFile;
  return true;
}

//__________________________________________________________________________________|___________

Bool_t TSModelFactory::createXML(RooStats::HistFactory::Measurement * measurement, const TString& xmlDir, const TString& histosFile) {

  /* write XML */
  if (measurement) {
    measurement->PrintXML(xmlDir.Data());

    // now, fix some stuff inplace because HistFactory is buggy
    char* rootsys = std::getenv("ROOTSYS");
    TString s = "cp ";
    s.Append(TQFolder::concatPaths(rootsys,"etc","HistFactorySchema.dtd"));
    s.Append(" ");
    s.Append(xmlDir);
    s.Append(+"/");
    info(s);
    TList* l = TQUtils::execute(s);
    delete l;
    l = TQUtils::execute ("sed -i -e 's|<Data[ ]*HistoName=\"\"[ ]*InputFile=\"\"[ ]*HistoPath=\"\"[ ]*/>||' "+xmlDir+"/*.xml");
    delete l;
    l = TQUtils::execute ("sed -i -e 's|InputFile=\"[^\"]*\"|InputFile=\""+histosFile+"\"|' "+xmlDir+"/*.xml");
    delete l;
    TString cwd = gSystem->pwd();
    TQStringUtils::ensureTrailingText(cwd,"/");
    l = TQUtils::execute ("sed -i -e 's|<Input>./"+cwd+"|<Input>|' "+xmlDir+"/*.xml");
    delete l;
    return true;
  } else {
    return false;
  }
}


//__________________________________________________________________________________|___________

RooStats::HistFactory::Measurement * TSModelFactory::createMeasurement(TQFolder * model) {

  /* stop if model definition is missing */
  if (!model) {
    error("createMeasurement(): No model definition provided");
    return 0;
  }

  fModel = model;

  info("createMeasurement(...): Creating Measurement object...");

  /* create a new Measurement object */
  RooStats::HistFactory::Measurement * measurement = new RooStats::HistFactory::Measurement(model->GetName(), model->getTagStringDefault("Title", model->GetTitle()));
  
  /* set configuration of Measurement object */
  TString outputFilePrefix = model->getTagStringDefault("OutputFilePrefix", model->GetName());
  measurement->SetOutputFilePrefix(outputFilePrefix.Data());
  Bool_t exportOnly = true;
  // @tag:[ExportOnly] If true, no plots or tables are produced but the model is just saved
  if (model->getTagBool("ExportOnly", exportOnly))
    measurement->SetExportOnly(exportOnly);
  auto pois = model->getTagVString("POI");
  std::sort(pois.begin(),pois.end());
  for(auto poi:pois){
    measurement->AddPOI(poi.Data());
  }
  Double_t lumi = 1.;
  if (model->getTagDouble("Lumi", lumi))
    measurement->SetLumi(lumi);
  Double_t lumiRelErr = 0.;
  if (model->getTagDouble("LumiRelErr", lumiRelErr))
    measurement->SetLumiRelErr(lumiRelErr);


  /* loop over and add channels */
  TQIterator itrCh(model->getListOfFolders("?"), "!.*", true);
  while (itrCh.hasNext()) {
    addChannel((TQFolder*)itrCh.readNext(), measurement);
  }

  /* set global parameter settings */
  TQIterator itrParam(model->getListOfFolders("ParamSettings/?"), "!.*", true);
  while (itrParam.hasNext()) {
    TQFolder * folder = (TQFolder*)itrParam.readNext();
    TQTaggable tagsParam(folder);
    
    // constant parameter?
    Bool_t isConst = false;
    if (tagsParam.getTagBool("Const", isConst) && isConst) {
      measurement->AddConstantParam(folder->GetName());
    }

    // constant parameter?
    if (tagsParam.getTagBoolDefault("POI", false)) {
      measurement->AddPOI(folder->GetName());
    }
    
    // constraint term?
    TString constraint;
    if (tagsParam.getTagString("ConstraintTerm", constraint)) {
      if (constraint.CompareTo("Uniform", TString::kIgnoreCase) == 0) {
        measurement->AddUniformSyst(folder->GetName());
      } else if (constraint.CompareTo("Gamma", TString::kIgnoreCase) == 0) {
        measurement->AddGammaSyst(folder->GetName(), 1.);
      } else if (constraint.CompareTo("LogNorm", TString::kIgnoreCase) == 0) {
        measurement->AddLogNormSyst(folder->GetName(), 1.);
      } else if (constraint.CompareTo("Gaussian", TString::kIgnoreCase) != 0) {
        warn(TString::Format("createMeasurement(): Unknown constraint term '%s' "
                             "for parameter '%s'", constraint.Data(), folder->GetName()));
      }
    }
  }

  fModel = 0;

  /* return measurement object */
  return measurement;
}


//__________________________________________________________________________________|___________

Bool_t TSModelFactory::reviseWorkspace(RooWorkspace * workspace, TQFolder * model) {
  /* stop if workspace is missing */
  if (!workspace) {
    error("reviseWorkspace(): No valid workspace provided");
    return false;
  }

  /* stop if model definition is missing */
  if (!model) {
    error("reviseWorkspace(): No model definition provided");
    return false;
  }

  // stop if model config is missing
  RooStats::ModelConfig* mc = dynamic_cast<RooStats::ModelConfig*>(workspace->obj("ModelConfig"));
  if (!mc) {
    error("reviseWorkspace(): No ModelConfig available");
    return false;
  }  

  // set title
  workspace->SetTitle(model->getTagStringDefault("Title", model->GetTitle()));

  // use parameter settings
  TQFolder* paramSettings = model->getFolder("ParamSettings");  
  
  /* check NPs */
  RooArgSet thenps;
  const RooAbsCollection* nps = mc->GetNuisanceParameters();
  if(!nps || nps->getSize() < 1){
    warn("no nuisance parameters set, setting manually");
    RooArgList allVars(workspace->allVars());
    RooRealVarIterator itr(allVars.createIterator());
    while (itr.hasNext()) {
      RooRealVar * var = itr.readNext();
      if(!var) continue;
      bool isNP = TQStringUtils::matches(var->GetName(),"alpha_*") || TQStringUtils::matches(var->GetName(),"gamma_stat_*");
      if(paramSettings){
	TQFolder* p = paramSettings->getFolder(var->GetName());
	if(p){
	  p->getTagBool("isNP",isNP);
	}
      }
      if(isNP){
	thenps.add(*var);
      }
    }
  } else {
    thenps.add(*nps);
  }

  /* check POIs */
  auto pois = model->getTagVString("POI");
  RooArgSet thepois;
  if(mc->GetParametersOfInterest()){
    thepois.add(*mc->GetParametersOfInterest());
  }
  for(auto poi:pois){
    for(const auto& var:workspace->allVars()){
      if(TQStringUtils::matches(var->GetName(),poi)){
	thepois.add(*var);
      }
    }
  }

  // set everything
  RooArgSet finalnps;
  for(const auto& np:thenps){
    if(!thepois.find(np->GetName())) finalnps.add(*np);
  }
  mc->SetParametersOfInterest(thepois);
  mc->SetNuisanceParameters(finalnps);
  
  /* set global parameter settings */
  if(paramSettings){
    TQIterator itrParam(paramSettings->getListOfFolders("?"), "!.*", true);
    while (itrParam.hasNext()) {
      TQFolder * folder = (TQFolder*)itrParam.readNext();
      TString name = folder->GetName();
      
      // corresponding variable from workspace
      RooRealVar * var = workspace->var(name.Data());
      if (!var) {
	warn(TString::Format("reviseWorkspace(): Failed to find variable '%s' "
			     "in workspace. Skipping ...", name.Data()));
	continue;
      }
      
      TQTaggable tagsParam(folder);
      
      // title of variable
      TString title;
      if (tagsParam.getTagString("Title", title)) {
	var->SetTitle(title.Data());
      }
      
      // interpolation code?
      Int_t interpCode = 4;
      if (tagsParam.getTagInteger("InterpCode", interpCode)) {
	TQIterator itr(var->clientIterator(), true);
	while (itr.hasNext()) {
	  TObject * obj = itr.readNext();
	  if (obj->InheritsFrom(FlexibleInterpVar::Class())) {
	    ((FlexibleInterpVar*)obj)->setInterpCode(*var, interpCode);
	  } else if (obj->InheritsFrom(PiecewiseInterpolation::Class())) {
	    ((PiecewiseInterpolation*)obj)->setInterpCode(*var, interpCode);
	  } else {
	    error(TString::Format("reviseWorkspace(): Failed to set interpolation code "
				  "on variable '%s'. Skipping ...", var->GetName()));
	  }
	}
      }

      // description?
      TString desc;
      if(tagsParam.getTagString("Description",desc)){
	var->setAttribute(desc.Data(),true);
      }
      
      std::vector<TString> attributes = tagsParam.getTagVString("Attributes");
      for(const auto& attr:attributes){
	var->setAttribute(attr.Data());
      }
    }
  }
  
  if(model->getTagBoolDefault("isBinned",true)){
    RooFIter iter = workspace->components().fwdIterator() ;
    RooAbsArg* arg = NULL;
    while((arg = iter.next())) {
      if (arg->IsA() == RooRealSumPdf::Class()) {
        arg->setAttribute("BinnedLikelihood");
      }
    }
  }

  // check for Lumi parameter
  RooRealVar* lumi = workspace->var("Lumi");
  if(lumi){
    lumi->setConstant(true);
  }
  
  // Save model in workspace: export as text listing ...
  TList * lConfig = model->exportToText(false);
  // ... and put it into workspace (keep workspace independent of analysis code library)
  workspace->import(*lConfig, ".Model", true);

  return true;
}


//__________________________________________________________________________________|___________

Bool_t TSModelFactory::addChannel(TQFolder * definition, RooStats::HistFactory::Measurement * measurement) {

  /* extract channel name */
  TString channelName = definition->GetName();
  if (!TQStringUtils::removeLeadingText(channelName, "Channel."))
    return false;
  
  TString histosfile = definition->getTagStringDefault("~.HistogramFile", "");
  TString histospath = TQFolder::concatPaths(definition->getTagStringDefault("~.HistogramPathPrefix", ""),"Nominal",channelName.Data());
  
  /* create Channel object */
  RooStats::HistFactory::Channel * channel = new Channel(channelName.Data(),histospath.Data());

  /* set statistical error configuration */
  channel->SetStatErrorConfig(
                              definition->getTagDoubleDefault("StatRelErrorThreshold", 0.05),
                              definition->getTagStringDefault("StatConstraintType", "Poisson").Data());

  /* loop over subfolder */
  TQIterator itr(definition->getListOfFolders("?"), "!.*", true);
  while (itr.hasNext()) {
    TQFolder * folder = (TQFolder*)itr.readNext();

    if (addSample(folder, channel)) {
      info(TString::Format("Added as Sample '%s'", folder->GetName()));
    }
  }

  /* add Channel object to Measurement object */
  measurement->AddChannel(*channel); //FIXME: this looks like a memory leak. AddChannel does not take a reference but is called by value. However, we never delete our local "channel" object

  return true;
}


//__________________________________________________________________________________|___________

Bool_t TSModelFactory::addSample(TQFolder * definition, RooStats::HistFactory::Channel * channel) {

  // extract sample name by removing the leading
  // "Sample." (stop if this prefix is not present)
  TString sampleName = definition->GetName();
  if (!TQStringUtils::removeLeadingText(sampleName, "Sample.")) {
    // missing prefix "Sample."
    return false;
  }
  TString sampleType = definition->getTagStringDefault("Type","B");

  /* extract histogram location */
  TString histogramLocation;
  if(!definition->getTagString("Histo",histogramLocation)){
    error(TString::Format("unable to find histogram for '%s'",definition->getPath().Data()));
    return false;
  }
  TString histogramFile = definition->getTagStringDefault("~.HistogramFile","histFactor_tmp.root");
  TString histogramPathPrefix = definition->getTagStringDefault("~.HistogramPathPrefix","");
  
  /* split histogram location */
  TString histoPath = TQFolder::concatPaths(histogramPathPrefix, histogramLocation);
  TString histoName = TQFolder::getPathTail(histoPath);    
  TQStringUtils::ensureTrailingText(histoPath,"/");

  TString histoFilePath = TQPathManager::getPathManager()->getTargetPath(histogramFile).c_str();
  
  if (sampleType != "D"){
    
    /* create Sample object */
    Sample * sample = new Sample(sampleName.Data(),histoName.Data(), histoFilePath.Data(), histoPath.Data());
  
    /* NormalizeByTheory */
    sample->SetNormalizeByTheory(definition->getTagBoolDefault("NormalizeByTheory", true));

    /* StatError ? */
    if (definition->getTagBoolDefault("ActivateStatError", false)) {
      sample->GetStatError().Activate(true);

      #ifdef HAS_GENERIC_LAMBDAS    
      TString stackLabel;
      if(definition->getTagString("StatErrorStackLabel",stackLabel)){
        ::SFINAE::trySetStackLabel(sample->GetStatError(),stackLabel.Data());
      }
      #endif
      
      if (definition->hasTag("StatErrorHisto")) {
        TString statErrorHistoFile;
        TString statErrorHistoName;
        TString statErrorHistoPath;
        splitHistoLocation(definition->getTagStringDefault("StatErrorHisto"),statErrorHistoFile, statErrorHistoName, statErrorHistoPath);
        TString statErrorHistoFilePath = TQPathManager::getPathManager()->getTargetPath(statErrorHistoFile).c_str();
        sample->GetStatError().SetUseHisto(true);
        sample->GetStatError().SetHistoName(statErrorHistoName.Data());
        sample->GetStatError().SetHistoName(statErrorHistoFilePath.Data());
        sample->GetStatError().SetHistoName(statErrorHistoPath.Data());
      } 
    } else {
      sample->GetStatError().Activate(false);
    }
    
    /* loop over subfolders */
    TQIterator itr(definition->getListOfFolders("?"), "!.*", true);
    while (itr.hasNext()) {
      TQFolder * folder = (TQFolder*)itr.readNext();
      TString name = folder->GetName();

      if (addNormFactor(folder, sample)) {
        info(TString::Format("Added as NormFactor '%s'", folder->GetName()));
      } else if (addOverallSys(folder, sample)) {
        info(TString::Format("Added as OverallSys '%s'", folder->GetName()));
      } else if (addHistoSys(folder, sample)) {
        info(TString::Format("Added as HistoSys '%s'", folder->GetName()));
      } else if (addShapeSys(folder, sample)) {
        info(TString::Format("Added as ShapeSys '%s'", folder->GetName()));
      } else if (addShapeFactor(folder, sample)) {
        info(TString::Format("Added as ShapeFactor '%s'", folder->GetName()));
      } else if (addHistoFactor(folder, sample)) {
        info(TString::Format("Added as HistFactor '%s'", folder->GetName()));	
      } else {
        error(TString::Format("Unrecognized element '%s' "
                              "in sample '%s'", name.Data(), sampleName.Data()));
      }
    }

    /* add the Sample object to the Channel object */
    channel->AddSample(*sample);
  } else {
    /* add data */
    TString dataName = definition->getTagStringDefault("dataset", sampleName == "Data" ? "obsData" : sampleName.Data());
    if(dataName == "obsData"){
      channel->SetData(histoName.Data(), histoFilePath.Data(), histoPath.Data());
    } else {
      auto data = RooStats::HistFactory::Data(histoName.Data(), histoFilePath.Data(), histoPath.Data());
      data.SetName(dataName.Data());
      channel->AddAdditionalData(data);
    }
  }

  return true;
}


//__________________________________________________________________________________|___________

Bool_t TSModelFactory::addNormFactor(TQFolder * definition, Sample * sample) {

  /* extract norm factor name */
  TString normFactorName = definition->GetName();
  if (!TQStringUtils::removeLeadingText(normFactorName, "NormFactor.")) {
    // missing prefix "NormFactor."
    return false;
  }

  /* add norm factor */
  sample->AddNormFactor(normFactorName.Data(),
                        definition->getTagDoubleDefault("Val", 1.),
                        definition->getTagDoubleDefault("Low", 1.),
                        definition->getTagDoubleDefault("High", 1.));

  TQFolder * paramSettings = fModel->getFolder(TQFolder::concatPaths("ParamSettings", normFactorName) + "+");
  
  /* propagate constant attribute of parameter */
  Bool_t isConst = false;
  if (definition->getTagBool("Const", isConst)) {
    TQTaggable tagsParam(paramSettings);
    if (tagsParam.getTagBoolDefault("Const", isConst) == isConst) {
      paramSettings->setTagBool("Const", isConst);
    } else {
      paramSettings->setTagBool(".Const.Recessive", isConst);
    }
  }

  if(definition->getTagBoolDefault("POI",false)){
    paramSettings->setTagBool("POI",true);
  }
  
  return true;
}


//__________________________________________________________________________________|___________

Bool_t TSModelFactory::addShapeFactor(TQFolder * definition, Sample * sample) {

  /* extract shape factor name */
  TString shapeFactorName = definition->GetName();
  if (!TQStringUtils::removeLeadingText(shapeFactorName, "ShapeFactor.")) {
    // missing prefix "ShapeFactor."
    return false;
  }

  /* add shape factor */
  sample->AddShapeFactor(shapeFactorName.Data());

  TQFolder * paramSettings = fModel->getFolder(TQFolder::concatPaths("ParamSettings", shapeFactorName) + "+");  
  if(definition->getTagBoolDefault("POI",false)){
    paramSettings->setTagBool("POI",true);
  }
  
  return true;
}

//__________________________________________________________________________________|___________

Bool_t TSModelFactory::addHistoFactor(TQFolder * definition, Sample * sample) {

  /* extract shape factor name */
  TString histoFactorName = definition->GetName();
  if (!TQStringUtils::removeLeadingText(histoFactorName, "HistoFactor.")) {
    // missing prefix "HistFactor."
    return false;
  }

  /* extract histogram locations */
  TString histogramLocationHigh,histogramLocationLow;
  if(!definition->getTagString("HistoHigh",histogramLocationHigh) || !definition->getTagString("HistoLow",histogramLocationLow)){
    error(TString::Format("no histogram assigned to '%s'",definition->getPath().Data()));
    return false;
  }
  
  /* split histogram locations */
  /* extract histogram location */
  
  TString histogramFile = definition->getTagStringDefault("~.HistogramFile","histFactor_tmp.root");
  TString histogramPathPrefix = definition->getTagStringDefault("~.HistogramPathPrefix","");
  
  /* split histogram location */
  TString histoPathLow = TQFolder::concatPaths(histogramPathPrefix, histogramLocationLow);
  TString histoPathHigh = TQFolder::concatPaths(histogramPathPrefix, histogramLocationHigh);
  TString histoNameLow = TQFolder::getPathTail(histoPathLow);    
  TString histoNameHigh = TQFolder::getPathTail(histoPathHigh);    
  TQStringUtils::ensureTrailingText(histoPathLow,"/");
  TQStringUtils::ensureTrailingText(histoPathHigh,"/");
  
  TString histoFilePath = TQPathManager::getPathManager()->getTargetPath(histogramFile).c_str();
  
  /* add norm factor */
  sample->AddHistoFactor(histoFactorName.Data(), 
			 histoNameLow.Data(),  histoFilePath.Data(), histoPathLow.Data(),
			 histoNameHigh.Data(), histoFilePath.Data(), histoPathHigh.Data());

  return true;
}

//__________________________________________________________________________________|___________

Bool_t TSModelFactory::addOverallSys(TQFolder * definition, Sample * sample) {

  /* extract systematic name */
  TString overallSysName = definition->GetName();
  if (!TQStringUtils::removeLeadingText(overallSysName, "OverallSys.")) {
    // missing prefix "OverallSys."
    return false;
  }

  /* add norm factor */
  sample->AddOverallSys(overallSysName.Data(),
                        definition->getTagDoubleDefault("Low", 1.),
                        definition->getTagDoubleDefault("High", 1.));

  return true;
}


//__________________________________________________________________________________|___________

Bool_t TSModelFactory::addHistoSys(TQFolder * definition, Sample * sample) {

  /* extract systematic name */
  TString histoSysName = definition->GetName();
  if (!TQStringUtils::removeLeadingText(histoSysName, "HistoSys.")) {
    // missing prefix "HistoSys."
    return false;
  }
  
  /* extract histogram locations */
  TString histogramLocationHigh,histogramLocationLow;
  if(!definition->getTagString("HistoHigh",histogramLocationHigh) || !definition->getTagString("HistoLow",histogramLocationLow)){
    error(TString::Format("no histogram assigned to '%s'",definition->getPath().Data()));
    return false;
  }
  
  /* split histogram locations */
  /* extract histogram location */
  
  TString histogramFile = definition->getTagStringDefault("~.HistogramFile","histFactor_tmp.root");
  TString histogramPathPrefix = definition->getTagStringDefault("~.HistogramPathPrefix","");
  
  /* split histogram location */
  TString histoPathLow = TQFolder::concatPaths(histogramPathPrefix, histogramLocationLow);
  TString histoPathHigh = TQFolder::concatPaths(histogramPathPrefix, histogramLocationHigh);
  TString histoNameLow = TQFolder::getPathTail(histoPathLow);    
  TString histoNameHigh = TQFolder::getPathTail(histoPathHigh);    
  TQStringUtils::ensureTrailingText(histoPathLow,"/");
  TQStringUtils::ensureTrailingText(histoPathHigh,"/");
  
  TString histoFilePath = TQPathManager::getPathManager()->getTargetPath(histogramFile).c_str();
  
  /* add norm factor */
  sample->AddHistoSys(histoSysName.Data(), 
                      histoNameLow.Data(),  histoFilePath.Data(), histoPathLow.Data(),
                      histoNameHigh.Data(), histoFilePath.Data(), histoPathHigh.Data());
  
  return true;
}

//__________________________________________________________________________________|___________

Bool_t TSModelFactory::addShapeSys(TQFolder * definition, Sample * sample) {

  /* extract systematic name */
  TString shapeSysName = definition->GetName();
  if (!TQStringUtils::removeLeadingText(shapeSysName, "ShapeSys.")) {
    // missing prefix "ShapeSys."
    return false;
  }

  /* extract histogram locations */
  TString histogramLocation;
  if(!definition->getTagString("Histo",histogramLocation)){
    error(TString::Format("unable to find histogram for '%s'",definition->getPath().Data()));
    return false;
  }  
  TString histogramFile;
  TString histogramPathPrefix;
  definition->getTagString("~.HistogramFile", histogramFile, true);
  definition->getTagString("~.HistogramPathPrefix", histogramPathPrefix, true);
  
  bool usePoisson = definition->getTagBoolDefault("usePoisson",false);
  
  histogramLocation = histogramFile + ":"
    + TQFolder::concatPaths(histogramPathPrefix, histogramLocation);

  /* split histogram locations */
  TString histoFile;
  TString histoName;
  TString histoPath;
  splitHistoLocation(histogramLocation, histoFile, histoName, histoPath);
  
  /* add norm factor */
  sample->AddShapeSys(shapeSysName.Data(), ( usePoisson ? RooStats::HistFactory::Constraint::Type::Poisson : RooStats::HistFactory::Constraint::Type::Gaussian ) , histoName.Data(), TQPathManager::getPathManager()->getTargetPath(histoFile).c_str(), histoPath.Data());

  return true;
}


//__________________________________________________________________________________|___________

void TSModelFactory::splitHistoLocation(TString input,
                                        TString &histoFile, TString &histoName, TString &histoPath) {
  /* extract histogram location */
  histoPath = input;
  histoFile = TQStringUtils::readPrefix(histoPath, ":");
  histoName = TQFolder::getPathTail(histoPath);

  if (!histoPath.IsNull())
    histoPath.Append("/");
}
 TSModelFactory.cxx:1
 TSModelFactory.cxx:2
 TSModelFactory.cxx:3
 TSModelFactory.cxx:4
 TSModelFactory.cxx:5
 TSModelFactory.cxx:6
 TSModelFactory.cxx:7
 TSModelFactory.cxx:8
 TSModelFactory.cxx:9
 TSModelFactory.cxx:10
 TSModelFactory.cxx:11
 TSModelFactory.cxx:12
 TSModelFactory.cxx:13
 TSModelFactory.cxx:14
 TSModelFactory.cxx:15
 TSModelFactory.cxx:16
 TSModelFactory.cxx:17
 TSModelFactory.cxx:18
 TSModelFactory.cxx:19
 TSModelFactory.cxx:20
 TSModelFactory.cxx:21
 TSModelFactory.cxx:22
 TSModelFactory.cxx:23
 TSModelFactory.cxx:24
 TSModelFactory.cxx:25
 TSModelFactory.cxx:26
 TSModelFactory.cxx:27
 TSModelFactory.cxx:28
 TSModelFactory.cxx:29
 TSModelFactory.cxx:30
 TSModelFactory.cxx:31
 TSModelFactory.cxx:32
 TSModelFactory.cxx:33
 TSModelFactory.cxx:34
 TSModelFactory.cxx:35
 TSModelFactory.cxx:36
 TSModelFactory.cxx:37
 TSModelFactory.cxx:38
 TSModelFactory.cxx:39
 TSModelFactory.cxx:40
 TSModelFactory.cxx:41
 TSModelFactory.cxx:42
 TSModelFactory.cxx:43
 TSModelFactory.cxx:44
 TSModelFactory.cxx:45
 TSModelFactory.cxx:46
 TSModelFactory.cxx:47
 TSModelFactory.cxx:48
 TSModelFactory.cxx:49
 TSModelFactory.cxx:50
 TSModelFactory.cxx:51
 TSModelFactory.cxx:52
 TSModelFactory.cxx:53
 TSModelFactory.cxx:54
 TSModelFactory.cxx:55
 TSModelFactory.cxx:56
 TSModelFactory.cxx:57
 TSModelFactory.cxx:58
 TSModelFactory.cxx:59
 TSModelFactory.cxx:60
 TSModelFactory.cxx:61
 TSModelFactory.cxx:62
 TSModelFactory.cxx:63
 TSModelFactory.cxx:64
 TSModelFactory.cxx:65
 TSModelFactory.cxx:66
 TSModelFactory.cxx:67
 TSModelFactory.cxx:68
 TSModelFactory.cxx:69
 TSModelFactory.cxx:70
 TSModelFactory.cxx:71
 TSModelFactory.cxx:72
 TSModelFactory.cxx:73
 TSModelFactory.cxx:74
 TSModelFactory.cxx:75
 TSModelFactory.cxx:76
 TSModelFactory.cxx:77
 TSModelFactory.cxx:78
 TSModelFactory.cxx:79
 TSModelFactory.cxx:80
 TSModelFactory.cxx:81
 TSModelFactory.cxx:82
 TSModelFactory.cxx:83
 TSModelFactory.cxx:84
 TSModelFactory.cxx:85
 TSModelFactory.cxx:86
 TSModelFactory.cxx:87
 TSModelFactory.cxx:88
 TSModelFactory.cxx:89
 TSModelFactory.cxx:90
 TSModelFactory.cxx:91
 TSModelFactory.cxx:92
 TSModelFactory.cxx:93
 TSModelFactory.cxx:94
 TSModelFactory.cxx:95
 TSModelFactory.cxx:96
 TSModelFactory.cxx:97
 TSModelFactory.cxx:98
 TSModelFactory.cxx:99
 TSModelFactory.cxx:100
 TSModelFactory.cxx:101
 TSModelFactory.cxx:102
 TSModelFactory.cxx:103
 TSModelFactory.cxx:104
 TSModelFactory.cxx:105
 TSModelFactory.cxx:106
 TSModelFactory.cxx:107
 TSModelFactory.cxx:108
 TSModelFactory.cxx:109
 TSModelFactory.cxx:110
 TSModelFactory.cxx:111
 TSModelFactory.cxx:112
 TSModelFactory.cxx:113
 TSModelFactory.cxx:114
 TSModelFactory.cxx:115
 TSModelFactory.cxx:116
 TSModelFactory.cxx:117
 TSModelFactory.cxx:118
 TSModelFactory.cxx:119
 TSModelFactory.cxx:120
 TSModelFactory.cxx:121
 TSModelFactory.cxx:122
 TSModelFactory.cxx:123
 TSModelFactory.cxx:124
 TSModelFactory.cxx:125
 TSModelFactory.cxx:126
 TSModelFactory.cxx:127
 TSModelFactory.cxx:128
 TSModelFactory.cxx:129
 TSModelFactory.cxx:130
 TSModelFactory.cxx:131
 TSModelFactory.cxx:132
 TSModelFactory.cxx:133
 TSModelFactory.cxx:134
 TSModelFactory.cxx:135
 TSModelFactory.cxx:136
 TSModelFactory.cxx:137
 TSModelFactory.cxx:138
 TSModelFactory.cxx:139
 TSModelFactory.cxx:140
 TSModelFactory.cxx:141
 TSModelFactory.cxx:142
 TSModelFactory.cxx:143
 TSModelFactory.cxx:144
 TSModelFactory.cxx:145
 TSModelFactory.cxx:146
 TSModelFactory.cxx:147
 TSModelFactory.cxx:148
 TSModelFactory.cxx:149
 TSModelFactory.cxx:150
 TSModelFactory.cxx:151
 TSModelFactory.cxx:152
 TSModelFactory.cxx:153
 TSModelFactory.cxx:154
 TSModelFactory.cxx:155
 TSModelFactory.cxx:156
 TSModelFactory.cxx:157
 TSModelFactory.cxx:158
 TSModelFactory.cxx:159
 TSModelFactory.cxx:160
 TSModelFactory.cxx:161
 TSModelFactory.cxx:162
 TSModelFactory.cxx:163
 TSModelFactory.cxx:164
 TSModelFactory.cxx:165
 TSModelFactory.cxx:166
 TSModelFactory.cxx:167
 TSModelFactory.cxx:168
 TSModelFactory.cxx:169
 TSModelFactory.cxx:170
 TSModelFactory.cxx:171
 TSModelFactory.cxx:172
 TSModelFactory.cxx:173
 TSModelFactory.cxx:174
 TSModelFactory.cxx:175
 TSModelFactory.cxx:176
 TSModelFactory.cxx:177
 TSModelFactory.cxx:178
 TSModelFactory.cxx:179
 TSModelFactory.cxx:180
 TSModelFactory.cxx:181
 TSModelFactory.cxx:182
 TSModelFactory.cxx:183
 TSModelFactory.cxx:184
 TSModelFactory.cxx:185
 TSModelFactory.cxx:186
 TSModelFactory.cxx:187
 TSModelFactory.cxx:188
 TSModelFactory.cxx:189
 TSModelFactory.cxx:190
 TSModelFactory.cxx:191
 TSModelFactory.cxx:192
 TSModelFactory.cxx:193
 TSModelFactory.cxx:194
 TSModelFactory.cxx:195
 TSModelFactory.cxx:196
 TSModelFactory.cxx:197
 TSModelFactory.cxx:198
 TSModelFactory.cxx:199
 TSModelFactory.cxx:200
 TSModelFactory.cxx:201
 TSModelFactory.cxx:202
 TSModelFactory.cxx:203
 TSModelFactory.cxx:204
 TSModelFactory.cxx:205
 TSModelFactory.cxx:206
 TSModelFactory.cxx:207
 TSModelFactory.cxx:208
 TSModelFactory.cxx:209
 TSModelFactory.cxx:210
 TSModelFactory.cxx:211
 TSModelFactory.cxx:212
 TSModelFactory.cxx:213
 TSModelFactory.cxx:214
 TSModelFactory.cxx:215
 TSModelFactory.cxx:216
 TSModelFactory.cxx:217
 TSModelFactory.cxx:218
 TSModelFactory.cxx:219
 TSModelFactory.cxx:220
 TSModelFactory.cxx:221
 TSModelFactory.cxx:222
 TSModelFactory.cxx:223
 TSModelFactory.cxx:224
 TSModelFactory.cxx:225
 TSModelFactory.cxx:226
 TSModelFactory.cxx:227
 TSModelFactory.cxx:228
 TSModelFactory.cxx:229
 TSModelFactory.cxx:230
 TSModelFactory.cxx:231
 TSModelFactory.cxx:232
 TSModelFactory.cxx:233
 TSModelFactory.cxx:234
 TSModelFactory.cxx:235
 TSModelFactory.cxx:236
 TSModelFactory.cxx:237
 TSModelFactory.cxx:238
 TSModelFactory.cxx:239
 TSModelFactory.cxx:240
 TSModelFactory.cxx:241
 TSModelFactory.cxx:242
 TSModelFactory.cxx:243
 TSModelFactory.cxx:244
 TSModelFactory.cxx:245
 TSModelFactory.cxx:246
 TSModelFactory.cxx:247
 TSModelFactory.cxx:248
 TSModelFactory.cxx:249
 TSModelFactory.cxx:250
 TSModelFactory.cxx:251
 TSModelFactory.cxx:252
 TSModelFactory.cxx:253
 TSModelFactory.cxx:254
 TSModelFactory.cxx:255
 TSModelFactory.cxx:256
 TSModelFactory.cxx:257
 TSModelFactory.cxx:258
 TSModelFactory.cxx:259
 TSModelFactory.cxx:260
 TSModelFactory.cxx:261
 TSModelFactory.cxx:262
 TSModelFactory.cxx:263
 TSModelFactory.cxx:264
 TSModelFactory.cxx:265
 TSModelFactory.cxx:266
 TSModelFactory.cxx:267
 TSModelFactory.cxx:268
 TSModelFactory.cxx:269
 TSModelFactory.cxx:270
 TSModelFactory.cxx:271
 TSModelFactory.cxx:272
 TSModelFactory.cxx:273
 TSModelFactory.cxx:274
 TSModelFactory.cxx:275
 TSModelFactory.cxx:276
 TSModelFactory.cxx:277
 TSModelFactory.cxx:278
 TSModelFactory.cxx:279
 TSModelFactory.cxx:280
 TSModelFactory.cxx:281
 TSModelFactory.cxx:282
 TSModelFactory.cxx:283
 TSModelFactory.cxx:284
 TSModelFactory.cxx:285
 TSModelFactory.cxx:286
 TSModelFactory.cxx:287
 TSModelFactory.cxx:288
 TSModelFactory.cxx:289
 TSModelFactory.cxx:290
 TSModelFactory.cxx:291
 TSModelFactory.cxx:292
 TSModelFactory.cxx:293
 TSModelFactory.cxx:294
 TSModelFactory.cxx:295
 TSModelFactory.cxx:296
 TSModelFactory.cxx:297
 TSModelFactory.cxx:298
 TSModelFactory.cxx:299
 TSModelFactory.cxx:300
 TSModelFactory.cxx:301
 TSModelFactory.cxx:302
 TSModelFactory.cxx:303
 TSModelFactory.cxx:304
 TSModelFactory.cxx:305
 TSModelFactory.cxx:306
 TSModelFactory.cxx:307
 TSModelFactory.cxx:308
 TSModelFactory.cxx:309
 TSModelFactory.cxx:310
 TSModelFactory.cxx:311
 TSModelFactory.cxx:312
 TSModelFactory.cxx:313
 TSModelFactory.cxx:314
 TSModelFactory.cxx:315
 TSModelFactory.cxx:316
 TSModelFactory.cxx:317
 TSModelFactory.cxx:318
 TSModelFactory.cxx:319
 TSModelFactory.cxx:320
 TSModelFactory.cxx:321
 TSModelFactory.cxx:322
 TSModelFactory.cxx:323
 TSModelFactory.cxx:324
 TSModelFactory.cxx:325
 TSModelFactory.cxx:326
 TSModelFactory.cxx:327
 TSModelFactory.cxx:328
 TSModelFactory.cxx:329
 TSModelFactory.cxx:330
 TSModelFactory.cxx:331
 TSModelFactory.cxx:332
 TSModelFactory.cxx:333
 TSModelFactory.cxx:334
 TSModelFactory.cxx:335
 TSModelFactory.cxx:336
 TSModelFactory.cxx:337
 TSModelFactory.cxx:338
 TSModelFactory.cxx:339
 TSModelFactory.cxx:340
 TSModelFactory.cxx:341
 TSModelFactory.cxx:342
 TSModelFactory.cxx:343
 TSModelFactory.cxx:344
 TSModelFactory.cxx:345
 TSModelFactory.cxx:346
 TSModelFactory.cxx:347
 TSModelFactory.cxx:348
 TSModelFactory.cxx:349
 TSModelFactory.cxx:350
 TSModelFactory.cxx:351
 TSModelFactory.cxx:352
 TSModelFactory.cxx:353
 TSModelFactory.cxx:354
 TSModelFactory.cxx:355
 TSModelFactory.cxx:356
 TSModelFactory.cxx:357
 TSModelFactory.cxx:358
 TSModelFactory.cxx:359
 TSModelFactory.cxx:360
 TSModelFactory.cxx:361
 TSModelFactory.cxx:362
 TSModelFactory.cxx:363
 TSModelFactory.cxx:364
 TSModelFactory.cxx:365
 TSModelFactory.cxx:366
 TSModelFactory.cxx:367
 TSModelFactory.cxx:368
 TSModelFactory.cxx:369
 TSModelFactory.cxx:370
 TSModelFactory.cxx:371
 TSModelFactory.cxx:372
 TSModelFactory.cxx:373
 TSModelFactory.cxx:374
 TSModelFactory.cxx:375
 TSModelFactory.cxx:376
 TSModelFactory.cxx:377
 TSModelFactory.cxx:378
 TSModelFactory.cxx:379
 TSModelFactory.cxx:380
 TSModelFactory.cxx:381
 TSModelFactory.cxx:382
 TSModelFactory.cxx:383
 TSModelFactory.cxx:384
 TSModelFactory.cxx:385
 TSModelFactory.cxx:386
 TSModelFactory.cxx:387
 TSModelFactory.cxx:388
 TSModelFactory.cxx:389
 TSModelFactory.cxx:390
 TSModelFactory.cxx:391
 TSModelFactory.cxx:392
 TSModelFactory.cxx:393
 TSModelFactory.cxx:394
 TSModelFactory.cxx:395
 TSModelFactory.cxx:396
 TSModelFactory.cxx:397
 TSModelFactory.cxx:398
 TSModelFactory.cxx:399
 TSModelFactory.cxx:400
 TSModelFactory.cxx:401
 TSModelFactory.cxx:402
 TSModelFactory.cxx:403
 TSModelFactory.cxx:404
 TSModelFactory.cxx:405
 TSModelFactory.cxx:406
 TSModelFactory.cxx:407
 TSModelFactory.cxx:408
 TSModelFactory.cxx:409
 TSModelFactory.cxx:410
 TSModelFactory.cxx:411
 TSModelFactory.cxx:412
 TSModelFactory.cxx:413
 TSModelFactory.cxx:414
 TSModelFactory.cxx:415
 TSModelFactory.cxx:416
 TSModelFactory.cxx:417
 TSModelFactory.cxx:418
 TSModelFactory.cxx:419
 TSModelFactory.cxx:420
 TSModelFactory.cxx:421
 TSModelFactory.cxx:422
 TSModelFactory.cxx:423
 TSModelFactory.cxx:424
 TSModelFactory.cxx:425
 TSModelFactory.cxx:426
 TSModelFactory.cxx:427
 TSModelFactory.cxx:428
 TSModelFactory.cxx:429
 TSModelFactory.cxx:430
 TSModelFactory.cxx:431
 TSModelFactory.cxx:432
 TSModelFactory.cxx:433
 TSModelFactory.cxx:434
 TSModelFactory.cxx:435
 TSModelFactory.cxx:436
 TSModelFactory.cxx:437
 TSModelFactory.cxx:438
 TSModelFactory.cxx:439
 TSModelFactory.cxx:440
 TSModelFactory.cxx:441
 TSModelFactory.cxx:442
 TSModelFactory.cxx:443
 TSModelFactory.cxx:444
 TSModelFactory.cxx:445
 TSModelFactory.cxx:446
 TSModelFactory.cxx:447
 TSModelFactory.cxx:448
 TSModelFactory.cxx:449
 TSModelFactory.cxx:450
 TSModelFactory.cxx:451
 TSModelFactory.cxx:452
 TSModelFactory.cxx:453
 TSModelFactory.cxx:454
 TSModelFactory.cxx:455
 TSModelFactory.cxx:456
 TSModelFactory.cxx:457
 TSModelFactory.cxx:458
 TSModelFactory.cxx:459
 TSModelFactory.cxx:460
 TSModelFactory.cxx:461
 TSModelFactory.cxx:462
 TSModelFactory.cxx:463
 TSModelFactory.cxx:464
 TSModelFactory.cxx:465
 TSModelFactory.cxx:466
 TSModelFactory.cxx:467
 TSModelFactory.cxx:468
 TSModelFactory.cxx:469
 TSModelFactory.cxx:470
 TSModelFactory.cxx:471
 TSModelFactory.cxx:472
 TSModelFactory.cxx:473
 TSModelFactory.cxx:474
 TSModelFactory.cxx:475
 TSModelFactory.cxx:476
 TSModelFactory.cxx:477
 TSModelFactory.cxx:478
 TSModelFactory.cxx:479
 TSModelFactory.cxx:480
 TSModelFactory.cxx:481
 TSModelFactory.cxx:482
 TSModelFactory.cxx:483
 TSModelFactory.cxx:484
 TSModelFactory.cxx:485
 TSModelFactory.cxx:486
 TSModelFactory.cxx:487
 TSModelFactory.cxx:488
 TSModelFactory.cxx:489
 TSModelFactory.cxx:490
 TSModelFactory.cxx:491
 TSModelFactory.cxx:492
 TSModelFactory.cxx:493
 TSModelFactory.cxx:494
 TSModelFactory.cxx:495
 TSModelFactory.cxx:496
 TSModelFactory.cxx:497
 TSModelFactory.cxx:498
 TSModelFactory.cxx:499
 TSModelFactory.cxx:500
 TSModelFactory.cxx:501
 TSModelFactory.cxx:502
 TSModelFactory.cxx:503
 TSModelFactory.cxx:504
 TSModelFactory.cxx:505
 TSModelFactory.cxx:506
 TSModelFactory.cxx:507
 TSModelFactory.cxx:508
 TSModelFactory.cxx:509
 TSModelFactory.cxx:510
 TSModelFactory.cxx:511
 TSModelFactory.cxx:512
 TSModelFactory.cxx:513
 TSModelFactory.cxx:514
 TSModelFactory.cxx:515
 TSModelFactory.cxx:516
 TSModelFactory.cxx:517
 TSModelFactory.cxx:518
 TSModelFactory.cxx:519
 TSModelFactory.cxx:520
 TSModelFactory.cxx:521
 TSModelFactory.cxx:522
 TSModelFactory.cxx:523
 TSModelFactory.cxx:524
 TSModelFactory.cxx:525
 TSModelFactory.cxx:526
 TSModelFactory.cxx:527
 TSModelFactory.cxx:528
 TSModelFactory.cxx:529
 TSModelFactory.cxx:530
 TSModelFactory.cxx:531
 TSModelFactory.cxx:532
 TSModelFactory.cxx:533
 TSModelFactory.cxx:534
 TSModelFactory.cxx:535
 TSModelFactory.cxx:536
 TSModelFactory.cxx:537
 TSModelFactory.cxx:538
 TSModelFactory.cxx:539
 TSModelFactory.cxx:540
 TSModelFactory.cxx:541
 TSModelFactory.cxx:542
 TSModelFactory.cxx:543
 TSModelFactory.cxx:544
 TSModelFactory.cxx:545
 TSModelFactory.cxx:546
 TSModelFactory.cxx:547
 TSModelFactory.cxx:548
 TSModelFactory.cxx:549
 TSModelFactory.cxx:550
 TSModelFactory.cxx:551
 TSModelFactory.cxx:552
 TSModelFactory.cxx:553
 TSModelFactory.cxx:554
 TSModelFactory.cxx:555
 TSModelFactory.cxx:556
 TSModelFactory.cxx:557
 TSModelFactory.cxx:558
 TSModelFactory.cxx:559
 TSModelFactory.cxx:560
 TSModelFactory.cxx:561
 TSModelFactory.cxx:562
 TSModelFactory.cxx:563
 TSModelFactory.cxx:564
 TSModelFactory.cxx:565
 TSModelFactory.cxx:566
 TSModelFactory.cxx:567
 TSModelFactory.cxx:568
 TSModelFactory.cxx:569
 TSModelFactory.cxx:570
 TSModelFactory.cxx:571
 TSModelFactory.cxx:572
 TSModelFactory.cxx:573
 TSModelFactory.cxx:574
 TSModelFactory.cxx:575
 TSModelFactory.cxx:576
 TSModelFactory.cxx:577
 TSModelFactory.cxx:578
 TSModelFactory.cxx:579
 TSModelFactory.cxx:580
 TSModelFactory.cxx:581
 TSModelFactory.cxx:582
 TSModelFactory.cxx:583
 TSModelFactory.cxx:584
 TSModelFactory.cxx:585
 TSModelFactory.cxx:586
 TSModelFactory.cxx:587
 TSModelFactory.cxx:588
 TSModelFactory.cxx:589
 TSModelFactory.cxx:590
 TSModelFactory.cxx:591
 TSModelFactory.cxx:592
 TSModelFactory.cxx:593
 TSModelFactory.cxx:594
 TSModelFactory.cxx:595
 TSModelFactory.cxx:596
 TSModelFactory.cxx:597
 TSModelFactory.cxx:598
 TSModelFactory.cxx:599
 TSModelFactory.cxx:600
 TSModelFactory.cxx:601
 TSModelFactory.cxx:602
 TSModelFactory.cxx:603
 TSModelFactory.cxx:604
 TSModelFactory.cxx:605
 TSModelFactory.cxx:606
 TSModelFactory.cxx:607
 TSModelFactory.cxx:608
 TSModelFactory.cxx:609
 TSModelFactory.cxx:610
 TSModelFactory.cxx:611
 TSModelFactory.cxx:612
 TSModelFactory.cxx:613
 TSModelFactory.cxx:614
 TSModelFactory.cxx:615
 TSModelFactory.cxx:616
 TSModelFactory.cxx:617
 TSModelFactory.cxx:618
 TSModelFactory.cxx:619
 TSModelFactory.cxx:620
 TSModelFactory.cxx:621
 TSModelFactory.cxx:622
 TSModelFactory.cxx:623
 TSModelFactory.cxx:624
 TSModelFactory.cxx:625
 TSModelFactory.cxx:626
 TSModelFactory.cxx:627
 TSModelFactory.cxx:628
 TSModelFactory.cxx:629
 TSModelFactory.cxx:630
 TSModelFactory.cxx:631
 TSModelFactory.cxx:632
 TSModelFactory.cxx:633
 TSModelFactory.cxx:634
 TSModelFactory.cxx:635
 TSModelFactory.cxx:636
 TSModelFactory.cxx:637
 TSModelFactory.cxx:638
 TSModelFactory.cxx:639
 TSModelFactory.cxx:640
 TSModelFactory.cxx:641
 TSModelFactory.cxx:642
 TSModelFactory.cxx:643
 TSModelFactory.cxx:644
 TSModelFactory.cxx:645
 TSModelFactory.cxx:646
 TSModelFactory.cxx:647
 TSModelFactory.cxx:648
 TSModelFactory.cxx:649
 TSModelFactory.cxx:650
 TSModelFactory.cxx:651
 TSModelFactory.cxx:652
 TSModelFactory.cxx:653
 TSModelFactory.cxx:654
 TSModelFactory.cxx:655
 TSModelFactory.cxx:656
 TSModelFactory.cxx:657
 TSModelFactory.cxx:658
 TSModelFactory.cxx:659
 TSModelFactory.cxx:660
 TSModelFactory.cxx:661
 TSModelFactory.cxx:662
 TSModelFactory.cxx:663
 TSModelFactory.cxx:664
 TSModelFactory.cxx:665
 TSModelFactory.cxx:666
 TSModelFactory.cxx:667
 TSModelFactory.cxx:668
 TSModelFactory.cxx:669
 TSModelFactory.cxx:670
 TSModelFactory.cxx:671
 TSModelFactory.cxx:672
 TSModelFactory.cxx:673
 TSModelFactory.cxx:674
 TSModelFactory.cxx:675
 TSModelFactory.cxx:676
 TSModelFactory.cxx:677
 TSModelFactory.cxx:678
 TSModelFactory.cxx:679
 TSModelFactory.cxx:680
 TSModelFactory.cxx:681
 TSModelFactory.cxx:682
 TSModelFactory.cxx:683
 TSModelFactory.cxx:684
 TSModelFactory.cxx:685
 TSModelFactory.cxx:686
 TSModelFactory.cxx:687
 TSModelFactory.cxx:688
 TSModelFactory.cxx:689
 TSModelFactory.cxx:690
 TSModelFactory.cxx:691
 TSModelFactory.cxx:692
 TSModelFactory.cxx:693
 TSModelFactory.cxx:694
 TSModelFactory.cxx:695
 TSModelFactory.cxx:696
 TSModelFactory.cxx:697
 TSModelFactory.cxx:698
 TSModelFactory.cxx:699
 TSModelFactory.cxx:700
 TSModelFactory.cxx:701
 TSModelFactory.cxx:702
 TSModelFactory.cxx:703
 TSModelFactory.cxx:704
 TSModelFactory.cxx:705
 TSModelFactory.cxx:706
 TSModelFactory.cxx:707
 TSModelFactory.cxx:708
 TSModelFactory.cxx:709
 TSModelFactory.cxx:710
 TSModelFactory.cxx:711
 TSModelFactory.cxx:712
 TSModelFactory.cxx:713
 TSModelFactory.cxx:714
 TSModelFactory.cxx:715
 TSModelFactory.cxx:716
 TSModelFactory.cxx:717
 TSModelFactory.cxx:718
 TSModelFactory.cxx:719
 TSModelFactory.cxx:720
 TSModelFactory.cxx:721
 TSModelFactory.cxx:722
 TSModelFactory.cxx:723
 TSModelFactory.cxx:724
 TSModelFactory.cxx:725
 TSModelFactory.cxx:726
 TSModelFactory.cxx:727
 TSModelFactory.cxx:728
 TSModelFactory.cxx:729
 TSModelFactory.cxx:730
 TSModelFactory.cxx:731
 TSModelFactory.cxx:732
 TSModelFactory.cxx:733
 TSModelFactory.cxx:734
 TSModelFactory.cxx:735
 TSModelFactory.cxx:736
 TSModelFactory.cxx:737
 TSModelFactory.cxx:738
 TSModelFactory.cxx:739
 TSModelFactory.cxx:740
 TSModelFactory.cxx:741
 TSModelFactory.cxx:742
 TSModelFactory.cxx:743
 TSModelFactory.cxx:744
 TSModelFactory.cxx:745
 TSModelFactory.cxx:746
 TSModelFactory.cxx:747
 TSModelFactory.cxx:748
 TSModelFactory.cxx:749
 TSModelFactory.cxx:750
 TSModelFactory.cxx:751
 TSModelFactory.cxx:752
 TSModelFactory.cxx:753
 TSModelFactory.cxx:754
 TSModelFactory.cxx:755
 TSModelFactory.cxx:756
 TSModelFactory.cxx:757
 TSModelFactory.cxx:758
 TSModelFactory.cxx:759
 TSModelFactory.cxx:760
 TSModelFactory.cxx:761
 TSModelFactory.cxx:762
 TSModelFactory.cxx:763
 TSModelFactory.cxx:764
 TSModelFactory.cxx:765
 TSModelFactory.cxx:766
 TSModelFactory.cxx:767
 TSModelFactory.cxx:768
 TSModelFactory.cxx:769
 TSModelFactory.cxx:770
 TSModelFactory.cxx:771
 TSModelFactory.cxx:772
 TSModelFactory.cxx:773
 TSModelFactory.cxx:774
 TSModelFactory.cxx:775
 TSModelFactory.cxx:776
 TSModelFactory.cxx:777
 TSModelFactory.cxx:778
 TSModelFactory.cxx:779
 TSModelFactory.cxx:780
 TSModelFactory.cxx:781
 TSModelFactory.cxx:782
 TSModelFactory.cxx:783
 TSModelFactory.cxx:784
 TSModelFactory.cxx:785
 TSModelFactory.cxx:786
 TSModelFactory.cxx:787
 TSModelFactory.cxx:788
 TSModelFactory.cxx:789
 TSModelFactory.cxx:790
 TSModelFactory.cxx:791
 TSModelFactory.cxx:792
 TSModelFactory.cxx:793
 TSModelFactory.cxx:794
 TSModelFactory.cxx:795
 TSModelFactory.cxx:796
 TSModelFactory.cxx:797
 TSModelFactory.cxx:798
 TSModelFactory.cxx:799
 TSModelFactory.cxx:800
 TSModelFactory.cxx:801