#include "TAxis.h"
#include "QFramework/TQHistogramUtils.h"
#include "QFramework/TQTHnBaseUtils.h"
#include "QFramework/TQStringUtils.h"
#include "QFramework/TQTaggable.h"
#include "QFramework/TQCounter.h"
#include "QFramework/TQIterator.h"
#include "QFramework/TQUtils.h"
#include "TMath.h"
#include "TList.h"
#include "THn.h"
#include "THnBase.h"
#include "THnSparse.h"
#include "THashList.h"
#include "TROOT.h"

// #define _DEBUG_

#include "QFramework/TQLibrary.h"

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

#include <stdio.h> 
#include <stdarg.h> 

#include "Math/Math.h"
#include "Math/QuantFuncMathCore.h"
#include "Math/SpecFuncMathCore.h"

////////////////////////////////////////////////////////////////////////////////////////////////
//
// TQTHnBaseUtils:
//
// TQTHnBaseUtils is a namespace providing a set of static utility
// methods for multidimensional histograms with its base class
// THnBase.  It is highly derived from the TQHistogramUtils class,
// where more information can be found.
//
////////////////////////////////////////////////////////////////////////////////////////////////

TString TQTHnBaseUtils::getHistogramDefinition(THnBase * histo) {
  // Returns a string representing the definition of the histogram following a syntax
  // compatible with TQTHnBaseUtils::createHistogram(...) and being similar to the
  // constructor of the corresponding histogram class. 
  // e.g. for a 3-dim histogram:
  // "THnSparseF('histo', 'title', 3, {34, 28, 24}, {0., 10., 0.}, {170., 290., 3.14})"
  // An empty string is returned in case an invalid histogram is passed.

  // invalid histogram?
  if (!histo) {
    return "";
  }
 
  // the following line is because the output of histo->IsA()->GetName() delivers
  // "THnSparseT<TArrayF>" for THnSparseF and THnSparseD respectively...
  TString histoType = histo->IsA()->GetName();
  if (!TQStringUtils::compare(histoType, "THnSparseT<TArrayF>")) {
    histoType = "THnSparseF";
  }
  else if (!TQStringUtils::compare(histoType,"THnSparseT<TArrayD>")) {
    histoType = "THnSparseD";
  }
  
  TString def = TString::Format("%s(\"%s\", ", histoType.Data(), histo->GetName());
  
  // will become full title of histogram (including axis titles)
  TString titleDef = "";//histo->GetTitle();

  // will become binning definition
  TString binDef;
 
  // iterating over dimensions of histogram
  int dim = getDimension(histo);

  for (int i = 0; i < dim; ++i) {
    TAxis * axis = NULL;
    axis = histo->GetAxis(i);
    if (!axis) {
      // should never happen
      break;
    }
 
    // embed axis title in histogram title
    TString title = axis->GetTitle();
    if (!title.IsNull()) {
      TQStringUtils::append(titleDef, title, ";");
    }
    // compile binning definition string
    TQStringUtils::append(binDef, TQHistogramUtils::getBinningDefinition(axis), ", ");
  } 
  
  // format binning definition for use with THnBase
  TQTaggable * binDefTags = TQTaggable::parseParameterList(binDef);
  TString nBins = "";
  TString min = "";
  TString max = "";
  for (int i = 0; i < dim; ++i) {
    nBins.Append(binDefTags->getTagStringDefault(TString::Format("%d", 3*i)));
    min.Append(binDefTags->getTagStringDefault(TString::Format("%d", 3*i+1)));
    max.Append(binDefTags->getTagStringDefault(TString::Format("%d", 3*i+2)));
    if (i < dim-1) {
      nBins.Append(", ");
      min.Append(", ");
      max.Append(", ");
    }
  }
  binDef = TString::Format("{%s}, {%s}, {%s}", nBins.Data(), min.Data(), max.Data());
  
  // now combine all parts to one definition string
  def.Append(TString::Format("\"%s\", ", titleDef.Data()));
  def.Append(TString::Format("%d, ", dim));
  def.Append(binDef + ")");
  
  return def;
}

//__________________________________________________________________________________|___________

THnBase * TQTHnBaseUtils::createHistogram(TString definition, bool printErrMsg) {

  // create histogram
  TString errMsg;
  THnBase * histo = createHistogram(definition, errMsg);

  if (!histo && printErrMsg) {
    // print error message
    std::cout << TQStringUtils::makeBoldRed(errMsg.Prepend(
							   "TQTHnBaseUtils::createHistogram(...): ")).Data() << std::endl;
  }

  // return histogram
  return histo;
}

//__________________________________________________________________________________|___________

THnBase * TQTHnBaseUtils::createHistogram(TString definition, TString &errMsg) {
  // Creates a new instance of a THnBase histogram from a definition string
  // that uses a similar syntax as the constructor of the corresponding histogram
  // class. Currently only THnSparseF and THnSparseD is supported
  //
  // Examples:
  //
  // - a THnSparse with 3 dimensions:
  //
  // createTHnBase("THnSparseF('histo', 'title', 3, {34, 28, 24}, {0., 10., 0.}, {170., 290., 3.14})")
  //
  
  // read histogram type (e.g. "THnBaseF", ...)
  TString type;
  TQStringUtils::readBlanksAndNewlines(definition);
  if (TQStringUtils::readToken(definition,type,TQStringUtils::getLetters() + TQStringUtils::getNumerals()) == 0) {
    errMsg = TString::Format("Missing valid histogram type, received '%s' from '%s'",type.Data(),definition.Data());
    return NULL;
  }
  
  // histogram type to create
  bool isTHnSparseF = (type.CompareTo("THnSparseF") == 0);
  bool isTHnSparseD = (type.CompareTo("THnSparseD") == 0);

  if (!isTHnSparseF && !isTHnSparseD) {
    errMsg = TString::Format("Unknown histogram type '%s'", type.Data());
    return NULL;
  }

  // read parameter block
  TString parameter;
  TQStringUtils::readBlanksAndNewlines(definition);
  if (TQStringUtils::readBlock(definition, parameter, "()", "''\"\"", false) == 0) {
    errMsg = TString::Format("Missing parameter block '(...)' after '%s'", type.Data());
    return NULL;
  }

  // make sure there is nothing left after the parameter block
  TQStringUtils::readBlanksAndNewlines(definition);
  if (!definition.IsNull()) {
    errMsg = TString::Format("Unrecognized token '%s'", definition.Data());
    return NULL;
  }

  // parse parameter block
  TQTaggable * pars = TQTaggable::parseParameterList(parameter, ",", true, "{}[]()", "''\"\"");
  if (!pars) {
    errMsg = TString::Format("Failed to parse parameters '%s'", parameter.Data());
    return NULL;
  }

  // keep track of parameters read (to find unexpected parameters)
  pars->resetReadFlags();

  // name of histogram
  if (!pars->tagIsOfTypeString("0")) {
    errMsg = "Missing valid histogram name";
    delete pars;
    return NULL;
  }
  TString name = pars->getTagStringDefault("0");

  // title of histogram
  if (!pars->tagIsOfTypeString("1")) {
    errMsg = "Missing valid histogram title";
    delete pars;
    return NULL;
  }
  TString title = pars->getTagStringDefault("1");

  // the number of bins on axes
  int dimension = 0;  
  std::vector<int> nBins;
  
  // left and right bound on axes
  std::vector<double> min; 
  std::vector<double> max; 

  // for THnSparse
  if (!extractBinning(pars, dimension, nBins, min, max, errMsg)) {
    errMsg.Append(" when creating THnSparse");
    delete pars;
    return NULL;
  }

  // unread parameters left?
  if (pars->hasUnreadKeys()) {
    errMsg.Append(TString::Format("Too many parameters for '%s'", type.Data()));
    delete pars;
    return NULL;
  }

  // the current directory might contain a histogram with the same name
  int i = 2;
  TString finalName = name;
  while (gDirectory && gDirectory->FindObject(name.Data())) {
    name = TString::Format("%s_i%d", finalName.Data(), i++);
  }

  // now create the histogram calling the corresponding constructor
  THnBase * histo = NULL;
  if (isTHnSparseF) {
    histo = new THnSparseF(name.Data(), title.Data(), dimension, 
			   nBins.data(), min.data(), max.data());
  }
  else if (isTHnSparseD) {
    histo = new THnSparseD(name.Data(), title.Data(), dimension,
			   nBins.data(), min.data(), max.data());
  }

  if (histo) {
    // histo->SetDirectory(NULL); not callable with THnBase, not necessary?
    // set original (final) name
    histo->SetName(finalName.Data());
    // sum weights
    histo->Sumw2();
  }

  delete pars;
  
  // finally return the histogram
  if(!histo){
    errMsg = "unknown error: histogram type is '"+type+"'";
  }
  
  return histo;
}
 
//__________________________________________________________________________________|___________
 
bool TQTHnBaseUtils::extractBinning(TQTaggable * p, int &dimension, std::vector<int> &nBins,std::vector<double> &min,std::vector<double> &max, TString &errMsg) {
	// extract the binning definition of the THnBase object. This must
	// exactly fit the syntax of the histogram definition file.
	
	p->getTagInteger("2", dimension); // get dimension of THnSparse
  
  // loop over THnSparse definitions of nBins, max values and min values
  for (int p_bin = 3; p_bin<6; p_bin++) {  
    double edge = 0.;
    // loop through arrays of nBins, max values and min values
    for (int i=0; i<dimension; i++) {
      if (!p->hasTag(TString::Format("%d.%d", p_bin, i))) {
				errMsg = "Invalid array of bins";
      }
      if (!p->getTagDouble(TString::Format("%d.%d", p_bin, i), edge)) {
				errMsg = "Invalid array of bins";
				return false;
      }
      if (p_bin == 3)
				nBins.push_back(edge);
      if (p_bin == 4)
				min.push_back(edge);
      if (p_bin == 5)
				max.push_back(edge);
    }
  }
  return true;
}

//__________________________________________________________________________________|___________

THnBase * TQTHnBaseUtils::copyHistogram(THnBase * histo, const TString& newName) { 
  // Creates an independent copy of the input histogram <histo> which is a THnBase
  // and returns a pointer to the copy or a NULL pointer in case of failure. 

  // stop if the histogram to copy is invalid
  if (!histo) {
    return NULL;
  }
  // make a copy of the input histogram
  THnBase * copy = TQTHnBaseUtils::createHistogram(TQTHnBaseUtils::getHistogramDefinition(histo));
  if (!copyAxisNames(histo, copy)) {
    WARN("failed copying axis names");
  }

  if (!copy) {
    return NULL;
  }
  
  TQTHnBaseUtils::addHistogram(copy,histo);
  
  int dim = getDimension(histo);
  
  for (int i = 0; i < dim; ++i) {
    if (histo->GetAxis(i)) copy->GetAxis(i)->SetTitle(histo->GetAxis(i)->GetTitle());
  }

  // disallowing to set NODIR as a name for consistency with TQHistogramUtils version
  if (newName != "NODIR" && !newName.IsNull()) {
    copy->SetName(newName);
  }
  
  // return the copied histogram
  return copy;
}

//__________________________________________________________________________________|___________

bool TQTHnBaseUtils::copyAxisNames(THnBase * histo, THnBase * copy) {
  // simply copy the axis names
  if (!histo || !copy) {
    return false;
  }
  for (int i=0; i<histo->GetNdimensions(); i++) {
    copy->GetAxis(i)->SetName(histo->GetAxis(i)->GetName());
  }
  return true;
}

//__________________________________________________________________________________|___________

bool TQTHnBaseUtils::addHistogram(THnBase * histo1, THnBase * histo2,
				  TQCounter* scale, double corr12, bool includeScaleUncertainty) {
  // adds two THnBase histograms with built-in Root function THnBase::Add()
  // Remark: This means there is no support for scale uncertainties!
  
  if(scale)
    return TQTHnBaseUtils::addHistogram(histo1,histo2,scale->getCounter(),scale->getError(),corr12,includeScaleUncertainty);
  else
    return TQTHnBaseUtils::addHistogram(histo1,histo2,1.,0.,corr12,false);
}


//__________________________________________________________________________________|___________


bool TQTHnBaseUtils::addHistogram(THnBase * histo1, THnBase * histo2,
				  double scale, double /*scaleUncertainty*/,
				  double /*corr12*/, bool /*includeScaleUncertainty*/) {
  // adds two THnBase histograms with built-in Root function THnBase::Add()
  // Remark: This means there is no support for scale uncertainties!

	// check validity of input histograms
  if (!histo1 || !histo2 || !checkConsistency(histo1, histo2)) {
    return false;
  }
  
  histo1->Add(histo2, scale);
  
  return true;
}


//__________________________________________________________________________________|___________


bool TQTHnBaseUtils::scaleHistogram(THnBase * histo, TQCounter* scale, bool includeScaleUncertainty) {
  // use built in Root function for scaling
  // Remark: This means there is no support for scale uncertainties!  
  if(scale)
    return TQTHnBaseUtils::scaleHistogram(histo,scale->getCounter(),scale->getError(),includeScaleUncertainty);
  else
    return TQTHnBaseUtils::scaleHistogram(histo,1.,0.,false);
}


//__________________________________________________________________________________|___________

bool TQTHnBaseUtils::scaleHistogram(THnBase * histo, double scale, double /*scaleUncertainty*/,
				    bool /*includeScaleUncertainty*/) {
  // use built in Root function for scaling
  // Remark: This means there is no support for scale uncertainties!  
  
  histo->Scale(scale);

  return true;
}
  
//__________________________________________________________________________________|___________

int TQTHnBaseUtils::getDimension(THnBase * histo) {
	
  if (!histo) {
    // is an invalid pointer
    return 0;
  }
  
  return histo->GetNdimensions();
}

//__________________________________________________________________________________|___________

bool TQTHnBaseUtils::checkConsistency(THnBase * histo1, THnBase * histo2, bool verbose) {
  // Check if two histograms have consistent binning
  // Remark: This is code from built-in Root function THnBase::CheckConsistency()
  
  // stop unless both histograms are valid
  if (!histo1 || !histo2) {
    if(verbose) ERRORfunc("received NULL pointer");
    return false;
  }
  
  if (histo1->GetNdimensions() != histo2->GetNdimensions()) {
    if(verbose) ERRORfunc("different number of dimensions, cannot carry out operation on the histograms");
    return false;
  }
  
  DEBUGfunc("function called on histograms '%s' and '%s'",histo1->GetName(),histo2->GetName());
  
  for (int dim = 0; dim < histo1->GetNdimensions(); dim++) {
    if (histo1->GetAxis(dim)->GetNbins() != histo2->GetAxis(dim)->GetNbins()) {
      if(verbose) ERRORfunc("Different number of bins on axis %i, cannot carry out operation on the histograms", dim);
      return false;
    }
  }
  
  return true;
}

//__________________________________________________________________________________|___________

THnBase* TQTHnBaseUtils::projectionND(THnBase *hist, std::vector<TString> axesNamesToUse, const TString& option) {
  // return multidimensional histogram with only the
  // dimensions specified with axes names
  // in the axesNamesToUse vector.
  // Note that the order of axes in the new histogram
  // is taken from this vector!
  if (!axesNamesToUse.empty()) {
    std::vector<int> axesIndizesToUse;
    for (TString name : axesNamesToUse) {
      bool found = false;
      for (int idim=0; idim<hist->GetNdimensions(); idim++) {
        if (name.EqualTo(hist->GetAxis(idim)->GetName())) {
          found = true;
          axesIndizesToUse.push_back(idim);
        }
      }
      if (!found) {
        WARNfunc("Axis with name '%s' not found! Please check your input configuration, for now this is skipped...", name.Data());
      }
    }
    // project relevant dimensions!
    THnSparseF *newhist;
    newhist = (THnSparseF*)hist->ProjectionND(axesIndizesToUse.size(), axesIndizesToUse.data(), option);
    return newhist;
  }
  return nullptr;
}

//__________________________________________________________________________________|___________

bool TQTHnBaseUtils::getAxisIndex(THnBase* h, const TString& axis_name, int& index) {
  // returns axis index of dimension with name 'name'
  bool found = false;            
  for (int idim=0; idim<h->GetNdimensions(); idim++) {
    if (axis_name.EqualTo(h->GetAxis(idim)->GetName())) {
      found = true;
      index = idim;
    }
  }
  if (!found) {
    WARN("Variable '%s' could not be found in input n-dim histogram with name '%s'!", axis_name.Data(), h->GetName());
  } 
  return found;
}
  
//__________________________________________________________________________________|___________

TAxis* TQTHnBaseUtils::getAxis(THnBase* h, const TString& axis_name) {
  // returns axis of dimension with name 'name'
  TAxis *axis = NULL;
  for (int idim=0; idim<h->GetNdimensions(); idim++) {
    if (axis_name.EqualTo(h->GetAxis(idim)->GetName())) {
      axis = h->GetAxis(idim);
    }
  }
  if (!axis) {
    WARN("Variable '%s' could not be found in input n-dim histogram with name '%s'!", axis_name.Data(), h->GetName());
  } 
  return axis;
}
  
 TQTHnBaseUtils.cxx:1
 TQTHnBaseUtils.cxx:2
 TQTHnBaseUtils.cxx:3
 TQTHnBaseUtils.cxx:4
 TQTHnBaseUtils.cxx:5
 TQTHnBaseUtils.cxx:6
 TQTHnBaseUtils.cxx:7
 TQTHnBaseUtils.cxx:8
 TQTHnBaseUtils.cxx:9
 TQTHnBaseUtils.cxx:10
 TQTHnBaseUtils.cxx:11
 TQTHnBaseUtils.cxx:12
 TQTHnBaseUtils.cxx:13
 TQTHnBaseUtils.cxx:14
 TQTHnBaseUtils.cxx:15
 TQTHnBaseUtils.cxx:16
 TQTHnBaseUtils.cxx:17
 TQTHnBaseUtils.cxx:18
 TQTHnBaseUtils.cxx:19
 TQTHnBaseUtils.cxx:20
 TQTHnBaseUtils.cxx:21
 TQTHnBaseUtils.cxx:22
 TQTHnBaseUtils.cxx:23
 TQTHnBaseUtils.cxx:24
 TQTHnBaseUtils.cxx:25
 TQTHnBaseUtils.cxx:26
 TQTHnBaseUtils.cxx:27
 TQTHnBaseUtils.cxx:28
 TQTHnBaseUtils.cxx:29
 TQTHnBaseUtils.cxx:30
 TQTHnBaseUtils.cxx:31
 TQTHnBaseUtils.cxx:32
 TQTHnBaseUtils.cxx:33
 TQTHnBaseUtils.cxx:34
 TQTHnBaseUtils.cxx:35
 TQTHnBaseUtils.cxx:36
 TQTHnBaseUtils.cxx:37
 TQTHnBaseUtils.cxx:38
 TQTHnBaseUtils.cxx:39
 TQTHnBaseUtils.cxx:40
 TQTHnBaseUtils.cxx:41
 TQTHnBaseUtils.cxx:42
 TQTHnBaseUtils.cxx:43
 TQTHnBaseUtils.cxx:44
 TQTHnBaseUtils.cxx:45
 TQTHnBaseUtils.cxx:46
 TQTHnBaseUtils.cxx:47
 TQTHnBaseUtils.cxx:48
 TQTHnBaseUtils.cxx:49
 TQTHnBaseUtils.cxx:50
 TQTHnBaseUtils.cxx:51
 TQTHnBaseUtils.cxx:52
 TQTHnBaseUtils.cxx:53
 TQTHnBaseUtils.cxx:54
 TQTHnBaseUtils.cxx:55
 TQTHnBaseUtils.cxx:56
 TQTHnBaseUtils.cxx:57
 TQTHnBaseUtils.cxx:58
 TQTHnBaseUtils.cxx:59
 TQTHnBaseUtils.cxx:60
 TQTHnBaseUtils.cxx:61
 TQTHnBaseUtils.cxx:62
 TQTHnBaseUtils.cxx:63
 TQTHnBaseUtils.cxx:64
 TQTHnBaseUtils.cxx:65
 TQTHnBaseUtils.cxx:66
 TQTHnBaseUtils.cxx:67
 TQTHnBaseUtils.cxx:68
 TQTHnBaseUtils.cxx:69
 TQTHnBaseUtils.cxx:70
 TQTHnBaseUtils.cxx:71
 TQTHnBaseUtils.cxx:72
 TQTHnBaseUtils.cxx:73
 TQTHnBaseUtils.cxx:74
 TQTHnBaseUtils.cxx:75
 TQTHnBaseUtils.cxx:76
 TQTHnBaseUtils.cxx:77
 TQTHnBaseUtils.cxx:78
 TQTHnBaseUtils.cxx:79
 TQTHnBaseUtils.cxx:80
 TQTHnBaseUtils.cxx:81
 TQTHnBaseUtils.cxx:82
 TQTHnBaseUtils.cxx:83
 TQTHnBaseUtils.cxx:84
 TQTHnBaseUtils.cxx:85
 TQTHnBaseUtils.cxx:86
 TQTHnBaseUtils.cxx:87
 TQTHnBaseUtils.cxx:88
 TQTHnBaseUtils.cxx:89
 TQTHnBaseUtils.cxx:90
 TQTHnBaseUtils.cxx:91
 TQTHnBaseUtils.cxx:92
 TQTHnBaseUtils.cxx:93
 TQTHnBaseUtils.cxx:94
 TQTHnBaseUtils.cxx:95
 TQTHnBaseUtils.cxx:96
 TQTHnBaseUtils.cxx:97
 TQTHnBaseUtils.cxx:98
 TQTHnBaseUtils.cxx:99
 TQTHnBaseUtils.cxx:100
 TQTHnBaseUtils.cxx:101
 TQTHnBaseUtils.cxx:102
 TQTHnBaseUtils.cxx:103
 TQTHnBaseUtils.cxx:104
 TQTHnBaseUtils.cxx:105
 TQTHnBaseUtils.cxx:106
 TQTHnBaseUtils.cxx:107
 TQTHnBaseUtils.cxx:108
 TQTHnBaseUtils.cxx:109
 TQTHnBaseUtils.cxx:110
 TQTHnBaseUtils.cxx:111
 TQTHnBaseUtils.cxx:112
 TQTHnBaseUtils.cxx:113
 TQTHnBaseUtils.cxx:114
 TQTHnBaseUtils.cxx:115
 TQTHnBaseUtils.cxx:116
 TQTHnBaseUtils.cxx:117
 TQTHnBaseUtils.cxx:118
 TQTHnBaseUtils.cxx:119
 TQTHnBaseUtils.cxx:120
 TQTHnBaseUtils.cxx:121
 TQTHnBaseUtils.cxx:122
 TQTHnBaseUtils.cxx:123
 TQTHnBaseUtils.cxx:124
 TQTHnBaseUtils.cxx:125
 TQTHnBaseUtils.cxx:126
 TQTHnBaseUtils.cxx:127
 TQTHnBaseUtils.cxx:128
 TQTHnBaseUtils.cxx:129
 TQTHnBaseUtils.cxx:130
 TQTHnBaseUtils.cxx:131
 TQTHnBaseUtils.cxx:132
 TQTHnBaseUtils.cxx:133
 TQTHnBaseUtils.cxx:134
 TQTHnBaseUtils.cxx:135
 TQTHnBaseUtils.cxx:136
 TQTHnBaseUtils.cxx:137
 TQTHnBaseUtils.cxx:138
 TQTHnBaseUtils.cxx:139
 TQTHnBaseUtils.cxx:140
 TQTHnBaseUtils.cxx:141
 TQTHnBaseUtils.cxx:142
 TQTHnBaseUtils.cxx:143
 TQTHnBaseUtils.cxx:144
 TQTHnBaseUtils.cxx:145
 TQTHnBaseUtils.cxx:146
 TQTHnBaseUtils.cxx:147
 TQTHnBaseUtils.cxx:148
 TQTHnBaseUtils.cxx:149
 TQTHnBaseUtils.cxx:150
 TQTHnBaseUtils.cxx:151
 TQTHnBaseUtils.cxx:152
 TQTHnBaseUtils.cxx:153
 TQTHnBaseUtils.cxx:154
 TQTHnBaseUtils.cxx:155
 TQTHnBaseUtils.cxx:156
 TQTHnBaseUtils.cxx:157
 TQTHnBaseUtils.cxx:158
 TQTHnBaseUtils.cxx:159
 TQTHnBaseUtils.cxx:160
 TQTHnBaseUtils.cxx:161
 TQTHnBaseUtils.cxx:162
 TQTHnBaseUtils.cxx:163
 TQTHnBaseUtils.cxx:164
 TQTHnBaseUtils.cxx:165
 TQTHnBaseUtils.cxx:166
 TQTHnBaseUtils.cxx:167
 TQTHnBaseUtils.cxx:168
 TQTHnBaseUtils.cxx:169
 TQTHnBaseUtils.cxx:170
 TQTHnBaseUtils.cxx:171
 TQTHnBaseUtils.cxx:172
 TQTHnBaseUtils.cxx:173
 TQTHnBaseUtils.cxx:174
 TQTHnBaseUtils.cxx:175
 TQTHnBaseUtils.cxx:176
 TQTHnBaseUtils.cxx:177
 TQTHnBaseUtils.cxx:178
 TQTHnBaseUtils.cxx:179
 TQTHnBaseUtils.cxx:180
 TQTHnBaseUtils.cxx:181
 TQTHnBaseUtils.cxx:182
 TQTHnBaseUtils.cxx:183
 TQTHnBaseUtils.cxx:184
 TQTHnBaseUtils.cxx:185
 TQTHnBaseUtils.cxx:186
 TQTHnBaseUtils.cxx:187
 TQTHnBaseUtils.cxx:188
 TQTHnBaseUtils.cxx:189
 TQTHnBaseUtils.cxx:190
 TQTHnBaseUtils.cxx:191
 TQTHnBaseUtils.cxx:192
 TQTHnBaseUtils.cxx:193
 TQTHnBaseUtils.cxx:194
 TQTHnBaseUtils.cxx:195
 TQTHnBaseUtils.cxx:196
 TQTHnBaseUtils.cxx:197
 TQTHnBaseUtils.cxx:198
 TQTHnBaseUtils.cxx:199
 TQTHnBaseUtils.cxx:200
 TQTHnBaseUtils.cxx:201
 TQTHnBaseUtils.cxx:202
 TQTHnBaseUtils.cxx:203
 TQTHnBaseUtils.cxx:204
 TQTHnBaseUtils.cxx:205
 TQTHnBaseUtils.cxx:206
 TQTHnBaseUtils.cxx:207
 TQTHnBaseUtils.cxx:208
 TQTHnBaseUtils.cxx:209
 TQTHnBaseUtils.cxx:210
 TQTHnBaseUtils.cxx:211
 TQTHnBaseUtils.cxx:212
 TQTHnBaseUtils.cxx:213
 TQTHnBaseUtils.cxx:214
 TQTHnBaseUtils.cxx:215
 TQTHnBaseUtils.cxx:216
 TQTHnBaseUtils.cxx:217
 TQTHnBaseUtils.cxx:218
 TQTHnBaseUtils.cxx:219
 TQTHnBaseUtils.cxx:220
 TQTHnBaseUtils.cxx:221
 TQTHnBaseUtils.cxx:222
 TQTHnBaseUtils.cxx:223
 TQTHnBaseUtils.cxx:224
 TQTHnBaseUtils.cxx:225
 TQTHnBaseUtils.cxx:226
 TQTHnBaseUtils.cxx:227
 TQTHnBaseUtils.cxx:228
 TQTHnBaseUtils.cxx:229
 TQTHnBaseUtils.cxx:230
 TQTHnBaseUtils.cxx:231
 TQTHnBaseUtils.cxx:232
 TQTHnBaseUtils.cxx:233
 TQTHnBaseUtils.cxx:234
 TQTHnBaseUtils.cxx:235
 TQTHnBaseUtils.cxx:236
 TQTHnBaseUtils.cxx:237
 TQTHnBaseUtils.cxx:238
 TQTHnBaseUtils.cxx:239
 TQTHnBaseUtils.cxx:240
 TQTHnBaseUtils.cxx:241
 TQTHnBaseUtils.cxx:242
 TQTHnBaseUtils.cxx:243
 TQTHnBaseUtils.cxx:244
 TQTHnBaseUtils.cxx:245
 TQTHnBaseUtils.cxx:246
 TQTHnBaseUtils.cxx:247
 TQTHnBaseUtils.cxx:248
 TQTHnBaseUtils.cxx:249
 TQTHnBaseUtils.cxx:250
 TQTHnBaseUtils.cxx:251
 TQTHnBaseUtils.cxx:252
 TQTHnBaseUtils.cxx:253
 TQTHnBaseUtils.cxx:254
 TQTHnBaseUtils.cxx:255
 TQTHnBaseUtils.cxx:256
 TQTHnBaseUtils.cxx:257
 TQTHnBaseUtils.cxx:258
 TQTHnBaseUtils.cxx:259
 TQTHnBaseUtils.cxx:260
 TQTHnBaseUtils.cxx:261
 TQTHnBaseUtils.cxx:262
 TQTHnBaseUtils.cxx:263
 TQTHnBaseUtils.cxx:264
 TQTHnBaseUtils.cxx:265
 TQTHnBaseUtils.cxx:266
 TQTHnBaseUtils.cxx:267
 TQTHnBaseUtils.cxx:268
 TQTHnBaseUtils.cxx:269
 TQTHnBaseUtils.cxx:270
 TQTHnBaseUtils.cxx:271
 TQTHnBaseUtils.cxx:272
 TQTHnBaseUtils.cxx:273
 TQTHnBaseUtils.cxx:274
 TQTHnBaseUtils.cxx:275
 TQTHnBaseUtils.cxx:276
 TQTHnBaseUtils.cxx:277
 TQTHnBaseUtils.cxx:278
 TQTHnBaseUtils.cxx:279
 TQTHnBaseUtils.cxx:280
 TQTHnBaseUtils.cxx:281
 TQTHnBaseUtils.cxx:282
 TQTHnBaseUtils.cxx:283
 TQTHnBaseUtils.cxx:284
 TQTHnBaseUtils.cxx:285
 TQTHnBaseUtils.cxx:286
 TQTHnBaseUtils.cxx:287
 TQTHnBaseUtils.cxx:288
 TQTHnBaseUtils.cxx:289
 TQTHnBaseUtils.cxx:290
 TQTHnBaseUtils.cxx:291
 TQTHnBaseUtils.cxx:292
 TQTHnBaseUtils.cxx:293
 TQTHnBaseUtils.cxx:294
 TQTHnBaseUtils.cxx:295
 TQTHnBaseUtils.cxx:296
 TQTHnBaseUtils.cxx:297
 TQTHnBaseUtils.cxx:298
 TQTHnBaseUtils.cxx:299
 TQTHnBaseUtils.cxx:300
 TQTHnBaseUtils.cxx:301
 TQTHnBaseUtils.cxx:302
 TQTHnBaseUtils.cxx:303
 TQTHnBaseUtils.cxx:304
 TQTHnBaseUtils.cxx:305
 TQTHnBaseUtils.cxx:306
 TQTHnBaseUtils.cxx:307
 TQTHnBaseUtils.cxx:308
 TQTHnBaseUtils.cxx:309
 TQTHnBaseUtils.cxx:310
 TQTHnBaseUtils.cxx:311
 TQTHnBaseUtils.cxx:312
 TQTHnBaseUtils.cxx:313
 TQTHnBaseUtils.cxx:314
 TQTHnBaseUtils.cxx:315
 TQTHnBaseUtils.cxx:316
 TQTHnBaseUtils.cxx:317
 TQTHnBaseUtils.cxx:318
 TQTHnBaseUtils.cxx:319
 TQTHnBaseUtils.cxx:320
 TQTHnBaseUtils.cxx:321
 TQTHnBaseUtils.cxx:322
 TQTHnBaseUtils.cxx:323
 TQTHnBaseUtils.cxx:324
 TQTHnBaseUtils.cxx:325
 TQTHnBaseUtils.cxx:326
 TQTHnBaseUtils.cxx:327
 TQTHnBaseUtils.cxx:328
 TQTHnBaseUtils.cxx:329
 TQTHnBaseUtils.cxx:330
 TQTHnBaseUtils.cxx:331
 TQTHnBaseUtils.cxx:332
 TQTHnBaseUtils.cxx:333
 TQTHnBaseUtils.cxx:334
 TQTHnBaseUtils.cxx:335
 TQTHnBaseUtils.cxx:336
 TQTHnBaseUtils.cxx:337
 TQTHnBaseUtils.cxx:338
 TQTHnBaseUtils.cxx:339
 TQTHnBaseUtils.cxx:340
 TQTHnBaseUtils.cxx:341
 TQTHnBaseUtils.cxx:342
 TQTHnBaseUtils.cxx:343
 TQTHnBaseUtils.cxx:344
 TQTHnBaseUtils.cxx:345
 TQTHnBaseUtils.cxx:346
 TQTHnBaseUtils.cxx:347
 TQTHnBaseUtils.cxx:348
 TQTHnBaseUtils.cxx:349
 TQTHnBaseUtils.cxx:350
 TQTHnBaseUtils.cxx:351
 TQTHnBaseUtils.cxx:352
 TQTHnBaseUtils.cxx:353
 TQTHnBaseUtils.cxx:354
 TQTHnBaseUtils.cxx:355
 TQTHnBaseUtils.cxx:356
 TQTHnBaseUtils.cxx:357
 TQTHnBaseUtils.cxx:358
 TQTHnBaseUtils.cxx:359
 TQTHnBaseUtils.cxx:360
 TQTHnBaseUtils.cxx:361
 TQTHnBaseUtils.cxx:362
 TQTHnBaseUtils.cxx:363
 TQTHnBaseUtils.cxx:364
 TQTHnBaseUtils.cxx:365
 TQTHnBaseUtils.cxx:366
 TQTHnBaseUtils.cxx:367
 TQTHnBaseUtils.cxx:368
 TQTHnBaseUtils.cxx:369
 TQTHnBaseUtils.cxx:370
 TQTHnBaseUtils.cxx:371
 TQTHnBaseUtils.cxx:372
 TQTHnBaseUtils.cxx:373
 TQTHnBaseUtils.cxx:374
 TQTHnBaseUtils.cxx:375
 TQTHnBaseUtils.cxx:376
 TQTHnBaseUtils.cxx:377
 TQTHnBaseUtils.cxx:378
 TQTHnBaseUtils.cxx:379
 TQTHnBaseUtils.cxx:380
 TQTHnBaseUtils.cxx:381
 TQTHnBaseUtils.cxx:382
 TQTHnBaseUtils.cxx:383
 TQTHnBaseUtils.cxx:384
 TQTHnBaseUtils.cxx:385
 TQTHnBaseUtils.cxx:386
 TQTHnBaseUtils.cxx:387
 TQTHnBaseUtils.cxx:388
 TQTHnBaseUtils.cxx:389
 TQTHnBaseUtils.cxx:390
 TQTHnBaseUtils.cxx:391
 TQTHnBaseUtils.cxx:392
 TQTHnBaseUtils.cxx:393
 TQTHnBaseUtils.cxx:394
 TQTHnBaseUtils.cxx:395
 TQTHnBaseUtils.cxx:396
 TQTHnBaseUtils.cxx:397
 TQTHnBaseUtils.cxx:398
 TQTHnBaseUtils.cxx:399
 TQTHnBaseUtils.cxx:400
 TQTHnBaseUtils.cxx:401
 TQTHnBaseUtils.cxx:402
 TQTHnBaseUtils.cxx:403
 TQTHnBaseUtils.cxx:404
 TQTHnBaseUtils.cxx:405
 TQTHnBaseUtils.cxx:406
 TQTHnBaseUtils.cxx:407
 TQTHnBaseUtils.cxx:408
 TQTHnBaseUtils.cxx:409
 TQTHnBaseUtils.cxx:410
 TQTHnBaseUtils.cxx:411
 TQTHnBaseUtils.cxx:412
 TQTHnBaseUtils.cxx:413
 TQTHnBaseUtils.cxx:414
 TQTHnBaseUtils.cxx:415
 TQTHnBaseUtils.cxx:416
 TQTHnBaseUtils.cxx:417
 TQTHnBaseUtils.cxx:418
 TQTHnBaseUtils.cxx:419
 TQTHnBaseUtils.cxx:420
 TQTHnBaseUtils.cxx:421
 TQTHnBaseUtils.cxx:422
 TQTHnBaseUtils.cxx:423
 TQTHnBaseUtils.cxx:424
 TQTHnBaseUtils.cxx:425
 TQTHnBaseUtils.cxx:426
 TQTHnBaseUtils.cxx:427
 TQTHnBaseUtils.cxx:428
 TQTHnBaseUtils.cxx:429
 TQTHnBaseUtils.cxx:430
 TQTHnBaseUtils.cxx:431
 TQTHnBaseUtils.cxx:432
 TQTHnBaseUtils.cxx:433
 TQTHnBaseUtils.cxx:434
 TQTHnBaseUtils.cxx:435
 TQTHnBaseUtils.cxx:436
 TQTHnBaseUtils.cxx:437
 TQTHnBaseUtils.cxx:438
 TQTHnBaseUtils.cxx:439
 TQTHnBaseUtils.cxx:440
 TQTHnBaseUtils.cxx:441
 TQTHnBaseUtils.cxx:442
 TQTHnBaseUtils.cxx:443
 TQTHnBaseUtils.cxx:444
 TQTHnBaseUtils.cxx:445
 TQTHnBaseUtils.cxx:446
 TQTHnBaseUtils.cxx:447
 TQTHnBaseUtils.cxx:448
 TQTHnBaseUtils.cxx:449
 TQTHnBaseUtils.cxx:450
 TQTHnBaseUtils.cxx:451
 TQTHnBaseUtils.cxx:452
 TQTHnBaseUtils.cxx:453
 TQTHnBaseUtils.cxx:454
 TQTHnBaseUtils.cxx:455
 TQTHnBaseUtils.cxx:456
 TQTHnBaseUtils.cxx:457
 TQTHnBaseUtils.cxx:458
 TQTHnBaseUtils.cxx:459
 TQTHnBaseUtils.cxx:460
 TQTHnBaseUtils.cxx:461
 TQTHnBaseUtils.cxx:462
 TQTHnBaseUtils.cxx:463
 TQTHnBaseUtils.cxx:464
 TQTHnBaseUtils.cxx:465
 TQTHnBaseUtils.cxx:466
 TQTHnBaseUtils.cxx:467
 TQTHnBaseUtils.cxx:468
 TQTHnBaseUtils.cxx:469
 TQTHnBaseUtils.cxx:470
 TQTHnBaseUtils.cxx:471
 TQTHnBaseUtils.cxx:472
 TQTHnBaseUtils.cxx:473
 TQTHnBaseUtils.cxx:474
 TQTHnBaseUtils.cxx:475
 TQTHnBaseUtils.cxx:476
 TQTHnBaseUtils.cxx:477
 TQTHnBaseUtils.cxx:478
 TQTHnBaseUtils.cxx:479
 TQTHnBaseUtils.cxx:480
 TQTHnBaseUtils.cxx:481
 TQTHnBaseUtils.cxx:482
 TQTHnBaseUtils.cxx:483
 TQTHnBaseUtils.cxx:484
 TQTHnBaseUtils.cxx:485
 TQTHnBaseUtils.cxx:486
 TQTHnBaseUtils.cxx:487
 TQTHnBaseUtils.cxx:488
 TQTHnBaseUtils.cxx:489
 TQTHnBaseUtils.cxx:490
 TQTHnBaseUtils.cxx:491
 TQTHnBaseUtils.cxx:492
 TQTHnBaseUtils.cxx:493
 TQTHnBaseUtils.cxx:494
 TQTHnBaseUtils.cxx:495
 TQTHnBaseUtils.cxx:496
 TQTHnBaseUtils.cxx:497
 TQTHnBaseUtils.cxx:498
 TQTHnBaseUtils.cxx:499
 TQTHnBaseUtils.cxx:500
 TQTHnBaseUtils.cxx:501
 TQTHnBaseUtils.cxx:502
 TQTHnBaseUtils.cxx:503
 TQTHnBaseUtils.cxx:504
 TQTHnBaseUtils.cxx:505
 TQTHnBaseUtils.cxx:506
 TQTHnBaseUtils.cxx:507
 TQTHnBaseUtils.cxx:508
 TQTHnBaseUtils.cxx:509
 TQTHnBaseUtils.cxx:510
 TQTHnBaseUtils.cxx:511
 TQTHnBaseUtils.cxx:512