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

#include "SFramework/TSModelBuilder.h"
#include "RooStats/HistFactory/HistoToWorkspaceFactoryFast.h"

#include "QFramework/TQSampleFolder.h"
#include "QFramework/TQHistogramUtils.h"
#include "QFramework/TQSampleDataReader.h"
#include "QFramework/TQStringUtils.h"
#include "QFramework/TQTaggable.h"
#include "QFramework/TQIterator.h"
#include "QFramework/TQUtils.h"
#include "QFramework/TQPathManager.h"

// #define _DEBUG_

#include "QFramework/TQLibrary.h"

#include "TSystem.h"
#include "TMath.h"
#include "RooWorkspace.h"
#include "RooMsgService.h"

#include "TStopwatch.h"

////////////////////////////////////////////////////////////////////////////////////////////////
//
//	TSModelBuilder
//
//	The TSModelBuilder class allows to create a complete definition of a statistical model to be
//	passed to the TSModelFactory class to run HistFactory. The specifics of the model to be
//	created have to be provided as configuration data by means of a TQFolder structure.
//
//	A model is represented by the root instance of a TQFolder structure holding detailed
//	definitions of channels, samples, systematic uncertainties as well as the corresponding
//	histograms.
//
//	Creation of a model by the TSModelBuilder class is split into two different steps: the
//	preparation step and the finalization step. The finalization step involves retrieving
//	histograms and counter representing signal and background expectations as well as data
//	observations from a sample folders (instances of TQSampleFolder) either stored in external
//	files or made available as memory resident object. Furthermore, it involves the analysis of
//	variations corresponding to systematic uncertainties and their proper treatment.
//
//
//
//	The configuration has to be provided as the following structure:
//
//	Samples/                           A folder listing all samples to be used in the model
//	                                   (entries starting with a dot "." are ignored)
//	  {sample/}                        [one folder for each sample]
//	    <Path>                         Default path to the corresponding sample (with respect to the
//	                                   base sample folder), e.g. "sig/em/mh125/ggf". Placeholders
//	                                   (e.g. "$(mass)") can be used and will be replaced using tags
//	                                   from configuration of corresponding channel and from Parameter
//	                                   block.
//	    <Type>                         [optional] The type of the corresponding sample,
//	                                   e.g. "S" for signal, "B" for background, and "D" for data
//	    <ActivateStatError>            [optional, default as in TSModelFactory (false)]
//	    <StatErrorHisto>               [optional]
//	    <NormalizeByTheory>            [optional, default as in TSModelFactory (true)]
//	    {additional-items/}            [one folder for each additional items]
//	      <AppliesToChannels>          String filter to be passed by name of channel in order
//	                                   to copy corresponding item to final instance of sample
//
//	Channels/                          A folder listing all channels (regions) to be used in
//	                                   the model (entries starting with a dot "." are ignored)
//	  {channel/}                       [one folder for each channel/region]
//	    <Histogram>                    Name of histogram to be used for corresponding channel,
//	                                   e.g. "CutTopoDPhill_0jet/MT".
//	    <Counter>                      Name of counter to be used for corresponding channel,
//	                                   e.g. "CutTopoDPhill_0jet" (counter will be converted to
//	                                   1-bin histogram)
//	    <StatRelErrorThreshold>
//	    <StatConstraintType>
//
//	    <RemapXTo>                     Number of bins to remap X axis of histogram to (histogram is
//	                                   remapped such that histogram obtained from <PathRemapFlat> is
//	                                   approximately flat).
//	    <RemapYTo>                     Number of bins to remap Y axis of histogram to (histogram is
//	                                   remapped such that histogram obtained from <PathRemapFlat> is
//	                                   approximately flat). Please note: remapping both X and Y axes
//	                                   simultaneously is not supported.
//	    <PathRemapFlat>                Path to histogram to become approximately flat by remapping
//	    <RemapSlices>                  Controls whether when remapping a 2D histogram each bin of the
//	                                   dimension NOT subject to the remapping is remapped individually
//	                                   (<RemapSlices> == true) or only the full projection
//	                                   (<RemapSlices> == false). This option is true by default
//	    <convertTo1D>                  Definition of conversion ("unfolding", "unrolling") of a 2D
//	                                   histogram to a 1D histogram.
//	    <HistogramOptions>
//
//
//	                                   ***** For documentation of the following options please refer to
//	                                   the documentation of TQSampleDataReader::getHistogram(...) *****
//
//	    <cutBinLowX>                   Removing bins from histograms
//	    <cutBinHighX>                  /.../
//	    <cutBinLowY>                   /.../
//	    <cutBinHighY>                  /.../
//	    <cutBinLow>                    /.../
//	    <cutBinHigh>                   /.../
//	    <zoomBinLowX>                  Zooming into histograms
//	    <zoomBinHighX>                 /.../
//	    <zoomBinLowY>                  /.../
//	    <zoomBinHighY>                 /.../
//	    <zoomBinLow>                   /.../
//	    <zoomBinHigh>                  /.../
//	    <projXBinLowY>                 Projecting 2D histograms onto one if its axes
//	    <projXBinHighY>                /.../
//	    <projXBinY>                    /.../
//	    <projX>                        /.../
//	    <projYBinLowX>                 /.../
//	    <projYBinHighX>                /.../
//	    <projYBinX>                    /.../
//	    <projY>                        /.../
//	    <rebinX>                       Rebinning histograms
//	    <rebin>                        /.../
//	    <rebinY>                       /.../
//	    <rebinZ>                       /.../
//	    <scale>                        Scaling the histogram
//	    <verbosity>                    Temporarily setting the verbosity mode of the
//	                                   TQSampleDataReader class
//	    <applyPoissonErrors>           Set bin errors of histogram to sqrt(bin contents)
//
//	    <forSample.<sample>.XXX>
//
//	                                   *****************************************************************
//
//	Variations/                        A folder listing all (systematic) variations to be used
//	                                   in the model (entries starting with a dot "." are ignored)
//	  {variation/}                     [one folder for each (systematic) variation]
//	    <SampleFolder>                 Location of the sample folder of the corresponding
//	                                   variation, e.g. "samples.root:samples_Nominal". Please
//	                                   note: there at least needs to be a "Nominal" folder
//
//	Systematics/                       A folder listing all sources of systematic uncertainties
//	                                   to be used in the model (entries starting with a dot "."
//	                                   are ignored)
//	  {systematic/}                    [one folder for each source of systematic uncertainty]
//	    <Up>                           Name of UP variation corresponding to systematic
//	                                   uncertainty (must be listed in Variations/ folder)
//	    <Down>                         Name of DOWN variation corresponding to systematic
//	                                   uncertainty (must be listed in Variations/ folder)
//	    <IsOverallSys>                 Selects if systematic uncertainty is treated as a
//	                                   normalization systematic ('OverallSys')
//	    <IsHistoSys>                   Selects if systematic uncertainty is treated as a shape
//	                                   systematic ('HistoSys'). Please note: the normalization
//	                                   component is factorized and removed for 'HistoSys'
//	    <Include>                      String filter tested for each combination of channel
//	                                   (region) and sample (in the form "<channel>:<sample>")
//	                                   which has to be pass in order that the corresponding
//	                                   systematic uncertainty is considered for this
//	                                   combination of channel/sample
//	    <Exclude>                      String filter tested for each combination of channel
//	                                   (region) and sample (in the form "<channel>:<sample>")
//	                                   which must NOT be pass in order that the corresponding
//	                                   systematic uncertainty is considered for this
//	                                   combination of channel/sample (if a combination passes
//	                                   both the inclusion and the exclusion filter it is
//	                                   excluded)
//	    <InterpCode>                   Interpolation code to be used by HistFactory
//	    <OverallSysMagnification>      Factor to artificially magnify the normalization
//	                                   response of the systematic uncertainty
//	    <HistoSysMagnification>        Factor to artificially magnify the shape response of
//	                                   the systematic uncertainty
//	    <Magnification>                Factor passed as default to <OverallSysMagnification>
//	                                   and <HistoSysMagnification>
//
//	Parameters/
//	  <Name>
//	  <Title>
//	  <OutputFilePrefix>
//	  <ExportOnly>
//	  <POI>                            Name of the Parameter Of Interest (POI)
//	  <Lumi>                           Luminosity scale factor
//	  <LumiRelErr>                     Relative luminosity uncertainty
//	  <SysRelThreshold>                Minimum relative variation to be exceeded by a systematic
//	                                   variation in order to be considered
//	  <SysRelMin>                      Minimum relative variation to be exceeded by a systematic
//	                                   variation in order to not be ignored
//	  <SysRelCutoff>                   Maximum relative variation a systematic variation must
//	                                   not exceed in order to be considered
//	  <SysRelCap>                      The maximum relative variation a systematic variation. If
//                                     the maximum is exceeded, the relative variation is set to this maximum
//	  <MinBinContent>                  The minimum bin content of histograms of each process
//	                                   (except Data histograms). If the bin content is lower
//	                                   than this minimum it is set to the minimum
//
//	The model built by the TSModelBuilder class uses the convention that each element available
//	in HistFactory (e.g. a "Sample", a "Channel", a "NormFactor) is represented by a
//	corresponding instance of TQFolder whose name prefix indicates the type of element followed
//	by the name of the element (e.g. "Sample.ttbar"). Properties of an element are stored as
//	tags on the corresponding folders and sub-elements are represented by sub folders. Available
//	elements and their properties are:
//
//	- Channel ("Channel.name/");
//	  - <StatRelErrorThreshold>
//	  - <StatConstraintType>
//
//	- Sample ("Sample.name/");
//	  - <Histo>
//	  - <.HistogramFile>
//	  - <.HistogramPathPrefix>
//	  - <NormalizeByTheory>
//	  - <ActivateStatError>
//	  - <StatErrorHisto>
//
//	- NormFactor ("NormFactor.name/");
//	  - <Val>
//	  - <Low>
//	  - <High>
//	  - <Const>
//
//	- OverallSys ("OverallSys.name/");
//	  - <High>
//	  - <Low>
//
//	- HistoSys ("HistoSys.name/");
//	  - <HistoHigh>
//	  - <HistoLow>
//	  - <.HistogramFile>
//	  - <.HistogramPathPrefix>
//
//
//	It will have to following structure:
//
//	{Channel.*/}                       [one folder for each channel]
//	  {Sample.*/}                      [one folder for each sample in channel]
//	.Configuration/                    The model configuration folder after the model building
//	                                   process which includes additional information (e.g. bin
//	                                   boundaries from remapping)
//	.Configuration.PreBuild/           A copy of the model configuration folder BEFORE the model
//	                                   building process
//	.Histograms/                       All histograms used in the model building process
//	                                   (including those created from counter on-the-fly) are
//	                                   stored here (this is also the folder written to a ROOT
//	                                   file to let HistFactory grab the histograms from).
//
//	A model created by the TSModelBuilder class is interfaced by the TSModelFactory class to
//	HistFactory.
//
//
////////////////////////////////////////////////////////////////////////////////////////////////

ClassImp(TSModelBuilder)


//__________________________________________________________________________________|___________

TSModelBuilder::TSModelBuilder() {
  // Default constructor for TSModelBuilder class.
}


//__________________________________________________________________________________|___________

TSModelBuilder::~TSModelBuilder() {
}


//__________________________________________________________________________________|___________

void TSModelBuilder::info(TString message) {

  // print an info message
  std::cout << "SFramework/TSModelBuilder: " << message.Data() << std::endl;
}


//__________________________________________________________________________________|___________

void TSModelBuilder::error(TString message) {
  errorCount++;

  // print a red error message
  if(errorCount < maxErrorCount){
    info(TQStringUtils::makeBoldRed(TString("ERROR: ") + message));
  } else if(errorCount == maxErrorCount){
    info(TQStringUtils::makeBoldRed(TString("ERROR: ") + message));
    info(TQStringUtils::makeBoldRed("ERROR: too many error messages, suppressing further output"));
  }
}
  

//__________________________________________________________________________________|___________

void TSModelBuilder::warn(TString message) {
  warnCount++;
  
  // print a yellow warning message
  if(warnCount < maxErrorCount){
    info(TQStringUtils::makeBoldYellow(TString("WARNING: ") + message));
  } else if(warnCount == maxErrorCount){
    info(TQStringUtils::makeBoldYellow(TString("WARNING: ") + message));    
    info(TQStringUtils::makeBoldRed("WARNING: too many warning messages, suppressing further output"));
  }
}


//__________________________________________________________________________________|___________

Bool_t TSModelBuilder::createChannelDefinitions(TQFolder * config, TQFolder * model) {
  // Creates the basic channel definitions of a model from configuration <config>
  // and returns true in case of success or false in case of failure.

  Bool_t success = true;

  // iterate over list of channels defined in configuration
  // (ignoring entries starting with a dot ".")
  TQIterator itr(config->getListOfFolders("Channels/?"), "!.*", true);
  if(!itr.hasNext()){
    success = false;
    error("createChannelDefinitions(...): No channel definitions given!");
  } else {
    while (itr.hasNext()) {
      // name of the channel
      TString name = itr.readNext()->GetName();
      // create definition of channel <name>
      if (!createChannelDefinition(config, model, name)) {
        // in case of failure ...
        success = false;
        error(TString::Format("createChannelDefinitions(...): "
                              "Failed to create definition for channel '%s'", name.Data()));
      }
    }
  }
  // return true in case of success or false in case of failure
  return success;
}


//__________________________________________________________________________________|___________

Bool_t TSModelBuilder::createChannelDefinition(TQFolder * config, TQFolder * model, TString name) {
  // Creates the basic channel definitions of a model from configuration <config>
  // and returns true in case of success or false in case of failure.

  /* load channel configuration */
  TQFolder * channelConfig = config->getFolder(TQFolder::concatPaths("Channels", name));
  if (!channelConfig) {
    error(TString::Format("createChannelDefinition(...): "
                          "Configuration for channel '%s' missing", name.Data()));
    return false;
  }

  /* create new channel in model definition */
  TQFolder * channelDef = model->getFolder(TString::Format("Channel.%s+", name.Data()));
  channelDef->setTagString("Channel",name);

  /* copy tags from Channel configuration to Channel definition */
  channelDef->importTags(channelConfig);

  /* loop over samples in template list */
  TQIterator itrSamples(config->getListOfFolders("Samples/?"), "!.*", true);
  while (itrSamples.hasNext()) {
    TQFolder * sampleConfig = (TQFolder*)itrSamples.readNext();
    TString nameSample = sampleConfig->GetName();
    TString sampleType = sampleConfig->getTagStringDefault("Type","B");    

    TString exclude;
    if(sampleConfig->getTagString("Exclude",exclude) && TQStringUtils::matchesFilter(name,exclude,",")) continue;
    TString include;
    if(sampleConfig->getTagString("Include",include) && !TQStringUtils::matchesFilter(name,include,",")) continue;    
    
    // create sample definition folder in model
    TQFolder * sampleDef = channelDef->getFolder(TString::Format("Sample.%s+", nameSample.Data()));
    sampleDef->setTagString("Sample",nameSample);
    sampleDef->setTagString("Type", sampleType);

    // nothing more to do in case of Data
    //if (sampleType == "D"){
    //  continue;
    //}

    // copy some tags from sample configuration to sample definition in model
    sampleDef->importTags(sampleConfig);

    // loop over sub elements of sample and add them to the sample definition
    TQIterator itrElements(sampleConfig->getListOfFolders("?"), "!.*", true);
    while (itrElements.hasNext()) {
      TQFolder * element = (TQFolder*)itrElements.readNext();
      TString nameElement = element->GetName();
      
      TString excludeElement;      
      if(element->getTagString("Exclude",excludeElement) && TQStringUtils::matchesFilter(name,excludeElement,",")) continue;
      TString includeElement;      
      if(element->getTagString("Include",includeElement) && !TQStringUtils::matchesFilter(name,includeElement,",")) continue;            
      
      sampleDef->addObject(element->copy());
    }
  }

  // everything seems to have worked out properly
  return true;
}


//__________________________________________________________________________________|___________

TQFolder * TSModelBuilder::createDefinition(TQFolder * config) {

  /* basic configuration of workspace/model */
  TString modelName = config->GetName();

  /* create new definition */
  TQFolder * model = TQFolder::newFolder("Model");

  // the folder the histograms are put in
  TQFolder * histos = model->getFolder(".Histograms+");
  this->setRepository(histos);
  
  TQFolder * parConfig = config->getFolder("Parameters");
  if (parConfig) {
    // get the name of the model
    parConfig->getTagString("Name", modelName);
    config->getTagString("Name", modelName);
    parConfig->setTagString("Name", modelName);
    parConfig->exportTags(model);
    modelName = parConfig->replaceInText(modelName);
  }

  modelName = TQFolder::makeValidIdentifier(modelName);
  model->SetName(modelName);

  info(TString::Format("createDefinition(): Creating definition for model '%s' ...", modelName.Data()));

  if (!createChannelDefinitions(config, model)) {
    error("createDefinition(): Failed to create model definition");
    return NULL;
  }

  /* copy ParamSettings */
  TQFolder * paramSettings = config->getFolder("ParamSettings");
  if (paramSettings) {
    model->addObject(paramSettings->copy());
  }


  TQFolderIterator edits(config->getListOfFolders("Edits/?"),true);
  while(edits.hasNext()){
    TQFolder* edit = edits.readNext();
    if(!edit) continue;
    this->applyEdits(edit,model);
  }

  return model;
}


//__________________________________________________________________________________|___________

void TSModelBuilder::applyEdits(TQFolder* edit, TQFolder* model){
  TString file;
  if(edit->getTagString("file",file)){
    TString msg;
    INFOfunc(TString::Format("applying edits from file '%s'",file.Data()));
    if(!model->importFromTextFile(TQPathManager::getPathManager()->findConfigPath(file).c_str(),msg)){
      ERRORfunc(msg);
    }

  }
  std::vector<TString> commands = edit->getTagVString("commands");
  if (commands.empty() && edit->hasTagString("command")) commands.push_back(edit->getTagStringDefault("command",""));
  for (auto com:commands) {
    TString msg;
    com.ReplaceAll("\n","");
    com.ReplaceAll(" ","");
    INFOfunc(TString::Format("applying edit command '%s'",com.Data()));
    if(!model->importFromText(com,msg)){
      ERRORfunc(msg);
    }
  }
}

//__________________________________________________________________________________|___________

Bool_t TSModelBuilder::finalizeModel(TQFolder * model, TQFolder * config) {
  // Finalizes the model <model> based on the configuration <config> by collecting
  // all histograms, including systematic uncertainties inferred from variations of
  // input histograms, and returns true in case of success or false otherwise.

  if (!model || !config) {
    error("finalizeModel(...): Model and/or configuration missing. Stopping ...");
    return false;
  }

  // collect histograms (for all variations including nominal)
  if(config->getTagBoolDefault("collectHistograms",true)){
    if (!collectAllHistograms(config, model)) {
      error("finalizeModel(...): Failed to collect histograms. Stopping ...");
      return false;
    }
  } else {
    info("finalizeModel(...): Skipping histogram collection");
  }
    

  if(config->getTagBoolDefault("includeSystematics",true)){
    TQFolder* parameters = config->getFolder("Parameters");
    TQFolder* systematics = config->getFolder("Systematics");      
    TList* allSamples = model->getListOfFolders("Channel.*/Sample.*");

    // if parameters is a null ptr, create an empty TQTaggable instance to proceed with the default parameters
    std::shared_ptr<TQFolder> empty_parameters = std::make_shared<TQFolder>();
    if (parameters == nullptr) {
      parameters = empty_parameters.get();
    }

    // include systematic uncertainties (evaluate variations for systematics
    // from input histograms and create corresponding entries in the model)
    bool ok = true;
    if (ok && !includeAllSystematics(systematics, allSamples)) {
      error("finalizeModel(...): Failed to include systematics. Stopping ...");
      ok = false;
    }

    if(config->getTagBoolDefault("processSystematics",true)){    
      if (ok && !processAllSystematics(parameters, allSamples)) {
        error("finalizeModel(...): Failed to process systematics. Stopping ...");
        ok = false;
      }
    }
    
    delete allSamples;
    if(!ok) return false;
  }

  model->sortByNameRecursive();

  return true;
}


//__________________________________________________________________________________|___________

TQFolder * TSModelBuilder::buildModel(TQFolder * config) {
  // Builds a model from configuration <config> and returns a pointer to the
  // corresponding instance of TQFolder representing the model or a NULL pointer in
  // case of failure

  TQFolder * model = createDefinition(config);
  // prepare model
  if (!model) {
    error("buildModel(...): Failed to prepare model. Stopping ...");
    return NULL;
  }

  // finalize model
  if (!finalizeModel(model, config)) {
    error("buildModel(...): Failed to finalize model. Stopping ...");
  }

  // return the model
  return model;
}

//__________________________________________________________________________________|___________

void TSModelBuilder::purgeVariation(TQFolder* model, const TString& name, Bool_t /*notify*/){
  // remove a variation from a model
  warn(TString::Format("purgeVariation('%s') : removing variation... ",name.Data()));
  model->removeObject(TQFolder::concatPaths("Variations",name));
  TQIterator itr(model->getListOfFolders("Systematics/?"),true);
  while(itr.hasNext()){
    TQFolder* f = dynamic_cast<TQFolder*>(itr.readNext());
    if(!f) continue;
    if((f->getTagStringDefault("Up","") == name) || (f->getTagStringDefault("Down","") == name)){
      warn(TString::Format("purgeVariation('%s') : removing systematic '%s'",name.Data(),f->GetName()));
      model->deleteObject(TQFolder::concatPaths("Systematics",f->getName()));
    }
  }
}


//__________________________________________________________________________________|___________

Bool_t TSModelBuilder::collectAllHistograms(TQFolder * config, TQFolder * model) {
  // collect all histograms from the sample folder and store them in the model
  info("collectAllHistograms(): Start collecting histograms...");
  TQFolder* variations = config->getFolder("Variations+");
  
  /* "Nominal" has to be first because it fixes the remapping information */
  bool ok = collectHistograms(config, model, variations->getFolder("Nominal+"));
  if(!ok) return false;

  /* ===== loop over variations ===== */
  TQFolderIterator itr(variations->getListOfFolders("?"), "!.*", true);
  while (itr.hasNext()) {
    TQFolder* variation = itr.readNext();
    TString name = variation->GetName();
    /* now run all but "Nominal" */
    if (name.CompareTo("Nominal") != 0) {
      bool success = collectHistograms(config, model, variation);
      if(!success && config->getTagBoolDefault("skipMissingVariations",false)){
        this->purgeVariation(config,name,true);
      }
    }
  }
  return true;
}

//__________________________________________________________________________________|___________

Bool_t TSModelBuilder::parseConversion(TString def, Bool_t &alongX,
                                       Bool_t &includeUnderflowX, Bool_t &includeOverflowX,
                                       Bool_t &includeUnderflowY, Bool_t &includeOverflowY) {

  Bool_t uv1 = TQStringUtils::removeLeading(def, "^", 1);
  TString axis1;
  TQStringUtils::readToken(def, axis1, "XYxy");
  Bool_t ov1 = TQStringUtils::removeLeading(def, "^", 1);

  if (!TQStringUtils::removeLeading(def, ":", 1)) {
    return false;
  }

  Bool_t uv2 = TQStringUtils::removeLeading(def, "^", 1);
  TString axis2;
  TQStringUtils::readToken(def, axis2, "XYxy");
  Bool_t ov2 = TQStringUtils::removeLeading(def, "^", 1);

  if (!def.IsNull()) {
    return false;
  }

  if (axis1.CompareTo("x", TString::kIgnoreCase) == 0
      && axis2.CompareTo("y", TString::kIgnoreCase) == 0) {
    alongX = true;
    includeUnderflowX = uv1;
    includeOverflowX = ov1;
    includeUnderflowY = uv2;
    includeOverflowY = ov2;
    return true;
  } else if (axis1.CompareTo("y", TString::kIgnoreCase) == 0
             && axis2.CompareTo("x", TString::kIgnoreCase) == 0) {
    alongX = false;
    includeUnderflowX = uv2;
    includeOverflowX = ov2;
    includeUnderflowY = uv1;
    includeOverflowY = ov1;
    return true;
  } else {
    return false;
  }
}


//__________________________________________________________________________________|___________

std::vector<int> TSModelBuilder::getRemapping(TQFolder * channelConfig, TQSampleFolder * refSamples,
                                              TString refPath, TString refHistogram, TQTaggable * refHistogramOptions,
                                              Int_t remapXTo, Int_t remapYTo, Int_t &dim, Bool_t remapSlices) {


  /* name of channel */
  TString nameChannel = channelConfig->GetName();

  /* remapping bin border information to return */
  std::vector<int> borders;

  /* ===== try to load/create the remapping information ===== */
  TQFolder * remappingConfig = channelConfig->getFolder("Remapping");
  if (remappingConfig) {
    borders = remappingConfig->getTagVInteger("Borders");

    remappingConfig->getTagInteger("Dim", dim);
    remappingConfig->getTagInteger("RemapXTo", remapXTo);
    if (dim > 1) {
      remappingConfig->getTagInteger("RemapYTo", remapYTo);
    }

  } else {
    /* load remapping reference histogram */
    TQSampleDataReader rd(refSamples);
    rd.setApplyStyles(false);
    //    rd.setVerbose(1);
    TH1 * h_ref = rd.getHistogram(refPath, refHistogram, refHistogramOptions);

    if (h_ref) {

      /* ===== create remapping information ===== */

      dim = TQHistogramUtils::getDimension(h_ref);

      /* check remapping definition */
      if (remapYTo > 0 && dim < 2) {
        error(TString::Format(
                              "getRemapping(...): Cannot remap Y axis of one dimensional histogram in channel '%s'",
                              nameChannel.Data()));
        delete h_ref;
        return borders;
      }
      if (remapXTo > 0 && remapYTo > 0) {
        error(TString::Format(
                              "getRemapping(...): Cannot remap more than one dimension in channel '%s'",
                              nameChannel.Data()));
        delete h_ref;
        return borders;
      }

      /* determine remapping */
      if (dim == 1) {
        borders = TQHistogramUtils::getBinBordersFlat(h_ref, remapXTo, true);
      } else if (dim == 2) {
        if (remapYTo > 0) {
          borders = TQHistogramUtils::getBinBordersFlat2D((TH2*)h_ref, remapYTo, false, true, remapSlices);
        } else if (remapXTo > 0) {
          borders = TQHistogramUtils::getBinBordersFlat2D((TH2*)h_ref, remapXTo, true, true, remapSlices);
        }
      } else {
        error("getRemapping(...): Remapping only supported for one- or two-dimensional histograms");
        delete h_ref;
        return borders;
      }
      delete h_ref;

      if (borders.size()==0) {
        error("getRemapping(...): Somehow failed to determine histogram remapping");
        return borders;
      }

      /* write remapping information to configuration */
      remappingConfig = channelConfig->getFolder("Remapping+");
      for (UInt_t i = 0; i < borders.size(); i++) {
        remappingConfig->setTagInteger(TString::Format("i%d", i), borders.at(i));
      }
      remappingConfig->setTagBool("RemapSlices", remapSlices);
      remappingConfig->setTagInteger("Dim", dim);
      remappingConfig->setTagInteger("RemapXTo", remapXTo);
      if (dim > 1) {
        remappingConfig->setTagInteger("RemapYTo", remapYTo);
      }

    } else {
      error(TString::Format("getRemapping(...): Failed to load remapping reference histogram '%s' for channel '%s' from path '%s' with options '%s'",
                            refHistogram.Data(), nameChannel.Data(), refPath.Data(), refHistogramOptions->exportTagsAsString().Data()));
    }
  }

  /* return remapping bin borders */
  return borders;
}

std::vector<int> TSModelBuilder::getRemappingOptimizedSgnf(TQFolder * channelConfig, TQSampleFolder * refSamples,
                                                           TString sigPath, TString bkgPath, TString histname, TQTaggable * histogramOptions,
                                                           Int_t &dim) {

  /* name of channel */
  TString nameChannel = channelConfig->GetName();

    // welcome message
  if (channelConfig->getTagBoolDefault("verboseRebinningAlgorithm", false)) {
    INFO("********************************************************");
    INFO(TString::Format("==>> Running rebinning on Channel: %s", nameChannel.Data()));
    INFO("*********************************************************");
  }

  /* remapping bin border information to return */
  std::vector<int> borders;

  /* parameters for binning optimiziation */
  double minSignal;
  double maxSignal;
  double minBkg;
  double maxBkgUnc;
  double maxSigUnc;
  double minBinWidth;
  bool significanceAgnostic;
  bool mergeBins;
  double estimatedMaxSignInBin;
  dim = 1;

  /* ===== try to load/create the remapping information ===== */
  TQFolder * remappingConfig = channelConfig->getFolder("Remapping");
  if (remappingConfig) {

    Int_t id = 0;
    Int_t value = 0;
    while (remappingConfig->getTagInteger(TString::Format("i%d", id++), value)) {
      borders.push_back(value);
    }
    remappingConfig->getTagInteger("Dim", dim);
    remappingConfig->getTagDouble("minSignal", minSignal);
    remappingConfig->getTagDouble("maxSignal", maxSignal);
    remappingConfig->getTagDouble("minBkg", minBkg);
    remappingConfig->getTagDouble("maxBkgUnc", maxBkgUnc);
    remappingConfig->getTagDouble("maxSigUnc", maxSigUnc);
    remappingConfig->getTagBool("significanceAgnostic", significanceAgnostic);
    remappingConfig->getTagDouble("estimatedMaxSignInBin", estimatedMaxSignInBin);
    remappingConfig->getTagDouble("minBinWidth", minBinWidth);
    remappingConfig->getTagBool("mergeBins", mergeBins);

  } else {
    /* load remapping reference histogram */
    TQSampleDataReader rd(refSamples);
    rd.setApplyStyles(false);
    // rd.setVerbose(1);
    TH1 * hsig = rd.getHistogram(sigPath, histname, histogramOptions);
    TH1 * hbkg = rd.getHistogram(bkgPath, histname, histogramOptions);

    if (hsig || hbkg) {

      /* ===== create remapping information ===== */

      dim = TQHistogramUtils::getDimension(hsig);

      /* check remapping definition */
      if (dim > 1) {
        error(TString::Format(
                              "getRemappingOptimizedSgnf(...): Remapping with significance optimization algorithm is not support "
                              "for >1D histograms!"));
        delete hsig;
        delete hbkg;
        return borders;
      }
      /* determine remapping */

      //@tag:[minSignal, maxSignal, minBkg, maxBkgUnc, significanceAgnostic, estimatedMaxSignInBin] Tags to steer binning optimization algorithm. For more information see the function in TQHistogramUtils.
      dim = channelConfig->getTagIntegerDefault("Dim", 1);
      minSignal = channelConfig->getTagDoubleDefault("rebinMinSignal", 10);
      maxSignal = channelConfig->getTagDoubleDefault("rebinMaxSignal", 30);
      minBkg = channelConfig->getTagDoubleDefault("rebinMinBkg", 10);
      maxBkgUnc = channelConfig->getTagDoubleDefault("rebinMaxBkgUnc", 0.2);
      maxSigUnc = channelConfig->getTagDoubleDefault("rebinMaxSigUnc", 0.8);
      minBinWidth = channelConfig->getTagDoubleDefault("rebinMinBinWidth", -1);

      mergeBins = channelConfig->getTagBoolDefault("rebinMergeBins", true);
      significanceAgnostic = channelConfig->getTagBoolDefault("significanceAgnostic", false);
      estimatedMaxSignInBin = channelConfig->getTagDoubleDefault("rebinEstimatedMaxSignInBin", -1);

      // @tag:[verboseRebinningAlgorithm] If true, lots of outputs from the binning optimization algorithm will be printed
      borders = TQHistogramUtils::getOptimizedBinBorders(hsig, hbkg, minSignal, minBkg, maxBkgUnc,
                                                            significanceAgnostic, maxSignal, estimatedMaxSignInBin,
                                                            channelConfig->getTagBoolDefault("verboseRebinningAlgorithm", false), maxSigUnc, minBinWidth, mergeBins);

      if (borders.size()==0) {
        error("getRemappingOptimizedSgnf(...): Somehow failed to determine histogram remapping");
        delete hsig;
        delete hbkg;
        return borders;
      }

      for (int i=1; i < hsig->GetNbinsX()+1; i++) {
        INFO(TString::Format("%f", hsig->GetBinLowEdge(i)));
      }

      TString info_pre_remap = "{";
      if (channelConfig->getTagBoolDefault("verboseRebinningAlgorithm", false)) {
        INFO("\n*********************************************************");
        INFO("==>> binborders to be used for <rebinXList={BEGIN_of_distribution,..,border1,border2,..,END_of_distribution}>");
        for (size_t i=0; i < borders.size(); i++) {
            info_pre_remap.Append(TString::Format("%f,", hsig->GetBinLowEdge(borders[i])));
        INFO(TString::Format("%f", hsig->GetBinLowEdge(borders[i])));
        }
        info_pre_remap.Append("}");
        INFO("*********************************************************");
      }
      INFO(info_pre_remap);

      delete hsig;
      delete hbkg;
      /* write remapping information to configuration */
      remappingConfig = channelConfig->getFolder("Remapping+");
      for (UInt_t i = 0; i < borders.size(); i++) {
        remappingConfig->setTagInteger(TString::Format("i%d", i), borders.at(i));
      }
      remappingConfig->setTagInteger("Dim", 1);
      remappingConfig->setTagDouble("minSignal", minSignal);
      remappingConfig->setTagDouble("maxSignal", maxSignal);
      remappingConfig->setTagDouble("minBkg", minBkg);
      remappingConfig->setTagDouble("maxBkgUnc", maxBkgUnc);
      remappingConfig->setTagBool("significanceAgnostic", significanceAgnostic);
      remappingConfig->setTagDouble("estimatedMaxSignInBin", estimatedMaxSignInBin);

      
    } else {
      error(TString::Format("getRemappingOptimizedSgnf(...): Failed to load remapping "
                            "histograms for channel '%s'", nameChannel.Data()));
    }
  }

  /* return remapping bin borders */
  return borders;
}

std::vector<int> TSModelBuilder::getMergeBins(TQFolder * config, TQFolder * channelConfig, std::map<TQFolder*,TH1*> histograms, TString varname, Bool_t isNominal, Int_t &dim){
  // merge bins of a histogram such that no histogram has contributions below mergeBins.minimalBinContent (default: 0), and the stack has no bin below mergeBins.minimalSummedBinContent (default: 1)

  // merged bin border information to return
  std::vector<int> borders;

  /* first try to load an already existing configuration */
  TQFolder * mergeBinsConfig = channelConfig->getFolder("MergeBins");

  /* if exists, load it */
  if (mergeBinsConfig) {
    Int_t id = 0;
    Int_t value = 0;
    while (mergeBinsConfig->getTagInteger(TString::Format("i%d", id++), value)) {
      borders.push_back(value);
    }
    mergeBinsConfig->getTagInteger("Dim", dim);
  } else { // if not, it must be calculated

    /* minimal bin content in induvidual bin after merging */
    Double_t minimalBinContent;

    /* minimal bin content in summed (over samples) bin after merging */
    Double_t minimalSummedBinContent;

    /* bin border that may not be merged */
    std::vector<int> hardBorders;

    /* vector filled with all content from all bins of all induvidual samples */
    std::map< const TString,  std::vector<Double_t> > totalBinContent;

    /* vector filled with all content from all bins of all summed samples */
    std::vector<Double_t> sumBinContent;

    /* read in values from the file */
    minimalBinContent = channelConfig->getTagDoubleDefault("mergeBins.minimalBinContent",0.);
    minimalSummedBinContent = channelConfig->getTagDoubleDefault("mergeBins.minimalSummedBinContent",1.);
    hardBorders = channelConfig->getTagVInt("mergeBins.hardBorders");

    /* loop over all histograms */
    for(auto it:histograms){
      /* vector filled with all content from all bins of a sample */
      std::vector<Double_t> histogramBinContent;

      TQFolder* sampleDef = it.first;
      TString nameSample = sampleDef->GetName();
      TString sampleType = sampleDef->getTagStringDefault("Type","B");          
      // only consider objects starting with "Sample."
      if (!TQStringUtils::removeLeadingText(nameSample, "Sample.")) {
        continue;
      }
      // skip Data if not in Nominal
      if (!isNominal && sampleType=="D"){
        continue;
      }
      // get configuration of sample
      TQFolder * sampleConfig = config->getFolder(TQFolder::concatPaths("Samples", nameSample));
      if (!sampleConfig) {
        error(TString::Format(
                              "collectHistograms('%s'): Failed to load configuration for sample '%s'. "
                              "Skipping this channel ...", varname.Data(), nameSample.Data()));
        continue;
      }

      TH1* histo = it.second;
      dim = TQHistogramUtils::getDimension(histo);
      if(dim != 1){
        throw std::runtime_error("dynamic bin merging currently only supported for one-dimensional histograms!");
      }

      // only merge histograms with more than one bin
      if (histo->GetNbinsX() <= 1) {
        continue;
      }

      // start filling vectors with needed info
      if (sumBinContent.empty()) {
        for (UInt_t i = 0; i < (unsigned) histo->GetNbinsX()+1; i++) { // exclude under and overflow
          histogramBinContent.push_back(histo->GetBinContent(i));
          sumBinContent.push_back(histo->GetBinContent(i));
          if (i != (unsigned) histo->GetNbinsX()){
            borders.push_back(i); // remove borders afterwards when two bins need to get merged
          }
        }
        totalBinContent[nameSample] = histogramBinContent;
      } else {
        for (UInt_t i = 0; i < (unsigned) histo->GetNbinsX()+1; i++) { // exclude under and overflow
          histogramBinContent.push_back(histo->GetBinContent(i));
          sumBinContent[i]+=histo->GetBinContent(i);
        }
        totalBinContent[nameSample] = histogramBinContent;
      }
    }

    // merge to left
    if (!totalBinContent.empty()){
      for (UInt_t iBin = totalBinContent.begin()->second.size()-1; iBin > 0; iBin--) { //run over all bins, ignore most left bin (iBin = 0)
        bool merge = false; // bool that says if one should merge
        for (auto& sample:totalBinContent){ // run over all samples
          if (sumBinContent[iBin] < minimalSummedBinContent || sample.second[iBin] < minimalBinContent) { // if true...
            merge = true; // ..do merge
            for (UInt_t iHardBorder = 0; iHardBorder < hardBorders.size(); iHardBorder++) { // check if by merging one to the left we encounter a hard border
              if (borders[iBin-1] == hardBorders[iHardBorder]){ // if in hardBorders...
                merge = false; // ...do not merge
                break; // quit run over samples if we already know that we cannot merge
              }
            }
            break; // quit run over samples if we already know that we have to merge
          }
        }
        if (merge == true) { // merge only if needed
          borders[iBin-1]=-1; // set border between bin iBin-1 and iBin to -1
          sumBinContent[iBin-1]+=sumBinContent[iBin]; // move content bin to another bin
          sumBinContent[iBin] = 0; // empty old bin
          for (auto& sample:totalBinContent){ // run over all samples
            sample.second[iBin-1]+=sample.second[iBin]; // move content bin to another bin
            sample.second[iBin]=0; // empty old bin
          }
        }
      }
    }

    // merge to right
    if (!totalBinContent.empty()){
      for (UInt_t iBin = 0; iBin < totalBinContent.begin()->second.size()-1; iBin++) { //run over all bins, ignore most right bin (iBin totalBinContent[0].size()-1)
        bool merge = false; // bool that says if one should merge
        for (auto& sample:totalBinContent){ // run over all samples
          if ((sumBinContent[iBin] < minimalSummedBinContent || sample.second[iBin] < minimalBinContent) && sumBinContent[iBin] != 0.) { // if true...
            merge = true; // ..do merge
            for (UInt_t iHardBorder = 0; iHardBorder < hardBorders.size(); iHardBorder++) { // check if by merging one to the left we encounter a hard border
              if (borders[iBin] == hardBorders[iHardBorder]){ // if in hardBorders...
                merge = false; // ...do not merge
                warn(TString::Format("negative bins still present in sample '%s' in bin '%d', cannot merge!",sample.first.Data(),iBin).Data());
                break; // quit run over samples if we already know that we cannot merge
              }
            }
            break; // quit run over samples if we already know that we have to merge
          }
        }
        if (merge == true) { // merge only if needed
          borders[iBin]=-1; // set border between bin iBin and iBin+1 to -1
          sumBinContent[iBin+1]+=sumBinContent[iBin]; // move content bin to another bin
          sumBinContent[iBin] = 0; // empty old bin
          for (auto& sample:totalBinContent){ // run over all samples
            sample.second[iBin+1]+=sample.second[iBin]; // move content bin to another bin
            sample.second[iBin]=0; // empty old bin
          }
        }
      }
    }

    // start erasing borders
    int erasedBins = 0;
    unsigned bordersSize = borders.size();
    for (UInt_t i = 0; i < bordersSize; i++){
      if (borders[i-erasedBins] == -1){
        borders.erase(borders.begin()+i-erasedBins);
        erasedBins++;
      }
    }

    /* write bin merging information to configuration */
    mergeBinsConfig = channelConfig->getFolder("MergeBins+");
    for (UInt_t i = 0; i < borders.size(); i++) {
      mergeBinsConfig->setTagInteger(TString::Format("i%d", i), borders.at(i));
    }
    mergeBinsConfig->setTagInteger("Dim",dim);
  }

  /* return merged bin borders */
  return borders;
}

//__________________________________________________________________________________|___________

Bool_t TSModelBuilder::collectHistograms(TQFolder * config, TQFolder * model, TQFolder* variation) {
  // collect all histograms from the sample folder

  // @tag:[applyStyles] determines if styles should be applied to retrieved histograms. Setting this to false can save a significant amount of time but might make the styling of post-fit plots require more effort. Defaults to true.
  //@tag:[transferRelativeErrorsFromChannel, channelFolderLayer] the errors of the retrieved histogram can be set to the values found in an analog histogram at the channel given by 'transferRelativeErrorsFromChannel'. The 'channelFolderLayer' is a helper tag to specify the layer inside the path at which the channels are specified. This was introdcued for JER varied histograms, which are obtained by adding/subtracting 4 highly correlated histograms. In this case the errors are taken on from the nominal histogram.
  
  if(!variation->hasTag("Variation")) variation->setTagString("Variation",variation->GetName());
  
  bool allowHistogramProcessing = config->getTagBoolDefault("processHistograms",true);
  bool useHistoTags = config->getTagBoolDefault("useHistogramTags",true);
  
  TQFolder* fallbackVariation = NULL;
  TString fallbackVariationName;
  if(variation->getTagString("Fallback",fallbackVariationName)){
    fallbackVariation = variation->getBase()->getFolder(fallbackVariationName);
  }
  // name of variation is given by name of sample folder
  TString varname = variation->GetName();
  Bool_t isNominal = TQStringUtils::equal("Nominal",variation->GetName());
  bool applyStyles = config->getTagBoolDefault("applyStyles", isNominal);

  // parameter folder
  TQFolder* parameters = config->getFolder("Parameters");
  // if parameters is a null ptr, create an empty TQTaggable instance to proceed with the default parameters
  std::shared_ptr<TQFolder> empty_parameters = std::make_shared<TQFolder>();
  if (parameters == nullptr) {
    parameters = empty_parameters.get();
  }
  
  info(TString::Format("collectHistograms('%s'): Collecting histograms...", varname.Data()));

  //@tag: [Include,Exclude] Inclusion and Exclusion string patterns for systematics  (will be matched to "Channel:Sample")  
  TString filterInclude = variation->getTagStringDefault("Include", "*");
  TString filterExclude = variation->getTagStringDefault("Exclude", "");

  int nHistos = 0;

  // ===== loop over channels =====
  TQFolderIterator itrChannels(model->getListOfFolders("?"), true);
  while (itrChannels.hasNext()) {
    TQFolder * channelDef = itrChannels.readNext();
    TString nameChannel = channelDef->GetName();
    // skip elements with names not starting with "Channel."
    if (!TQStringUtils::removeLeadingText(nameChannel, "Channel.")) {
      continue;
    }
    // load the configuration of the current channel
    TQFolder * channelConfig = config->getFolder(TQFolder::concatPaths("Channels", nameChannel));
    if (!channelConfig) {
      error(TString::Format("collectHistograms('%s'): Failed to load configuration for "
                            "channel '%s'. Skipping this channel ...", varname.Data(), nameChannel.Data()));
      continue;
    }

    // the name of the input histogram or counter
    TString name;
    bool useCounter = channelConfig->getTagString("Counter",name);
    bool useHistogram = channelConfig->getTagString("Histogram",name);
    if (useHistogram && useCounter){
      // requesting both histogram and counter ==> ERROR
      error(TString::Format(
                            "collectHistograms('%s'): Cannot use both histogram and counter for channel '%s'. "
                            "Skipping this channel ...", varname.Data(), nameChannel.Data()));
      continue;
    }

    channelConfig->getTagBool("useCounter",useCounter);
    useHistogram = useHistogram && !useCounter;

    if (!useHistogram && !useCounter){
      /* neither histogram nor counter provided ==> ERROR */
      error(TString::Format(
                            "collectHistograms('%s'): Neither histogram nor counter provided for channel '%s'. "
                            "Skipping this channel ...", varname.Data(), nameChannel.Data()));
      continue;
    }

    // Remapping of input distribution
    // ===============================

    // the bin borders for histogram remapping
    Int_t dim = 0;
    Int_t remapXTo = channelConfig->getTagIntegerDefault("RemapXTo", 0);
    Int_t remapYTo = channelConfig->getTagIntegerDefault("RemapYTo", 0);
    Bool_t remapSlices = channelConfig->getTagBoolDefault("RemapSlices", true);

    Bool_t rebinToOptimalSgnf = channelConfig->getTagIntegerDefault("rebinToOptimalSgnf", false);

    // the number of bins to remap the histograms to
    if (!useCounter && (remapXTo > 0 || remapYTo > 0 || rebinToOptimalSgnf) ) {
      
      // the histogram sample data reader
      TQSampleFolder * samples = getSampleFolder(variation);
      if (!samples) {
	error(TString::Format("collectHistograms('%s'): Failed to get sample folder",variation->GetName()));
	return false;
      }
      TQSampleDataReader rd(samples);
      rd.setApplyStyles(applyStyles);
      
      std::vector<int> borders;

      if ( (remapXTo > 0 || remapYTo > 0) && rebinToOptimalSgnf) {
        warn(TString::Format(
                             "collectHistograms('%s'): configured two types of rebinning mechanisms, "
                             "flat signal rebinning gets preference!", varname.Data()));
        rebinToOptimalSgnf = false;
      }

      // reference path for histogram remapping
      TString refPath;
      if (channelConfig->getTagString("PathRemapFlat", refPath)) {
        refPath = channelConfig->replaceInText(refPath);
        refPath = parameters->replaceInText(refPath);

        // get remapping information
        borders = getRemapping(channelConfig, samples, refPath, name,
                               channelConfig, remapXTo, remapYTo, dim, remapSlices);
      } else {
        if (!rebinToOptimalSgnf) {
          error(TString::Format(
                                "collectHistograms('%s'): No reference path provided for remapping in channel "
                                "'%s'. Skipping remapping ...", varname.Data(), nameChannel.Data()));
        }
      }
      if (rebinToOptimalSgnf) {
        TString sigPath;
        TString bkgPath;
        if (!channelConfig->getTagString("rebinSigPath", sigPath) || !channelConfig->getTagString("rebinBkgPath", bkgPath)) {
          error(TString::Format(
                                "collectHistograms('%s'): No valid reference paths for signal and background provided for significance "
                                "optimized rebinning in channel '%s'. Skipping remapping ...", varname.Data(), nameChannel.Data()));
        }
        sigPath = channelConfig->replaceInText(sigPath);
        sigPath = parameters->replaceInText(sigPath);
        bkgPath = channelConfig->replaceInText(bkgPath);
        bkgPath = parameters->replaceInText(bkgPath);
        borders = getRemappingOptimizedSgnf(channelConfig, samples, sigPath, bkgPath, name,channelConfig, dim);
      }

      if (borders.size()==0) {
        error(TString::Format(
                              "collectHistograms('%s'): Failed to obtain remapping information for channel "
                              "'%s'. Skipping remapping ...", varname.Data(), nameChannel.Data()));
      } else {
        channelDef->setTagList(".Remapping.Bins",borders);
        channelDef->setTagBool(".Remapped", true);
      }
    }

    // loop over samples in current channel
    std::map<TQFolder*,TH1*> histograms;
    std::map<TQFolder*,TString> finalHistoPaths;
    TQFolderIterator itrSamples(channelDef->getListOfFolders("?"), true);
    while (itrSamples.hasNext()) {
      TQFolder * sampleDef = itrSamples.readNext();

      TQTaggable sampleVarTags;
      sampleVarTags.importTags(variation->getBase());            
      sampleVarTags.importTags(sampleDef);
      sampleVarTags.importTags(variation);
      
      // the histogram sample data reader
      TQSampleFolder * samples = getSampleFolder(&sampleVarTags);
      if (!samples) {
	error(TString::Format("collectHistograms('%s'): Failed to get sample folder",variation->GetName()));
	return false;
      }
      TQSampleDataReader rd(samples);
      rd.setApplyStyles(applyStyles);
      
      TString nameSample = sampleDef->GetName();
      TString sampleType = sampleDef->getTagStringDefault("Type","B");      
      // only consider objects starting with "Sample."
      if (!TQStringUtils::removeLeadingText(nameSample, "Sample.")) {
        continue;
      }
      // skip Data if not in Nominal
      if (!isNominal && sampleType == "D"){
        continue;
      }

      Bool_t passesInclude = TQStringUtils::matchesFilter(nameChannel + ":" + nameSample, filterInclude, ",", true);
      Bool_t passesExclude = TQStringUtils::matchesFilter(nameChannel + ":" + nameSample, filterExclude, ",", true);
      if (!passesInclude || passesExclude) {
        continue;
      }

      // load the path to take the histogram or counter from and replace
      // potential placeholders using tags from Channel and Parameter configuration
      std::map<TString,TString> paths;
      TQTaggable tags;
      tags.importTags(sampleDef,true,true);
      tags.importTags(parameters,true,true);
      TString defaultPath = sampleDef->getTagStringDefault("Path");
      tags.importTags(variation,true,true);
      paths["path"] = tags.replaceInTextRecursive(defaultPath);
      if(fallbackVariation){
        tags.importTags(fallbackVariation,true,true);        
        paths["fallbackPath"] = tags.replaceInTextRecursive(defaultPath);
      }
      bool hasAlternate = false;     
      for(auto expr:sampleDef->getTagVString("AlternatePath.selectChannels")){
        if(TQStringUtils::matches(nameChannel,expr)){
          hasAlternate=true;
        }
        if(!hasAlternate) break;
        TString alternatePath;
        hasAlternate = sampleDef->getTagString("AlternatePath",alternatePath);
        tags.importTags(variation,true,true);        
        if(hasAlternate){
          alternatePath = tags.replaceInTextRecursive(alternatePath);
          paths["alternatePath"] = alternatePath;
          if(fallbackVariation){
            tags.importTags(fallbackVariation,true,true);                    
            paths["fallbackAlternatePath"] = tags.replaceInTextRecursive(alternatePath);
          }          
        }
      }
      
      TQTaggable finalHistoTags(channelConfig);
      if(useHistoTags){
        sampleDef->exportTags(&finalHistoTags);
        TString prefixChannel = TString::Format("forChannel.%s.", nameChannel.Data());
        sampleDef->exportTags(&finalHistoTags, "", prefixChannel + "*");
        finalHistoTags.renameTags(prefixChannel, "");
        
        TString prefixSample = TString::Format("forSample.%s.", nameSample.Data());
        channelConfig->exportTags(&finalHistoTags, "", prefixSample + "*");
        finalHistoTags.renameTags(prefixSample, "");
      }
      
      
      std::map<TString,TH1*> histos;
      for(auto it:paths){
        TString key(it.first);
        TString path(it.second);
        
        //@tag:[transferRelativeErrorsFromChannel]
        TString pathToTransferFrom;
        TString channelToTransferFrom;
        if(variation->getTagString("transferRelativeErrorsFromChannel", channelToTransferFrom)){
          TQStringUtils::removeLeading(path, "/");
          std::vector<TString> layers = TQStringUtils::tokenizeVector(path, "/");
          if ((int)layers.size() > variation->getTagIntegerDefault("channelFolderLayer", 1)) {
            layers[variation->getTagIntegerDefault("channelFolderLayer", 1)] = channelToTransferFrom;
          } else {
            error(TString::Format("Cannot construct path to transfer from for histogram with name '%s' and path '%s'", name.Data(), path.Data()));
          }
          pathToTransferFrom = TQStringUtils::concat(layers, "/");
        }

        if (!channelToTransferFrom.IsNull()) finalHistoTags.setTagString("transferRelativeErrorsFromPath", pathToTransferFrom);
       
        TH1 * histo = NULL;
        TList* sfList = new TList();
        
        if (useHistogram) {
          // load the histogram from sample folder structure
          TString finalHistoName(tags.replaceInTextRecursive(name));
          histo = rd.getHistogram(path, finalHistoName, &finalHistoTags,sfList);
        } else {
          // load the counter from sample folder structure and convert to a 1-bin histogram
          TString finalHistoName(tags.replaceInTextRecursive(name));	  
          TQCounter * cnt = rd.getCounter(path, finalHistoName, &finalHistoTags,sfList);
          if (cnt) {
            histo = TQHistogramUtils::counterToHistogram(cnt);
            if (applyStyles) rd.applyStyleToElement(histo,sfList,&finalHistoTags);
            delete cnt;
          }
        }
        delete sfList;

        histos[key] = histo;
      }
      
      int verbosity = parameters->getTagIntegerDefault("verbosity",0);
        
      TH1* histo = histos["path"];
      TH1* althisto = NULL;
      if(hasAlternate) althisto = histos["alternatePath"];
      
      TString origpath = paths["path"];
      TString path = origpath;
      if(!histo && fallbackVariation){
        histo = histos["fallbackPath"];
        if(hasAlternate) althisto = histos["fallbackAlternatePath"];        
        TString fallbackPath = paths["fallbackPath"];        
        if (histo && verbosity>4) warn(TString::Format("collectHistograms('%s'): Failed to load counter '%s' for sample '%s' in channel '%s' from path '%s', using fallback path '%s'", varname.Data(), histo->GetName(),  nameSample.Data(), nameChannel.Data(), path.Data(),fallbackPath.Data()));
        path = fallbackPath;
      }
      
      if(hasAlternate){
        std::vector<int> altBins = sampleDef->getTagVInteger("AlternatePath.bins");
        if(altBins.size() == 0){
          warn(TString::Format("collectHistograms('%s'): Failed to merge alternate histograms for sample '%s' in channel '%s', no bins given!", varname.Data(), nameSample.Data(), nameChannel.Data()));
        } else {
          if(!TQHistogramUtils::replaceBins(histo,althisto,altBins)){
            warn(TString::Format("collectHistograms('%s'): Failed to merge alternate histograms for sample '%s' in channel '%s', histograms incompatible!", varname.Data(), nameSample.Data(), nameChannel.Data()));
          } else {
            info(TString::Format("collectHistograms('%s'): Merged alternate histogram in bins %s for sample '%s' in channel '%s'!", varname.Data(), TQStringUtils::concat(altBins,",").Data(), nameSample.Data(), nameChannel.Data()));
          }
        }
        delete althisto;
      }
      
      if (!histo) {
        error(TString::Format("collectHistograms('%s'): Failed to load histogram '%s' for sample '%s' in channel '%s'. Path given was %s", varname.Data(), name.Data(),  nameSample.Data(), nameChannel.Data(), (fallbackVariation ? origpath + " or " + path : origpath).Data()));
        continue;
      }
      
      // keep track of the histogram's details and where it was taken from
      if (isNominal) {
        sampleDef->setTagString(".HistoDetails.Original",
                                TQHistogramUtils::getDetailsAsString(histo));
        sampleDef->setTagString(".HistoFromPath", path);
        sampleDef->setTagDouble(".integral.nominal",TQHistogramUtils::getIntegral(histo,true) );
        sampleDef->setTagDouble("Bins",histo->GetNbinsX()*histo->GetNbinsY()*histo->GetNbinsZ());
        sampleDef->importTags(finalHistoTags);
      }
      
      /* the path to this sample's histogram folder */
      TString histoSamplePath = TQFolder::concatPaths(varname, nameChannel);
      histo->SetName(nameSample);
      
      histograms[sampleDef]=histo;
      finalHistoPaths[sampleDef]=path;
    }
    
    // the number of bins to remap the histograms to
    if (!useCounter) {
      Bool_t mergeBinsManual = channelConfig->getTagBoolDefault("mergeBinsManual", false);
      Bool_t mergeBins = channelConfig->getTagBoolDefault("mergeBins", false);
      std::vector<int> borders;
      if(mergeBinsManual && mergeBins){
        error(TString::Format("Cannot both merge bins manually and automatically, refusing to do either!"));
      } else if(mergeBins) {
        if (remapXTo > 0 || remapYTo > 0){
          error(TString::Format("Cannot both remap and merge bins! Remap will be skipped!"));
        }
        // get bin merging information
        borders = getMergeBins(config, channelConfig, histograms, varname, isNominal, dim);
        // save uncertainty under name .Remapping so also ActionImportSystematics can handle it
        channelDef->setTagList(".Remapping.Bins",borders);
        channelDef->setTagBool(".Remapped", true);
      } else if(mergeBinsManual){
        borders = channelConfig->getTagVInt("mergeBinsManual.borders");
        channelDef->setTagList(".Remapping.Bins",borders);
        channelDef->setTagBool(".Remapped", true);
      }
    }

    /* the path to this sample's histogram folder */
    TString histoSamplePath = TQFolder::concatPaths(varname, nameChannel);

    int nDim = -1;
    
    for(auto it:histograms){
      TQFolder* sampleDef = it.first;
      TString nameSample = sampleDef->GetName();
      TString sampleType = sampleDef->getTagStringDefault("Type","B");
      // only consider objects starting with "Sample."
      if (!TQStringUtils::removeLeadingText(nameSample, "Sample.")) {
        continue;
      }
      // skip Data if not in Nominal
      if (!isNominal && sampleType == "D"){
        continue;
      }

      TH1* histo = it.second;
      if(allowHistogramProcessing){
        TH1* newhisto = processHistogram(config,sampleDef,histo);
        if(newhisto){
          TQFolder* target = this->repository()->getFolder(histoSamplePath+"+");
          TQFolder* before = target->getFolder(".BeforeProcessing+");
          sampleDef->setTagString(".Histogram.BeforeProcessing",TQFolder::concatPaths(before->getPath(),histo->GetName()));
          if(isNominal){
            sampleDef->setTagDouble(".integral.nominal",TQHistogramUtils::getIntegral(newhisto,true) );
          }
          target->Remove(histo);     
          before->addObject(histo);
          histo = newhisto;
        }
      }
      
      /* store histogram */
      TQFolder* histoFolder = this->repository()->getFolder(histoSamplePath+"+");
      histoFolder->setTagString(TString::Format("Path.%s",histo->GetName()),finalHistoPaths[sampleDef].Data());
      if (!histoFolder->addObject(histo)){
        error(TString::Format("collectHistograms('%s'): Failed to store histogram", varname.Data()));
      } else {
	nHistos++;
      }

      if (isNominal) {
        // set histogram path in definition in case of variation "Nominal"
        it.first->setTagString("Histo", TQFolder::concatPaths(histoSamplePath, nameSample));
      }
      
      // extract style tags from histogram and write to sample config
      if (applyStyles && !sampleDef->hasMatchingTag("style.*")) {
        TQHistogramUtils::extractStyle(histo, sampleDef, "/");
      }

      int thisdim = TQHistogramUtils::getDimension(histo);
      if(thisdim == 1 && histo->GetNbinsX() == 1) thisdim = 0;
      if(nDim < 0){
	nDim = thisdim;
      } else if(nDim != thisdim){
	error(TString::Format("collectHistograms('%s'): Inconsistent dimensions of histogram!", varname.Data()));
      }
    }

    channelDef->setTagInteger("nDim",nDim);
  }
  
  return nHistos>0;
}

TH1* TSModelBuilder::processHistogram(TQFolder* config, TQFolder* sampleDef, const TH1* orighisto){
  // parameter folder
  TQFolder* parameters = config->getFolder("Parameters");
  // if parameters is a null ptr, create an empty TQTaggable instance to proceed with the default parameters
  std::shared_ptr<TQFolder> empty_parameters = std::make_shared<TQFolder>();
  if (parameters == nullptr) {
    parameters = empty_parameters.get();
  }
  
  TH1* histo = NULL;
  // @tag:[MinBinContent] If a positive number, ensures a minimum bin content for each histogram bin (default: -1). Tag is read from folder "Parameters".
  // @tag:[ignoreNegative] Can be used with MinBinContent. See definition in TQHistogramUtils::ensureMinimumContent(...) (default: false)
  // @tag:[flipToPositive] Can be used with MinBinContent. See definition in TQHistogramUtils::ensureMinimumContent(...) (default: false)
  // @tag:[assignUncertainty] Can be used with MinBinContent. See definition in TQHistogramUtils::ensureMinimumContent(...) (default: true)
  // @tag:[ensureAbsMinimumContent] Can be used with AbsMinBinContent. See definition in TQHistogramUtils::ensureAbsMinimumContent(...) (default: true)

  TString nameSample = sampleDef->GetName();
  Double_t minBinContent = parameters->getTagDoubleDefault("MinBinContent", -1.);
  bool ignoreNegative = parameters->getTagBoolDefault("ignoreNegative", false);
  bool flipToPositive = parameters->getTagBoolDefault("flipToPositive", false);
  bool assignUncertainty = parameters->getTagBoolDefault("assignUncertainty", true);
  bool remap = parameters->getTagBoolDefault("remap", true);
  bool ensureAbsMinimumContent = sampleDef->getTagBoolDefault("ensureAbsMinimumContent", false); // 
  std::vector<int> borders = sampleDef->getTagVInteger("~.Remapping.Bins");
  int dim = sampleDef->getTagIntegerDefault("~dim",1);
  Int_t remapXTo = sampleDef->getTagIntegerDefault("~RemapXTo", 0);
  Int_t remapYTo = sampleDef->getTagIntegerDefault("~RemapYTo", 0);

  // remap histogram
  if (borders.size()!=0) {
    TH1* h_remapped = NULL;
    if (dim == 1) {
      h_remapped = TQHistogramUtils::getRebinned(orighisto, borders, remap);
    } else if (dim == 2) {
      if (remapYTo > 0) {
        // remapping Y axis of 2D histogram
        h_remapped = TQHistogramUtils::getRemapped2D((TH2*)orighisto, borders, false);
      } else if (remapXTo > 0) {
        // remapping X axis of 2D histogram
        h_remapped = TQHistogramUtils::getRemapped2D((TH2*)orighisto, borders, true);
      }
    }
    if (h_remapped) {
      histo = h_remapped;
    } else {
      warn(TString::Format("processHistograms(): Somehow failed to remap %d-dim histogram '%s' into %zu bins ", dim, orighisto->GetName(), (borders.size()-1)));
      // Copy the orginal histogram and keep it in memory
      histo = (TH1*) orighisto->Clone();
      histo->SetDirectory(orighisto->GetDirectory());
    }
  }

  /* convert histogram from 2D to 1D? */
  Int_t dimHisto = TQHistogramUtils::getDimension(histo);
  TString convertTo1DDef = sampleDef->getTagStringDefault("~convertTo1D");
  if (dimHisto == 2 && !convertTo1DDef.IsNull()) {
    Bool_t alongX = false;
    Bool_t inclUVX = false;
    Bool_t inclOVX = false;
    Bool_t inclUVY = false;
    Bool_t inclOVY = false;
    if (!parseConversion(convertTo1DDef, alongX, inclUVX, inclOVX, inclUVY, inclOVY)) {
      warn(TString::Format(
                           "collectHistograms(): Invalid histogram conversion to 1D '%s'",
                           convertTo1DDef.Data()));
    } else {
      TH1 * h_converted = TQHistogramUtils::convertTo1D(
                                                        (TH2*)histo, alongX, inclUVX, inclOVX, inclUVY, inclOVY);
      if (h_converted) {
        sampleDef->setTagBool(".ConvertedTo1D", true);
        if(histo) delete histo;        
        histo = h_converted;
      } else {
        warn("collectHistograms(): Somehow failed to convert histogram to 1D");
      }
    }
  }
  
  // block everything except onlyBins
  std::vector<int> onlyBins = sampleDef->getTagVInteger("onlyBins");
  if(onlyBins.size() > 0){
    if(!histo) histo = TQHistogramUtils::copyHistogram(orighisto);
    for(int i=0; i<histo->GetNbinsX()+2; ++i){
      bool keep = false;
      for(size_t j=0; j<onlyBins.size(); ++j){
        if(i == onlyBins[j]) keep = true;
      }
      if(!keep){
        histo->SetBinContent(i,0);
        histo->SetBinError(i,0);
      }
    }
  }
  std::vector<int> onlyBinsX = sampleDef->getTagVInteger("onlyBinsX");
  std::vector<int> onlyBinsY = sampleDef->getTagVInteger("onlyBinsY");  
  if(onlyBinsX.size() > 0 || onlyBinsY.size() > 0){
    if(!histo) histo = TQHistogramUtils::copyHistogram(orighisto);
    for(int i=0; i<histo->GetXaxis()->GetNbins()+2; ++i){
      for(int j=0; j<histo->GetYaxis()->GetNbins()+2; ++j){      
        bool keep = false;
        for(size_t k=0; k<onlyBinsX.size(); ++k){
          if(i == onlyBinsX[k]) keep = true;
        }
        for(size_t k=0; k<onlyBinsY.size(); ++k){
          if(j == onlyBinsY[k]) keep = true;
        }
        if(!keep){
          histo->SetBinContent(i,j,0);
          histo->SetBinError(i,j,0);
        }
      }
    }
  }
  
  if (minBinContent >= 0.){
     if(!histo) histo = TQHistogramUtils::copyHistogram(orighisto);
     if(ensureAbsMinimumContent==true){
        TQHistogramUtils::ensureAbsMinimumBinContent(histo, minBinContent);
        info(TString::Format("processHistogram(): ensureAbsMinimumContent on sample: '%s'", nameSample.Data()));
     } else {
        TQHistogramUtils::ensureMinimumBinContent(histo, minBinContent, ignoreNegative, flipToPositive, assignUncertainty);
     }
  }


  double averageWeight = 0;

  if(sampleDef->getTag("~inflateStatUncertaintyLowYield.averageWeight",averageWeight)) {

     if(!histo) histo = TQHistogramUtils::copyHistogram(orighisto);
     TQHistogramUtils::ensureMinimumBinError(histo,averageWeight); 
  }
  
  

  // @tag:[warnings.dips] checks for dips in distributions with TQHistogramUtils::getNDips() and throws warning if dips are found.
  if(config->getTagBoolDefault("warnings.dips",true) && TQHistogramUtils::getNDips(histo) > 0) {
    warn(TString::Format("processHistogram(): Histogram for sample '%s' in channel"
                         " '%s' has dips. Please consider using less bins.", sampleDef->getTagStringDefault("~Sample","<unknown>").Data(),sampleDef->getTagStringDefault("~Channel","<unknown>").Data()));
  }
  
  return histo;
}

void TSModelBuilder::applyStyle(TQFolder* model, const TString& samplename, TH1* hist){
  TQFolderIterator itr(model->getListOfFolders(TQFolder::concatPaths("?","Sample."+samplename)),true);
  while(itr.hasNext()){
    TQFolder* sample = itr.readNext();
    if(sample->hasMatchingTag("style.*")){
      TQHistogramUtils::applyStyle(hist,sample,"/");
      return;
    }
  }
}
 TSModelBuilder.cxx:1
 TSModelBuilder.cxx:2
 TSModelBuilder.cxx:3
 TSModelBuilder.cxx:4
 TSModelBuilder.cxx:5
 TSModelBuilder.cxx:6
 TSModelBuilder.cxx:7
 TSModelBuilder.cxx:8
 TSModelBuilder.cxx:9
 TSModelBuilder.cxx:10
 TSModelBuilder.cxx:11
 TSModelBuilder.cxx:12
 TSModelBuilder.cxx:13
 TSModelBuilder.cxx:14
 TSModelBuilder.cxx:15
 TSModelBuilder.cxx:16
 TSModelBuilder.cxx:17
 TSModelBuilder.cxx:18
 TSModelBuilder.cxx:19
 TSModelBuilder.cxx:20
 TSModelBuilder.cxx:21
 TSModelBuilder.cxx:22
 TSModelBuilder.cxx:23
 TSModelBuilder.cxx:24
 TSModelBuilder.cxx:25
 TSModelBuilder.cxx:26
 TSModelBuilder.cxx:27
 TSModelBuilder.cxx:28
 TSModelBuilder.cxx:29
 TSModelBuilder.cxx:30
 TSModelBuilder.cxx:31
 TSModelBuilder.cxx:32
 TSModelBuilder.cxx:33
 TSModelBuilder.cxx:34
 TSModelBuilder.cxx:35
 TSModelBuilder.cxx:36
 TSModelBuilder.cxx:37
 TSModelBuilder.cxx:38
 TSModelBuilder.cxx:39
 TSModelBuilder.cxx:40
 TSModelBuilder.cxx:41
 TSModelBuilder.cxx:42
 TSModelBuilder.cxx:43
 TSModelBuilder.cxx:44
 TSModelBuilder.cxx:45
 TSModelBuilder.cxx:46
 TSModelBuilder.cxx:47
 TSModelBuilder.cxx:48
 TSModelBuilder.cxx:49
 TSModelBuilder.cxx:50
 TSModelBuilder.cxx:51
 TSModelBuilder.cxx:52
 TSModelBuilder.cxx:53
 TSModelBuilder.cxx:54
 TSModelBuilder.cxx:55
 TSModelBuilder.cxx:56
 TSModelBuilder.cxx:57
 TSModelBuilder.cxx:58
 TSModelBuilder.cxx:59
 TSModelBuilder.cxx:60
 TSModelBuilder.cxx:61
 TSModelBuilder.cxx:62
 TSModelBuilder.cxx:63
 TSModelBuilder.cxx:64
 TSModelBuilder.cxx:65
 TSModelBuilder.cxx:66
 TSModelBuilder.cxx:67
 TSModelBuilder.cxx:68
 TSModelBuilder.cxx:69
 TSModelBuilder.cxx:70
 TSModelBuilder.cxx:71
 TSModelBuilder.cxx:72
 TSModelBuilder.cxx:73
 TSModelBuilder.cxx:74
 TSModelBuilder.cxx:75
 TSModelBuilder.cxx:76
 TSModelBuilder.cxx:77
 TSModelBuilder.cxx:78
 TSModelBuilder.cxx:79
 TSModelBuilder.cxx:80
 TSModelBuilder.cxx:81
 TSModelBuilder.cxx:82
 TSModelBuilder.cxx:83
 TSModelBuilder.cxx:84
 TSModelBuilder.cxx:85
 TSModelBuilder.cxx:86
 TSModelBuilder.cxx:87
 TSModelBuilder.cxx:88
 TSModelBuilder.cxx:89
 TSModelBuilder.cxx:90
 TSModelBuilder.cxx:91
 TSModelBuilder.cxx:92
 TSModelBuilder.cxx:93
 TSModelBuilder.cxx:94
 TSModelBuilder.cxx:95
 TSModelBuilder.cxx:96
 TSModelBuilder.cxx:97
 TSModelBuilder.cxx:98
 TSModelBuilder.cxx:99
 TSModelBuilder.cxx:100
 TSModelBuilder.cxx:101
 TSModelBuilder.cxx:102
 TSModelBuilder.cxx:103
 TSModelBuilder.cxx:104
 TSModelBuilder.cxx:105
 TSModelBuilder.cxx:106
 TSModelBuilder.cxx:107
 TSModelBuilder.cxx:108
 TSModelBuilder.cxx:109
 TSModelBuilder.cxx:110
 TSModelBuilder.cxx:111
 TSModelBuilder.cxx:112
 TSModelBuilder.cxx:113
 TSModelBuilder.cxx:114
 TSModelBuilder.cxx:115
 TSModelBuilder.cxx:116
 TSModelBuilder.cxx:117
 TSModelBuilder.cxx:118
 TSModelBuilder.cxx:119
 TSModelBuilder.cxx:120
 TSModelBuilder.cxx:121
 TSModelBuilder.cxx:122
 TSModelBuilder.cxx:123
 TSModelBuilder.cxx:124
 TSModelBuilder.cxx:125
 TSModelBuilder.cxx:126
 TSModelBuilder.cxx:127
 TSModelBuilder.cxx:128
 TSModelBuilder.cxx:129
 TSModelBuilder.cxx:130
 TSModelBuilder.cxx:131
 TSModelBuilder.cxx:132
 TSModelBuilder.cxx:133
 TSModelBuilder.cxx:134
 TSModelBuilder.cxx:135
 TSModelBuilder.cxx:136
 TSModelBuilder.cxx:137
 TSModelBuilder.cxx:138
 TSModelBuilder.cxx:139
 TSModelBuilder.cxx:140
 TSModelBuilder.cxx:141
 TSModelBuilder.cxx:142
 TSModelBuilder.cxx:143
 TSModelBuilder.cxx:144
 TSModelBuilder.cxx:145
 TSModelBuilder.cxx:146
 TSModelBuilder.cxx:147
 TSModelBuilder.cxx:148
 TSModelBuilder.cxx:149
 TSModelBuilder.cxx:150
 TSModelBuilder.cxx:151
 TSModelBuilder.cxx:152
 TSModelBuilder.cxx:153
 TSModelBuilder.cxx:154
 TSModelBuilder.cxx:155
 TSModelBuilder.cxx:156
 TSModelBuilder.cxx:157
 TSModelBuilder.cxx:158
 TSModelBuilder.cxx:159
 TSModelBuilder.cxx:160
 TSModelBuilder.cxx:161
 TSModelBuilder.cxx:162
 TSModelBuilder.cxx:163
 TSModelBuilder.cxx:164
 TSModelBuilder.cxx:165
 TSModelBuilder.cxx:166
 TSModelBuilder.cxx:167
 TSModelBuilder.cxx:168
 TSModelBuilder.cxx:169
 TSModelBuilder.cxx:170
 TSModelBuilder.cxx:171
 TSModelBuilder.cxx:172
 TSModelBuilder.cxx:173
 TSModelBuilder.cxx:174
 TSModelBuilder.cxx:175
 TSModelBuilder.cxx:176
 TSModelBuilder.cxx:177
 TSModelBuilder.cxx:178
 TSModelBuilder.cxx:179
 TSModelBuilder.cxx:180
 TSModelBuilder.cxx:181
 TSModelBuilder.cxx:182
 TSModelBuilder.cxx:183
 TSModelBuilder.cxx:184
 TSModelBuilder.cxx:185
 TSModelBuilder.cxx:186
 TSModelBuilder.cxx:187
 TSModelBuilder.cxx:188
 TSModelBuilder.cxx:189
 TSModelBuilder.cxx:190
 TSModelBuilder.cxx:191
 TSModelBuilder.cxx:192
 TSModelBuilder.cxx:193
 TSModelBuilder.cxx:194
 TSModelBuilder.cxx:195
 TSModelBuilder.cxx:196
 TSModelBuilder.cxx:197
 TSModelBuilder.cxx:198
 TSModelBuilder.cxx:199
 TSModelBuilder.cxx:200
 TSModelBuilder.cxx:201
 TSModelBuilder.cxx:202
 TSModelBuilder.cxx:203
 TSModelBuilder.cxx:204
 TSModelBuilder.cxx:205
 TSModelBuilder.cxx:206
 TSModelBuilder.cxx:207
 TSModelBuilder.cxx:208
 TSModelBuilder.cxx:209
 TSModelBuilder.cxx:210
 TSModelBuilder.cxx:211
 TSModelBuilder.cxx:212
 TSModelBuilder.cxx:213
 TSModelBuilder.cxx:214
 TSModelBuilder.cxx:215
 TSModelBuilder.cxx:216
 TSModelBuilder.cxx:217
 TSModelBuilder.cxx:218
 TSModelBuilder.cxx:219
 TSModelBuilder.cxx:220
 TSModelBuilder.cxx:221
 TSModelBuilder.cxx:222
 TSModelBuilder.cxx:223
 TSModelBuilder.cxx:224
 TSModelBuilder.cxx:225
 TSModelBuilder.cxx:226
 TSModelBuilder.cxx:227
 TSModelBuilder.cxx:228
 TSModelBuilder.cxx:229
 TSModelBuilder.cxx:230
 TSModelBuilder.cxx:231
 TSModelBuilder.cxx:232
 TSModelBuilder.cxx:233
 TSModelBuilder.cxx:234
 TSModelBuilder.cxx:235
 TSModelBuilder.cxx:236
 TSModelBuilder.cxx:237
 TSModelBuilder.cxx:238
 TSModelBuilder.cxx:239
 TSModelBuilder.cxx:240
 TSModelBuilder.cxx:241
 TSModelBuilder.cxx:242
 TSModelBuilder.cxx:243
 TSModelBuilder.cxx:244
 TSModelBuilder.cxx:245
 TSModelBuilder.cxx:246
 TSModelBuilder.cxx:247
 TSModelBuilder.cxx:248
 TSModelBuilder.cxx:249
 TSModelBuilder.cxx:250
 TSModelBuilder.cxx:251
 TSModelBuilder.cxx:252
 TSModelBuilder.cxx:253
 TSModelBuilder.cxx:254
 TSModelBuilder.cxx:255
 TSModelBuilder.cxx:256
 TSModelBuilder.cxx:257
 TSModelBuilder.cxx:258
 TSModelBuilder.cxx:259
 TSModelBuilder.cxx:260
 TSModelBuilder.cxx:261
 TSModelBuilder.cxx:262
 TSModelBuilder.cxx:263
 TSModelBuilder.cxx:264
 TSModelBuilder.cxx:265
 TSModelBuilder.cxx:266
 TSModelBuilder.cxx:267
 TSModelBuilder.cxx:268
 TSModelBuilder.cxx:269
 TSModelBuilder.cxx:270
 TSModelBuilder.cxx:271
 TSModelBuilder.cxx:272
 TSModelBuilder.cxx:273
 TSModelBuilder.cxx:274
 TSModelBuilder.cxx:275
 TSModelBuilder.cxx:276
 TSModelBuilder.cxx:277
 TSModelBuilder.cxx:278
 TSModelBuilder.cxx:279
 TSModelBuilder.cxx:280
 TSModelBuilder.cxx:281
 TSModelBuilder.cxx:282
 TSModelBuilder.cxx:283
 TSModelBuilder.cxx:284
 TSModelBuilder.cxx:285
 TSModelBuilder.cxx:286
 TSModelBuilder.cxx:287
 TSModelBuilder.cxx:288
 TSModelBuilder.cxx:289
 TSModelBuilder.cxx:290
 TSModelBuilder.cxx:291
 TSModelBuilder.cxx:292
 TSModelBuilder.cxx:293
 TSModelBuilder.cxx:294
 TSModelBuilder.cxx:295
 TSModelBuilder.cxx:296
 TSModelBuilder.cxx:297
 TSModelBuilder.cxx:298
 TSModelBuilder.cxx:299
 TSModelBuilder.cxx:300
 TSModelBuilder.cxx:301
 TSModelBuilder.cxx:302
 TSModelBuilder.cxx:303
 TSModelBuilder.cxx:304
 TSModelBuilder.cxx:305
 TSModelBuilder.cxx:306
 TSModelBuilder.cxx:307
 TSModelBuilder.cxx:308
 TSModelBuilder.cxx:309
 TSModelBuilder.cxx:310
 TSModelBuilder.cxx:311
 TSModelBuilder.cxx:312
 TSModelBuilder.cxx:313
 TSModelBuilder.cxx:314
 TSModelBuilder.cxx:315
 TSModelBuilder.cxx:316
 TSModelBuilder.cxx:317
 TSModelBuilder.cxx:318
 TSModelBuilder.cxx:319
 TSModelBuilder.cxx:320
 TSModelBuilder.cxx:321
 TSModelBuilder.cxx:322
 TSModelBuilder.cxx:323
 TSModelBuilder.cxx:324
 TSModelBuilder.cxx:325
 TSModelBuilder.cxx:326
 TSModelBuilder.cxx:327
 TSModelBuilder.cxx:328
 TSModelBuilder.cxx:329
 TSModelBuilder.cxx:330
 TSModelBuilder.cxx:331
 TSModelBuilder.cxx:332
 TSModelBuilder.cxx:333
 TSModelBuilder.cxx:334
 TSModelBuilder.cxx:335
 TSModelBuilder.cxx:336
 TSModelBuilder.cxx:337
 TSModelBuilder.cxx:338
 TSModelBuilder.cxx:339
 TSModelBuilder.cxx:340
 TSModelBuilder.cxx:341
 TSModelBuilder.cxx:342
 TSModelBuilder.cxx:343
 TSModelBuilder.cxx:344
 TSModelBuilder.cxx:345
 TSModelBuilder.cxx:346
 TSModelBuilder.cxx:347
 TSModelBuilder.cxx:348
 TSModelBuilder.cxx:349
 TSModelBuilder.cxx:350
 TSModelBuilder.cxx:351
 TSModelBuilder.cxx:352
 TSModelBuilder.cxx:353
 TSModelBuilder.cxx:354
 TSModelBuilder.cxx:355
 TSModelBuilder.cxx:356
 TSModelBuilder.cxx:357
 TSModelBuilder.cxx:358
 TSModelBuilder.cxx:359
 TSModelBuilder.cxx:360
 TSModelBuilder.cxx:361
 TSModelBuilder.cxx:362
 TSModelBuilder.cxx:363
 TSModelBuilder.cxx:364
 TSModelBuilder.cxx:365
 TSModelBuilder.cxx:366
 TSModelBuilder.cxx:367
 TSModelBuilder.cxx:368
 TSModelBuilder.cxx:369
 TSModelBuilder.cxx:370
 TSModelBuilder.cxx:371
 TSModelBuilder.cxx:372
 TSModelBuilder.cxx:373
 TSModelBuilder.cxx:374
 TSModelBuilder.cxx:375
 TSModelBuilder.cxx:376
 TSModelBuilder.cxx:377
 TSModelBuilder.cxx:378
 TSModelBuilder.cxx:379
 TSModelBuilder.cxx:380
 TSModelBuilder.cxx:381
 TSModelBuilder.cxx:382
 TSModelBuilder.cxx:383
 TSModelBuilder.cxx:384
 TSModelBuilder.cxx:385
 TSModelBuilder.cxx:386
 TSModelBuilder.cxx:387
 TSModelBuilder.cxx:388
 TSModelBuilder.cxx:389
 TSModelBuilder.cxx:390
 TSModelBuilder.cxx:391
 TSModelBuilder.cxx:392
 TSModelBuilder.cxx:393
 TSModelBuilder.cxx:394
 TSModelBuilder.cxx:395
 TSModelBuilder.cxx:396
 TSModelBuilder.cxx:397
 TSModelBuilder.cxx:398
 TSModelBuilder.cxx:399
 TSModelBuilder.cxx:400
 TSModelBuilder.cxx:401
 TSModelBuilder.cxx:402
 TSModelBuilder.cxx:403
 TSModelBuilder.cxx:404
 TSModelBuilder.cxx:405
 TSModelBuilder.cxx:406
 TSModelBuilder.cxx:407
 TSModelBuilder.cxx:408
 TSModelBuilder.cxx:409
 TSModelBuilder.cxx:410
 TSModelBuilder.cxx:411
 TSModelBuilder.cxx:412
 TSModelBuilder.cxx:413
 TSModelBuilder.cxx:414
 TSModelBuilder.cxx:415
 TSModelBuilder.cxx:416
 TSModelBuilder.cxx:417
 TSModelBuilder.cxx:418
 TSModelBuilder.cxx:419
 TSModelBuilder.cxx:420
 TSModelBuilder.cxx:421
 TSModelBuilder.cxx:422
 TSModelBuilder.cxx:423
 TSModelBuilder.cxx:424
 TSModelBuilder.cxx:425
 TSModelBuilder.cxx:426
 TSModelBuilder.cxx:427
 TSModelBuilder.cxx:428
 TSModelBuilder.cxx:429
 TSModelBuilder.cxx:430
 TSModelBuilder.cxx:431
 TSModelBuilder.cxx:432
 TSModelBuilder.cxx:433
 TSModelBuilder.cxx:434
 TSModelBuilder.cxx:435
 TSModelBuilder.cxx:436
 TSModelBuilder.cxx:437
 TSModelBuilder.cxx:438
 TSModelBuilder.cxx:439
 TSModelBuilder.cxx:440
 TSModelBuilder.cxx:441
 TSModelBuilder.cxx:442
 TSModelBuilder.cxx:443
 TSModelBuilder.cxx:444
 TSModelBuilder.cxx:445
 TSModelBuilder.cxx:446
 TSModelBuilder.cxx:447
 TSModelBuilder.cxx:448
 TSModelBuilder.cxx:449
 TSModelBuilder.cxx:450
 TSModelBuilder.cxx:451
 TSModelBuilder.cxx:452
 TSModelBuilder.cxx:453
 TSModelBuilder.cxx:454
 TSModelBuilder.cxx:455
 TSModelBuilder.cxx:456
 TSModelBuilder.cxx:457
 TSModelBuilder.cxx:458
 TSModelBuilder.cxx:459
 TSModelBuilder.cxx:460
 TSModelBuilder.cxx:461
 TSModelBuilder.cxx:462
 TSModelBuilder.cxx:463
 TSModelBuilder.cxx:464
 TSModelBuilder.cxx:465
 TSModelBuilder.cxx:466
 TSModelBuilder.cxx:467
 TSModelBuilder.cxx:468
 TSModelBuilder.cxx:469
 TSModelBuilder.cxx:470
 TSModelBuilder.cxx:471
 TSModelBuilder.cxx:472
 TSModelBuilder.cxx:473
 TSModelBuilder.cxx:474
 TSModelBuilder.cxx:475
 TSModelBuilder.cxx:476
 TSModelBuilder.cxx:477
 TSModelBuilder.cxx:478
 TSModelBuilder.cxx:479
 TSModelBuilder.cxx:480
 TSModelBuilder.cxx:481
 TSModelBuilder.cxx:482
 TSModelBuilder.cxx:483
 TSModelBuilder.cxx:484
 TSModelBuilder.cxx:485
 TSModelBuilder.cxx:486
 TSModelBuilder.cxx:487
 TSModelBuilder.cxx:488
 TSModelBuilder.cxx:489
 TSModelBuilder.cxx:490
 TSModelBuilder.cxx:491
 TSModelBuilder.cxx:492
 TSModelBuilder.cxx:493
 TSModelBuilder.cxx:494
 TSModelBuilder.cxx:495
 TSModelBuilder.cxx:496
 TSModelBuilder.cxx:497
 TSModelBuilder.cxx:498
 TSModelBuilder.cxx:499
 TSModelBuilder.cxx:500
 TSModelBuilder.cxx:501
 TSModelBuilder.cxx:502
 TSModelBuilder.cxx:503
 TSModelBuilder.cxx:504
 TSModelBuilder.cxx:505
 TSModelBuilder.cxx:506
 TSModelBuilder.cxx:507
 TSModelBuilder.cxx:508
 TSModelBuilder.cxx:509
 TSModelBuilder.cxx:510
 TSModelBuilder.cxx:511
 TSModelBuilder.cxx:512
 TSModelBuilder.cxx:513
 TSModelBuilder.cxx:514
 TSModelBuilder.cxx:515
 TSModelBuilder.cxx:516
 TSModelBuilder.cxx:517
 TSModelBuilder.cxx:518
 TSModelBuilder.cxx:519
 TSModelBuilder.cxx:520
 TSModelBuilder.cxx:521
 TSModelBuilder.cxx:522
 TSModelBuilder.cxx:523
 TSModelBuilder.cxx:524
 TSModelBuilder.cxx:525
 TSModelBuilder.cxx:526
 TSModelBuilder.cxx:527
 TSModelBuilder.cxx:528
 TSModelBuilder.cxx:529
 TSModelBuilder.cxx:530
 TSModelBuilder.cxx:531
 TSModelBuilder.cxx:532
 TSModelBuilder.cxx:533
 TSModelBuilder.cxx:534
 TSModelBuilder.cxx:535
 TSModelBuilder.cxx:536
 TSModelBuilder.cxx:537
 TSModelBuilder.cxx:538
 TSModelBuilder.cxx:539
 TSModelBuilder.cxx:540
 TSModelBuilder.cxx:541
 TSModelBuilder.cxx:542
 TSModelBuilder.cxx:543
 TSModelBuilder.cxx:544
 TSModelBuilder.cxx:545
 TSModelBuilder.cxx:546
 TSModelBuilder.cxx:547
 TSModelBuilder.cxx:548
 TSModelBuilder.cxx:549
 TSModelBuilder.cxx:550
 TSModelBuilder.cxx:551
 TSModelBuilder.cxx:552
 TSModelBuilder.cxx:553
 TSModelBuilder.cxx:554
 TSModelBuilder.cxx:555
 TSModelBuilder.cxx:556
 TSModelBuilder.cxx:557
 TSModelBuilder.cxx:558
 TSModelBuilder.cxx:559
 TSModelBuilder.cxx:560
 TSModelBuilder.cxx:561
 TSModelBuilder.cxx:562
 TSModelBuilder.cxx:563
 TSModelBuilder.cxx:564
 TSModelBuilder.cxx:565
 TSModelBuilder.cxx:566
 TSModelBuilder.cxx:567
 TSModelBuilder.cxx:568
 TSModelBuilder.cxx:569
 TSModelBuilder.cxx:570
 TSModelBuilder.cxx:571
 TSModelBuilder.cxx:572
 TSModelBuilder.cxx:573
 TSModelBuilder.cxx:574
 TSModelBuilder.cxx:575
 TSModelBuilder.cxx:576
 TSModelBuilder.cxx:577
 TSModelBuilder.cxx:578
 TSModelBuilder.cxx:579
 TSModelBuilder.cxx:580
 TSModelBuilder.cxx:581
 TSModelBuilder.cxx:582
 TSModelBuilder.cxx:583
 TSModelBuilder.cxx:584
 TSModelBuilder.cxx:585
 TSModelBuilder.cxx:586
 TSModelBuilder.cxx:587
 TSModelBuilder.cxx:588
 TSModelBuilder.cxx:589
 TSModelBuilder.cxx:590
 TSModelBuilder.cxx:591
 TSModelBuilder.cxx:592
 TSModelBuilder.cxx:593
 TSModelBuilder.cxx:594
 TSModelBuilder.cxx:595
 TSModelBuilder.cxx:596
 TSModelBuilder.cxx:597
 TSModelBuilder.cxx:598
 TSModelBuilder.cxx:599
 TSModelBuilder.cxx:600
 TSModelBuilder.cxx:601
 TSModelBuilder.cxx:602
 TSModelBuilder.cxx:603
 TSModelBuilder.cxx:604
 TSModelBuilder.cxx:605
 TSModelBuilder.cxx:606
 TSModelBuilder.cxx:607
 TSModelBuilder.cxx:608
 TSModelBuilder.cxx:609
 TSModelBuilder.cxx:610
 TSModelBuilder.cxx:611
 TSModelBuilder.cxx:612
 TSModelBuilder.cxx:613
 TSModelBuilder.cxx:614
 TSModelBuilder.cxx:615
 TSModelBuilder.cxx:616
 TSModelBuilder.cxx:617
 TSModelBuilder.cxx:618
 TSModelBuilder.cxx:619
 TSModelBuilder.cxx:620
 TSModelBuilder.cxx:621
 TSModelBuilder.cxx:622
 TSModelBuilder.cxx:623
 TSModelBuilder.cxx:624
 TSModelBuilder.cxx:625
 TSModelBuilder.cxx:626
 TSModelBuilder.cxx:627
 TSModelBuilder.cxx:628
 TSModelBuilder.cxx:629
 TSModelBuilder.cxx:630
 TSModelBuilder.cxx:631
 TSModelBuilder.cxx:632
 TSModelBuilder.cxx:633
 TSModelBuilder.cxx:634
 TSModelBuilder.cxx:635
 TSModelBuilder.cxx:636
 TSModelBuilder.cxx:637
 TSModelBuilder.cxx:638
 TSModelBuilder.cxx:639
 TSModelBuilder.cxx:640
 TSModelBuilder.cxx:641
 TSModelBuilder.cxx:642
 TSModelBuilder.cxx:643
 TSModelBuilder.cxx:644
 TSModelBuilder.cxx:645
 TSModelBuilder.cxx:646
 TSModelBuilder.cxx:647
 TSModelBuilder.cxx:648
 TSModelBuilder.cxx:649
 TSModelBuilder.cxx:650
 TSModelBuilder.cxx:651
 TSModelBuilder.cxx:652
 TSModelBuilder.cxx:653
 TSModelBuilder.cxx:654
 TSModelBuilder.cxx:655
 TSModelBuilder.cxx:656
 TSModelBuilder.cxx:657
 TSModelBuilder.cxx:658
 TSModelBuilder.cxx:659
 TSModelBuilder.cxx:660
 TSModelBuilder.cxx:661
 TSModelBuilder.cxx:662
 TSModelBuilder.cxx:663
 TSModelBuilder.cxx:664
 TSModelBuilder.cxx:665
 TSModelBuilder.cxx:666
 TSModelBuilder.cxx:667
 TSModelBuilder.cxx:668
 TSModelBuilder.cxx:669
 TSModelBuilder.cxx:670
 TSModelBuilder.cxx:671
 TSModelBuilder.cxx:672
 TSModelBuilder.cxx:673
 TSModelBuilder.cxx:674
 TSModelBuilder.cxx:675
 TSModelBuilder.cxx:676
 TSModelBuilder.cxx:677
 TSModelBuilder.cxx:678
 TSModelBuilder.cxx:679
 TSModelBuilder.cxx:680
 TSModelBuilder.cxx:681
 TSModelBuilder.cxx:682
 TSModelBuilder.cxx:683
 TSModelBuilder.cxx:684
 TSModelBuilder.cxx:685
 TSModelBuilder.cxx:686
 TSModelBuilder.cxx:687
 TSModelBuilder.cxx:688
 TSModelBuilder.cxx:689
 TSModelBuilder.cxx:690
 TSModelBuilder.cxx:691
 TSModelBuilder.cxx:692
 TSModelBuilder.cxx:693
 TSModelBuilder.cxx:694
 TSModelBuilder.cxx:695
 TSModelBuilder.cxx:696
 TSModelBuilder.cxx:697
 TSModelBuilder.cxx:698
 TSModelBuilder.cxx:699
 TSModelBuilder.cxx:700
 TSModelBuilder.cxx:701
 TSModelBuilder.cxx:702
 TSModelBuilder.cxx:703
 TSModelBuilder.cxx:704
 TSModelBuilder.cxx:705
 TSModelBuilder.cxx:706
 TSModelBuilder.cxx:707
 TSModelBuilder.cxx:708
 TSModelBuilder.cxx:709
 TSModelBuilder.cxx:710
 TSModelBuilder.cxx:711
 TSModelBuilder.cxx:712
 TSModelBuilder.cxx:713
 TSModelBuilder.cxx:714
 TSModelBuilder.cxx:715
 TSModelBuilder.cxx:716
 TSModelBuilder.cxx:717
 TSModelBuilder.cxx:718
 TSModelBuilder.cxx:719
 TSModelBuilder.cxx:720
 TSModelBuilder.cxx:721
 TSModelBuilder.cxx:722
 TSModelBuilder.cxx:723
 TSModelBuilder.cxx:724
 TSModelBuilder.cxx:725
 TSModelBuilder.cxx:726
 TSModelBuilder.cxx:727
 TSModelBuilder.cxx:728
 TSModelBuilder.cxx:729
 TSModelBuilder.cxx:730
 TSModelBuilder.cxx:731
 TSModelBuilder.cxx:732
 TSModelBuilder.cxx:733
 TSModelBuilder.cxx:734
 TSModelBuilder.cxx:735
 TSModelBuilder.cxx:736
 TSModelBuilder.cxx:737
 TSModelBuilder.cxx:738
 TSModelBuilder.cxx:739
 TSModelBuilder.cxx:740
 TSModelBuilder.cxx:741
 TSModelBuilder.cxx:742
 TSModelBuilder.cxx:743
 TSModelBuilder.cxx:744
 TSModelBuilder.cxx:745
 TSModelBuilder.cxx:746
 TSModelBuilder.cxx:747
 TSModelBuilder.cxx:748
 TSModelBuilder.cxx:749
 TSModelBuilder.cxx:750
 TSModelBuilder.cxx:751
 TSModelBuilder.cxx:752
 TSModelBuilder.cxx:753
 TSModelBuilder.cxx:754
 TSModelBuilder.cxx:755
 TSModelBuilder.cxx:756
 TSModelBuilder.cxx:757
 TSModelBuilder.cxx:758
 TSModelBuilder.cxx:759
 TSModelBuilder.cxx:760
 TSModelBuilder.cxx:761
 TSModelBuilder.cxx:762
 TSModelBuilder.cxx:763
 TSModelBuilder.cxx:764
 TSModelBuilder.cxx:765
 TSModelBuilder.cxx:766
 TSModelBuilder.cxx:767
 TSModelBuilder.cxx:768
 TSModelBuilder.cxx:769
 TSModelBuilder.cxx:770
 TSModelBuilder.cxx:771
 TSModelBuilder.cxx:772
 TSModelBuilder.cxx:773
 TSModelBuilder.cxx:774
 TSModelBuilder.cxx:775
 TSModelBuilder.cxx:776
 TSModelBuilder.cxx:777
 TSModelBuilder.cxx:778
 TSModelBuilder.cxx:779
 TSModelBuilder.cxx:780
 TSModelBuilder.cxx:781
 TSModelBuilder.cxx:782
 TSModelBuilder.cxx:783
 TSModelBuilder.cxx:784
 TSModelBuilder.cxx:785
 TSModelBuilder.cxx:786
 TSModelBuilder.cxx:787
 TSModelBuilder.cxx:788
 TSModelBuilder.cxx:789
 TSModelBuilder.cxx:790
 TSModelBuilder.cxx:791
 TSModelBuilder.cxx:792
 TSModelBuilder.cxx:793
 TSModelBuilder.cxx:794
 TSModelBuilder.cxx:795
 TSModelBuilder.cxx:796
 TSModelBuilder.cxx:797
 TSModelBuilder.cxx:798
 TSModelBuilder.cxx:799
 TSModelBuilder.cxx:800
 TSModelBuilder.cxx:801
 TSModelBuilder.cxx:802
 TSModelBuilder.cxx:803
 TSModelBuilder.cxx:804
 TSModelBuilder.cxx:805
 TSModelBuilder.cxx:806
 TSModelBuilder.cxx:807
 TSModelBuilder.cxx:808
 TSModelBuilder.cxx:809
 TSModelBuilder.cxx:810
 TSModelBuilder.cxx:811
 TSModelBuilder.cxx:812
 TSModelBuilder.cxx:813
 TSModelBuilder.cxx:814
 TSModelBuilder.cxx:815
 TSModelBuilder.cxx:816
 TSModelBuilder.cxx:817
 TSModelBuilder.cxx:818
 TSModelBuilder.cxx:819
 TSModelBuilder.cxx:820
 TSModelBuilder.cxx:821
 TSModelBuilder.cxx:822
 TSModelBuilder.cxx:823
 TSModelBuilder.cxx:824
 TSModelBuilder.cxx:825
 TSModelBuilder.cxx:826
 TSModelBuilder.cxx:827
 TSModelBuilder.cxx:828
 TSModelBuilder.cxx:829
 TSModelBuilder.cxx:830
 TSModelBuilder.cxx:831
 TSModelBuilder.cxx:832
 TSModelBuilder.cxx:833
 TSModelBuilder.cxx:834
 TSModelBuilder.cxx:835
 TSModelBuilder.cxx:836
 TSModelBuilder.cxx:837
 TSModelBuilder.cxx:838
 TSModelBuilder.cxx:839
 TSModelBuilder.cxx:840
 TSModelBuilder.cxx:841
 TSModelBuilder.cxx:842
 TSModelBuilder.cxx:843
 TSModelBuilder.cxx:844
 TSModelBuilder.cxx:845
 TSModelBuilder.cxx:846
 TSModelBuilder.cxx:847
 TSModelBuilder.cxx:848
 TSModelBuilder.cxx:849
 TSModelBuilder.cxx:850
 TSModelBuilder.cxx:851
 TSModelBuilder.cxx:852
 TSModelBuilder.cxx:853
 TSModelBuilder.cxx:854
 TSModelBuilder.cxx:855
 TSModelBuilder.cxx:856
 TSModelBuilder.cxx:857
 TSModelBuilder.cxx:858
 TSModelBuilder.cxx:859
 TSModelBuilder.cxx:860
 TSModelBuilder.cxx:861
 TSModelBuilder.cxx:862
 TSModelBuilder.cxx:863
 TSModelBuilder.cxx:864
 TSModelBuilder.cxx:865
 TSModelBuilder.cxx:866
 TSModelBuilder.cxx:867
 TSModelBuilder.cxx:868
 TSModelBuilder.cxx:869
 TSModelBuilder.cxx:870
 TSModelBuilder.cxx:871
 TSModelBuilder.cxx:872
 TSModelBuilder.cxx:873
 TSModelBuilder.cxx:874
 TSModelBuilder.cxx:875
 TSModelBuilder.cxx:876
 TSModelBuilder.cxx:877
 TSModelBuilder.cxx:878
 TSModelBuilder.cxx:879
 TSModelBuilder.cxx:880
 TSModelBuilder.cxx:881
 TSModelBuilder.cxx:882
 TSModelBuilder.cxx:883
 TSModelBuilder.cxx:884
 TSModelBuilder.cxx:885
 TSModelBuilder.cxx:886
 TSModelBuilder.cxx:887
 TSModelBuilder.cxx:888
 TSModelBuilder.cxx:889
 TSModelBuilder.cxx:890
 TSModelBuilder.cxx:891
 TSModelBuilder.cxx:892
 TSModelBuilder.cxx:893
 TSModelBuilder.cxx:894
 TSModelBuilder.cxx:895
 TSModelBuilder.cxx:896
 TSModelBuilder.cxx:897
 TSModelBuilder.cxx:898
 TSModelBuilder.cxx:899
 TSModelBuilder.cxx:900
 TSModelBuilder.cxx:901
 TSModelBuilder.cxx:902
 TSModelBuilder.cxx:903
 TSModelBuilder.cxx:904
 TSModelBuilder.cxx:905
 TSModelBuilder.cxx:906
 TSModelBuilder.cxx:907
 TSModelBuilder.cxx:908
 TSModelBuilder.cxx:909
 TSModelBuilder.cxx:910
 TSModelBuilder.cxx:911
 TSModelBuilder.cxx:912
 TSModelBuilder.cxx:913
 TSModelBuilder.cxx:914
 TSModelBuilder.cxx:915
 TSModelBuilder.cxx:916
 TSModelBuilder.cxx:917
 TSModelBuilder.cxx:918
 TSModelBuilder.cxx:919
 TSModelBuilder.cxx:920
 TSModelBuilder.cxx:921
 TSModelBuilder.cxx:922
 TSModelBuilder.cxx:923
 TSModelBuilder.cxx:924
 TSModelBuilder.cxx:925
 TSModelBuilder.cxx:926
 TSModelBuilder.cxx:927
 TSModelBuilder.cxx:928
 TSModelBuilder.cxx:929
 TSModelBuilder.cxx:930
 TSModelBuilder.cxx:931
 TSModelBuilder.cxx:932
 TSModelBuilder.cxx:933
 TSModelBuilder.cxx:934
 TSModelBuilder.cxx:935
 TSModelBuilder.cxx:936
 TSModelBuilder.cxx:937
 TSModelBuilder.cxx:938
 TSModelBuilder.cxx:939
 TSModelBuilder.cxx:940
 TSModelBuilder.cxx:941
 TSModelBuilder.cxx:942
 TSModelBuilder.cxx:943
 TSModelBuilder.cxx:944
 TSModelBuilder.cxx:945
 TSModelBuilder.cxx:946
 TSModelBuilder.cxx:947
 TSModelBuilder.cxx:948
 TSModelBuilder.cxx:949
 TSModelBuilder.cxx:950
 TSModelBuilder.cxx:951
 TSModelBuilder.cxx:952
 TSModelBuilder.cxx:953
 TSModelBuilder.cxx:954
 TSModelBuilder.cxx:955
 TSModelBuilder.cxx:956
 TSModelBuilder.cxx:957
 TSModelBuilder.cxx:958
 TSModelBuilder.cxx:959
 TSModelBuilder.cxx:960
 TSModelBuilder.cxx:961
 TSModelBuilder.cxx:962
 TSModelBuilder.cxx:963
 TSModelBuilder.cxx:964
 TSModelBuilder.cxx:965
 TSModelBuilder.cxx:966
 TSModelBuilder.cxx:967
 TSModelBuilder.cxx:968
 TSModelBuilder.cxx:969
 TSModelBuilder.cxx:970
 TSModelBuilder.cxx:971
 TSModelBuilder.cxx:972
 TSModelBuilder.cxx:973
 TSModelBuilder.cxx:974
 TSModelBuilder.cxx:975
 TSModelBuilder.cxx:976
 TSModelBuilder.cxx:977
 TSModelBuilder.cxx:978
 TSModelBuilder.cxx:979
 TSModelBuilder.cxx:980
 TSModelBuilder.cxx:981
 TSModelBuilder.cxx:982
 TSModelBuilder.cxx:983
 TSModelBuilder.cxx:984
 TSModelBuilder.cxx:985
 TSModelBuilder.cxx:986
 TSModelBuilder.cxx:987
 TSModelBuilder.cxx:988
 TSModelBuilder.cxx:989
 TSModelBuilder.cxx:990
 TSModelBuilder.cxx:991
 TSModelBuilder.cxx:992
 TSModelBuilder.cxx:993
 TSModelBuilder.cxx:994
 TSModelBuilder.cxx:995
 TSModelBuilder.cxx:996
 TSModelBuilder.cxx:997
 TSModelBuilder.cxx:998
 TSModelBuilder.cxx:999
 TSModelBuilder.cxx:1000
 TSModelBuilder.cxx:1001
 TSModelBuilder.cxx:1002
 TSModelBuilder.cxx:1003
 TSModelBuilder.cxx:1004
 TSModelBuilder.cxx:1005
 TSModelBuilder.cxx:1006
 TSModelBuilder.cxx:1007
 TSModelBuilder.cxx:1008
 TSModelBuilder.cxx:1009
 TSModelBuilder.cxx:1010
 TSModelBuilder.cxx:1011
 TSModelBuilder.cxx:1012
 TSModelBuilder.cxx:1013
 TSModelBuilder.cxx:1014
 TSModelBuilder.cxx:1015
 TSModelBuilder.cxx:1016
 TSModelBuilder.cxx:1017
 TSModelBuilder.cxx:1018
 TSModelBuilder.cxx:1019
 TSModelBuilder.cxx:1020
 TSModelBuilder.cxx:1021
 TSModelBuilder.cxx:1022
 TSModelBuilder.cxx:1023
 TSModelBuilder.cxx:1024
 TSModelBuilder.cxx:1025
 TSModelBuilder.cxx:1026
 TSModelBuilder.cxx:1027
 TSModelBuilder.cxx:1028
 TSModelBuilder.cxx:1029
 TSModelBuilder.cxx:1030
 TSModelBuilder.cxx:1031
 TSModelBuilder.cxx:1032
 TSModelBuilder.cxx:1033
 TSModelBuilder.cxx:1034
 TSModelBuilder.cxx:1035
 TSModelBuilder.cxx:1036
 TSModelBuilder.cxx:1037
 TSModelBuilder.cxx:1038
 TSModelBuilder.cxx:1039
 TSModelBuilder.cxx:1040
 TSModelBuilder.cxx:1041
 TSModelBuilder.cxx:1042
 TSModelBuilder.cxx:1043
 TSModelBuilder.cxx:1044
 TSModelBuilder.cxx:1045
 TSModelBuilder.cxx:1046
 TSModelBuilder.cxx:1047
 TSModelBuilder.cxx:1048
 TSModelBuilder.cxx:1049
 TSModelBuilder.cxx:1050
 TSModelBuilder.cxx:1051
 TSModelBuilder.cxx:1052
 TSModelBuilder.cxx:1053
 TSModelBuilder.cxx:1054
 TSModelBuilder.cxx:1055
 TSModelBuilder.cxx:1056
 TSModelBuilder.cxx:1057
 TSModelBuilder.cxx:1058
 TSModelBuilder.cxx:1059
 TSModelBuilder.cxx:1060
 TSModelBuilder.cxx:1061
 TSModelBuilder.cxx:1062
 TSModelBuilder.cxx:1063
 TSModelBuilder.cxx:1064
 TSModelBuilder.cxx:1065
 TSModelBuilder.cxx:1066
 TSModelBuilder.cxx:1067
 TSModelBuilder.cxx:1068
 TSModelBuilder.cxx:1069
 TSModelBuilder.cxx:1070
 TSModelBuilder.cxx:1071
 TSModelBuilder.cxx:1072
 TSModelBuilder.cxx:1073
 TSModelBuilder.cxx:1074
 TSModelBuilder.cxx:1075
 TSModelBuilder.cxx:1076
 TSModelBuilder.cxx:1077
 TSModelBuilder.cxx:1078
 TSModelBuilder.cxx:1079
 TSModelBuilder.cxx:1080
 TSModelBuilder.cxx:1081
 TSModelBuilder.cxx:1082
 TSModelBuilder.cxx:1083
 TSModelBuilder.cxx:1084
 TSModelBuilder.cxx:1085
 TSModelBuilder.cxx:1086
 TSModelBuilder.cxx:1087
 TSModelBuilder.cxx:1088
 TSModelBuilder.cxx:1089
 TSModelBuilder.cxx:1090
 TSModelBuilder.cxx:1091
 TSModelBuilder.cxx:1092
 TSModelBuilder.cxx:1093
 TSModelBuilder.cxx:1094
 TSModelBuilder.cxx:1095
 TSModelBuilder.cxx:1096
 TSModelBuilder.cxx:1097
 TSModelBuilder.cxx:1098
 TSModelBuilder.cxx:1099
 TSModelBuilder.cxx:1100
 TSModelBuilder.cxx:1101
 TSModelBuilder.cxx:1102
 TSModelBuilder.cxx:1103
 TSModelBuilder.cxx:1104
 TSModelBuilder.cxx:1105
 TSModelBuilder.cxx:1106
 TSModelBuilder.cxx:1107
 TSModelBuilder.cxx:1108
 TSModelBuilder.cxx:1109
 TSModelBuilder.cxx:1110
 TSModelBuilder.cxx:1111
 TSModelBuilder.cxx:1112
 TSModelBuilder.cxx:1113
 TSModelBuilder.cxx:1114
 TSModelBuilder.cxx:1115
 TSModelBuilder.cxx:1116
 TSModelBuilder.cxx:1117
 TSModelBuilder.cxx:1118
 TSModelBuilder.cxx:1119
 TSModelBuilder.cxx:1120
 TSModelBuilder.cxx:1121
 TSModelBuilder.cxx:1122
 TSModelBuilder.cxx:1123
 TSModelBuilder.cxx:1124
 TSModelBuilder.cxx:1125
 TSModelBuilder.cxx:1126
 TSModelBuilder.cxx:1127
 TSModelBuilder.cxx:1128
 TSModelBuilder.cxx:1129
 TSModelBuilder.cxx:1130
 TSModelBuilder.cxx:1131
 TSModelBuilder.cxx:1132
 TSModelBuilder.cxx:1133
 TSModelBuilder.cxx:1134
 TSModelBuilder.cxx:1135
 TSModelBuilder.cxx:1136
 TSModelBuilder.cxx:1137
 TSModelBuilder.cxx:1138
 TSModelBuilder.cxx:1139
 TSModelBuilder.cxx:1140
 TSModelBuilder.cxx:1141
 TSModelBuilder.cxx:1142
 TSModelBuilder.cxx:1143
 TSModelBuilder.cxx:1144
 TSModelBuilder.cxx:1145
 TSModelBuilder.cxx:1146
 TSModelBuilder.cxx:1147
 TSModelBuilder.cxx:1148
 TSModelBuilder.cxx:1149
 TSModelBuilder.cxx:1150
 TSModelBuilder.cxx:1151
 TSModelBuilder.cxx:1152
 TSModelBuilder.cxx:1153
 TSModelBuilder.cxx:1154
 TSModelBuilder.cxx:1155
 TSModelBuilder.cxx:1156
 TSModelBuilder.cxx:1157
 TSModelBuilder.cxx:1158
 TSModelBuilder.cxx:1159
 TSModelBuilder.cxx:1160
 TSModelBuilder.cxx:1161
 TSModelBuilder.cxx:1162
 TSModelBuilder.cxx:1163
 TSModelBuilder.cxx:1164
 TSModelBuilder.cxx:1165
 TSModelBuilder.cxx:1166
 TSModelBuilder.cxx:1167
 TSModelBuilder.cxx:1168
 TSModelBuilder.cxx:1169
 TSModelBuilder.cxx:1170
 TSModelBuilder.cxx:1171
 TSModelBuilder.cxx:1172
 TSModelBuilder.cxx:1173
 TSModelBuilder.cxx:1174
 TSModelBuilder.cxx:1175
 TSModelBuilder.cxx:1176
 TSModelBuilder.cxx:1177
 TSModelBuilder.cxx:1178
 TSModelBuilder.cxx:1179
 TSModelBuilder.cxx:1180
 TSModelBuilder.cxx:1181
 TSModelBuilder.cxx:1182
 TSModelBuilder.cxx:1183
 TSModelBuilder.cxx:1184
 TSModelBuilder.cxx:1185
 TSModelBuilder.cxx:1186
 TSModelBuilder.cxx:1187
 TSModelBuilder.cxx:1188
 TSModelBuilder.cxx:1189
 TSModelBuilder.cxx:1190
 TSModelBuilder.cxx:1191
 TSModelBuilder.cxx:1192
 TSModelBuilder.cxx:1193
 TSModelBuilder.cxx:1194
 TSModelBuilder.cxx:1195
 TSModelBuilder.cxx:1196
 TSModelBuilder.cxx:1197
 TSModelBuilder.cxx:1198
 TSModelBuilder.cxx:1199
 TSModelBuilder.cxx:1200
 TSModelBuilder.cxx:1201
 TSModelBuilder.cxx:1202
 TSModelBuilder.cxx:1203
 TSModelBuilder.cxx:1204
 TSModelBuilder.cxx:1205
 TSModelBuilder.cxx:1206
 TSModelBuilder.cxx:1207
 TSModelBuilder.cxx:1208
 TSModelBuilder.cxx:1209
 TSModelBuilder.cxx:1210
 TSModelBuilder.cxx:1211
 TSModelBuilder.cxx:1212
 TSModelBuilder.cxx:1213
 TSModelBuilder.cxx:1214
 TSModelBuilder.cxx:1215
 TSModelBuilder.cxx:1216
 TSModelBuilder.cxx:1217
 TSModelBuilder.cxx:1218
 TSModelBuilder.cxx:1219
 TSModelBuilder.cxx:1220
 TSModelBuilder.cxx:1221
 TSModelBuilder.cxx:1222
 TSModelBuilder.cxx:1223
 TSModelBuilder.cxx:1224
 TSModelBuilder.cxx:1225
 TSModelBuilder.cxx:1226
 TSModelBuilder.cxx:1227
 TSModelBuilder.cxx:1228
 TSModelBuilder.cxx:1229
 TSModelBuilder.cxx:1230
 TSModelBuilder.cxx:1231
 TSModelBuilder.cxx:1232
 TSModelBuilder.cxx:1233
 TSModelBuilder.cxx:1234
 TSModelBuilder.cxx:1235
 TSModelBuilder.cxx:1236
 TSModelBuilder.cxx:1237
 TSModelBuilder.cxx:1238
 TSModelBuilder.cxx:1239
 TSModelBuilder.cxx:1240
 TSModelBuilder.cxx:1241
 TSModelBuilder.cxx:1242
 TSModelBuilder.cxx:1243
 TSModelBuilder.cxx:1244
 TSModelBuilder.cxx:1245
 TSModelBuilder.cxx:1246
 TSModelBuilder.cxx:1247
 TSModelBuilder.cxx:1248
 TSModelBuilder.cxx:1249
 TSModelBuilder.cxx:1250
 TSModelBuilder.cxx:1251
 TSModelBuilder.cxx:1252
 TSModelBuilder.cxx:1253
 TSModelBuilder.cxx:1254
 TSModelBuilder.cxx:1255
 TSModelBuilder.cxx:1256
 TSModelBuilder.cxx:1257
 TSModelBuilder.cxx:1258
 TSModelBuilder.cxx:1259
 TSModelBuilder.cxx:1260
 TSModelBuilder.cxx:1261
 TSModelBuilder.cxx:1262
 TSModelBuilder.cxx:1263
 TSModelBuilder.cxx:1264
 TSModelBuilder.cxx:1265
 TSModelBuilder.cxx:1266
 TSModelBuilder.cxx:1267
 TSModelBuilder.cxx:1268
 TSModelBuilder.cxx:1269
 TSModelBuilder.cxx:1270
 TSModelBuilder.cxx:1271
 TSModelBuilder.cxx:1272
 TSModelBuilder.cxx:1273
 TSModelBuilder.cxx:1274
 TSModelBuilder.cxx:1275
 TSModelBuilder.cxx:1276
 TSModelBuilder.cxx:1277
 TSModelBuilder.cxx:1278
 TSModelBuilder.cxx:1279
 TSModelBuilder.cxx:1280
 TSModelBuilder.cxx:1281
 TSModelBuilder.cxx:1282
 TSModelBuilder.cxx:1283
 TSModelBuilder.cxx:1284
 TSModelBuilder.cxx:1285
 TSModelBuilder.cxx:1286
 TSModelBuilder.cxx:1287
 TSModelBuilder.cxx:1288
 TSModelBuilder.cxx:1289
 TSModelBuilder.cxx:1290
 TSModelBuilder.cxx:1291
 TSModelBuilder.cxx:1292
 TSModelBuilder.cxx:1293
 TSModelBuilder.cxx:1294
 TSModelBuilder.cxx:1295
 TSModelBuilder.cxx:1296
 TSModelBuilder.cxx:1297
 TSModelBuilder.cxx:1298
 TSModelBuilder.cxx:1299
 TSModelBuilder.cxx:1300
 TSModelBuilder.cxx:1301
 TSModelBuilder.cxx:1302
 TSModelBuilder.cxx:1303
 TSModelBuilder.cxx:1304
 TSModelBuilder.cxx:1305
 TSModelBuilder.cxx:1306
 TSModelBuilder.cxx:1307
 TSModelBuilder.cxx:1308
 TSModelBuilder.cxx:1309
 TSModelBuilder.cxx:1310
 TSModelBuilder.cxx:1311
 TSModelBuilder.cxx:1312
 TSModelBuilder.cxx:1313
 TSModelBuilder.cxx:1314
 TSModelBuilder.cxx:1315
 TSModelBuilder.cxx:1316
 TSModelBuilder.cxx:1317
 TSModelBuilder.cxx:1318
 TSModelBuilder.cxx:1319
 TSModelBuilder.cxx:1320
 TSModelBuilder.cxx:1321
 TSModelBuilder.cxx:1322
 TSModelBuilder.cxx:1323
 TSModelBuilder.cxx:1324
 TSModelBuilder.cxx:1325
 TSModelBuilder.cxx:1326
 TSModelBuilder.cxx:1327
 TSModelBuilder.cxx:1328
 TSModelBuilder.cxx:1329
 TSModelBuilder.cxx:1330
 TSModelBuilder.cxx:1331
 TSModelBuilder.cxx:1332
 TSModelBuilder.cxx:1333
 TSModelBuilder.cxx:1334
 TSModelBuilder.cxx:1335
 TSModelBuilder.cxx:1336
 TSModelBuilder.cxx:1337
 TSModelBuilder.cxx:1338
 TSModelBuilder.cxx:1339
 TSModelBuilder.cxx:1340
 TSModelBuilder.cxx:1341
 TSModelBuilder.cxx:1342
 TSModelBuilder.cxx:1343
 TSModelBuilder.cxx:1344
 TSModelBuilder.cxx:1345
 TSModelBuilder.cxx:1346
 TSModelBuilder.cxx:1347
 TSModelBuilder.cxx:1348
 TSModelBuilder.cxx:1349
 TSModelBuilder.cxx:1350
 TSModelBuilder.cxx:1351
 TSModelBuilder.cxx:1352
 TSModelBuilder.cxx:1353
 TSModelBuilder.cxx:1354
 TSModelBuilder.cxx:1355
 TSModelBuilder.cxx:1356
 TSModelBuilder.cxx:1357
 TSModelBuilder.cxx:1358
 TSModelBuilder.cxx:1359
 TSModelBuilder.cxx:1360
 TSModelBuilder.cxx:1361
 TSModelBuilder.cxx:1362
 TSModelBuilder.cxx:1363
 TSModelBuilder.cxx:1364
 TSModelBuilder.cxx:1365
 TSModelBuilder.cxx:1366
 TSModelBuilder.cxx:1367
 TSModelBuilder.cxx:1368
 TSModelBuilder.cxx:1369
 TSModelBuilder.cxx:1370
 TSModelBuilder.cxx:1371
 TSModelBuilder.cxx:1372
 TSModelBuilder.cxx:1373
 TSModelBuilder.cxx:1374
 TSModelBuilder.cxx:1375
 TSModelBuilder.cxx:1376
 TSModelBuilder.cxx:1377
 TSModelBuilder.cxx:1378
 TSModelBuilder.cxx:1379
 TSModelBuilder.cxx:1380
 TSModelBuilder.cxx:1381
 TSModelBuilder.cxx:1382
 TSModelBuilder.cxx:1383
 TSModelBuilder.cxx:1384
 TSModelBuilder.cxx:1385
 TSModelBuilder.cxx:1386
 TSModelBuilder.cxx:1387
 TSModelBuilder.cxx:1388
 TSModelBuilder.cxx:1389
 TSModelBuilder.cxx:1390
 TSModelBuilder.cxx:1391
 TSModelBuilder.cxx:1392
 TSModelBuilder.cxx:1393
 TSModelBuilder.cxx:1394
 TSModelBuilder.cxx:1395
 TSModelBuilder.cxx:1396
 TSModelBuilder.cxx:1397
 TSModelBuilder.cxx:1398
 TSModelBuilder.cxx:1399
 TSModelBuilder.cxx:1400
 TSModelBuilder.cxx:1401
 TSModelBuilder.cxx:1402
 TSModelBuilder.cxx:1403
 TSModelBuilder.cxx:1404
 TSModelBuilder.cxx:1405
 TSModelBuilder.cxx:1406
 TSModelBuilder.cxx:1407
 TSModelBuilder.cxx:1408
 TSModelBuilder.cxx:1409
 TSModelBuilder.cxx:1410
 TSModelBuilder.cxx:1411
 TSModelBuilder.cxx:1412
 TSModelBuilder.cxx:1413
 TSModelBuilder.cxx:1414
 TSModelBuilder.cxx:1415
 TSModelBuilder.cxx:1416
 TSModelBuilder.cxx:1417
 TSModelBuilder.cxx:1418
 TSModelBuilder.cxx:1419
 TSModelBuilder.cxx:1420
 TSModelBuilder.cxx:1421
 TSModelBuilder.cxx:1422
 TSModelBuilder.cxx:1423
 TSModelBuilder.cxx:1424
 TSModelBuilder.cxx:1425
 TSModelBuilder.cxx:1426
 TSModelBuilder.cxx:1427
 TSModelBuilder.cxx:1428
 TSModelBuilder.cxx:1429
 TSModelBuilder.cxx:1430
 TSModelBuilder.cxx:1431
 TSModelBuilder.cxx:1432
 TSModelBuilder.cxx:1433
 TSModelBuilder.cxx:1434
 TSModelBuilder.cxx:1435
 TSModelBuilder.cxx:1436
 TSModelBuilder.cxx:1437
 TSModelBuilder.cxx:1438
 TSModelBuilder.cxx:1439
 TSModelBuilder.cxx:1440
 TSModelBuilder.cxx:1441
 TSModelBuilder.cxx:1442
 TSModelBuilder.cxx:1443
 TSModelBuilder.cxx:1444
 TSModelBuilder.cxx:1445
 TSModelBuilder.cxx:1446
 TSModelBuilder.cxx:1447
 TSModelBuilder.cxx:1448
 TSModelBuilder.cxx:1449
 TSModelBuilder.cxx:1450
 TSModelBuilder.cxx:1451
 TSModelBuilder.cxx:1452
 TSModelBuilder.cxx:1453
 TSModelBuilder.cxx:1454
 TSModelBuilder.cxx:1455
 TSModelBuilder.cxx:1456
 TSModelBuilder.cxx:1457
 TSModelBuilder.cxx:1458
 TSModelBuilder.cxx:1459
 TSModelBuilder.cxx:1460
 TSModelBuilder.cxx:1461
 TSModelBuilder.cxx:1462
 TSModelBuilder.cxx:1463
 TSModelBuilder.cxx:1464
 TSModelBuilder.cxx:1465
 TSModelBuilder.cxx:1466
 TSModelBuilder.cxx:1467
 TSModelBuilder.cxx:1468
 TSModelBuilder.cxx:1469
 TSModelBuilder.cxx:1470
 TSModelBuilder.cxx:1471
 TSModelBuilder.cxx:1472
 TSModelBuilder.cxx:1473
 TSModelBuilder.cxx:1474
 TSModelBuilder.cxx:1475
 TSModelBuilder.cxx:1476
 TSModelBuilder.cxx:1477
 TSModelBuilder.cxx:1478
 TSModelBuilder.cxx:1479
 TSModelBuilder.cxx:1480
 TSModelBuilder.cxx:1481
 TSModelBuilder.cxx:1482
 TSModelBuilder.cxx:1483
 TSModelBuilder.cxx:1484
 TSModelBuilder.cxx:1485
 TSModelBuilder.cxx:1486
 TSModelBuilder.cxx:1487
 TSModelBuilder.cxx:1488
 TSModelBuilder.cxx:1489
 TSModelBuilder.cxx:1490
 TSModelBuilder.cxx:1491
 TSModelBuilder.cxx:1492
 TSModelBuilder.cxx:1493
 TSModelBuilder.cxx:1494
 TSModelBuilder.cxx:1495
 TSModelBuilder.cxx:1496
 TSModelBuilder.cxx:1497
 TSModelBuilder.cxx:1498
 TSModelBuilder.cxx:1499
 TSModelBuilder.cxx:1500
 TSModelBuilder.cxx:1501
 TSModelBuilder.cxx:1502
 TSModelBuilder.cxx:1503
 TSModelBuilder.cxx:1504
 TSModelBuilder.cxx:1505
 TSModelBuilder.cxx:1506
 TSModelBuilder.cxx:1507
 TSModelBuilder.cxx:1508
 TSModelBuilder.cxx:1509
 TSModelBuilder.cxx:1510
 TSModelBuilder.cxx:1511
 TSModelBuilder.cxx:1512
 TSModelBuilder.cxx:1513
 TSModelBuilder.cxx:1514
 TSModelBuilder.cxx:1515
 TSModelBuilder.cxx:1516
 TSModelBuilder.cxx:1517
 TSModelBuilder.cxx:1518
 TSModelBuilder.cxx:1519
 TSModelBuilder.cxx:1520
 TSModelBuilder.cxx:1521
 TSModelBuilder.cxx:1522
 TSModelBuilder.cxx:1523
 TSModelBuilder.cxx:1524
 TSModelBuilder.cxx:1525
 TSModelBuilder.cxx:1526
 TSModelBuilder.cxx:1527
 TSModelBuilder.cxx:1528
 TSModelBuilder.cxx:1529
 TSModelBuilder.cxx:1530
 TSModelBuilder.cxx:1531
 TSModelBuilder.cxx:1532
 TSModelBuilder.cxx:1533
 TSModelBuilder.cxx:1534
 TSModelBuilder.cxx:1535
 TSModelBuilder.cxx:1536
 TSModelBuilder.cxx:1537
 TSModelBuilder.cxx:1538
 TSModelBuilder.cxx:1539
 TSModelBuilder.cxx:1540
 TSModelBuilder.cxx:1541
 TSModelBuilder.cxx:1542
 TSModelBuilder.cxx:1543
 TSModelBuilder.cxx:1544
 TSModelBuilder.cxx:1545
 TSModelBuilder.cxx:1546
 TSModelBuilder.cxx:1547
 TSModelBuilder.cxx:1548
 TSModelBuilder.cxx:1549
 TSModelBuilder.cxx:1550
 TSModelBuilder.cxx:1551
 TSModelBuilder.cxx:1552
 TSModelBuilder.cxx:1553
 TSModelBuilder.cxx:1554
 TSModelBuilder.cxx:1555
 TSModelBuilder.cxx:1556
 TSModelBuilder.cxx:1557
 TSModelBuilder.cxx:1558
 TSModelBuilder.cxx:1559
 TSModelBuilder.cxx:1560
 TSModelBuilder.cxx:1561
 TSModelBuilder.cxx:1562
 TSModelBuilder.cxx:1563
 TSModelBuilder.cxx:1564
 TSModelBuilder.cxx:1565
 TSModelBuilder.cxx:1566
 TSModelBuilder.cxx:1567
 TSModelBuilder.cxx:1568
 TSModelBuilder.cxx:1569
 TSModelBuilder.cxx:1570
 TSModelBuilder.cxx:1571
 TSModelBuilder.cxx:1572
 TSModelBuilder.cxx:1573
 TSModelBuilder.cxx:1574
 TSModelBuilder.cxx:1575
 TSModelBuilder.cxx:1576
 TSModelBuilder.cxx:1577
 TSModelBuilder.cxx:1578
 TSModelBuilder.cxx:1579
 TSModelBuilder.cxx:1580
 TSModelBuilder.cxx:1581
 TSModelBuilder.cxx:1582
 TSModelBuilder.cxx:1583
 TSModelBuilder.cxx:1584
 TSModelBuilder.cxx:1585
 TSModelBuilder.cxx:1586
 TSModelBuilder.cxx:1587
 TSModelBuilder.cxx:1588
 TSModelBuilder.cxx:1589
 TSModelBuilder.cxx:1590
 TSModelBuilder.cxx:1591
 TSModelBuilder.cxx:1592
 TSModelBuilder.cxx:1593
 TSModelBuilder.cxx:1594
 TSModelBuilder.cxx:1595
 TSModelBuilder.cxx:1596
 TSModelBuilder.cxx:1597
 TSModelBuilder.cxx:1598
 TSModelBuilder.cxx:1599
 TSModelBuilder.cxx:1600
 TSModelBuilder.cxx:1601
 TSModelBuilder.cxx:1602
 TSModelBuilder.cxx:1603
 TSModelBuilder.cxx:1604
 TSModelBuilder.cxx:1605
 TSModelBuilder.cxx:1606
 TSModelBuilder.cxx:1607
 TSModelBuilder.cxx:1608
 TSModelBuilder.cxx:1609
 TSModelBuilder.cxx:1610
 TSModelBuilder.cxx:1611
 TSModelBuilder.cxx:1612
 TSModelBuilder.cxx:1613
 TSModelBuilder.cxx:1614
 TSModelBuilder.cxx:1615
 TSModelBuilder.cxx:1616
 TSModelBuilder.cxx:1617
 TSModelBuilder.cxx:1618
 TSModelBuilder.cxx:1619
 TSModelBuilder.cxx:1620
 TSModelBuilder.cxx:1621
 TSModelBuilder.cxx:1622
 TSModelBuilder.cxx:1623
 TSModelBuilder.cxx:1624
 TSModelBuilder.cxx:1625
 TSModelBuilder.cxx:1626
 TSModelBuilder.cxx:1627
 TSModelBuilder.cxx:1628
 TSModelBuilder.cxx:1629
 TSModelBuilder.cxx:1630
 TSModelBuilder.cxx:1631
 TSModelBuilder.cxx:1632
 TSModelBuilder.cxx:1633
 TSModelBuilder.cxx:1634
 TSModelBuilder.cxx:1635
 TSModelBuilder.cxx:1636
 TSModelBuilder.cxx:1637
 TSModelBuilder.cxx:1638
 TSModelBuilder.cxx:1639
 TSModelBuilder.cxx:1640
 TSModelBuilder.cxx:1641