ROOT logo
/**
 * @file   BaseConfig.C
 * @author Christian Holm Christensen <cholm@nbi.dk>
 * @date   Wed Oct 15 12:52:58 2014
 * 
 * @brief  Base classes for configurations shared amoung steps. 
 * 
 * 
 */
//====================================================================
/** 
 * Base class for detector configuration. By default, everything is on
 * except ACORDE.
 */
struct VirtualDetCfg 
{
  virtual Bool_t UseABSO()   const { return true;  }
  virtual Bool_t UseACORDE() const { return false; }
  virtual Bool_t UseDIPO()   const { return true;  }
  virtual Bool_t UseEMCAL()  const { return true;  }
  virtual Bool_t UseFMD()    const { return true;  }
  virtual Bool_t UseFRAME()  const { return true;  }
  virtual Bool_t UseHALL()   const { return true;  }
  virtual Bool_t UseITS()    const { return true;  }
  virtual Bool_t UseMAG()    const { return true;  }
  virtual Bool_t UseMUON()   const { return true;  }
  virtual Bool_t UsePHOS()   const { return true;  }
  virtual Bool_t UsePIPE()   const { return true;  }
  virtual Bool_t UsePMD()    const { return true;  }
  virtual Bool_t UseHMPID()  const { return true;  }
  virtual Bool_t UseSHIL()   const { return true;  }
  virtual Bool_t UseT0()     const { return true;  }
  virtual Bool_t UseTOF()    const { return true;  }
  virtual Bool_t UseTPC()    const { return true;  }
  virtual Bool_t UseTRD()    const { return true;  }
  virtual Bool_t UseVZERO()  const { return true;  }
  virtual Bool_t UseZDC()    const { return true;  }
  virtual void Print() 
  {
    Printf("ABSO:   %3s", UseABSO()    ? "yes" : "no");
    Printf("ACORDE: %3s", UseACORDE()  ? "yes" : "no");
    Printf("DIPO:   %3s", UseDIPO()    ? "yes" : "no");
    Printf("EMCAL:  %3s", UseEMCAL()   ? "yes" : "no");
    Printf("FMD:    %3s", UseFMD()     ? "yes" : "no");
    Printf("FRAME:  %3s", UseFRAME()   ? "yes" : "no");
    Printf("HALL:   %3s", UseHALL()    ? "yes" : "no");
    Printf("ITS:    %3s", UseITS()     ? "yes" : "no");
    Printf("MAG:    %3s", UseMAG()     ? "yes" : "no");
    Printf("MUON:   %3s", UseMUON()    ? "yes" : "no");
    Printf("PHOS:   %3s", UsePHOS()    ? "yes" : "no");
    Printf("PIPE:   %3s", UsePIPE()    ? "yes" : "no");
    Printf("PMD:    %3s", UsePMD()     ? "yes" : "no");
    Printf("HMPID:  %3s", UseHMPID()   ? "yes" : "no");
    Printf("SHIL:   %3s", UseSHIL()    ? "yes" : "no");
    Printf("T0:     %3s", UseT0()      ? "yes" : "no");
    Printf("TOF:    %3s", UseTOF()     ? "yes" : "no");
    Printf("TPC:    %3s", UseTPC()     ? "yes" : "no");
    Printf("TRD:    %3s", UseTRD()     ? "yes" : "no");
    Printf("VZERO:  %3s", UseVZERO()   ? "yes" : "no");
    Printf("ZDC:    %3s", UseZDC()     ? "yes" : "no");
  }
  /** 
   * Get the string of enabled detectors for local reconstruction.
   * 
   * @param enable On return, contains string of enable detectors
   */
  void GetRecoString(TString& enable) const
  {
    if (UseITS())	Append2Str(enable, "ITS"); 
    if (UseTPC())	Append2Str(enable, "TPC"); 
    if (UseTRD())	Append2Str(enable, "TRD"); 
    if (UseTOF())	Append2Str(enable, "TOF"); 
    if (UsePHOS())	Append2Str(enable, "PHOS"); 
    if (UseHMPID())	Append2Str(enable, "HMPID"); 
    if (UseEMCAL())	Append2Str(enable, "EMCAL"); 
    if (UseMUON())	Append2Str(enable, "MUON"); 
    if (UseFMD())	Append2Str(enable, "FMD"); 
    if (UseZDC())	Append2Str(enable, "ZDC"); 
    if (UsePMD())	Append2Str(enable, "PMD"); 
    if (UseT0())	Append2Str(enable, "T0"); 
    if (UseVZERO())	Append2Str(enable, "VZERO");
  }
  /** 
   * Get the string of detectors for which we should make Summable
   * Digits
   * 
   * @param sDigits On returm contains the string of enable detectors
   */
  void GetSDigitString(TString& sDigits) const 
  {
    if (UseTRD())	Append2Str(sDigits, "TRD"); 
    if (UseTOF())	Append2Str(sDigits, "TOF"); 
    if (UsePHOS())	Append2Str(sDigits, "PHOS"); 
    if (UseHMPID())	Append2Str(sDigits, "HMPID"); 
    if (UseEMCAL())	Append2Str(sDigits, "EMCAL"); 
    if (UseMUON())	Append2Str(sDigits, "MUON"); 
    if (UseFMD())	Append2Str(sDigits, "FMD"); 
    if (UseZDC())	Append2Str(sDigits, "ZDC"); 
    if (UsePMD())	Append2Str(sDigits, "PMD"); 
    if (UseT0())	Append2Str(sDigits, "T0"); 
    if (UseVZERO())	Append2Str(sDigits, "VZERO");
  }
  /** 
   * Get the sting of detectors for which we should do the hit to
   * digit conversion directly.
   * 
   * @param fromHits On returm contains the string of enable detectors
   */
  void GetHits2DigitsString(TString& fromHits) const
  {
    if (UseITS())	Append2Str(fromHits, "ITS");
    if (UseTPC())	Append2Str(fromHits, "TPC");
  }
  /** 
   * Append a C style string to a string, possibly adding a space before
   * 
   * @param str     Where to append
   * @param append  What to append
   */
  static void Append2Str(TString& str, const char* append)
  {
    if (!str.IsNull()) str.Append(" ");
    str.Append(append);
  }
  
};
/** Global variable */
VirtualDetCfg* detCfg = 0;

//====================================================================
/**
 * Base class for the OCDG configration 
 */
struct VirtualOCDBCfg
{
  /** 
   * This member function must return the default prefix. 
   * 
   * @return Prefix of OCDB specific storages
   */
  virtual const char* Prefix() const { return ""; }
  /** 
   * This member function should define the real setup. 
   * 
   * @param forSim Whether we're setting up for simulations or not 
   */
  virtual void Init(Bool_t forSim) 
  {
    ::Fatal("VirtualOCDBConfig", "Dummy init called - redefine!");
  }
  /** 
   * Set the specific storage for a given key (possibly wild-carded). 
   * 
   * @param key    Key 
   * @param ideal  Whether it is residual or ideal
   */
  void AddStore(const char*    key, 
		Bool_t         ideal)
  {
    AliCDBManager* cdb = AliCDBManager::Instance();
    const char* prefix = Prefix();
    TString     path   = Form("alien://Folder=/alice/simulation/%s/%s",
			      prefix, !ideal ? "Residual" : "Ideal");
    ::Info("AddStore", "%s -> %s", key, path.Data());
    cdb->SetSpecificStorage(key, path);
  }
};

/** Global variable */
VirtualOCDBCfg* ocdbCfg = 0;

//====================================================================
/** 
 * Event generator configuration 
 * 
 */
struct VirtualEGCfg 
{
  TString runType;
  VirtualEGCfg() : runType("") {}
  virtual ~VirtualEGCfg() {}
  virtual Bool_t IsLego() const { return false; }
    /** 
   * Set the default generator based on the beam type 
   *
   * - p-p PYTHIA
   * - p-A or A-p DPMJet
   * - A-A Hijing 
   */
  static const char* DeduceRunType()
  {
    if      (grp->IsPP())                return "pythia";
    else if (grp->IsPA() || grp->IsAP()) return "dpmjet";
    else if (grp->IsAA())                return "hijing";
    return "hijing";
  }

  static void LoadLibrary(const TString& name,
			  const TString& cls="")
  {
    // If we're looking for a specific class, check that first, and
    // if available, do nothing;
    if (!cls.IsNull() && gROOT->GetClass(cls)) return;

    // Now check the list of loaded and linekd libraries 
    TString libs(gSystem->GetLibraries("", "SD"));

    // IF already in the list, do nothing 
    if (libs.Contains(name)) return;

    // Otherwise load the library 
    gSystem->Load(name);
  }
  /**
   * Load the general libraries needed
   *
   */
  static void LoadGen(const TString& runType) {
    LoadLibrary("liblhapdf","AliStructFuncType"); // Parton density functions
    LoadLibrary("libEGPythia6","TPythia6");       // TGenerator interface
    if (!runType.EqualTo("hydjet", TString::kIgnoreCase))
      LoadPythia(false);
  }

  /**
   * Load the pythia libraries
   *
   * @param vers Optional version post-fix
   */
  static void LoadPythia(Bool_t gen=true, const char* vers="6.4.21")
  {
    if (gen) LoadGen("");
    char m = vers[0];
    if (gROOT->GetClass(Form("AliPythia6%c", m))) return;

    LoadLibrary("libmicrocern");
    LoadLibrary(Form("libpythia%s",vers));
    LoadLibrary(Form("libAliPythia%c", m));
  }
  /**
   * Load HIJING libraries
   */
  static void LoadHijing()
  {
    LoadPythia();
    if (gROOT->GetClass("THijing")) return;
    LoadLibrary("libhijing");
    LoadLibrary("libTHijing");
    AliPDG::AddParticlesToPdgDataBase();
  }
  /**
   * Load HydJet libraries
   */
  static void LoadHydjet()
  {
    LoadLibrary("libTUHKMgen","TUHKMgen");
  }
  /**
   * Load DPMJet libraries
   */
  static void LoadDpmjet()
  {
    LoadPythia();
    if (gROOT->GetClass("TDPMjet")) return;
    LoadLibrary("libdpmjet");
    LoadLibrary("libTDPMjet");
  }
  /**
   * Load AMPT libraries
   */
  static void LoadAmpt()
  {
    LoadPythia();
    if (gROOT->GetClass("TAmpt")) return;
    LoadLibrary("libampt");
    LoadLibrary("libTAmpt");
  }
  /**
   * Make the generator
   *
   * @param rt    Event generator identifier 
   * @param b1    Least impact parameter 
   * @param b2    Largest impact parameter 
   * @param smear If true, smear interaction per event 
   *
   * @return Point to newly allocated generator or null
   * 
   */
  AliGenerator* MakeGenerator(const TString& rt, 
			      Float_t b1, 
			      Float_t b2, 
			      Bool_t smear=true)
  {
    if (rt.IsNull()) { 
      ::Fatal("MakeGenerator", "No EG spec given");
      return 0;
    }

    TString runType = rt;
    runType.ToLower();

    AliGenerator* g = CreateGenerator(runType,b1,b2);
    if (g && smear) g->SetVertexSmear(AliGenerator::kPerEvent);

    return g;
  }
  /**
   * Make our decayer
   *
   * @param rt The EG to use 
   *
   * @return Newly allocated decayer or null
   */
  TVirtualMCDecayer* MakeDecayer(const TString& rt)
  {
    if (rt.IsNull()) { 
      ::Fatal("MakeGenerator", "No EG spec given");
      return 0;
    }

    TString runType = rt;
    rt.ToLower();

    TVirtualMCDecayer* decayer = CreateDecayer(runType);

    if (decayer) decayer->Init();
    return decayer;
  }
protected:
  /** 
   * Create the generator.  This function must be defined in a derived class. 
   * 
   * @param runType The generator ID (all lower case)
   * @param b1      Least impact parameter 
   * @param b2      Largest impact parameter 
   * 
   * @return Must return a pointer to a new AliGenerator or null
   */
  virtual AliGenerator* CreateGenerator(const TString& runType, 
					Float_t b1, 
					Float_t b2) = 0;
  /** 
   * Create the decayer.  This function must be defined in a derived class. 
   * 
   * @param runType The generator ID (all lower case)
   * 
   * @return Must return a pointer to a new TVirtualMCDecayer or null
   */
  virtual TVirtualMCDecayer* CreateDecayer(const TString& runType) = 0;

};
/** Global variable */
VirtualEGCfg* egCfg = 0;

//====================================================================
/**
 * Base class for trains 
 * 
 */
struct VirtualTrain 
{


  /** 
   * Run this train 
   * 
   * @param run 
   * @param xmlFile 
   * @param stage 
   * @param cdb 
   * 
   * @return 
   */
  Bool_t Run(UInt_t      run, 
	     const char* xmlFile = "wn.xml", 
	     Int_t       stage   = 0, 
	     const char* cdb     = "raw://")
  {
    // --- Load configuration script ---------------------------------
    LoadConfig();
    
    // --- Set-up for CDB access through Grid ------------------------
    TString cdbString(cdb);
    if (cdbString.Contains("raw://")) {
      TGrid::Connect("alien://");
      if (!gGrid || !gGrid->IsConnected()) {
	::Error("Run", "No grid connection");
	return false;
      }  
    }
    
    // --- Some environment variables --------------------------------
    // Temp dir is here, and compilation is here too 
    gSystem->Setenv("TMPDIR", gSystem->pwd());
    gSystem->SetBuildDir(gSystem->pwd(), kTRUE);

    // --- Now load common libraries ---------------------------------
    LoadBaseLibraries();
    
    // --- Now create and configure manager --------------------------
    AliAnalysisManager *mgr  = new AliAnalysisManager(GetName(), 
						      "Production train");
    mgr->SetRunFromPath(grp->run);
    
    // --- Create ESD input handler ------------------------------------
    AliESDInputHandlerRP *esdHandler = new AliESDInputHandlerRP();
    mgr->SetInputEventHandler(esdHandler);
    if (UseFriends()) {
      esdHandler->SetReadFriends(kTRUE);
      esdHandler->SetActiveBranches("ESDfriend");
    }

    // --- Monte Carlo handler -----------------------------------------
    if (UseMC()) {
      AliMCEventHandler* mcHandler = new AliMCEventHandler();
      mgr->SetMCtruthEventHandler(mcHandler);
      mcHandler->SetPreReadMode(1);
      mcHandler->SetReadTR(true);
    }
    // --- AOD output handler ----------------------------------------
    if (MakeAOD()) {
      AliAODHandler* aodHandler   = new AliAODHandler();
      aodHandler->SetOutputFileName("AliAOD.root");
      mgr->SetOutputEventHandler(aodHandler);
    }
    
    // --- Call user routine for adding tasks ------------------------
    if (!AddTasks()) return false;
    
    // --- Check if we are to merge ----------------------------------
    if (stage > 0) 
      return Merge(xmlfile, stage);

    // --- Otherwise run the train -----------------------------------
    TChain* chain = CreateChain();
    if (!chain) return false;

    TStopwatch timer;
    timer.Start();
    if (!mgr->InitAnalysis()) {
      ::Error("Run", "Failed to initialize the train");
      return false;
    }

    mgr->PrintStatus();
    mgr->SetSkipTerminate(kTRUE);
    mgr->StartAnalysis("local", chain);
    timer.Print();
    
  }
  /** 
   * Merge requested files 
   * 
   * @param dir    Output directory 
   * @param stage  Stage 
   * 
   * @return true on success 
   */
  Bool_t Merge(const char* dir, Int_t stage)
  {

    TStopwatch    timer;     
    timer.Start();
    TString       outputDir     = dir;
    Bool_t        final         = outputDir.Contains("Stage");
    TCollection*  outputFiles   = GetFilesToMerge(stage, final);
    if (!outputFiles) { 
      ::Warning("Merge", "Nothing to merge");
      return true;
    }
    TIter       iter(outputFiles);
    TObjString* str           = 0;
    Bool_t      merged        = kTRUE;
    while((str = static_cast<TObjString*>(iter()))) {
      TString& outputFile = str->GetString();
      // Skip already merged outputs
      if (!gSystem->AccessPathName(outputFile)) {
	::Warning("Merge","Output file <%s> found. Not merging again.",
		  outputFile.Data());
	continue;
      }
      merged = AliAnalysisAlien::MergeOutput(outputFile, 
					     outputDir, 
					     10, 
					     stage);
      if (merged) continue; 
      
      ::Error("Merge", "Cannot merge %s\n", outputFile.Data());
    }
    // --- possible merge file information files ---------------------
    if (MergeFileInfo()) { 
      TString infolog = "fileinfo.log";
      AliAnalysisAlien::MergeInfo(infolog, dir); 
    }

    // --- If not final stage, get out here --------------------------
    if (!final) { 
      ValidateOutput();
      timer.Print();
      return true;
    }
    
    // --- set up and run termiante ----------------------------------
    AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
    mgr->SetSkipTerminate(kFALSE);
    if (!mgr->InitAnalysis()) {
      ::Error("Merge", "Failed to initialize the train");
      return false;
    }
    
    mgr->PrintStatus();
    mgr->StartAnalysis("gridterminate", (TTree*)0);
    ValidateOutput();
    timer.Print();

    return true;
  }
	       
  /** 
   * Load a library/module 
   * 
   * @param module Library/module name 
   * 
   * @return true on success
   */
  Bool_t LoadLibrary(const char *module)
  {
    // Load a module library in a given mode. Reports success.
    Int_t result = 0;
    TString mod(module);
    ::Info("LoadLibrary", "Loading %s", module);
    gROOT->IncreaseDirLevel();

    if (mod.IsNull()) {
      ::Error("LoadLibrary", "Empty module name");
      gROOT->DecreaseDirLevel();
      return kFALSE;
    }

    // If a library is specified, just load it
    if (mod.EndsWith(".so")) {
      mod.Remove(mod.Index(".so"));
      ::Info("LoadLibrary", "Loading .so: %s", mod.Data()); 
      result = gSystem->Load(mod);
      if (result < 0) {
	::Error("oadLibrary", "Could not load library %s", module);
      }
      gROOT->DecreaseDirLevel();      
      return (result >= 0);
    }
    // Check if the library is already loaded
    if (strlen(gSystem->GetLibraries(Form("%s.so", module), "", kFALSE)) > 0) {
      ::Info("LoadLibrary", "Module %s.so already loaded", module);
      gROOT->DecreaseDirLevel();      
      return kTRUE;
    }

    ::Info("LoadLibrary", "Trying to load lib%s.so", module);
    result = gSystem->Load(Form("lib%s.so", module));
    if (result < 0)
      ::Error("LoadLibrary", "Could not load module %s", module);
    ::Info("LoadLibrary", "Module %s, successfully loaded", module);
    gROOT->DecreaseDirLevel();      
    return (result >= 0);
  }
  /** 
   * Load common libraries 
   * 
   * @return true on sucess 
   */
  virtual Bool_t LoadBaseLibraries()
  {
    // Load common analysis libraries.
    if (!gSystem->Getenv("ALICE_ROOT")) {
      ::Error("LoadBaseLibraries", 
	      "Analysis trains requires that analysis libraries are "
	      "compiled with a local AliRoot");
      return false;
    }

    Bool_t success = true;
    // Load framework classes. Par option ignored here.
    success &= LoadLibrary("libSTEERBase.so");
    success &= LoadLibrary("libESD.so");
    success &= LoadLibrary("libAOD.so");
    success &= LoadLibrary("libANALYSIS.so");
    success &= LoadLibrary("libOADB.so");
    success &= LoadLibrary("libANALYSISalice.so");
    success &= LoadLibrary("libESDfilter.so");
    success &= LoadLibrary("libCORRFW.so");
    success &= LoadLibrary("libPWGPP.so");
    gROOT->ProcessLine(".include $ALICE_ROOT/include");
    if (success) {
      ::Info("LoadBaseLibraries", 
	     "Load common libraries:    SUCCESS");
      ::Info("LoadBaseLibraries", 
	     "Include path for Aclic compilation:\n%s",
	     gSystem->GetIncludePath());
    } else {
      ::Info("LoadBaseLibraries", 
	     "Load common libraries:    FAILED");
    }
    return success;
  }
  /** 
   * Create the input chain
   * 
   * @return Pointer to newly allocated train 
   */
  TChain* CreateChain()
  {
    if (gSystem->AccessPathName("AliESDs.root")) {
      ::Error("CreateChain", 
	      "File: AliESDs.root not in ./data dir");
      return 0;
    }
    
    // Create the input chain
    TChain* chain = new TChain("esdTree");
    chain->Add("AliESDs.root");
    if (!chain->GetNtrees()) {
      delete chain;
      chain = 0;
    }

    return chain;
  }
  /** 
   * Helper function to make @c outputs_valid file 
   * 
   */
  void ValidateOutput()
  {
    std::ofstream out;
    out.open("outputs_valid", ios::out);
    out.close();    
  }  

  /** 
   * @{ 
   * @name Functions to overload 
   */
  /** 
   * Load the configuration script. Override to load specific script.
   */
  virtual void LoadConfig() {};
  /** 
   * Override to set a name of the analysis manager 
   * 
   * @return Name of analysis manager 
   */
  virtual const char* GetName() const { return "dummy"; }
  /** 
   * Override to return true if friends are needed. 
   * 
   * @return false
   */
  virtual Bool_t UseFriends() const { return false; }
  /** 
   * Override to return true if MC info is needed
   * 
   * @return false
   */
  virtual Bool_t UseMC() const { return false; }
  /** 
   * Override to return true if AODs should be made 
   * 
   * @return false
   */
  virtual Bool_t MakeAOD() const { return false; }
  /**
   * User rountine for adding tasks. Override to add tasks to the
   * train.
   *
   * @return true
   */
  virtual Bool_t AddTasks() const { return true; }
  /** 
   * Override to return true to merge file information files. 
   * 
   * @return false
   */
  virtual Bool_t MergeFileInfo() const { return false; }
  /** 
   * Return the list of ouput files (TObjString objects)
   *
   * @param stage Merge stage 
   * @param final Final merging (also terminate)
   *
   * @return Pointer to TCollection. 
   */
  virtual TCollection* GetFilesToMerge(Int_t stage, Bool_t final) const 
  { 
    return 0; 
  }
};




//====================================================================
/**
 * A function so that we can do TROOT::Macro.  Does nothing but print a message.
 *
 */
void BaseConfig()
{
  Info("", "Defined base classes for configuration");
}
//
// EOF
//

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