ROOT logo
//*-- Author :    Ole Hansen   15-Jun-01

//////////////////////////////////////////////////////////////////////////
//
// THaAnalysisObject
//
// Abstract base class for a detector or subdetector.
//
// Derived classes must define all internal variables, a constructor 
// that registers any internal variables of interest in the global 
// physics variable list, and a Decode() method that fills the variables
// based on the information in the THaEvData structure.
//
//////////////////////////////////////////////////////////////////////////

#include "THaAnalysisObject.h"
#include "THaVarList.h"
#include "THaTextvars.h"
#include "THaGlobals.h"
#include "TClass.h"
#include "TDatime.h"
#include "TROOT.h"
#include "TMath.h"
#include "TError.h"
#include "TVector3.h"
#include "TSystem.h"
#include "TObjArray.h"
#include "TVirtualMutex.h"
#include "TThread.h"
#include "Varargs.h"

#include <cstring>
#include <cctype>
#include <errno.h>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <cstdio>
#include <string>
#ifdef HAS_SSTREAM
 #include <sstream>
 #define ISSTREAM istringstream
 #define OSSTREAM ostringstream
#else
 #include <strstream>
 #define ISSTREAM istrstream
 #define OSSTREAM ostrstream
#endif
#include <stdexcept>
#include <cassert>
#include <map>
#include <limits>

using namespace std;
typedef string::size_type ssiz_t;
typedef vector<string>::iterator vsiter_t;

TList* THaAnalysisObject::fgModules = NULL;

const Double_t THaAnalysisObject::kBig = 1.e38;

// Mutex for concurrent access to global Here function
static TVirtualMutex* gHereMutex = 0;

//_____________________________________________________________________________
THaAnalysisObject::THaAnalysisObject( const char* name, 
				      const char* description ) :
  TNamed(name,description), fPrefix(NULL), fStatus(kNotinit), 
  fDebug(0), fIsInit(false), fIsSetup(false), fProperties(0),
  fOKOut(false), fInitDate(19950101,0)
{
  // Constructor

  if( !fgModules ) fgModules = new TList;
  fgModules->Add( this );
}

//_____________________________________________________________________________
THaAnalysisObject::THaAnalysisObject( )
  : fPrefix(NULL), fStatus(kNotinit), fDebug(0), fIsInit(false),
    fIsSetup(false), fProperties(), fOKOut(false)
{
  // only for ROOT I/O
}

//_____________________________________________________________________________
THaAnalysisObject::~THaAnalysisObject()
{
  // Destructor

  if (fgModules) {
    fgModules->Remove( this );
    if( fgModules->GetSize() == 0 ) {
      delete fgModules;
      fgModules = 0;
    }
  }
  delete [] fPrefix; fPrefix = 0;
}

//_____________________________________________________________________________
Int_t THaAnalysisObject::Begin( THaRunBase* /* run */ )
{
  // Method usually called right before the start of the event loop
  // for 'run'. Begin() is similar to Init(), but since there is a default
  // Init() implementing standard database and global variable setup,
  // Begin() can be used to implement start-of-run setup tasks for each
  // module cleanly without interfering with the standard Init() prodecure.
  //
  // The default Begin() method does nothing.

  return 0;
}

//_____________________________________________________________________________
Int_t THaAnalysisObject::DefineVariables( EMode /* mode */ )
{ 
  // Default method for defining global variables. Currently does nothing.

  return kOK;
}

//_____________________________________________________________________________
Int_t THaAnalysisObject::DefineVarsFromList( const VarDef* list, EMode mode,
					     const char* var_prefix ) const
{ 
  return DefineVarsFromList( list, kVarDef, mode, var_prefix );
}

//_____________________________________________________________________________
Int_t THaAnalysisObject::DefineVarsFromList( const RVarDef* list, EMode mode,
					     const char* var_prefix ) const
{ 
  return DefineVarsFromList( list, kRVarDef, mode, var_prefix );
}
 
//_____________________________________________________________________________
Int_t THaAnalysisObject::DefineVarsFromList( const void* list, 
					     EType type, EMode mode,
					     const char* var_prefix ) const
{
  // Add/delete variables defined in 'list' to/from the list of global 
  // variables, using prefix of the current apparatus.
  // Internal function that can be called during initialization.

  TString here(GetClassName());
  here.Append("::DefineVarsFromList");
  return DefineVarsFromList( list, type, mode, var_prefix, this, 
			     fPrefix, here.Data() );
}

//_____________________________________________________________________________
Int_t THaAnalysisObject::DefineVarsFromList( const void* list, 
					     EType type, EMode mode,
					     const char* var_prefix,
					     const TObject* obj,
					     const char* prefix,
					     const char* here )
{
  // Actual implementation of the variable definition utility function.
  // Static function that can be used by classes other than THaAnalysisObjects

  if( !gHaVars ) {
    TString action;
    if( mode == kDefine )
      action = "defined";
    else if( mode == kDelete )
      action = "deleted (this is safe when exiting)";
    ::Warning( ::Here(here,prefix), "No global variable list found. "
	       "No variables %s.",  action.Data() );
    return (mode==kDefine ? kInitError : kOK);
  }

  if( mode == kDefine ) {
    if( type == kVarDef )
      gHaVars->DefineVariables( static_cast<const VarDef*>(list),
				prefix, ::Here(here,prefix) );
    else if( type == kRVarDef )
      gHaVars->DefineVariables( static_cast<const RVarDef*>(list), obj,
				prefix, ::Here(here,prefix), var_prefix );
  }
  else if( mode == kDelete ) {
    if( type == kVarDef ) {
      const VarDef* item;
      const VarDef* theList = static_cast<const VarDef*>(list);
      while( (item = theList++) && item->name ) {
	TString name(prefix);
	name.Append( item->name );
	gHaVars->RemoveName( name );
      }
    } else if( type == kRVarDef ) {
      const RVarDef* item;
      const RVarDef* theList = static_cast<const RVarDef*>(list);
      while( (item = theList++) && item->name ) {
	TString name(prefix);
	name.Append( item->name );
	gHaVars->RemoveName( name );
      }
    }
  }

  return kOK;
}

//_____________________________________________________________________________
Int_t THaAnalysisObject::End( THaRunBase* /* run */ )
{
  // Method usually called right after the end of the event loop for 'run'.
  // May be used by modules to clean up, compute averages, write summaries, etc.
  //
  // The default End() method does nothing.

  return 0;
}

//_____________________________________________________________________________
THaAnalysisObject* THaAnalysisObject::FindModule( const char* name,
						  const char* classname,
						  bool do_error )
{
  // Locate the object 'name' in the global list of Analysis Modules 
  // and check if it inherits from 'classname' (if given), and whether 
  // it is properly initialized.
  // Return pointer to valid object, else return NULL.
  // If do_error == true (default), also print error message and set fStatus
  // to kInitError.
  // If do_error == false, don't print error messages and not test if object is
  // initialized.
  //
  // This function is intended to be called from physics module initialization
  // routines.

  static const char* const here = "FindModule";
  static const char* const anaobj = "THaAnalysisObject";

  if( !name || !*name ) {
    if( do_error )
      Error( Here(here), "No module name given." );
    fStatus = kInitError;
    return NULL;
  }

  // Find the module in the list, comparing 'name' to the module's fPrefix
  TIter next(fgModules);
  TObject* obj = 0;
  while( (obj = next()) ) {
#ifdef NDEBUG
    THaAnalysisObject* module = static_cast<THaAnalysisObject*>(obj);
#else
    THaAnalysisObject* module = dynamic_cast<THaAnalysisObject*>(obj);
    assert(module);
#endif
    const char* cprefix = module->GetPrefix();
    if( !cprefix ) {
      module->MakePrefix();
      cprefix = module->GetPrefix();
      if( !cprefix )
	continue;
    }
    TString prefix(cprefix);
    if( prefix.EndsWith(".") )
      prefix.Chop();
    if( prefix == name )
      break;
  }
  if( !obj ) {
    if( do_error )
      Error( Here(here), "Module %s does not exist.", name );
    fStatus = kInitError;
    return NULL;
  }

  // Type check (similar to dynamic_cast, except resolving the class name as
  // a string at run time
  if( !obj->IsA()->InheritsFrom( anaobj )) {
    if( do_error )
      Error( Here(here), "Module %s (%s) is not a %s.",
	     obj->GetName(), obj->GetTitle(), anaobj );
    fStatus = kInitError;
    return NULL;
  }
  if( classname && *classname && strcmp(classname,anaobj) &&
      !obj->IsA()->InheritsFrom( classname )) {
    if( do_error )
      Error( Here(here), "Module %s (%s) is not a %s.",
	     obj->GetName(), obj->GetTitle(), classname );
    fStatus = kInitError;
    return NULL;
  }
  THaAnalysisObject* aobj = static_cast<THaAnalysisObject*>( obj );
  if( do_error ) {
    if( !aobj->IsOK() ) {
      Error( Here(here), "Module %s (%s) not initialized.",
	     obj->GetName(), obj->GetTitle() );
      fStatus = kInitError;
      return NULL;
    }
  }
  return aobj;
}

//_____________________________________________________________________________
vector<string> THaAnalysisObject::GetDBFileList( const char* name, 
						 const TDatime& date,
						 const char* here )
{
  // Return the database file searchlist as a vector of strings.
  // The file names are relative to the current directory.

  static const string defaultdir = "DEFAULT";
#ifdef WIN32
  static const string dirsep = "\\", allsep = "/\\";
#else
  static const string dirsep = "/", allsep = "/";
#endif

  const char* dbdir = NULL;
  const char* result;
  void* dirp;
  size_t pos;
  vector<string> time_dirs, dnames, fnames;
  vsiter_t it;
  string item, filename, thedir;
  Int_t item_date;
  bool have_defaultdir = false, found = false;

  if( !name || !*name )
    goto exit;

  // If name contains a directory separator, we take the name verbatim
  filename = name;
  if( filename.find_first_of(allsep) != string::npos ) {
    fnames.push_back( filename );
    goto exit;
  }

  // Build search list of directories
  if( (dbdir = gSystem->Getenv("DB_DIR")))
    dnames.push_back( dbdir );
  dnames.push_back( "DB" );
  dnames.push_back( "db" );
  dnames.push_back( "." );

  // Try to open the database directories in the search list.
  // The first directory that can be opened is taken as the database
  // directory. Subsequent directories are ignored.
  it = dnames.begin();
  while( !(dirp = gSystem->OpenDirectory( (*it).c_str() )) && 
	 (++it != dnames.end()) ) {}

  // None of the directories can be opened?
  if( it == dnames.end() ) {
    ::Error( here, "Cannot open any database directories. Check your disk!");
    goto exit;
  }

  // Pointer to database directory string
  thedir = *it;

  // In the database directory, get the names of all subdirectories matching 
  // a YYYYMMDD pattern.
  while( (result = gSystem->GetDirEntry(dirp)) ) {
    item = result;
    if( item.length() == 8 ) {
      for( pos=0; pos<8; ++pos )
	if( !isdigit(item[pos])) break;
      if( pos==8 )
	time_dirs.push_back( item );
    } else if ( item == defaultdir )
      have_defaultdir = true;
  }
  gSystem->FreeDirectory(dirp);

  // Search a date-coded subdirectory that corresponds to the requested date.
  if( time_dirs.size() > 0 ) {
    sort( time_dirs.begin(), time_dirs.end() );
    for( it = time_dirs.begin(); it != time_dirs.end(); ++it ) {
      item_date = atoi((*it).c_str());
      if( it == time_dirs.begin() && date.GetDate() < item_date )
	break;
      if( it != time_dirs.begin() && date.GetDate() < item_date ) {
	--it;
	found = true;
	break;
      }
      // Assume that the last directory is valid until infinity.
      if( it+1 == time_dirs.end() && date.GetDate() >= item_date ) {
	found = true;
	break;
      }
    }
  }

  // Construct the database file name. It is of the form db_<prefix>.dat.
  // Subdetectors use the same files as their parent detectors!
  // If filename does not start with "db_", make it so
  if( filename.substr(0,3) != "db_" )
    filename.insert(0,"db_");
  // If filename does not end with ".dat", make it so
#ifndef NDEBUG
  // should never happen
  assert( filename.length() >= 4 );
#else
  if( filename.length() < 4 ) { fnames.clear(); goto exit; }
#endif
  if( *filename.rbegin() == '.' ) {
    filename += "dat";
  } else if( filename.substr(filename.length()-4) != ".dat" ) {
    filename += ".dat";
  }

  // Build the searchlist of file names in the order:
  // ./filename <dbdir>/<date-dir>/filename 
  //    <dbdir>/DEFAULT/filename <dbdir>/filename
  fnames.push_back( filename );
  if( found ) {
    item = thedir + dirsep + *it + dirsep + filename;
    fnames.push_back( item );
  }
  if( have_defaultdir ) {
    item = thedir + dirsep + defaultdir + dirsep + filename;
    fnames.push_back( item );
  }
  fnames.push_back( thedir + dirsep + filename );

 exit:
  return fnames;
}

//_____________________________________________________________________________
const char* THaAnalysisObject::GetDBFileName() const
{
  return GetPrefix();
}

//_____________________________________________________________________________
const char* THaAnalysisObject::GetClassName() const
{
  const char* classname = "UnknownClass";
  if( TROOT::Initialized() )
    classname = ClassName();
  return classname;
}

//_____________________________________________________________________________
void THaAnalysisObject::DoError( int level, const char* here,
				 const char* fmt, va_list va) const
{
  // Interface to ErrorHandler. Inserts this object's name after the class name.
  // If 'here' = ("prefix")::method -> print <Class("prefix")::method>
  // If 'here' = method             -> print <Class::method>

  TString location(here);
  if( !location.BeginsWith("(\"") )
    location.Prepend("::");

  location.Prepend(GetClassName());

  ::ErrorHandler(level, location.Data(), fmt, va);
}

//_____________________________________________________________________________
const char* Here( const char* method, const char* prefix )
{
  // Utility function for error messages. The return value points to a static
  // string buffer that is unique to the current thread.
  // There are two usage cases:
  // ::Here("method","prefix")        -> returns ("prefix")::method
  // ::Here("Class::method","prefix") -> returns Class("prefix")::method

  // One static string buffer per thread ID
  static map<Long_t,TString> buffers;

  TString txt;
  if( prefix && *prefix ) {
    TString full_prefix(prefix);
    // delete trailing dot of prefix, if any
    if( full_prefix.EndsWith(".") )
      full_prefix.Chop();
    full_prefix.Prepend("(\""); full_prefix.Append("\")");
    const char* scope;
    if( method && *method && (scope = strstr(method, "::")) ) {
      Ssiz_t pos = scope - method;
      txt = method;
      assert(pos >= 0 && pos < txt.Length());
      txt.Insert(pos, full_prefix);
      method = 0;
    } else {
      txt = full_prefix + "::";
    }
  }
  if( method )
    txt.Append(method);

  R__LOCKGUARD2(gHereMutex);

  TString& ret = (buffers[ TThread::SelfId() ] = txt);

  return ret.Data(); // pointer to the C-string of a std::string in static map
}

//_____________________________________________________________________________
const char* THaAnalysisObject::Here( const char* here ) const
{
  // Return a string consisting of ("fPrefix")::here
  // Used for generating diagnostic messages.
  // The return value points to an internal static buffer that
  // one should not try to delete ;)
  
  return ::Here( here, fPrefix );
}

//_____________________________________________________________________________
const char* THaAnalysisObject::ClassNameHere( const char* here ) const
{
  // Return a string consisting of Class("fPrefix")::here

  TString method(here);
  if( method.Index("::") == kNPOS ) {
    method.Prepend("::");
    method.Prepend(GetClassName());
  }
  return ::Here( method.Data(), fPrefix );
}

//_____________________________________________________________________________
THaAnalysisObject::EStatus THaAnalysisObject::Init()
{
  // Initialize this object for current time. See Init(date) below.

  return Init( TDatime() );
}

//_____________________________________________________________________________
THaAnalysisObject::EStatus THaAnalysisObject::Init( const TDatime& date )
{
  // Common Init function for THaAnalysisObjects.
  //
  // Check if this object or any base classes have defined a custom 
  // ReadDatabase() method. If so, open the database file called 
  // "db_<fPrefix>dat" and, if successful, call ReadDatabase().
  // 
  // This implementation will change once the real database is  available.

  static const char* const here = "Init";

  if( IsZombie() )
    return fStatus = kNotinit;

  fInitDate = date;
  
  const char* fnam = "run.";

  // Generate the name prefix for global variables. Do this here, not in
  // the constructor, so we can use a virtual function - detectors and
  // especially subdetectors may have their own idea what prefix they like.
  MakePrefix();

  // Open the run database and call the reader. If database cannot be opened,
  // fail only if this object needs the run database
  // Call this object's actual database reader
  Int_t status = ReadRunDatabase(date);
  if( status && (status != kFileError || (fProperties & kNeedsRunDB) != 0))
    goto err;

  // Read the database for this object.
  // Don't bother if this object has not implemented its own database reader.

  // Note: requires ROOT >= 3.01 because of TClass::GetMethodAllAny()
  if( IsA()->GetMethodAllAny("ReadDatabase") != 
      gROOT->GetClass("THaAnalysisObject")->GetMethodAllAny("ReadDatabase") ) {

    // Call this object's actual database reader
    fnam = GetDBFileName();
    try {
      status = ReadDatabase(date);
    }
    catch( std::bad_alloc ) {
      Error( Here(here), "Out of memory in ReadDatabase. Machine too busy? "
	     "Call expert." );
      status = kInitError;
    }
    catch( ... ) {
      Error( Here(here), "Exception caught in ReadDatabase. Not initialized. "
	     "Call expert." );
      status = kInitError;
    }
    if( status )
      goto err;
  } 
  else if ( fDebug>0 ) {
    Info( Here(here), "No ReadDatabase function defined. Database not read." );
  }

  // Define this object's variables.
  status = DefineVariables(kDefine);

  Clear("I");
  goto exit;

 err:
  if( status == kFileError )
    Error( Here(here), "Cannot open database file db_%sdat", fnam );
  else if( status == kInitError )
    Error( Here(here), "Error when reading file db_%sdat", fnam);
 exit:
  return fStatus = (EStatus)status;
}

//_____________________________________________________________________________
Int_t THaAnalysisObject::InitOutput( THaOutput* /* output */ )
{
  // This method is called from THaAnalyzer::DoInit,
  // after THaOutput is initialized.
  // The TTree to work with can be retrieved like:
  // TTree *tree = output->GetTree()
  //
  // tree is the TTree to append the branches to
  //
  // construct all branches here. Set kOKOut=true if
  // all is okay, and return 0
  //
  // anything else will trigger error messages.
  fOKOut = true;
  return kOK;
}

//_____________________________________________________________________________
void THaAnalysisObject::MakePrefix( const char* basename )
{
  // Set up name prefix for global variables. 
  // Internal function called by constructors of derived classes.
  // If basename != NULL, 
  //   fPrefix = basename  + "." + GetName() + ".",
  // else 
  //   fPrefix = GetName() + "."

  delete [] fPrefix;
  if( basename && *basename ) {
    fPrefix = new char[ strlen(basename) + strlen(GetName()) + 3 ];
    strcpy( fPrefix, basename );
    strcat( fPrefix, "." );
  } else {
    fPrefix = new char[ strlen(GetName()) + 2 ];
    *fPrefix = 0;
  }
  strcat( fPrefix, GetName() );
  strcat( fPrefix, "." );
}

//_____________________________________________________________________________
void THaAnalysisObject::MakePrefix()
{
  // Make default prefix: GetName() + "."

  MakePrefix(0);
}

//_____________________________________________________________________________
FILE* THaAnalysisObject::OpenFile( const char *name, const TDatime& date,
				   const char *here, const char *filemode, 
				   const int debug_flag )
{
  // Open database file and return a pointer to the C-style file descriptor.

  // Ensure input is sane
  if( !name || !*name )
    return NULL;
  if( !here )
    here="";
  if( !filemode )
    filemode="r";

  // Get list of database file candidates and try to open them in turn
  FILE* fi = NULL;
  vector<string> fnames( GetDBFileList(name, date, here) );
  if( !fnames.empty() ) {
    vsiter_t it = fnames.begin();
    do {
      if( debug_flag>1 )
	cout << "Info in <" << here << ">: Opening database file " << *it;
      // Open the database file
      fi = fopen( (*it).c_str(), filemode);
      
      if( debug_flag>1 ) 
	if( !fi ) cout << " ... failed" << endl;
	else      cout << " ... ok" << endl;
      else if( debug_flag>0 && fi )
	cout << "<" << here << ">: Opened database file " << *it << endl;
      // continue until we succeed
    } while ( !fi && ++it != fnames.end() );
  }
  if( !fi && debug_flag>0 ) {
    ::Error(here,"Cannot open database file db_%s%sdat",name,
	    (name[strlen(name)-1]=='.'?"":"."));
  }

  return fi;
}

//_____________________________________________________________________________
FILE* THaAnalysisObject::OpenFile( const TDatime& date )
{ 
  // Default method for opening database file

  return OpenFile(GetDBFileName(), date, ClassNameHere("OpenFile()"), "r", fDebug);
}

//_____________________________________________________________________________
FILE* THaAnalysisObject::OpenRunDBFile( const TDatime& date )
{ 
  // Default method for opening run database file

  return OpenFile("run", date, ClassNameHere("OpenFile()"), "r", fDebug);
}

//_____________________________________________________________________________
char* THaAnalysisObject::ReadComment( FILE* fp, char *buf, const int len )
{
  // Read database comment lines (those not starting with a space (' ')),
  // returning the comment.
  // If the line is data, then nothing is done and NULL is returned,
  // so one can search for the next data line with:
  //   while ( ReadComment(fp, buf, len) );
  int ch = fgetc(fp);  // peak ahead one character
  ungetc(ch,fp);

  if (ch == EOF || ch == ' ')
    return NULL; // a real line of data
  
  char *s= fgets(buf,len,fp); // read the comment
  return s;
}

//_____________________________________________________________________________
Int_t THaAnalysisObject::ReadDatabase( const TDatime& /* date */ )
{
  // Default database reader. Currently does nothing.

  return kOK;
}

//_____________________________________________________________________________
Int_t THaAnalysisObject::ReadRunDatabase( const TDatime& date )
{
  // Default run database reader. Reads one key, <prefix>.config, into 
  // fConfig. If not found, fConfig is empty. If fConfig was explicitly
  // set with SetConfig(), the run database is not parsed and fConfig is
  // not touched.

  if( !fPrefix ) return kInitError;

  if( (fProperties & kConfigOverride) == 0) {
    FILE* file = OpenRunDBFile( date );
    if( !file ) return kFileError;

    TString name(fPrefix); name.Append("config");
    Int_t ret = LoadDBvalue( file, date, name, fConfig );
    fclose(file);

    if( ret == -1 ) return kFileError;
    if( ret < 0 )   return kInitError;
    if( ret == 1 )  fConfig = "";
  }
  return kOK;
}

//_____________________________________________________________________________
Int_t THaAnalysisObject::RemoveVariables()
{
  // Default method for removing global variables of this object

  return DefineVariables( kDelete );
}

//_____________________________________________________________________________
void THaAnalysisObject::SetName( const char* name )
{
  // Set/change the name of the object.

  if( !name || !*name ) {
    Warning( Here("SetName()"),
	     "Cannot set an empty object name. Name not set.");
    return;
  }
  TNamed::SetName( name );
  MakePrefix();
}

//_____________________________________________________________________________
void THaAnalysisObject::SetNameTitle( const char* name, const char* title )
{
  // Set name and title of the object.

  SetName( name );
  SetTitle( title );
}

//_____________________________________________________________________________
void THaAnalysisObject::SetConfig( const char* label )
{
  // Set the "configuration" to select in the database.
  // In text-based database files, this will make the database reader
  // seek to a section header [ config=label ] if the module supports it.

  fConfig = label;
  if( fConfig.IsNull() )
    fProperties &= ~kConfigOverride;
  else
    fProperties |= kConfigOverride;
}

//_____________________________________________________________________________
void THaAnalysisObject::SetDebug( Int_t level )
{
  // Set debug level

  fDebug = level;
}

//---------- Geometry functions -----------------------------------------------
//_____________________________________________________________________________
Bool_t THaAnalysisObject::IntersectPlaneWithRay( const TVector3& xax,
						 const TVector3& yax,
						 const TVector3& org,
						 const TVector3& ray_start,
						 const TVector3& ray_vect,
						 Double_t& length,
						 TVector3& intersect )
{
  // Find intersection point of plane (given by 'xax', 'yax', 'org') with
  // ray (given by 'ray_start', 'ray_vect'). 
  // Returns true if intersection found, else false (ray parallel to plane).
  // Output is in 'length' and 'intersect', where
  //   intersect = ray_start + length*ray_vect
  // 'length' and 'intersect' must be provided by the caller.

  // Calculate explicitly for speed.

  Double_t nom[9], den[9];
  nom[0] = den[0] = xax.X();
  nom[3] = den[3] = xax.Y();
  nom[6] = den[6] = xax.Z();
  nom[1] = den[1] = yax.X();
  nom[4] = den[4] = yax.Y();
  nom[7] = den[7] = yax.Z();
  den[2] = -ray_vect.X();
  den[5] = -ray_vect.Y();
  den[8] = -ray_vect.Z();

  Double_t det1 = den[0]*(den[4]*den[8]-den[7]*den[5])
    -den[3]*(den[1]*den[8]-den[7]*den[2])
    +den[6]*(den[1]*den[5]-den[4]*den[2]);
  if( fabs(det1) < 1e-5 )
    return false;

  nom[2] = ray_start.X()-org.X();
  nom[5] = ray_start.Y()-org.Y();
  nom[8] = ray_start.Z()-org.Z();
  Double_t det2 = nom[0]*(nom[4]*nom[8]-nom[7]*nom[5])
    -nom[3]*(nom[1]*nom[8]-nom[7]*nom[2])
    +nom[6]*(nom[1]*nom[5]-nom[4]*nom[2]);

  length = det2/det1;
  intersect = ray_start + length*ray_vect;
  return true;
}

//_____________________________________________________________________________
void THaAnalysisObject::GeoToSph( Double_t  th_geo, Double_t  ph_geo,
				  Double_t& th_sph, Double_t& ph_sph )
{
  // Convert geographical to spherical angles. Units are rad.
  // th_geo and ph_geo can be anything.
  // th_sph is in [0,pi], ph_sph in [-pi,pi].

  static const Double_t twopi = 2.0*TMath::Pi();
  Double_t ct = cos(th_geo), cp = cos(ph_geo);
  register Double_t tmp = ct*cp;
  th_sph = acos( tmp );
  tmp = sqrt(1.0 - tmp*tmp);
  ph_sph = (fabs(tmp) < 1e-6 ) ? 0.0 : acos( sqrt(1.0-ct*ct)*cp/tmp );
  if( th_geo/twopi-floor(th_geo/twopi) > 0.5 ) ph_sph = TMath::Pi() - ph_sph;
  if( ph_geo/twopi-floor(ph_geo/twopi) > 0.5 ) ph_sph = -ph_sph;
}

//_____________________________________________________________________________
void THaAnalysisObject::SphToGeo( Double_t  th_sph, Double_t  ph_sph,
				  Double_t& th_geo, Double_t& ph_geo )
{
  // Convert spherical to geographical angles. Units are rad.
  // th_sph and ph_sph can be anything, although th_sph outside
  // [0,pi] is not really meaningful.
  // th_geo is in [-pi,pi] and ph_sph in [-pi/2,pi/2]

  static const Double_t twopi = 2.0*TMath::Pi();
  Double_t ct = cos(th_sph), st = sin(th_sph), cp = cos(ph_sph);
  if( fabs(ct) > 1e-6 ) {
    th_geo = atan( st/ct*cp );
    if( cp>0.0 && th_geo<0.0 )      th_geo += TMath::Pi();
    else if( cp<0.0 && th_geo>0.0 ) th_geo -= TMath::Pi();
  } else {
    th_geo = TMath::Pi()/2.0;
    if( cp<0.0 ) th_geo = -th_geo;
  }
  ph_geo = acos( sqrt( st*st*cp*cp + ct*ct ));
  if( ph_sph/twopi - floor(ph_sph/twopi) > 0.5 ) ph_geo =- ph_geo;
}

//---------- Database utility functions ---------------------------------------

static string errtxt;
static int loaddb_depth = 0; // Recursion depth in LoadDB
static string loaddb_prefix; // Actual prefix of object in LoadDB (for err msg)

// Local helper functions (could be in an anonymous namespace)
//_____________________________________________________________________________
static Int_t IsDBdate( const string& line, TDatime& date, bool warn = true )
{
  // Check if 'line' contains a valid database time stamp. If so, 
  // parse the line, set 'date' to the extracted time stamp, and return 1.
  // Else return 0;
  // Time stamps must be in SQL format: [ yyyy-mm-dd hh:mi:ss ]

  ssiz_t lbrk = line.find('[');
  if( lbrk == string::npos || lbrk >= line.size()-12 ) return 0;
  ssiz_t rbrk = line.find(']',lbrk);
  if( rbrk == string::npos || rbrk <= lbrk+11 ) return 0;
  Int_t yy, mm, dd, hh, mi, ss;
  if( sscanf( line.substr(lbrk+1,rbrk-lbrk-1).c_str(), "%4d-%2d-%2d %2d:%2d:%2d",
	      &yy, &mm, &dd, &hh, &mi, &ss) != 6
      || yy < 1995 || mm < 1 || mm > 12 || dd < 1 || dd > 31
      || hh < 0 || hh > 23 || mi < 0 || mi > 59 || ss < 0 || ss > 59 ) {
    if( warn )
      ::Warning("THaAnalysisObject::IsDBdate()", 
		"Invalid date tag %s", line.c_str());
    return 0;
  }
  date.Set(yy, mm, dd, hh, mi, ss);
  return 1;
}

//_____________________________________________________________________________
static Int_t IsDBkey( const string& line, const char* key, string& text )
{
  // Check if 'line' is of the form "key = value" and, if so, whether the key 
  // equals 'key'. Keys are not case sensitive.
  // - If there is no '=', then return 0.
  // - If there is a '=', but the left-hand side doesn't match 'key',
  //   then return -1. 
  // - If key found, parse the line, set 'text' to the whitespace-trimmed
  //   text after the "=" and return +1.
  // 'text' is not changed unless a valid key is found.
  //
  // Note: By construction in ReadDBline, 'line' is not empty, any comments
  // starting with '#' have been removed, and trailing whitespace has been
  // trimmed. Also, all tabs have been converted to spaces.

  // Search for "="
  register const char* ln = line.c_str();
  const char* eq = strchr(ln, '=');
  if( !eq ) return 0;
  // Extract the key
  while( *ln == ' ' ) ++ln; // find_first_not_of(" ")
  assert( ln <= eq );
  if( ln == eq ) return -1;
  register const char* p = eq-1;
  assert( p >= ln );
  while( *p == ' ' ) --p; // find_last_not_of(" ")
  if( strncmp(ln, key, p-ln+1) ) return -1;
  // Key matches. Now extract the value, trimming leading whitespace.
  ln = eq+1;
  assert( !*ln || *(ln+strlen(ln)-1) != ' ' ); // Trailing space already trimmed
  while( *ln == ' ' ) ++ln;
  text = ln;

  return 1;
}

//_____________________________________________________________________________
static Int_t ChopPrefix( string& s )
{
  // Remove trailing level from prefix. Example "L.vdc." -> "L."
  // Return remaining number of dots, or zero if empty/invalid prefix

  ssiz_t len = s.size(), pos;
  Int_t ndot = 0;
  if( len<2 )
    goto null;
  pos = s.rfind('.',len-2);
  if( pos == string::npos ) 
    goto null;
  s.erase(pos+1);
  for( ssiz_t i = 0; i <= pos; i++ ) {
    if( s[i] == '.' )
      ndot++;
  }
  return ndot;

 null:
  s.clear();
  return 0;

}

//_____________________________________________________________________________
bool THaAnalysisObject::IsTag( const char* buf )
{
  // Return true if the string in 'buf' matches regexp ".*\[.+\].*",
  // i.e. it is a database tag.  Generic utility function.

  register const char* p = buf;
  while( *p && *p != '[' ) p++;
  if( !*p ) return false;
  p++;
  if( !*p || *p == ']' ) return false;
  p++;
  while( *p && *p != ']' ) p++;
  return ( *p == ']' );
}

//_____________________________________________________________________________
static Int_t GetLine( FILE* file, char* buf, size_t bufsiz, string& line )
{
  // Get a line (possibly longer than 'bufsiz') from 'file' using
  // using the provided buffer 'buf'. Put result into string 'line'.
  // This is similar to std::getline, except that C-style I/O is used.
  // Also, convert all tabs to spaces.
  // Returns 0 on success, or EOF if no more data (or error).

  char* r = buf;
  line.clear();
  while( (r = fgets(buf, bufsiz, file)) ) {
    char* c = strchr(buf, '\n');
    if( c )
      *c = '\0';
    // Convert all tabs to spaces
    register char *p = buf;
    while( (p = strchr(p,'\t')) ) *(p++) = ' ';
    // Append to string
    line.append(buf);
    // If newline was read, the line is finished
    if( c )
      break;
  }
  // Don't report EOF if we have any data
  if( !r && line.empty() )
    return EOF;
  return 0;
}

//_____________________________________________________________________________
static void Trim( string& str )
{
  // Trim leading and trailing space from string 'str'

  if( str.empty() )
    return;
  register const char* p = str.c_str();
  while( *p == ' ' ) ++p;
  if( *p == '\0' )
    str.clear();
  else if( p != str.c_str() ) {
    ssiz_t pos = p-str.c_str();
    str.substr(pos).swap(str);
  }
  if( !str.empty() ) {
    const char* q = str.c_str() + str.length()-1;
    p = q;
    while( *p == ' ' ) --p;
    if( p != q ) {
      ssiz_t pos = p-str.c_str();
      str.erase(pos+1);
    }
  }
}

//_____________________________________________________________________________
Int_t THaAnalysisObject::ReadDBline( FILE* file, char* buf, size_t bufsiz,
				     string& line )
{
  // Get a text line from the database file 'file'. Ignore all comments
  // (anything after a #). Trim trailing whitespace. Concatenate continuation
  // lines (ending with \).
  // Only returns if a non-empty line was found, or on EOF.

  line.clear();

  Int_t r = 0;
  bool maybe_continued = false, unfinished = true;
  string linbuf;
  fpos_t oldpos;
  while( unfinished && fgetpos(file, &oldpos) == 0 &&
	 (r = GetLine(file,buf,bufsiz,linbuf)) == 0 ) {
    // Search for comment or continuation character.
    // If found, remove it and everything that follows.
    bool continued = false, comment = false, has_equal = false,
      trailing_space = false, leading_space = false;
    ssiz_t pos = linbuf.find_first_of("#\\");
    if( pos != string::npos ) {
      if( linbuf[pos] == '\\' )
	continued = true;
      else
	comment = true;
      linbuf.erase(pos);
    }
    // Trim leading and trailing space
    if( !linbuf.empty() ) {
      if( linbuf[0] == ' ')
	leading_space = true;
      if( linbuf[linbuf.length()-1] == ' ')
	trailing_space = true;
      if( leading_space || trailing_space )
	Trim(linbuf);
    }

    if( line.empty() && linbuf.empty() )
      // Nothing to do, i.e. no line building in progress and no data
      continue;

    if( !linbuf.empty() ) {
      has_equal = (linbuf.find('=') != string::npos);
      // Tentative continuation is canceled by a subsequent line with a '='
      if( maybe_continued && has_equal ) {
	// We must have data at this point, so we can exit. However, the line
	// we've just read is obviously a good one, so we must also rewind the
	// file to the previous position so this line can be read again.
	assert( !line.empty() );  // else maybe_continued not set correctly
	fsetpos(file, &oldpos);
	break;
      }
      // If the line has data, it isn't a comment, even if there was a '#'
      //      comment = false;  // not used
    } else if( continued || comment ) {
      // Skip empty continuation lines and comments in the middle of a
      // continuation block
      continue;
    } else {
      // An empty line, except for a comment or continuation, ends continuation.
      // Since we have data here, and this line is blank and would later be
      // skipped anyay, we can simply exit
      break;
    }

    if( line.empty() && !continued && has_equal ) {
      // If the first line of a potential result contains a '=', this
      // line may be continued by non-'=' lines up until the next blank line.
      // However, do not use this logic if the line also contains a
      // continuation mark '\'; the two continuation styles should not be mixed
      maybe_continued = true;
    }
    unfinished = (continued || maybe_continued);

    // Ensure that at least one space is preserved between continuations,
    // if originally present
    if( maybe_continued || (trailing_space && continued) )
      linbuf += ' ';
    if( leading_space && !line.empty() && line[line.length()-1] != ' ')
      line += ' ';

    // Append current data to result
    line.append(linbuf);
  }

  // Because of the '=' sign continuation logic, we may have hit EOF if the last
  // line of the file is a key. In this case, we need to back out.
  if( maybe_continued ) {
    if( r == EOF ) {
      fsetpos(file, &oldpos);
      r = 0;
    }
    // Also, whether we hit EOF or not, tentative continuation may have
    // added a tentative space, which we tidy up here
    assert( !line.empty() );
    if( line[line.length()-1] == ' ')
      line.erase(line.length()-1);
  }
  return r;
}

//_____________________________________________________________________________
Int_t THaAnalysisObject::LoadDBvalue( FILE* file, const TDatime& date, 
				      const char* key, string& text )
{
  // Load a data value tagged with 'key' from the database 'file'.
  // Lines before the first valid time stamp or starting with "#" are ignored.
  // If 'key' is found, then the most recent value seen (based on time stamps
  // and position within the file) is returned in 'text'.
  // Values with time stamps later than 'date' are ignored.
  // This allows incremental organization of the database where
  // only changes are recorded with time stamps.
  // Return 0 if success, 1 if key not found, <0 if unexpected error.

  if( !file || !key ) return -255;
  TDatime keydate(950101,0), prevdate(950101,0);

  errno = 0;
  errtxt.clear();
  rewind(file);

  static const size_t bufsiz = 256;
  char* buf = new char[bufsiz];

  bool found = false, ignore = false;
  string dbline;
  vector<string> lines;
  while( ReadDBline(file, buf, bufsiz, dbline) != EOF ) {
    if( dbline.empty() ) continue;
    // Replace text variables in this database line, if any. Multi-valued
    // variables are supported here, although they are only sensible on the LHS
    lines.assign( 1, dbline );
    gHaTextvars->Substitute( lines );
    for( vsiter_t it = lines.begin(); it != lines.end(); ++it ) {
      string& line = *it;
      Int_t status;
      if( !ignore && (status = IsDBkey( line, key, text )) != 0 ) {
	if( status > 0 ) {
	  // Found a matching key for a newer date than before
	  found = true;
	  prevdate = keydate;
	  // we do not set ignore to true here so that the _last_, not the first,
	  // of multiple identical keys is evaluated.
	}
      } else if( IsDBdate( line, keydate ) != 0 ) 
	ignore = ( keydate>date || keydate<prevdate );
    }
  }
  delete [] buf;

  if( errno ) {
    perror( "THaAnalysisObject::LoadDBvalue" );
    return -1;
  }
  return found ? 0 : 1;
}

//_____________________________________________________________________________
Int_t THaAnalysisObject::LoadDBvalue( FILE* file, const TDatime& date, 
				      const char* key, Double_t& value )
{
  // Locate key in database, convert the text found to double-precision,
  // and return result in 'value'.
  // This is a convenience function.

  string text;
  Int_t err = LoadDBvalue( file, date, key, text );
  if( err == 0 )
    value = atof(text.c_str());
  return err;
}

//_____________________________________________________________________________
Int_t THaAnalysisObject::LoadDBvalue( FILE* file, const TDatime& date, 
				      const char* key, Int_t& value )
{
  // Locate key in database, convert the text found to integer
  // and return result in 'value'.
  // This is a convenience function.

  string text;
  Int_t err = LoadDBvalue( file, date, key, text );
  if( err == 0 )
    value = atoi(text.c_str());
  return err;
}

//_____________________________________________________________________________
Int_t THaAnalysisObject::LoadDBvalue( FILE* file, const TDatime& date, 
				      const char* key, TString& text )
{
  // Locate key in database, convert the text found to TString
  // and return result in 'text'.
  // This is a convenience function.

  string _text;
  Int_t err = LoadDBvalue( file, date, key, _text );
  if( err == 0 )
    text = _text.c_str();
  return err;
}

//_____________________________________________________________________________
template <class T>
Int_t THaAnalysisObject::LoadDBarray( FILE* file, const TDatime& date, 
				      const char* key, vector<T>& values )
{
  string text;
  Int_t err = LoadDBvalue( file, date, key, text );
  if( err )
    return err;
  values.clear();
  text += " ";
  ISSTREAM inp(text);
  T dval;
  while( 1 ) {
    inp >> dval;
    if( inp.good() )
      values.push_back(dval);
    else
      break;
  }
  return 0;
}

//_____________________________________________________________________________
template <class T>
Int_t THaAnalysisObject::LoadDBmatrix( FILE* file, const TDatime& date, 
				       const char* key, 
				       vector<vector<T> >& values,
				       UInt_t ncols )
{
  // Read a matrix of values of type T into a vector of vectors.
  // The matrix is square with ncols columns.

  vector<T>* tmpval = new vector<T>;
  if( !tmpval )
    return -255;
  Int_t err = LoadDBarray( file, date, key, *tmpval );
  if( err ) {
    delete tmpval;
    return err;
  }
  if( (tmpval->size() % ncols) != 0 ) {
    delete tmpval;
    errtxt = "key = "; errtxt += key;
    return -129;
  }
  values.clear();
  typename vector<vector<T> >::size_type nrows = tmpval->size()/ncols, irow;
  for( irow = 0; irow < nrows; ++irow ) {

    vector<T> row;
    for( typename vector<T>::size_type i=0; i<ncols; ++i ) {
      row.push_back( tmpval->at(i+irow*ncols) );
    }
    values.push_back( row );
  }
  delete tmpval;
  return 0;
}

//_____________________________________________________________________________
Int_t THaAnalysisObject::LoadDB( FILE* f, const TDatime& date,
				 const DBRequest* req, Int_t search )
{
  // Member function version of LoadDB, uses current object's fPrefix and
  // class name

  TString here(GetClassName());
  here.Append("::LoadDB");
  return LoadDB( f, date, req, GetPrefix(), search, here.Data() );
}

#define CheckLimits(T,val) \
  if( (val) < std::numeric_limits<T>::min() ||     \
      (val) > std::numeric_limits<T>::max() ) {	   \
    OSSTREAM txt;				   \
    txt << (val);				   \
    errtxt = txt.str();                            \
    goto rangeerr;				   \
  }

#define CheckLimitsUnsigned(T,val) \
  if( (val) < 0 || static_cast<T>(val) > std::numeric_limits<T>::max() ) { \
    OSSTREAM txt;				   \
    txt << (val);				   \
    errtxt = txt.str();                            \
    goto rangeerr;                                 \
  }

//_____________________________________________________________________________
Int_t THaAnalysisObject::LoadDB( FILE* f, const TDatime& date,
				 const DBRequest* req, const char* prefix,
				 Int_t search, const char* here )
{
  // Load a list of parameters from the database file 'f' according to 
  // the contents of the 'req' structure (see VarDef.h).

  if( !req ) return -255;
  if( !prefix ) prefix = "";
  Int_t ret = 0;
  if( loaddb_depth++ == 0 )
    loaddb_prefix = prefix;

  const DBRequest* item = req;
  while( item->name ) {
    if( item->var ) {
      string keystr = prefix; keystr.append(item->name);
      UInt_t nelem = item->nelem;
      const char* key = keystr.c_str();
      if( item->type == kDouble || item->type == kFloat ) {
	if( nelem < 2 ) {
	  Double_t dval;
	  ret = LoadDBvalue( f, date, key, dval );
	  if( ret == 0 ) {
	    if( item->type == kDouble )
	      *((Double_t*)item->var) = dval;
	    else {
	      CheckLimits( Float_t, dval );
	      *((Float_t*)item->var) = dval;
	    }
	  }
	} else {
	  // Array of reals requested
	  vector<double> dvals;
	  ret = LoadDBarray( f, date, key, dvals );
	  if( static_cast<UInt_t>(dvals.size()) != nelem ) {
	    nelem = dvals.size();
	    ret = -130;
	  } else if( ret == 0 ) {
	    if( item->type == kDouble ) {
	      for( UInt_t i = 0; i < nelem; i++ )
		((Double_t*)item->var)[i] = dvals[i];
	    } else {
	      for( UInt_t i = 0; i < nelem; i++ ) {
		CheckLimits( Float_t, dvals[i] );
		((Float_t*)item->var)[i] = dvals[i];
	      }
	    }
	  }
	}
      } else if( item->type >= kInt && item->type <= kByte ) {
	// Implies a certain order of definitions in VarType.h
	if( nelem < 2 ) {
	  Int_t ival;
	  ret = LoadDBvalue( f, date, key, ival );
	  if( ret == 0 ) {
	    switch( item->type ) {
	    case kInt:
	      *((Int_t*)item->var) = ival;
	      break;
	    case kUInt:
	      CheckLimitsUnsigned( UInt_t, ival );
	      *((UInt_t*)item->var) = ival;
	      break;
	    case kShort:
	      CheckLimits( Short_t, ival );
	      *((Short_t*)item->var) = ival;
	      break;
	    case kUShort:
	      CheckLimitsUnsigned( UShort_t, ival );
	      *((UShort_t*)item->var) = ival;
	      break;
	    case kChar:
	      CheckLimits( Char_t, ival );
	      *((Char_t*)item->var) = ival;
	      break;
	    case kByte:
	      CheckLimitsUnsigned( Byte_t, ival );
	      *((Byte_t*)item->var) = ival;
	      break;
	    default:
	      goto badtype;
	    }
	  }
	} else {
	  // Array of integers requested
	  vector<Int_t> ivals;
	  ret = LoadDBarray( f, date, key, ivals );
	  if( static_cast<UInt_t>(ivals.size()) != nelem ) {
	    nelem = ivals.size();
	    ret = -130;
	  } else if( ret == 0 ) {
	    switch( item->type ) {
	    case kInt:
	      for( UInt_t i = 0; i < nelem; i++ )
		((Int_t*)item->var)[i] = ivals[i];
	      break;
	    case kUInt:
	      for( UInt_t i = 0; i < nelem; i++ ) {
		CheckLimitsUnsigned( UInt_t, ivals[i] );
		((UInt_t*)item->var)[i] = ivals[i];
	      }
	      break;
	    case kShort:
	      for( UInt_t i = 0; i < nelem; i++ ) {
		CheckLimits( Short_t, ivals[i] );
		((Short_t*)item->var)[i] = ivals[i];
	      }
	      break;
	    case kUShort:
	      for( UInt_t i = 0; i < nelem; i++ ) {
		CheckLimitsUnsigned( UShort_t, ivals[i] );
		((UShort_t*)item->var)[i] = ivals[i];
	      }
	      break;
	    case kChar:
	      for( UInt_t i = 0; i < nelem; i++ ) {
		CheckLimits( Char_t, ivals[i] );
		((Char_t*)item->var)[i] = ivals[i];
	      }
	      break;
	    case kByte:
	      for( UInt_t i = 0; i < nelem; i++ ) {
		CheckLimitsUnsigned( Byte_t, ivals[i] );
		((Byte_t*)item->var)[i] = ivals[i];
	      }
	      break;
	    default:
	      goto badtype;
	    }
	  }
	}
      } else if( item->type == kString ) {
	ret = LoadDBvalue( f, date, key, *((string*)item->var) );
      } else if( item->type == kTString ) {
	ret = LoadDBvalue( f, date, key, *((TString*)item->var) );
      } else if( item->type == kFloatV ) {
	ret = LoadDBarray( f, date, key, *((vector<float>*)item->var) );
	if( ret == 0 && nelem > 0 && nelem !=
	    static_cast<UInt_t>(((vector<float>*)item->var)->size()) ) {
	  nelem = ((vector<float>*)item->var)->size();
	  ret = -130;
	}
      } else if( item->type == kDoubleV ) {
	ret = LoadDBarray( f, date, key, *((vector<double>*)item->var) );
	if( ret == 0 && nelem > 0 && nelem !=
	    static_cast<UInt_t>(((vector<double>*)item->var)->size()) ) {
	  nelem = ((vector<double>*)item->var)->size();
	  ret = -130;
	}
      } else if( item->type == kIntV ) {
	ret = LoadDBarray( f, date, key, *((vector<Int_t>*)item->var) );
	if( ret == 0 && nelem > 0 && nelem !=
	    static_cast<UInt_t>(((vector<Int_t>*)item->var)->size()) ) {
	  nelem = ((vector<Int_t>*)item->var)->size();
	  ret = -130;
	}
      } else if( item->type == kFloatM ) {
	ret = LoadDBmatrix( f, date, key, 
			    *((vector<vector<float> >*)item->var), nelem );
      } else if( item->type == kDoubleM ) {
	ret = LoadDBmatrix( f, date, key, 
			    *((vector<vector<double> >*)item->var), nelem );
      } else if( item->type == kIntM ) {
	ret = LoadDBmatrix( f, date, key,
			    *((vector<vector<Int_t> >*)item->var), nelem );
      } else {
      badtype:
	if( item->type >= kDouble && item->type <= kObject2P )
	  ::Error( ::Here(here,loaddb_prefix.c_str()),
		   "Key \"%s\": Reading of data type \"%s\" not implemented",
		   key, THaVar::GetEnumName(item->type) );
	else
	  ::Error( ::Here(here,loaddb_prefix.c_str()),
		   "Key \"%s\": Reading of data type \"(#%d)\" not implemented",
		   key, item->type );
	ret = -2;
	break;
      rangeerr:
	::Error( ::Here(here,loaddb_prefix.c_str()),
		 "Key \"%s\": Value %s out of range for requested type \"%s\"",
		 key, errtxt.c_str(), THaVar::GetEnumName(item->type) );
	ret = -3;
	break;
      }

      if( ret == 0 ) {  // Key found -> next item
	goto nextitem;
      } else if( ret > 0 ) {  // Key not found
	// If searching specified, either for this key or globally, retry
	// finding the key at the next level up along the name tree. Name
	// tree levels are defined by dots (".") in the prefix. The top
	// level is 1 (where prefix = "").
	// Example: key = "nw", prefix = "L.vdc.u1", search = 1, then
	// search for:  "L.vdc.u1.nw" -> "L.vdc.nw" -> "L.nw" -> "nw"
	//
	// Negative values of 'search' mean search up relative to the
	// current level by at most abs(search) steps, or up to top level.
	// Example: key = "nw", prefix = "L.vdc.u1", search = -1, then
	// search for:  "L.vdc.u1.nw" -> "L.vdc.nw"

	// per-item search level overrides global one
	Int_t newsearch = (item->search != 0) ? item->search : search;
	if( newsearch != 0 && *prefix ) {
	  string newprefix(prefix);
	  Int_t newlevel = ChopPrefix(newprefix) + 1;
	  if( newsearch < 0 || newlevel >= newsearch ) {
	    DBRequest newreq[2];
	    newreq[0] = *item;
	    memset( newreq+1, 0, sizeof(DBRequest) );
	    newreq->search = 0;
	    if( newsearch < 0 )
	      newsearch++;
	    ret = LoadDB( f, date, newreq, newprefix.c_str(), newsearch, here );
	    // If error, quit here. Error message printed at lowest level.
	    if( ret != 0 )
	      break;
	    goto nextitem;  // Key found and ok
	  }
	}
	if( item->optional ) 
	  ret = 0;
	else {
	  if( item->descript ) {
	    ::Error( ::Here(here,loaddb_prefix.c_str()),
		     "Required key \"%s\" (%s) missing in the database.",
		     key, item->descript );
	  } else {
	    ::Error( ::Here(here,loaddb_prefix.c_str()),
		     "Required key \"%s\" missing in the database.", key );
	  }
	  // For missing keys, the return code is the index into the request 
	  // array + 1. In this way the caller knows which key is missing.
	  ret = 1+(item-req);
	  break;
	}
      } else if( ret == -128 ) {  // Line too long
	::Error( ::Here(here,loaddb_prefix.c_str()),
		 "Text line too long. Fix the database!\n\"%s...\"",
		 errtxt.c_str() );
	break;
      } else if( ret == -129 ) {  // Matrix ncols mismatch
	::Error( ::Here(here,loaddb_prefix.c_str()),
		 "Number of matrix elements not evenly divisible by requested "
		 "number of columns. Fix the database!\n\"%s...\"",
		 errtxt.c_str() );
	break;
      } else if( ret == -130 ) {  // Vector/array size mismatch
	::Error( ::Here(here,loaddb_prefix.c_str()),
		 "Incorrect number of array elements found for key = %s. "
		 "%u requested, %u found. Fix database.", keystr.c_str(),
		 item->nelem, nelem );
	break;
      } else {  // other ret < 0: unexpected zero pointer etc.
	::Error( ::Here(here,loaddb_prefix.c_str()), 
		 "Program error when trying to read database key \"%s\". "
		 "CALL EXPERT!", key );
	break;
      }
    }
  nextitem:
    item++;
  }
  if( --loaddb_depth == 0 )
    loaddb_prefix.clear();

  return ret;
}

//_____________________________________________________________________________
Int_t THaAnalysisObject::SeekDBconfig( FILE* file, const char* tag, 
				       const char* label,
				       Bool_t end_on_tag )
{
  // Starting from the current position in 'file', look for the
  // configuration 'tag'. Position the file on the
  // line immediately following the tag. If no tag found, return to
  // the original position in the file. 
  // Return zero if not found, 1 otherwise.
  //
  // Configuration tags have the form [ config=tag ].
  // If 'label' is given explicitly, it replaces 'config' in the tag string,
  // for example label="version" will search for [ version=tag ].
  // If 'label' is empty (""), search for just [ tag ].
  // 
  // If 'end_on_tag' is true, quit if any non-matching tag found,
  // i.e. anything matching "*[*]*" except "[config=anything]".
  //
  // Useful for segmenting databases (esp. VDC) for different
  // experimental configurations.

  if( !file || !tag || !*tag ) return 0;
  string _label("[");
  if( label && *label ) {
    _label.append(label);  _label.append("=");
  }
  ssiz_t llen = _label.size();

  bool found = false;

  errno = 0;
  off_t pos = ftello(file);
  if( pos != -1 ) {
    bool quit = false;
    const int LEN = 256;
    char buf[LEN];
    while( !errno && !found && !quit && fgets( buf, LEN, file)) {
      size_t len = strlen(buf);
      if( len<2 || buf[0] == '#' ) continue;      //skip comments
      if( buf[len-1] == '\n') buf[len-1] = 0;     //delete trailing newline
      char* cbuf = ::Compress(buf);
      string line(cbuf); delete [] cbuf;
      ssiz_t lbrk = line.find(_label);
      if( lbrk != string::npos && lbrk+llen < line.size() ) {
	ssiz_t rbrk = line.find(']',lbrk+llen);
	if( rbrk == string::npos ) continue;
	if( line.substr(lbrk+llen,rbrk-lbrk-llen) == tag ) {
	  found = true;
	  break;
	}
      } else if( end_on_tag && IsTag(buf) )
	quit = true;
    }
  }
  if( errno ) {
    perror( "THaAnalysisObject::SeekDBconfig" );
    found = false;
  }
  if( !found && pos >= 0 )
    fseeko( file, pos, SEEK_SET ); 
  return found;
}

//_____________________________________________________________________________
Int_t THaAnalysisObject::SeekDBdate( FILE* file, const TDatime& date,
				     Bool_t end_on_tag )
{
  // Starting from the current position in file 'f', look for a 
  // date tag matching time stamp 'date'. Position the file on the
  // line immediately following the tag. If no tag found, return to
  // the original position in the file. 
  // Return zero if not found, 1 otherwise.
  // Date tags must be in SQL format: [ yyyy-mm-dd hh:mi:ss ].
  // If 'end_on_tag' is true, end the search at the next non-date tag;
  // otherwise, search through end of file.
  // Useful for sub-segmenting database files.
  
  static const char* const here = "THaAnalysisObject::SeekDBdateTag";

  if( !file ) return 0;
  const int LEN = 256;
  char buf[LEN];
  TDatime tagdate(950101,0), prevdate(950101,0);
  const bool kNoWarn = false;

  errno = 0;
  off_t pos = ftello(file);
  if( pos == -1 ) {
    if( errno ) 
      perror(here);
    return 0;
  }
  off_t foundpos = -1;
  bool found = false, quit = false;
  while( !errno && !quit && fgets( buf, LEN, file)) {
    size_t len = strlen(buf);
    if( len<2 || buf[0] == '#' ) continue;
    if( buf[len-1] == '\n') buf[len-1] = 0; //delete trailing newline
    string line(buf);
    if( IsDBdate( line, tagdate, kNoWarn )
	&& tagdate<=date && tagdate>=prevdate ) {
      prevdate = tagdate;
      foundpos = ftello(file);
      found = true;
    } else if( end_on_tag && IsTag(buf))
      quit = true;
  }
  if( errno ) {
    perror(here);
    found = false;
  }
  fseeko( file, (found ? foundpos: pos), SEEK_SET );
  return found;
}

//_____________________________________________________________________________
vector<string> THaAnalysisObject::vsplit(const string& s)
{
  // Static utility function to split a string into
  // whitespace-separated strings
  vector<string> ret;
  typedef string::size_type ssiz_t;
  ssiz_t i = 0;
  while ( i != s.size()) {
    while (i != s.size() && isspace(s[i])) ++i;
      ssiz_t j = i;
      while (j != s.size() && !isspace(s[j])) ++j;
      if (i != j) {
         ret.push_back(s.substr(i, j-i));
         i = j;
      }
  }
  return ret;
}

//_____________________________________________________________________________
TString& THaAnalysisObject::GetObjArrayString( const TObjArray* array, Int_t i )
{
  // Get the string at index i in the given TObjArray

  return (static_cast<TObjString*>(array->At(i)))->String();
}

//_____________________________________________________________________________
void THaAnalysisObject::Print( Option_t* ) const
{
  cout << "AOBJ: " << IsA()->GetName()
       << "\t" << GetName()
       << "\t\"";
  if( fPrefix )
    cout << fPrefix;
  cout << "\"\t" << GetTitle()
       << endl;
}

//_____________________________________________________________________________
void THaAnalysisObject::PrintObjects( Option_t* opt )
{
  // Print all defined analysis objects (useful for debugging)

  TIter next(fgModules);
  TObject* obj;
  while( (obj = next()) ) {
    obj->Print(opt);
  }
}

//_____________________________________________________________________________
ClassImp(THaAnalysisObject)

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