ROOT logo
//===================== ANALYSIS TRAIN =========================================
// To use: copy this macro to your work directory, modify the global part to match
// your needs, then run root.
//    root[0] .L AnalysisTrainHMPID.C
// Grid full mode as below (other modes: test, offline, submit, terminate)
//    root[1] AnalysisTrainHMPID("grid", "full")
// CAF mode (requires root v5-23-02 + aliroot v4-16-Rev08)
//    root[2] AnalysisTrainHMPID("proof")
// Local mode requires AliESds.root or AliAOD.root in ./data directory
//    root[3] AnalysisTrainHMPID("local")
// In proof and grid modes, a token is needed and sourcing the produced environment file.
//

// =============================================================================
// ### General Steering variables
// =============================================================================
//== general setup variables
TString     kTrainName         = "hmpidAnalysis"; // (no blancs or special characters)
TString     kJobTag            = "HMPID Tasks analysis train configured"; //
Bool_t      kUsePAR            = kFALSE;  // use par files for extra libs
Bool_t      kUseCPAR           = kFALSE;  // use par files for common libs
Bool_t      kFillAOD           = kFALSE;  // switch of AOD filling for on the fly analysis

Int_t       iAODhandler        = 1;      // Analysis produces an AOD or dAOD's
Int_t       iESDfilter         = 0;      // ESD to AOD filter (barrel + muon tracks)
Int_t       iPhysicsSelection  = 1;      // Physics selection task
Bool_t      kUseKinefilter     = kFALSE; // use Kinematics filter
Bool_t      kUseMuonfilter     = kFALSE; // use muon filter
TString     kCommonOutputFileName = "HmpidOutput.root";


//== general process variables

// ### Other flags to steer the analysis
//==============================================================================
Bool_t      kSkipTerminate      = kFALSE; // Do not call Teminate
Bool_t      kDebugLevel         = kTRUE; // activate debugging
Int_t       kUseSysInfo         = 0; // activate debugging
Bool_t      kUseMC              = kTRUE;  // use MC info
Bool_t      kIsMC               = kFALSE;  // is MC info, if false it overwrites Use(AOD)MC
Bool_t      kUseESDTags         = kFALSE; // use ESD tags for selection
Bool_t      kUseTR              = kFALSE;  // use track references

// ### Analysis modules to be included. Some may not be yet fully implemented.
//==============================================================================
Int_t       iHMPID             = 1;      // Basic HMPID analysis task
Int_t       iJETAN             = 0;      // Jet analysis (PWG4) // 1 write standard 2 write non-standard jets
Int_t       iJETANLib          = 0;
Int_t       kHighPtFilterMask  = 16;     // change depending on the used AOD Filter


//==============================================================================
// ### PROOF Steering varibales
//==============================================================================
//== proof setup variables
TString     kProofCluster      = "alice-caf.cern.ch";
Bool_t      kProofUseAFPAR     = kTRUE;  // use AF special par file
TString     kProofAFversion    = "VO_ALICE@AliRoot::v4-20-08-AN";
//== proof input and output variables
TString     kProofDataSet      = "/alice/sim/LHC10d2_117220";
//== proof process variables
Bool_t      kProofClearPackages = kFALSE;
Int_t       kProofEvents = 10000;
Int_t       kProofOffset = 0;

//==============================================================================
// ### Grid plugin Steering varibiables
//==============================================================================
//== grid plugin setup variables
Bool_t      kPluginUse         = kTRUE;   // do not change
Bool_t      kPluginUseProductionMode  = kFALSE;   // use the plugin in production mode
TString     kPluginRootVersion       = "v5-30-03";  // *CHANGE ME IF MORE RECENT IN GRID*
TString     kPluginAliRootVersion    = "v5-02-06-AN";  // *CHANGE ME IF MORE RECENT IN GRID*                                          
Bool_t      kPluginMergeViaJDL       = kTRUE;  // merge via JDL
Bool_t      kPluginFastReadOption    = kFALSE;  // use xrootd flags to reduce timeouts
Bool_t      kPluginOverwriteMode     = kTRUE;  // overwrite existing collections
Int_t       kPluginOutputToRunNumber = 1;     // write the output to subdirs named after run number
TString kPluginExecutableCommand = "root -b -q";

// == grid plugin input and output variables
TString     kGridDatadir      = "/alice/data/2010/LHC10b";
TString     kGridLocalRunList = "";
TString     kGridWorkDir      = "LHC10b/pass3";   // Alien working directory
TString     kGridOutdir       = ""; // AliEn output directory. If blank will become output_<kTrainName>
TString     kGridDataSet      = ""; // sub working directory not to confuse different run xmls 
Int_t       kGridRunRange[2]       = {114783, 114783}; // Set the run range
TString     kGridRunPattern        = "%03d"; // important for leading zeroes!!
TString     kGridPassPattern       = "/ESDs/pass3";
//TString     kGridPassPattern       = "ESDs/pass1"; to work with plugin->AddRunNumber
TString     kGridExtraFiles        = ""; // files that will be added to the input list in the JDL...
Int_t       kGridMaxMergeFiles      = 12; // Number of files merged in a chunk grid run range
TString     kGridMergeExclude       = "AliAOD.root"; // Files that should not be merged
TString     kGridOutputStorages      = "disk=2"; // Make replicas on the storages
// == grid process variables
Int_t       kGridRunsPerMaster     = 1; // Number of runs per master job
Int_t       kGridFilesPerJob       = 100; // Maximum number of files per job (gives size of AOD)

//==============================================================================
// ### Local Steering variables
//==============================================================================
//== local setup variables
//== local input and output variables
TString     kLocalXMLDataset   = ""; // Change local xml dataset for local interactive analysis
TString     kLocalDataList   = "list.txt"; // Change local xml dataset for local interactive analysis
// == local process variables



// Temporaries.
TString anaPars = "";
TString anaLibs = "";
TString anaLibsExtra = "";
TString anaSources = "";
// Function signatures
class AliAnalysisAlien;

//______________________________________________________________________________
void AnalysisTrainHMPID(const char *analysis_mode="local", const char *plugin_mode="",
                        const char *config_file="",Int_t iOffset = 0)
{
// Main analysis train macro. If a configuration file is provided, all parameters
// are taken from there but may be altered by CheckModuleFlags.

   if (strlen(config_file) && !LoadConfig(config_file)) return;

   if(iOffset)kProofOffset = iOffset;
   TString smode(analysis_mode);
   smode.ToUpper();
   // Check compatibility of selected modules
   CheckModuleFlags(smode);

   printf("==================================================================\n");
   printf("===========    RUNNING ANALYSIS TRAIN %s IN %s MODE   ==========\n", kTrainName.Data(),smode.Data());
   printf("==================================================================\n");
   printf("=  Configuring analysis train for:                               =\n");
   printf("=  ESD analysis                                                  =\n");
   if (iPhysicsSelection)   printf("=  Physics selection                                                    =\n");
   if (iESDfilter)   printf("=  ESD filter                                                    =\n");
   if (iJETAN)       printf("=  Jet analysis                                                  =\n");
   printf("==================================================================\n");
   printf(":: use MC truth      %d\n", (UInt_t)kUseMC);
   printf(":: use KINE filter   %d\n", (UInt_t)kUseKinefilter);
   printf(":: use track refs    %d\n", (UInt_t)kUseTR);
   printf(":: use tags          %d\n", (UInt_t)kUseESDTags);
   printf(":: use debugging     %d\n", (UInt_t)kDebugLevel);
   printf(":: use PAR files     %d\n", (UInt_t)kUsePAR);
   printf(":: use AliEn plugin  %d\n", (UInt_t)kPluginUse);
   
   //==========================================================================
   // Connect to back-end system
   if (!Connect(smode)) {
      ::Error("AnalysisTrain", "Could not connect to %s back-end", analysis_mode);
      return;
   }   

   // Load common libraries and set include path
   if (!LoadCommonLibraries(smode)) {
      ::Error("AnalysisTrain", "Could not load common libraries");
      return;
   }


    
   // Make the analysis manager and connect event handlers
   AliAnalysisManager *mgr  = new AliAnalysisManager("HMPIDTrain", "HMPID train");
   if (kCommonOutputFileName.Length()>0)mgr->SetCommonFileName(kCommonOutputFileName.Data());
   mgr->SetNSysInfo(0);
   if (!strcmp(plugin_mode, "test")) mgr->SetNSysInfo(1);
   if (kUseSysInfo)mgr->SetNSysInfo(kUseSysInfo);
   mgr->SetSkipTerminate(kSkipTerminate);

   // Load analysis specific libraries
   if (!LoadAnalysisLibraries(smode)) {
      ::Error("AnalysisTrain", "Could not load analysis libraries");
     return;
   }   

   // Create input handler (input container created automatically)
   // ESD input handler
   AliESDInputHandler *esdHandler = new AliESDInputHandler();
   if (kUseESDTags) esdHandler->SetReadTags();
   esdHandler->SetReadFriends(kFALSE);
   mgr->SetInputEventHandler(esdHandler);       

   // Monte Carlo handler
   if (kUseMC) {
      AliMCEventHandler* mcHandler = new AliMCEventHandler();
      mgr->SetMCtruthEventHandler(mcHandler);
      mcHandler->SetReadTR(kUseTR); 
   }   

   // AOD output container, created automatically when setting an AOD handler
   if (iAODhandler) {
      // AOD output handler
      AliAODHandler* aodHandler   = new AliAODHandler();
      aodHandler->SetOutputFileName("AliAOD.root");
      aodHandler->SetFillAODforRun(kFillAOD);
      
      mgr->SetOutputEventHandler(aodHandler);
      AliAnalysisDataContainer *cout_aod = mgr->GetCommonOutputContainer();
      cout_aod->SetSpecialOutput();
   }

   // Debugging if needed
   if (kDebugLevel){
      mgr->SetDebugLevel(3);
   }
   if(kUseSysInfo>0){
      mgr->RegisterExtraFile("syswatch.root");
      if(kGridMergeExclude.Length())kGridMergeExclude += " ";
      kGridMergeExclude += "syswatch.root";
   } else {
      AliLog::SetGlobalLogLevel(AliLog::kError);
   }

   //==========================================================================
   // Create the chain. In this example it is created only from ALIEN files but
   // can be done to work in batch or grid mode as well.
   TChain *chain = CreateChain(smode, plugin_mode);
        
   //==========================================================================
   // Load the tasks configuration macros for all wagons. These files are supposed now to be
   // in the current workdir, but in AliEn they will be in the file catalog, 
   // mapped from AliRoot and pecified in the jdl input list.
   if(iPhysicsSelection){
     gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
     AliPhysicsSelectionTask* physSelTask = AddTaskPhysicsSelection(); // last flag also adds information on  
   }

   if (iESDfilter) {
      //  ESD filter task configuration.
      gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskESDFilter.C");
      AliAnalysisTaskESDfilter *taskesdfilter = AddTaskESDFilter(kUseKinefilter,kUseMuonfilter);
      if(kIsMC){
         mgr->RegisterExtraFile("pyxsec_hists.root");
         if(kGridMergeExclude.Length())kGridMergeExclude += " ";
         kGridMergeExclude += "pyxsec_hists.root";
      }
   }   

    // Jet analysis
   if (iJETAN) {
      gROOT->LoadMacro("$ALICE_ROOT/PWG4/macros/AddTaskJets.C");
      AliAnalysisTaskJets *taskjets = 0;
      if (iJETAN&1) taskjets = AddTaskJets(kHighPtFilterMask); 
      if (!taskjets) ::Warning("AnalysisTrainHMPID", "AliAnalysisTaskJets cannot run for this train conditions - EXCLUDED");
   }
   
    gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPIDResponse.C");
    AliAnalysisTaskPIDResponse  *taskPIDResponse = AddTaskPIDResponse();
      

   if(iHMPID){
     gROOT->LoadMacro("$ALICE_ROOT/HMPID/AddTaskHMPID.C");
     AliHMPIDAnalysisTask *taskHmpid = AddTaskHMPID(kUseMC);
     taskHmpid->SelectCollisionCandidates();
     if (!taskHmpid) ::Warning("AnalysisTrainHMPID", "AliAnalysisTaskHMPID cannot run for this train conditions - EXCLUDED");
   }

   if (kPluginUse) {
      AliAnalysisGrid *alienHandler = CreateAlienHandler(plugin_mode);
      AliAnalysisManager::GetAnalysisManager()->SetGridHandler(alienHandler);
   }

   if (mgr->InitAnalysis()) {
     mgr->PrintStatus();
     if (!strcmp(plugin_mode,"submit") && smode=="GRID"){
       TString alien_workdir = gGrid->GetHomeDirectory();
       alien_workdir += kGridWorkDir.Data();
       if(kGridDataSet.Length()>0)alien_workdir += Form("/%s",kGridDataSet.Data());
       AliAnalysisAlien *gridhandler = (AliAnalysisAlien*)mgr->GetGridHandler();
       printf("=== AnalysisTrainHMPID:: Registering jdl in the work directory alien://%s/%s, should be done by the manager! ===\n",
	      alien_workdir.Data(),gridhandler->GetGridOutputDir());

       TString dest;
       dest = Form("%s/%s/%s.jdl",alien_workdir.Data(),gridhandler->GetGridOutputDir(),kTrainName.Data());
       if(AliAnalysisAlien::FileExists(dest.Data())){
     //  Printf("%s exist on grid removing...",dest.Data());
     //  gGrid->Rm(dest.Data());
       }
       TFile::Cp(Form("file:%s.jdl",kTrainName.Data()),Form("alien://%s",dest.Data()));


       TString dest;
       dest = Form("%s/%s/%s_merge.jdl",alien_workdir.Data(),gridhandler->GetGridOutputDir(),kTrainName.Data());
       if(AliAnalysisAlien::FileExists(dest.Data())){
	 //	 Printf("%s exist on grid removing...",dest.Data());
	 //	 gGrid->Rm(dest.Data());
       }
       TFile::Cp(Form("file:%s_merge.jdl",kTrainName.Data()),Form("alien://%s",dest.Data()));
     }

     AliLog::SetGlobalLogLevel(AliLog::kError);
     if((kUseSysInfo>0 && smode=="LOCAL") || !strcmp(plugin_mode, "test")){
       TFile *fM = TFile::Open("manager_local.root","RECREATE");
       mgr->Write();
       fM->Close();
     }

     StartAnalysis(smode, chain);
       
     if((kUseSysInfo>0 && smode=="LOCAL") || !strcmp(plugin_mode, "test")){
       for(int i = 0;i < mgr->GetTopTasks()->GetEntries();i++){
         mgr->ProfileTask(i);
       }
     }
     if (!strcmp(plugin_mode, "offline") && smode=="GRID"){
       // Offline mode path files
       //	PatchJDL();
       PatchAnalysisMacro();
     }
   }
}


//______________________________________________________________________________
void StartAnalysis(const char *mode, TChain *chain) {

   Int_t imode = -1;
   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
   if (!strcmp(mode, "LOCAL")) imode = 0;
   if (!strcmp(mode, "PROOF")) imode = 1;
   if (!strcmp(mode, "GRID"))  imode = 2;
   switch (imode) {
      case 0:
         if (!chain) {
            ::Error("AnalysisTrainHMPID.C::StartAnalysis", "Cannot create the chain");
            return;
         }
         mgr->StartAnalysis(mode, chain);
         return;
      case 1:
         if (!kProofDataSet.Length()) {
            ::Error("AnalysisTrainHMPID.C::StartAnalysis", "kProofDataSet is empty");
            return;
         }
         mgr->StartAnalysis(mode, kProofDataSet, kProofEvents,kProofOffset);
         return;
      case 2:
         if (kPluginUse) {
            if (!mgr->GetGridHandler()) {
               ::Error("AnalysisTrainHMPID.C::StartAnalysis", "Grid plugin not initialized");
               return;
            }
            mgr->StartAnalysis("grid");
         } else {
            if (!chain) {
               ::Error("AnalysisTrainHMPID.C::StartAnalysis", "Cannot create the chain");
               return;
            }
            mgr->StartAnalysis(mode, chain);
         }
      return;
   }
}

//______________________________________________________________________________
void CheckModuleFlags(const char *mode) {
// Checks selected modules and insure compatibility
   Int_t imode = -1;
   if (!strcmp(mode, "LOCAL")) imode = 0;
   if (!strcmp(mode, "PROOF")) imode = 1;
   if (!strcmp(mode, "GRID"))  imode = 2;


   if (kUseCPAR) {
     kPluginAliRootVersion    = ""; // NO aliroot if we use CPAR
   }

   if (imode==1) {
      if (!kUsePAR) {
         ::Info("AnalysisTrainHMPID.C::CheckModuleFlags", "PAR files enabled due to PROOF analysis");
         kUsePAR = kTRUE;
      }   
   }  
   if (imode != 2) {
      ::Info("AnalysisTrainHMPID.C::CheckModuleFlags", "AliEn plugin disabled since not in GRID mode");
      kPluginUse = kFALSE; 
   }

   if(!kIsMC){
     // switch off anthin related to MC
     kUseMC = 0;
     kUseTR = kFALSE;
   }

 // ESD analysis
   if (!kUseMC){
     kUseTR = kFALSE;
     if(kUseKinefilter)::Info("AnalysisTrainHMPID.C::CheckModuleFlags", "Kine Filter disabled in analysis without MC");
     kUseKinefilter = kFALSE;
   }
   if (iJETAN){
     iESDfilter=1;
   }
   if (!iESDfilter){
     kUseKinefilter = kFALSE;
     kUseMuonfilter = kFALSE;
   }

   iJETANLib = iJETAN && 1;
   if (iESDfilter) {iAODhandler=1;}
   if (kUseKinefilter && !kUseMC) kUseKinefilter = kFALSE;
   
}


//______________________________________________________________________________
Bool_t Connect(const char *mode) {
// Connect <username> to the back-end system.
   Int_t imode = -1;
   if (!strcmp(mode, "LOCAL")) imode = 0;
   if (!strcmp(mode, "PROOF")) imode = 1;
   if (!strcmp(mode, "GRID"))  imode = 2;
   TString username = gSystem->Getenv("alien_API_USER");
   switch (imode) {
     case 0:
       break;
     case 1:
       if  (!username.Length()) {
         ::Error(Form("AnalysisTrainHMPID.C::Connect <%s>", mode), "Make sure you:\n \
                        1. Have called: alien-token-init <username>\n \
                        2. Have called: >source /tmp/gclient_env_$UID");
         return kFALSE;
       }
       ::Info("AnalysisTrainHMPID.C::Connect", "Connecting user <%s> to PROOF cluster <%s>", 
                username.Data(), kProofCluster.Data());
       gEnv->SetValue("XSec.GSI.DelegProxy", "2");
       TProof::Open(Form("%s@%s", username.Data(), kProofCluster.Data()));       
       if (!gProof) {
         if (strcmp(gSystem->Getenv("XrdSecGSISRVNAMES"), "lxfsrd0506.cern.ch"))
           ::Error(Form("AnalysisTrainHMPID.C::Connect <%s>", mode), "Environment XrdSecGSISRVNAMES different from lxfsrd0506.cern.ch");
           return kFALSE;
         }
       if(kProofClearPackages)gProof->ClearPackages();
       break;
     case 2:      
       if  (!username.Length()) {
         ::Error(Form("AnalysisTrainHMPID.C::Connect <%s>", mode), "Make sure you:\n \
                        1. Have called: alien-token-init <username>\n \
                        2. Have called: >source /tmp/gclient_env_$UID");
         return kFALSE;
       }
       if (kPluginUse && !gSystem->Getenv("alien_CLOSE_SE")) {
         ::Error(Form("AnalysisTrainHMPID.C::Connect <%s>", mode), 
                        "When using the AliEn plugin it is preferable to define the \
                        variable alien_CLOSE_SE in your environment.");
         return kFALSE;
       }
       ::Info("AnalysisTrainHMPID.C::Connect", "Connecting user <%s> to AliEn ...", 
                username.Data());
       TGrid::Connect("alien://");
       if (!gGrid || !gGrid->IsConnected()) return kFALSE;
       break;
     default:
       ::Error("AnalysisTrainHMPID.C::Connect", "Unknown run mode: %s", mode);
       return kFALSE;
   }
   ::Info("AnalysisTrainHMPID.C::Connect","Connected in %s mode", mode);
   return kTRUE;
}


//______________________________________________________________________________
Bool_t LoadCommonLibraries(const char *mode)
{
// Load common analysis libraries.
   Int_t imode = -1;
   if (!strcmp(mode, "LOCAL")) imode = 0;
   if (!strcmp(mode, "PROOF")) imode = 1;
   if (!strcmp(mode, "GRID"))  imode = 2;
   if (!gSystem->Getenv("ALICE_ROOT")) {
      ::Error("AnalysisTrainHMPID.C::LoadCommonLibraries", "Analysis train requires that analysis libraries are compiled with a local AliRoot"); 
      return kFALSE;
   }   
   Bool_t success = kTRUE;
   // ROOT libraries
   gSystem->Load("libTree.so");
   gSystem->Load("libGeom.so");
   gSystem->Load("libVMC.so");
   gSystem->Load("libPhysics.so");
   
   // Load framework classes. Par option ignored here.
   switch (imode) {
      case 0:
      case 2:
         if (kUseCPAR) {
            success &= LoadLibrary("STEERBase", mode, kTRUE);
            success &= LoadLibrary("ESD", mode, kTRUE);
            success &= LoadLibrary("AOD", mode, kTRUE);
            success &= LoadLibrary("ANALYSIS", mode, kTRUE);
            success &= LoadLibrary("ANALYSISalice", mode, kTRUE);
            success &= LoadLibrary("CORRFW", mode, kTRUE);
         } else {   
            success &= LoadLibrary("libSTEERBase.so", mode);
            success &= LoadLibrary("libESD.so", mode);
            success &= LoadLibrary("libAOD.so", mode);
            success &= LoadLibrary("libANALYSIS.so", mode);
            success &= LoadLibrary("libANALYSISalice.so", mode);
            success &= LoadLibrary("libCORRFW.so", mode);
            gROOT->ProcessLine(".include $ALICE_ROOT/include");
         }   
         break;
      case 1:
         if (!kProofUseAFPAR) {
            success &= LoadLibrary("STEERBase", mode);
            success &= LoadLibrary("ESD", mode);
            success &= LoadLibrary("AOD", mode);
            success &= LoadLibrary("ANALYSIS", mode);
            success &= LoadLibrary("ANALYSISalice", mode);
            success &= LoadLibrary("CORRFW", mode);
         } else { 
            success &= !gProof->EnablePackage(kProofAFversion);
            success &= LoadLibrary("CORRFW", mode);
         }
         break;         
      default:
         ::Error("AnalysisTrainHMPID.C::LoadCommonLibraries", "Unknown run mode: %s", mode);
         return kFALSE;
   }
   if (success) {
      ::Info("AnalysisTrainHMPID.C::LoadCommodLibraries", "Load common libraries:    SUCCESS");
      ::Info("AnalysisTrainHMPID.C::LoadCommodLibraries", "Include path for Aclic compilation:\n%s",
              gSystem->GetIncludePath());
   } else {           
      ::Info("AnalysisTrainHMPID.C::LoadCommodLibraries", "Load common libraries:    FAILED");
   }   
      
   return success;
}


//______________________________________________________________________________
Bool_t LoadAnalysisLibraries(const char *mode)
{
// Load common analysis libraries.
   Bool_t success = kTRUE;
   if (iESDfilter) {
      if (!LoadLibrary("PWG3base", mode, kTRUE) ||
          !LoadLibrary("PWG3muon", mode, kTRUE)) return kFALSE;
   }   

   if(iHMPID){
     if (!LoadSource(Form("%s/AliHMPIDAnalysisTask.cxx",gSystem->ExpandPathName(".")), mode, kTRUE))return kFALSE;
   }

   if (iJETANLib) {
     if (!LoadLibrary("JETAN", mode, kTRUE)) return kFALSE;
   }

   ::Info("AnalysisTrainHMPID.C::LoadAnalysisLibraries", "Load other libraries:   SUCCESS");
   return kTRUE;
}


//______________________________________________________________________________
Bool_t LoadLibrary(const char *module, const char *mode, Bool_t rec=kFALSE)
{
// Load a module library in a given mode. Reports success.
   Int_t imode = -1;
   Int_t result;
   TString smodule(module);
   if (!strcmp(mode, "LOCAL")) imode = 0;
   if (!strcmp(mode, "PROOF")) imode = 1;
   if (!strcmp(mode, "GRID"))  imode = 2;
   TString mod(module);
   if (!mod.Length()) {
      ::Error("AnalysisTrainHMPID.C::LoadLibrary", "Empty module name");
      return kFALSE;
   }   
   // If a library is specified, just load it
   if (smodule.EndsWith(".so")) {
      mod.Remove(mod.Index(".so"));
      result = gSystem->Load(mod);
      if (result < 0) {
         ::Error("AnalysisTrainHMPID.C::LoadLibrary", "Could not load library %s", module);
         return kFALSE;
      }
      if (rec) anaLibs += Form("%s.so ",mod.Data()); 
      if (rec) anaLibsExtra += Form("%s.so ",mod.Data()); 
      return kTRUE;
   } 
   // Check if the library is already loaded
   if (strlen(gSystem->GetLibraries(Form("%s.so", module), "", kFALSE)) > 0)
      return kTRUE;    
   switch (imode) {
      case 0:
      case 2:
         if (kUsePAR) {
            result = SetupPar(module);
            if (rec) anaPars += Form("%s.par ", module);
         } else {
            result = gSystem->Load(Form("lib%s.so", module));
            if (rec) anaLibs += Form("lib%s.so ", module);
         }   
         break;
      case 1:
	     if(!gSystem->AccessPathName(module)){
	       ::Info("AnalysisTrainHMPID.C::LoadLibrary", "Removing directory %s",module);
	       gSystem->Exec(Form("rm -rf %s",module));
         }
         result = gProof->UploadPackage(module);
         if (result<0) {
            result = gProof->UploadPackage(gSystem->ExpandPathName(Form("$ALICE_ROOT/%s.par", module)));
            if (result<0) {
               ::Error("AnalysisTrainHMPID.C::LoadLibrary", "Could not find module %s.par in current directory nor in $ALICE_ROOT", module);
               return kFALSE;
            }
         }   
         result = gProof->EnablePackage(module);
         break;
      default:
         return kFALSE;
   }         
   if (result < 0) {
      ::Error("AnalysisTrainHMPID.C::LoadLibrary", "Could not load module %s", module);
      return kFALSE;
   }
   return kTRUE;
}           

//______________________________________________________________________________
Bool_t LoadSource(const char *source, const char *mode, Bool_t rec=kFALSE)
{
// Load a module library in a given mode. Reports success.
   Int_t imode = -1;
   Int_t result = -1;
   if (!strcmp(mode, "LOCAL")) imode = 0;
   if (!strcmp(mode, "PROOF")) imode = 1;
   if (!strcmp(mode, "GRID"))  imode = 2;
   TString ssource(source);
   TString basename = gSystem->BaseName(ssource.Data());
   if (!ssource.Length()) {
      ::Error("AnalysisTrainHMPID.C::LoadSource", "Empty task name");
      return kFALSE;
   }
   // we have a source code so compile it
   if (ssource.EndsWith(".cxx")) {
     // need to copy it here other wise the path is also used on grid...
     ssource.Remove(ssource.Index(".cxx"));
     basename.Remove(basename.Index(".cxx"));
     Printf("LoadSources:: Copying...  path %s{cxx,h}",ssource.Data());
     gSystem->Exec(Form("cp %s.cxx . ",ssource.Data()));
     gSystem->Exec(Form("cp %s.h . ",ssource.Data()));
     // Path to code
     // only needed for local compilation, in grid and proof mode 
     // the task headers are uploaded 
     //     path.Remove(path.Index(gSystem->BaseName(path.Data())));
     // Printf("LoadSources:: Including path %s",path.Data());
     //  if(path.Length()>0)gROOT->ProcessLine(Form(".include %s",path.Data()));
     Printf("LoadSources:: Loading...  path %s",basename.Data());
     switch (imode) {
     case 0:
       result = gROOT->LoadMacro(Form("%s.cxx++g",basename.Data()));
       break;
     case 1:
       result = gProof->Load(Form("%s.cxx++g",basename.Data()));
       break;
     case 2:
       result = gROOT->LoadMacro(Form("%s.cxx++g",basename.Data()));
       if (rec){
       // what we want to compile
         anaSources += Form("%s.cxx ",basename.Data());
       // what we need as input...
         anaLibs += Form("%s.cxx %s.h ",basename.Data(),basename.Data());
       }
       break;
     default:
       return kFALSE;
     }
   }
   if (result < 0) {
      ::Error("AnalysisTrainHMPID.C::LoadSources", "Could not load source %s", source);
      return kFALSE;
   }
   return kTRUE;
}

//______________________________________________________________________________
TChain *CreateChain(const char *mode, const char *plugin_mode)
{
// Create the input chain
   Int_t imode = -1;
   if (!strcmp(mode, "LOCAL")) imode = 0;
   if (!strcmp(mode, "PROOF")) imode = 1;
   if (!strcmp(mode, "GRID"))  imode = 2;
   TChain *chain = NULL;
   // Local chain
   switch (imode) {
      case 0:
	     if (!kLocalXMLDataset.Length()) {
	       // Local ESD
	       chain = new TChain("esdTree");
	       TString line;
	       ifstream in;
	       in.open(kLocalDataList.Data());
	       while (in.good()) {
	         in >> line;
	         if (line.Length() == 0) continue;
	         cout << " line = " << line << endl;
	         chain->Add(line.Data());
	       }       
	     } else {
	       // Interactive ESD
           chain = CreateChainSingle(kLocalXMLDataset, "esdTree");
	     }   
         break;
      case 1:
         break;
      case 2:
         if (kPluginUse) {
            AliAnalysisGrid *alienHandler = CreateAlienHandler(plugin_mode);
            AliAnalysisManager::GetAnalysisManager()->SetGridHandler(alienHandler);
         } else {
            TString treeName = "esdTree";
            chain = CreateChainSingle("wn.xml", treeName);
         }
         break;      
      default:   
   }
   if (chain && chain->GetNtrees()) return chain;
   return NULL;
}   

//______________________________________________________________________________
TChain* CreateChainSingle(const char* xmlfile, const char *treeName)
{
   printf("*******************************\n");
   printf("*** Getting the ESD Chain   ***\n");
   printf("*******************************\n");
   TAlienCollection * myCollection  = TAlienCollection::Open(xmlfile);

   if (!myCollection) {
      ::Error("AnalysisTrainHMPID.C::CreateChainSingle", "Cannot create an AliEn collection from %s", xmlfile) ;
      return NULL ;
   }

   TChain* chain = new TChain(treeName);
   myCollection->Reset() ;
   while ( myCollection->Next() ) chain->Add(myCollection->GetTURL("")) ;
   chain->ls();
   return chain;
}

//______________________________________________________________________________
Int_t SetupPar(char* pararchivename)
{
   if (!pararchivename || !strlen(pararchivename)) return -1;
   char processline[1024];
   if (gSystem->AccessPathName(Form("%s.par", pararchivename))) {
      if (!gSystem->AccessPathName(Form("%s/%s.par", gSystem->Getenv("ALICE_ROOT"),pararchivename))) {
         ::Info("AnalysisTrainHMPID.C::SetupPar", "Getting %s.par from $ALICE_ROOT", pararchivename);
         TFile::Cp(gSystem->ExpandPathName(Form("$ALICE_ROOT/%s.par", pararchivename)), 
                   Form("%s.par",pararchivename));
      } else {
         ::Error("AnalysisTrainHMPID.C::SetupPar", "Cannot find %s.par", pararchivename);
         return -1;
      }   
   }
   gSystem->Exec(Form("tar xvzf %s.par", pararchivename));

   TString ocwd = gSystem->WorkingDirectory();
   if (!gSystem->ChangeDirectory(pararchivename)) return -1;
	
   // check for BUILD.sh and execute
   if (!gSystem->AccessPathName("PROOF-INF/BUILD.sh")) {
      printf("*******************************\n");
      printf("*** Building PAR archive    ***\n");
      printf("*******************************\n");	    
      if (gSystem->Exec("PROOF-INF/BUILD.sh")) {
         Error("runProcess","Cannot Build the PAR Archive! - Abort!");
         return -1;
      }
   }

	// check for SETUP.C and execute
	if (!gSystem->AccessPathName("PROOF-INF/SETUP.C")) {
	    printf("*******************************\n");
	    printf("*** Setup PAR archive       ***\n");
	    printf("*******************************\n");
	    gROOT->Macro("PROOF-INF/SETUP.C");
	}	
	if (!gSystem->ChangeDirectory(ocwd.Data())) return -1;
   return 0;
}

//______________________________________________________________________________
AliAnalysisAlien* CreateAlienHandler(const char *plugin_mode)
{
// Check if user has a valid token, otherwise make one. This has limitations.
// One can always follow the standard procedure of calling alien-token-init then
//   source /tmp/gclient_env_$UID in the current shell.
   if (!AliAnalysisGrid::CreateToken()) return NULL;
   AliAnalysisAlien *plugin = new AliAnalysisAlien();
// Set the run mode (can be "full", "test", "offline", "submit" or "terminate")
   plugin->SetRunMode(plugin_mode);
   if (kPluginUseProductionMode) plugin->SetProductionMode();
   plugin->SetJobTag(kJobTag);
   plugin->SetNtestFiles(1);
//   plugin->SetPreferedSE("ALICE::NIHAM::File");
// Set versions of used packages
   plugin->SetAPIVersion("V1.1x");
   plugin->SetROOTVersion(kPluginRootVersion);
   plugin->SetAliROOTVersion(kPluginAliRootVersion);

// Declare input data to be processed.
// Method 1: Create automatically XML collections using alien 'find' command.
// Define production directory LFN
   plugin->SetGridDataDir(kGridDatadir.Data());
// Set data search pattern
   plugin->SetDataPattern(Form(" %s/*/*ESDs.root",kGridPassPattern.Data()));
// ...then add run numbers to be considered
   plugin->SetRunPrefix("000");
   plugin->SetRunRange(kGridRunRange[0], kGridRunRange[1]);

   if(kGridLocalRunList.Length()>0){
     ifstream in1;
     in1.open(kGridLocalRunList.Data());
     int iRun;
     // just use run numbers, negatives will be excluded
     while(in1>>iRun){
       if(iRun>0){
       Printf("AnalysisTrainHMPID Adding run number from File %s", Form(kGridRunPattern.Data(),iRun));
       plugin->AddRunNumber(Form(kGridRunPattern.Data(),iRun));
       } else{
         Printf("AnalysisTrainHMPID Skipping run number from File %d", iRun);
       }
     }
   }

// Method 2: Declare existing data files (raw collections, xml collections, root file)
// If no path mentioned data is supposed to be in the work directory (see SetGridWorkingDir())
// XML collections added via this method can be combined with the first method if
// the content is compatible (using or not tags)
//   plugin->AddDataFile("137431.xml");
//   plugin->AddDataFile("/alice/data/2008/LHC08c/000057657/raw/Run57657.Merged.RAW.tag.root");
// Define alien work directory where all files will be copied. Relative to alien $HOME.
   TString alien_workdir = "";

   alien_workdir += kGridWorkDir.Data();
   if(kGridDataSet.Length()>0)alien_workdir += Form("/%s",kGridDataSet.Data());
   plugin->SetGridWorkingDir(alien_workdir.Data());

   // Declare alien output directory. Relative to working directory.
   if (!kGridOutdir.Length()) kGridOutdir = Form("output_%s",kTrainName.Data());
   plugin->SetGridOutputDir(kGridOutdir);

   // set extra libs before par file compilation
   anaLibs += kGridExtraFiles;
   anaLibs  = anaLibs.Strip();   
   Printf("anaLibs %s",anaLibs.Data());
   Printf("anaLibsExtra %s",anaLibsExtra.Data());

   if (anaLibs.Length())          plugin->SetAdditionalLibs(anaLibs.Data());
   if (anaLibsExtra.Length())     plugin->SetAdditionalRootLibs(anaLibsExtra.Data());

   TString ana_sources = "";
   TString ana_add = "";
   if (kUsePAR && anaPars.Length()) {
      printf("%s\n", anaPars.Data());
      TObjArray *arr;
      TObjString *objstr;
      arr = anaPars.Tokenize(" ");
      TIter next(arr);
      while ((objstr=(TObjString*)next())) plugin->EnablePackage(objstr->GetString());
      delete arr;
   } 
   
// Declare the analysis source files names separated by blancs. To be compiled runtime
// using ACLiC on the worker nodes.
   ana_sources = anaSources.Strip();
// Declare all libraries (other than the default ones for the framework. These will be
// loaded by the generated analysis macro. Add all extra files (task .cxx/.h) here.

   if (ana_sources.Length()) plugin->SetAnalysisSource(ana_sources);
   plugin->SetExecutableCommand(kPluginExecutableCommand.Data());
   // Declare the output file names separated by blancs.
   // (can be like: file.root or file.root@ALICE::Niham::File)
   plugin->SetUseSubmitPolicy(kFALSE);
   plugin->SetMergeExcludes(kGridMergeExclude);
   plugin->SetMaxMergeFiles(kGridMaxMergeFiles);
   plugin->SetNrunsPerMaster(kGridRunsPerMaster);
   plugin->SetMergeViaJDL(kPluginMergeViaJDL);
   // Use fastread option
   plugin->SetFastReadOption(kPluginFastReadOption);
   // UseOverwrite mode
   plugin->SetOverwriteMode(kPluginOverwriteMode);
   // Optionally define the files to be archived.
   //   plugin->SetOutputArchive("log_archive.zip:stdout,stderr@ALICE::NIHAM::File root_archive.zip:AliAOD.root,AOD.tag.root@ALICE::NIHAM::File");
   plugin->SetOutputToRunNo(kPluginOutputToRunNumber);     // write the output to subdirs named after run number
//   plugin->SetDefaultOutputs(kFALSE);

   // Put default output files to archive
   TString listhists = "";
   TString listaods  = "";
   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
   TIter next(mgr->GetOutputs());
   AliAnalysisDataContainer *output;
   while ((output=(AliAnalysisDataContainer*)next())) {
      const char *filename = output->GetFileName();
      if (!(strcmp(filename, "default"))) {
         if (!mgr->GetOutputEventHandler()) continue;
         filename = mgr->GetOutputEventHandler()->GetOutputFileName();
         if (listaods.Length()) listaods += " ";
         listaods += filename;
      } else {
         if(!listhists.Contains(filename)){
            if (listhists.Length()) listhists += " ";
            listhists += filename;
         }
      }
   }

   if (mgr->GetExtraFiles().Length()) {
     if (listaods.Length()) listaods += " ";
     listaods += mgr->GetExtraFiles();
   }

   TString outputArchive;
   outputArchive = Form("log_archive.zip:std*r@%s",kGridOutputStorages.Data());
   listaods.ReplaceAll(" ", ",");
   listhists.ReplaceAll(" ", ",");
   if (listhists.Length()) listhists = Form("hist_archive.zip:%s@%s", listhists.Data(), kGridOutputStorages.Data());
   if (listaods.Length())  listaods  = Form("aod_archive.zip:%s@%s", listaods.Data(), kGridOutputStorages.Data());

   if (!listhists.Length() && !listaods.Length()) {
      ::Fatal("AnalysisTrainHMPID", "No task output !");
   }

   if (listaods.Length()) {
      outputArchive += " ";
      outputArchive += listaods;
   }
   if (listhists.Length()) {
      outputArchive += " ";
      outputArchive += listhists;
   }
//   plugin->SetOutputArchive(outputArchive);

// Optionally set a name for the generated analysis macro (default MyAnalysis.C)
   plugin->SetAnalysisMacro(Form("%s.C", kTrainName.Data()));
// Optionally set maximum number of input files/subjob (default 100, put 0 to ignore)
   plugin->SetSplitMaxInputFileNumber(kGridFilesPerJob);
// Optionally set number of failed jobs that will trigger killing waiting sub-jobs.
//   plugin->SetMaxInitFailed(5);
// Optionally resubmit threshold.
//   plugin->SetMasterResubmitThreshold(90);
// Optionally set time to live (default 30000 sec)
   plugin->SetTTL(30000);
// Optionally set input format (default xml-single)
   plugin->SetInputFormat("xml-single");
// Optionally modify the name of the generated JDL (default analysis.jdl)
   plugin->SetJDLName(Form("%s.jdl", kTrainName.Data()));
// Optionally modify the executable name (default analysis.sh)
   plugin->SetExecutable(Form("%s.sh", kTrainName.Data()));
// Optionally modify job price (default 1)
   plugin->SetPrice(1);      
// Optionally modify split mode (default 'se')    
   plugin->SetSplitMode("se");
   plugin->SetCheckCopy(kFALSE);
   return plugin;
}

//______________________________________________________________________________
Bool_t LoadConfig(const char *filename)
{
// Read train configuration from file
   if (gSystem->AccessPathName(filename)) {
      ::Error("AnalysisTrainHMPID.C::LoadConfig", "Config file name not found");
      return kFALSE;
   }   
   gROOT->ProcessLine(Form(".x %s", filename));
   ::Info("AnalysisTrainHMPID.C::LoadConfig", "Train configuration loaded from file %s", filename);
   return kTRUE;
}

//______________________________________________________________________________
Bool_t PatchJDL(){
  Printf(">>> Patching JDL");
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  AliAnalysisAlien*    gridHandler = (AliAnalysisAlien*)mgr->GetGridHandler();
  TGridJDL *jdl = gridHandler->GetGridJDL();
  if(iJETAN)jdl->AddToPackages("fastjet","v2.4.0");
  gridHandler->WriteJDL(kFALSE);
  Printf("<<<  Patching JDL");
  return kTRUE;
}

//______________________________________________________________________________
Bool_t PatchAnalysisMacro(){
  Printf(">>> Patching AnalysisMacro");
  gSystem->Exec(Form("mv %s.C %s.C_tmp",kTrainName.Data(),kTrainName.Data()));

  ifstream in1; 
  in1.open(Form("%s.C_tmp", kTrainName.Data()));
  char cLine[250];
  TString st;
  while(in1.getline(cLine,250)){
    st += cLine;
    st += "\n";
  }
  Int_t index= -1;
  index = st.Index("gSystem->Load(\"libPhysics\");");
  index += strlen("gSystem->Load(\"libPhysics\");");
  /*
    TObjArray *arr;
    TObjString *objstr;
    arr = anaLibs.Tokenize(" ");
    TIter next(arr);

    add += "\n\n // added by CKB \n";
    while ((objstr=(TObjString*)next())){
      if(objstr->GetString().Contains("PWG3"))continue;
      if(objstr->GetString().EndsWith(".so"))add += Form("gSystem->Load(\"%s\");\n",objstr->GetString().Data());
    }
    delete arr; 
    */
    //    add += Form("AliLog::SetGlobalLogLevel(%d);\n",AliLog::GetGlobalLogLevel());
  TString add = "";

  if(index<0)Printf("%s:%d index out of bounds",(char*)__FILE__,__LINE__);
  add += "\n\n // added by CKB \n";
  add += "\n gSystem->AddIncludePath(\"./\"); \n";
  if(gGrid && kPluginAliRootVersion.Length()==0){
    add += "\n // Dirty hack for TRD reference data \n";
    add += "\n gSystem->Setenv(\"ALICE_ROOT\",\"";
    add += Form("alien://%s/rootfiles/",gGrid->GetHomeDirectory());
    add += "\"); \n";
  }
  add += "// BKC \n\n";
  st.Insert(index,add.Data());

  if(kUseCPAR && kPluginAliRootVersion.Length()==0){
    index = st.Index("gSystem->AddIncludePath(\"-I$"); // uncommen $ALICE_ROOT include for par files
    if(index<0)Printf("%s:%d index out of bounds",(char*)__FILE__,__LINE__);
    st.Insert(index,"// CKB comment out whehn no aliroot is provided \n //");
  }

  ofstream out;
  out.open(Form("%s.C", kTrainName.Data()));
  if (out.bad()) {
    return kFALSE;
  }
  out << st << endl;
  Printf("<<< Patching AnalysisMacro");

  Printf(">>> Patching Merge Macro");
  gSystem->Exec(Form("mv %s_merge.C %s_merge.C_tmp",kTrainName.Data(),kTrainName.Data()));

  ifstream in2; 
  in2.open(Form("%s_merge.C_tmp", kTrainName.Data()));
  TString st2;
  while(in2.getline(cLine,250)){
    st2 += cLine;
    st2 += "\n";
  }
  index = st2.Index("gSystem->Load(\"libPhysics\");");
  index += strlen("gSystem->Load(\"libPhysics\");");
  TString add2 = "";
  add2 += "\n gSystem->AddIncludePath(\"./\"); \n";
  if(gGrid&&kPluginAliRootVersion.Length()==0){
    add2 += "\n // Dirty hack for TRD reference data \n";
    add2 += "\n gSystem->Setenv(\"ALICE_ROOT\",\"";
    add2 += Form("alien://%s/rootfiles/",gGrid->GetHomeDirectory());
    add2 += "\"); \n";
  }
  add2 += "// BKC \n\n";
  if(index<0)Printf("%s:%d index out of bounds",(char*)__FILE__,__LINE__);
  st2.Insert(index,add.Data());

  if(kUseCPAR&&kPluginAliRootVersion.Length()==0){
    index = st2.Index("gSystem->AddIncludePath(\"-I$"); // uncommen $ALICE_ROOT include for par files
    if(index<0)Printf("%s:%d index out of bounds",(char*)__FILE__,__LINE__);
    st2.Insert(index,"// CKB comment out whehn no aliroot is provided \n //");
  }

  // do not exclude the extra files from merign, this is done explicitly in this train script
  index = st2.Index("mergeExcludes +="); // uncommen $ALICE_ROOT include for par files
  if(index<0)Printf("%s:%d index out of bounds",(char*)__FILE__,__LINE__);
  st2.Insert(index,"// CKB comment out, handled explicitly by the train macro \n //");


  ofstream out2;
  out2.open(Form("%s_merge.C", kTrainName.Data()));
  if (out2.bad()) {
    return kFALSE;
  }
  out2 << st2 << endl;
  Printf("<<< Patching Merging Macro");


  return kTRUE;

}
 AnalysisTrainHMPID.C:1
 AnalysisTrainHMPID.C:2
 AnalysisTrainHMPID.C:3
 AnalysisTrainHMPID.C:4
 AnalysisTrainHMPID.C:5
 AnalysisTrainHMPID.C:6
 AnalysisTrainHMPID.C:7
 AnalysisTrainHMPID.C:8
 AnalysisTrainHMPID.C:9
 AnalysisTrainHMPID.C:10
 AnalysisTrainHMPID.C:11
 AnalysisTrainHMPID.C:12
 AnalysisTrainHMPID.C:13
 AnalysisTrainHMPID.C:14
 AnalysisTrainHMPID.C:15
 AnalysisTrainHMPID.C:16
 AnalysisTrainHMPID.C:17
 AnalysisTrainHMPID.C:18
 AnalysisTrainHMPID.C:19
 AnalysisTrainHMPID.C:20
 AnalysisTrainHMPID.C:21
 AnalysisTrainHMPID.C:22
 AnalysisTrainHMPID.C:23
 AnalysisTrainHMPID.C:24
 AnalysisTrainHMPID.C:25
 AnalysisTrainHMPID.C:26
 AnalysisTrainHMPID.C:27
 AnalysisTrainHMPID.C:28
 AnalysisTrainHMPID.C:29
 AnalysisTrainHMPID.C:30
 AnalysisTrainHMPID.C:31
 AnalysisTrainHMPID.C:32
 AnalysisTrainHMPID.C:33
 AnalysisTrainHMPID.C:34
 AnalysisTrainHMPID.C:35
 AnalysisTrainHMPID.C:36
 AnalysisTrainHMPID.C:37
 AnalysisTrainHMPID.C:38
 AnalysisTrainHMPID.C:39
 AnalysisTrainHMPID.C:40
 AnalysisTrainHMPID.C:41
 AnalysisTrainHMPID.C:42
 AnalysisTrainHMPID.C:43
 AnalysisTrainHMPID.C:44
 AnalysisTrainHMPID.C:45
 AnalysisTrainHMPID.C:46
 AnalysisTrainHMPID.C:47
 AnalysisTrainHMPID.C:48
 AnalysisTrainHMPID.C:49
 AnalysisTrainHMPID.C:50
 AnalysisTrainHMPID.C:51
 AnalysisTrainHMPID.C:52
 AnalysisTrainHMPID.C:53
 AnalysisTrainHMPID.C:54
 AnalysisTrainHMPID.C:55
 AnalysisTrainHMPID.C:56
 AnalysisTrainHMPID.C:57
 AnalysisTrainHMPID.C:58
 AnalysisTrainHMPID.C:59
 AnalysisTrainHMPID.C:60
 AnalysisTrainHMPID.C:61
 AnalysisTrainHMPID.C:62
 AnalysisTrainHMPID.C:63
 AnalysisTrainHMPID.C:64
 AnalysisTrainHMPID.C:65
 AnalysisTrainHMPID.C:66
 AnalysisTrainHMPID.C:67
 AnalysisTrainHMPID.C:68
 AnalysisTrainHMPID.C:69
 AnalysisTrainHMPID.C:70
 AnalysisTrainHMPID.C:71
 AnalysisTrainHMPID.C:72
 AnalysisTrainHMPID.C:73
 AnalysisTrainHMPID.C:74
 AnalysisTrainHMPID.C:75
 AnalysisTrainHMPID.C:76
 AnalysisTrainHMPID.C:77
 AnalysisTrainHMPID.C:78
 AnalysisTrainHMPID.C:79
 AnalysisTrainHMPID.C:80
 AnalysisTrainHMPID.C:81
 AnalysisTrainHMPID.C:82
 AnalysisTrainHMPID.C:83
 AnalysisTrainHMPID.C:84
 AnalysisTrainHMPID.C:85
 AnalysisTrainHMPID.C:86
 AnalysisTrainHMPID.C:87
 AnalysisTrainHMPID.C:88
 AnalysisTrainHMPID.C:89
 AnalysisTrainHMPID.C:90
 AnalysisTrainHMPID.C:91
 AnalysisTrainHMPID.C:92
 AnalysisTrainHMPID.C:93
 AnalysisTrainHMPID.C:94
 AnalysisTrainHMPID.C:95
 AnalysisTrainHMPID.C:96
 AnalysisTrainHMPID.C:97
 AnalysisTrainHMPID.C:98
 AnalysisTrainHMPID.C:99
 AnalysisTrainHMPID.C:100
 AnalysisTrainHMPID.C:101
 AnalysisTrainHMPID.C:102
 AnalysisTrainHMPID.C:103
 AnalysisTrainHMPID.C:104
 AnalysisTrainHMPID.C:105
 AnalysisTrainHMPID.C:106
 AnalysisTrainHMPID.C:107
 AnalysisTrainHMPID.C:108
 AnalysisTrainHMPID.C:109
 AnalysisTrainHMPID.C:110
 AnalysisTrainHMPID.C:111
 AnalysisTrainHMPID.C:112
 AnalysisTrainHMPID.C:113
 AnalysisTrainHMPID.C:114
 AnalysisTrainHMPID.C:115
 AnalysisTrainHMPID.C:116
 AnalysisTrainHMPID.C:117
 AnalysisTrainHMPID.C:118
 AnalysisTrainHMPID.C:119
 AnalysisTrainHMPID.C:120
 AnalysisTrainHMPID.C:121
 AnalysisTrainHMPID.C:122
 AnalysisTrainHMPID.C:123
 AnalysisTrainHMPID.C:124
 AnalysisTrainHMPID.C:125
 AnalysisTrainHMPID.C:126
 AnalysisTrainHMPID.C:127
 AnalysisTrainHMPID.C:128
 AnalysisTrainHMPID.C:129
 AnalysisTrainHMPID.C:130
 AnalysisTrainHMPID.C:131
 AnalysisTrainHMPID.C:132
 AnalysisTrainHMPID.C:133
 AnalysisTrainHMPID.C:134
 AnalysisTrainHMPID.C:135
 AnalysisTrainHMPID.C:136
 AnalysisTrainHMPID.C:137
 AnalysisTrainHMPID.C:138
 AnalysisTrainHMPID.C:139
 AnalysisTrainHMPID.C:140
 AnalysisTrainHMPID.C:141
 AnalysisTrainHMPID.C:142
 AnalysisTrainHMPID.C:143
 AnalysisTrainHMPID.C:144
 AnalysisTrainHMPID.C:145
 AnalysisTrainHMPID.C:146
 AnalysisTrainHMPID.C:147
 AnalysisTrainHMPID.C:148
 AnalysisTrainHMPID.C:149
 AnalysisTrainHMPID.C:150
 AnalysisTrainHMPID.C:151
 AnalysisTrainHMPID.C:152
 AnalysisTrainHMPID.C:153
 AnalysisTrainHMPID.C:154
 AnalysisTrainHMPID.C:155
 AnalysisTrainHMPID.C:156
 AnalysisTrainHMPID.C:157
 AnalysisTrainHMPID.C:158
 AnalysisTrainHMPID.C:159
 AnalysisTrainHMPID.C:160
 AnalysisTrainHMPID.C:161
 AnalysisTrainHMPID.C:162
 AnalysisTrainHMPID.C:163
 AnalysisTrainHMPID.C:164
 AnalysisTrainHMPID.C:165
 AnalysisTrainHMPID.C:166
 AnalysisTrainHMPID.C:167
 AnalysisTrainHMPID.C:168
 AnalysisTrainHMPID.C:169
 AnalysisTrainHMPID.C:170
 AnalysisTrainHMPID.C:171
 AnalysisTrainHMPID.C:172
 AnalysisTrainHMPID.C:173
 AnalysisTrainHMPID.C:174
 AnalysisTrainHMPID.C:175
 AnalysisTrainHMPID.C:176
 AnalysisTrainHMPID.C:177
 AnalysisTrainHMPID.C:178
 AnalysisTrainHMPID.C:179
 AnalysisTrainHMPID.C:180
 AnalysisTrainHMPID.C:181
 AnalysisTrainHMPID.C:182
 AnalysisTrainHMPID.C:183
 AnalysisTrainHMPID.C:184
 AnalysisTrainHMPID.C:185
 AnalysisTrainHMPID.C:186
 AnalysisTrainHMPID.C:187
 AnalysisTrainHMPID.C:188
 AnalysisTrainHMPID.C:189
 AnalysisTrainHMPID.C:190
 AnalysisTrainHMPID.C:191
 AnalysisTrainHMPID.C:192
 AnalysisTrainHMPID.C:193
 AnalysisTrainHMPID.C:194
 AnalysisTrainHMPID.C:195
 AnalysisTrainHMPID.C:196
 AnalysisTrainHMPID.C:197
 AnalysisTrainHMPID.C:198
 AnalysisTrainHMPID.C:199
 AnalysisTrainHMPID.C:200
 AnalysisTrainHMPID.C:201
 AnalysisTrainHMPID.C:202
 AnalysisTrainHMPID.C:203
 AnalysisTrainHMPID.C:204
 AnalysisTrainHMPID.C:205
 AnalysisTrainHMPID.C:206
 AnalysisTrainHMPID.C:207
 AnalysisTrainHMPID.C:208
 AnalysisTrainHMPID.C:209
 AnalysisTrainHMPID.C:210
 AnalysisTrainHMPID.C:211
 AnalysisTrainHMPID.C:212
 AnalysisTrainHMPID.C:213
 AnalysisTrainHMPID.C:214
 AnalysisTrainHMPID.C:215
 AnalysisTrainHMPID.C:216
 AnalysisTrainHMPID.C:217
 AnalysisTrainHMPID.C:218
 AnalysisTrainHMPID.C:219
 AnalysisTrainHMPID.C:220
 AnalysisTrainHMPID.C:221
 AnalysisTrainHMPID.C:222
 AnalysisTrainHMPID.C:223
 AnalysisTrainHMPID.C:224
 AnalysisTrainHMPID.C:225
 AnalysisTrainHMPID.C:226
 AnalysisTrainHMPID.C:227
 AnalysisTrainHMPID.C:228
 AnalysisTrainHMPID.C:229
 AnalysisTrainHMPID.C:230
 AnalysisTrainHMPID.C:231
 AnalysisTrainHMPID.C:232
 AnalysisTrainHMPID.C:233
 AnalysisTrainHMPID.C:234
 AnalysisTrainHMPID.C:235
 AnalysisTrainHMPID.C:236
 AnalysisTrainHMPID.C:237
 AnalysisTrainHMPID.C:238
 AnalysisTrainHMPID.C:239
 AnalysisTrainHMPID.C:240
 AnalysisTrainHMPID.C:241
 AnalysisTrainHMPID.C:242
 AnalysisTrainHMPID.C:243
 AnalysisTrainHMPID.C:244
 AnalysisTrainHMPID.C:245
 AnalysisTrainHMPID.C:246
 AnalysisTrainHMPID.C:247
 AnalysisTrainHMPID.C:248
 AnalysisTrainHMPID.C:249
 AnalysisTrainHMPID.C:250
 AnalysisTrainHMPID.C:251
 AnalysisTrainHMPID.C:252
 AnalysisTrainHMPID.C:253
 AnalysisTrainHMPID.C:254
 AnalysisTrainHMPID.C:255
 AnalysisTrainHMPID.C:256
 AnalysisTrainHMPID.C:257
 AnalysisTrainHMPID.C:258
 AnalysisTrainHMPID.C:259
 AnalysisTrainHMPID.C:260
 AnalysisTrainHMPID.C:261
 AnalysisTrainHMPID.C:262
 AnalysisTrainHMPID.C:263
 AnalysisTrainHMPID.C:264
 AnalysisTrainHMPID.C:265
 AnalysisTrainHMPID.C:266
 AnalysisTrainHMPID.C:267
 AnalysisTrainHMPID.C:268
 AnalysisTrainHMPID.C:269
 AnalysisTrainHMPID.C:270
 AnalysisTrainHMPID.C:271
 AnalysisTrainHMPID.C:272
 AnalysisTrainHMPID.C:273
 AnalysisTrainHMPID.C:274
 AnalysisTrainHMPID.C:275
 AnalysisTrainHMPID.C:276
 AnalysisTrainHMPID.C:277
 AnalysisTrainHMPID.C:278
 AnalysisTrainHMPID.C:279
 AnalysisTrainHMPID.C:280
 AnalysisTrainHMPID.C:281
 AnalysisTrainHMPID.C:282
 AnalysisTrainHMPID.C:283
 AnalysisTrainHMPID.C:284
 AnalysisTrainHMPID.C:285
 AnalysisTrainHMPID.C:286
 AnalysisTrainHMPID.C:287
 AnalysisTrainHMPID.C:288
 AnalysisTrainHMPID.C:289
 AnalysisTrainHMPID.C:290
 AnalysisTrainHMPID.C:291
 AnalysisTrainHMPID.C:292
 AnalysisTrainHMPID.C:293
 AnalysisTrainHMPID.C:294
 AnalysisTrainHMPID.C:295
 AnalysisTrainHMPID.C:296
 AnalysisTrainHMPID.C:297
 AnalysisTrainHMPID.C:298
 AnalysisTrainHMPID.C:299
 AnalysisTrainHMPID.C:300
 AnalysisTrainHMPID.C:301
 AnalysisTrainHMPID.C:302
 AnalysisTrainHMPID.C:303
 AnalysisTrainHMPID.C:304
 AnalysisTrainHMPID.C:305
 AnalysisTrainHMPID.C:306
 AnalysisTrainHMPID.C:307
 AnalysisTrainHMPID.C:308
 AnalysisTrainHMPID.C:309
 AnalysisTrainHMPID.C:310
 AnalysisTrainHMPID.C:311
 AnalysisTrainHMPID.C:312
 AnalysisTrainHMPID.C:313
 AnalysisTrainHMPID.C:314
 AnalysisTrainHMPID.C:315
 AnalysisTrainHMPID.C:316
 AnalysisTrainHMPID.C:317
 AnalysisTrainHMPID.C:318
 AnalysisTrainHMPID.C:319
 AnalysisTrainHMPID.C:320
 AnalysisTrainHMPID.C:321
 AnalysisTrainHMPID.C:322
 AnalysisTrainHMPID.C:323
 AnalysisTrainHMPID.C:324
 AnalysisTrainHMPID.C:325
 AnalysisTrainHMPID.C:326
 AnalysisTrainHMPID.C:327
 AnalysisTrainHMPID.C:328
 AnalysisTrainHMPID.C:329
 AnalysisTrainHMPID.C:330
 AnalysisTrainHMPID.C:331
 AnalysisTrainHMPID.C:332
 AnalysisTrainHMPID.C:333
 AnalysisTrainHMPID.C:334
 AnalysisTrainHMPID.C:335
 AnalysisTrainHMPID.C:336
 AnalysisTrainHMPID.C:337
 AnalysisTrainHMPID.C:338
 AnalysisTrainHMPID.C:339
 AnalysisTrainHMPID.C:340
 AnalysisTrainHMPID.C:341
 AnalysisTrainHMPID.C:342
 AnalysisTrainHMPID.C:343
 AnalysisTrainHMPID.C:344
 AnalysisTrainHMPID.C:345
 AnalysisTrainHMPID.C:346
 AnalysisTrainHMPID.C:347
 AnalysisTrainHMPID.C:348
 AnalysisTrainHMPID.C:349
 AnalysisTrainHMPID.C:350
 AnalysisTrainHMPID.C:351
 AnalysisTrainHMPID.C:352
 AnalysisTrainHMPID.C:353
 AnalysisTrainHMPID.C:354
 AnalysisTrainHMPID.C:355
 AnalysisTrainHMPID.C:356
 AnalysisTrainHMPID.C:357
 AnalysisTrainHMPID.C:358
 AnalysisTrainHMPID.C:359
 AnalysisTrainHMPID.C:360
 AnalysisTrainHMPID.C:361
 AnalysisTrainHMPID.C:362
 AnalysisTrainHMPID.C:363
 AnalysisTrainHMPID.C:364
 AnalysisTrainHMPID.C:365
 AnalysisTrainHMPID.C:366
 AnalysisTrainHMPID.C:367
 AnalysisTrainHMPID.C:368
 AnalysisTrainHMPID.C:369
 AnalysisTrainHMPID.C:370
 AnalysisTrainHMPID.C:371
 AnalysisTrainHMPID.C:372
 AnalysisTrainHMPID.C:373
 AnalysisTrainHMPID.C:374
 AnalysisTrainHMPID.C:375
 AnalysisTrainHMPID.C:376
 AnalysisTrainHMPID.C:377
 AnalysisTrainHMPID.C:378
 AnalysisTrainHMPID.C:379
 AnalysisTrainHMPID.C:380
 AnalysisTrainHMPID.C:381
 AnalysisTrainHMPID.C:382
 AnalysisTrainHMPID.C:383
 AnalysisTrainHMPID.C:384
 AnalysisTrainHMPID.C:385
 AnalysisTrainHMPID.C:386
 AnalysisTrainHMPID.C:387
 AnalysisTrainHMPID.C:388
 AnalysisTrainHMPID.C:389
 AnalysisTrainHMPID.C:390
 AnalysisTrainHMPID.C:391
 AnalysisTrainHMPID.C:392
 AnalysisTrainHMPID.C:393
 AnalysisTrainHMPID.C:394
 AnalysisTrainHMPID.C:395
 AnalysisTrainHMPID.C:396
 AnalysisTrainHMPID.C:397
 AnalysisTrainHMPID.C:398
 AnalysisTrainHMPID.C:399
 AnalysisTrainHMPID.C:400
 AnalysisTrainHMPID.C:401
 AnalysisTrainHMPID.C:402
 AnalysisTrainHMPID.C:403
 AnalysisTrainHMPID.C:404
 AnalysisTrainHMPID.C:405
 AnalysisTrainHMPID.C:406
 AnalysisTrainHMPID.C:407
 AnalysisTrainHMPID.C:408
 AnalysisTrainHMPID.C:409
 AnalysisTrainHMPID.C:410
 AnalysisTrainHMPID.C:411
 AnalysisTrainHMPID.C:412
 AnalysisTrainHMPID.C:413
 AnalysisTrainHMPID.C:414
 AnalysisTrainHMPID.C:415
 AnalysisTrainHMPID.C:416
 AnalysisTrainHMPID.C:417
 AnalysisTrainHMPID.C:418
 AnalysisTrainHMPID.C:419
 AnalysisTrainHMPID.C:420
 AnalysisTrainHMPID.C:421
 AnalysisTrainHMPID.C:422
 AnalysisTrainHMPID.C:423
 AnalysisTrainHMPID.C:424
 AnalysisTrainHMPID.C:425
 AnalysisTrainHMPID.C:426
 AnalysisTrainHMPID.C:427
 AnalysisTrainHMPID.C:428
 AnalysisTrainHMPID.C:429
 AnalysisTrainHMPID.C:430
 AnalysisTrainHMPID.C:431
 AnalysisTrainHMPID.C:432
 AnalysisTrainHMPID.C:433
 AnalysisTrainHMPID.C:434
 AnalysisTrainHMPID.C:435
 AnalysisTrainHMPID.C:436
 AnalysisTrainHMPID.C:437
 AnalysisTrainHMPID.C:438
 AnalysisTrainHMPID.C:439
 AnalysisTrainHMPID.C:440
 AnalysisTrainHMPID.C:441
 AnalysisTrainHMPID.C:442
 AnalysisTrainHMPID.C:443
 AnalysisTrainHMPID.C:444
 AnalysisTrainHMPID.C:445
 AnalysisTrainHMPID.C:446
 AnalysisTrainHMPID.C:447
 AnalysisTrainHMPID.C:448
 AnalysisTrainHMPID.C:449
 AnalysisTrainHMPID.C:450
 AnalysisTrainHMPID.C:451
 AnalysisTrainHMPID.C:452
 AnalysisTrainHMPID.C:453
 AnalysisTrainHMPID.C:454
 AnalysisTrainHMPID.C:455
 AnalysisTrainHMPID.C:456
 AnalysisTrainHMPID.C:457
 AnalysisTrainHMPID.C:458
 AnalysisTrainHMPID.C:459
 AnalysisTrainHMPID.C:460
 AnalysisTrainHMPID.C:461
 AnalysisTrainHMPID.C:462
 AnalysisTrainHMPID.C:463
 AnalysisTrainHMPID.C:464
 AnalysisTrainHMPID.C:465
 AnalysisTrainHMPID.C:466
 AnalysisTrainHMPID.C:467
 AnalysisTrainHMPID.C:468
 AnalysisTrainHMPID.C:469
 AnalysisTrainHMPID.C:470
 AnalysisTrainHMPID.C:471
 AnalysisTrainHMPID.C:472
 AnalysisTrainHMPID.C:473
 AnalysisTrainHMPID.C:474
 AnalysisTrainHMPID.C:475
 AnalysisTrainHMPID.C:476
 AnalysisTrainHMPID.C:477
 AnalysisTrainHMPID.C:478
 AnalysisTrainHMPID.C:479
 AnalysisTrainHMPID.C:480
 AnalysisTrainHMPID.C:481
 AnalysisTrainHMPID.C:482
 AnalysisTrainHMPID.C:483
 AnalysisTrainHMPID.C:484
 AnalysisTrainHMPID.C:485
 AnalysisTrainHMPID.C:486
 AnalysisTrainHMPID.C:487
 AnalysisTrainHMPID.C:488
 AnalysisTrainHMPID.C:489
 AnalysisTrainHMPID.C:490
 AnalysisTrainHMPID.C:491
 AnalysisTrainHMPID.C:492
 AnalysisTrainHMPID.C:493
 AnalysisTrainHMPID.C:494
 AnalysisTrainHMPID.C:495
 AnalysisTrainHMPID.C:496
 AnalysisTrainHMPID.C:497
 AnalysisTrainHMPID.C:498
 AnalysisTrainHMPID.C:499
 AnalysisTrainHMPID.C:500
 AnalysisTrainHMPID.C:501
 AnalysisTrainHMPID.C:502
 AnalysisTrainHMPID.C:503
 AnalysisTrainHMPID.C:504
 AnalysisTrainHMPID.C:505
 AnalysisTrainHMPID.C:506
 AnalysisTrainHMPID.C:507
 AnalysisTrainHMPID.C:508
 AnalysisTrainHMPID.C:509
 AnalysisTrainHMPID.C:510
 AnalysisTrainHMPID.C:511
 AnalysisTrainHMPID.C:512
 AnalysisTrainHMPID.C:513
 AnalysisTrainHMPID.C:514
 AnalysisTrainHMPID.C:515
 AnalysisTrainHMPID.C:516
 AnalysisTrainHMPID.C:517
 AnalysisTrainHMPID.C:518
 AnalysisTrainHMPID.C:519
 AnalysisTrainHMPID.C:520
 AnalysisTrainHMPID.C:521
 AnalysisTrainHMPID.C:522
 AnalysisTrainHMPID.C:523
 AnalysisTrainHMPID.C:524
 AnalysisTrainHMPID.C:525
 AnalysisTrainHMPID.C:526
 AnalysisTrainHMPID.C:527
 AnalysisTrainHMPID.C:528
 AnalysisTrainHMPID.C:529
 AnalysisTrainHMPID.C:530
 AnalysisTrainHMPID.C:531
 AnalysisTrainHMPID.C:532
 AnalysisTrainHMPID.C:533
 AnalysisTrainHMPID.C:534
 AnalysisTrainHMPID.C:535
 AnalysisTrainHMPID.C:536
 AnalysisTrainHMPID.C:537
 AnalysisTrainHMPID.C:538
 AnalysisTrainHMPID.C:539
 AnalysisTrainHMPID.C:540
 AnalysisTrainHMPID.C:541
 AnalysisTrainHMPID.C:542
 AnalysisTrainHMPID.C:543
 AnalysisTrainHMPID.C:544
 AnalysisTrainHMPID.C:545
 AnalysisTrainHMPID.C:546
 AnalysisTrainHMPID.C:547
 AnalysisTrainHMPID.C:548
 AnalysisTrainHMPID.C:549
 AnalysisTrainHMPID.C:550
 AnalysisTrainHMPID.C:551
 AnalysisTrainHMPID.C:552
 AnalysisTrainHMPID.C:553
 AnalysisTrainHMPID.C:554
 AnalysisTrainHMPID.C:555
 AnalysisTrainHMPID.C:556
 AnalysisTrainHMPID.C:557
 AnalysisTrainHMPID.C:558
 AnalysisTrainHMPID.C:559
 AnalysisTrainHMPID.C:560
 AnalysisTrainHMPID.C:561
 AnalysisTrainHMPID.C:562
 AnalysisTrainHMPID.C:563
 AnalysisTrainHMPID.C:564
 AnalysisTrainHMPID.C:565
 AnalysisTrainHMPID.C:566
 AnalysisTrainHMPID.C:567
 AnalysisTrainHMPID.C:568
 AnalysisTrainHMPID.C:569
 AnalysisTrainHMPID.C:570
 AnalysisTrainHMPID.C:571
 AnalysisTrainHMPID.C:572
 AnalysisTrainHMPID.C:573
 AnalysisTrainHMPID.C:574
 AnalysisTrainHMPID.C:575
 AnalysisTrainHMPID.C:576
 AnalysisTrainHMPID.C:577
 AnalysisTrainHMPID.C:578
 AnalysisTrainHMPID.C:579
 AnalysisTrainHMPID.C:580
 AnalysisTrainHMPID.C:581
 AnalysisTrainHMPID.C:582
 AnalysisTrainHMPID.C:583
 AnalysisTrainHMPID.C:584
 AnalysisTrainHMPID.C:585
 AnalysisTrainHMPID.C:586
 AnalysisTrainHMPID.C:587
 AnalysisTrainHMPID.C:588
 AnalysisTrainHMPID.C:589
 AnalysisTrainHMPID.C:590
 AnalysisTrainHMPID.C:591
 AnalysisTrainHMPID.C:592
 AnalysisTrainHMPID.C:593
 AnalysisTrainHMPID.C:594
 AnalysisTrainHMPID.C:595
 AnalysisTrainHMPID.C:596
 AnalysisTrainHMPID.C:597
 AnalysisTrainHMPID.C:598
 AnalysisTrainHMPID.C:599
 AnalysisTrainHMPID.C:600
 AnalysisTrainHMPID.C:601
 AnalysisTrainHMPID.C:602
 AnalysisTrainHMPID.C:603
 AnalysisTrainHMPID.C:604
 AnalysisTrainHMPID.C:605
 AnalysisTrainHMPID.C:606
 AnalysisTrainHMPID.C:607
 AnalysisTrainHMPID.C:608
 AnalysisTrainHMPID.C:609
 AnalysisTrainHMPID.C:610
 AnalysisTrainHMPID.C:611
 AnalysisTrainHMPID.C:612
 AnalysisTrainHMPID.C:613
 AnalysisTrainHMPID.C:614
 AnalysisTrainHMPID.C:615
 AnalysisTrainHMPID.C:616
 AnalysisTrainHMPID.C:617
 AnalysisTrainHMPID.C:618
 AnalysisTrainHMPID.C:619
 AnalysisTrainHMPID.C:620
 AnalysisTrainHMPID.C:621
 AnalysisTrainHMPID.C:622
 AnalysisTrainHMPID.C:623
 AnalysisTrainHMPID.C:624
 AnalysisTrainHMPID.C:625
 AnalysisTrainHMPID.C:626
 AnalysisTrainHMPID.C:627
 AnalysisTrainHMPID.C:628
 AnalysisTrainHMPID.C:629
 AnalysisTrainHMPID.C:630
 AnalysisTrainHMPID.C:631
 AnalysisTrainHMPID.C:632
 AnalysisTrainHMPID.C:633
 AnalysisTrainHMPID.C:634
 AnalysisTrainHMPID.C:635
 AnalysisTrainHMPID.C:636
 AnalysisTrainHMPID.C:637
 AnalysisTrainHMPID.C:638
 AnalysisTrainHMPID.C:639
 AnalysisTrainHMPID.C:640
 AnalysisTrainHMPID.C:641
 AnalysisTrainHMPID.C:642
 AnalysisTrainHMPID.C:643
 AnalysisTrainHMPID.C:644
 AnalysisTrainHMPID.C:645
 AnalysisTrainHMPID.C:646
 AnalysisTrainHMPID.C:647
 AnalysisTrainHMPID.C:648
 AnalysisTrainHMPID.C:649
 AnalysisTrainHMPID.C:650
 AnalysisTrainHMPID.C:651
 AnalysisTrainHMPID.C:652
 AnalysisTrainHMPID.C:653
 AnalysisTrainHMPID.C:654
 AnalysisTrainHMPID.C:655
 AnalysisTrainHMPID.C:656
 AnalysisTrainHMPID.C:657
 AnalysisTrainHMPID.C:658
 AnalysisTrainHMPID.C:659
 AnalysisTrainHMPID.C:660
 AnalysisTrainHMPID.C:661
 AnalysisTrainHMPID.C:662
 AnalysisTrainHMPID.C:663
 AnalysisTrainHMPID.C:664
 AnalysisTrainHMPID.C:665
 AnalysisTrainHMPID.C:666
 AnalysisTrainHMPID.C:667
 AnalysisTrainHMPID.C:668
 AnalysisTrainHMPID.C:669
 AnalysisTrainHMPID.C:670
 AnalysisTrainHMPID.C:671
 AnalysisTrainHMPID.C:672
 AnalysisTrainHMPID.C:673
 AnalysisTrainHMPID.C:674
 AnalysisTrainHMPID.C:675
 AnalysisTrainHMPID.C:676
 AnalysisTrainHMPID.C:677
 AnalysisTrainHMPID.C:678
 AnalysisTrainHMPID.C:679
 AnalysisTrainHMPID.C:680
 AnalysisTrainHMPID.C:681
 AnalysisTrainHMPID.C:682
 AnalysisTrainHMPID.C:683
 AnalysisTrainHMPID.C:684
 AnalysisTrainHMPID.C:685
 AnalysisTrainHMPID.C:686
 AnalysisTrainHMPID.C:687
 AnalysisTrainHMPID.C:688
 AnalysisTrainHMPID.C:689
 AnalysisTrainHMPID.C:690
 AnalysisTrainHMPID.C:691
 AnalysisTrainHMPID.C:692
 AnalysisTrainHMPID.C:693
 AnalysisTrainHMPID.C:694
 AnalysisTrainHMPID.C:695
 AnalysisTrainHMPID.C:696
 AnalysisTrainHMPID.C:697
 AnalysisTrainHMPID.C:698
 AnalysisTrainHMPID.C:699
 AnalysisTrainHMPID.C:700
 AnalysisTrainHMPID.C:701
 AnalysisTrainHMPID.C:702
 AnalysisTrainHMPID.C:703
 AnalysisTrainHMPID.C:704
 AnalysisTrainHMPID.C:705
 AnalysisTrainHMPID.C:706
 AnalysisTrainHMPID.C:707
 AnalysisTrainHMPID.C:708
 AnalysisTrainHMPID.C:709
 AnalysisTrainHMPID.C:710
 AnalysisTrainHMPID.C:711
 AnalysisTrainHMPID.C:712
 AnalysisTrainHMPID.C:713
 AnalysisTrainHMPID.C:714
 AnalysisTrainHMPID.C:715
 AnalysisTrainHMPID.C:716
 AnalysisTrainHMPID.C:717
 AnalysisTrainHMPID.C:718
 AnalysisTrainHMPID.C:719
 AnalysisTrainHMPID.C:720
 AnalysisTrainHMPID.C:721
 AnalysisTrainHMPID.C:722
 AnalysisTrainHMPID.C:723
 AnalysisTrainHMPID.C:724
 AnalysisTrainHMPID.C:725
 AnalysisTrainHMPID.C:726
 AnalysisTrainHMPID.C:727
 AnalysisTrainHMPID.C:728
 AnalysisTrainHMPID.C:729
 AnalysisTrainHMPID.C:730
 AnalysisTrainHMPID.C:731
 AnalysisTrainHMPID.C:732
 AnalysisTrainHMPID.C:733
 AnalysisTrainHMPID.C:734
 AnalysisTrainHMPID.C:735
 AnalysisTrainHMPID.C:736
 AnalysisTrainHMPID.C:737
 AnalysisTrainHMPID.C:738
 AnalysisTrainHMPID.C:739
 AnalysisTrainHMPID.C:740
 AnalysisTrainHMPID.C:741
 AnalysisTrainHMPID.C:742
 AnalysisTrainHMPID.C:743
 AnalysisTrainHMPID.C:744
 AnalysisTrainHMPID.C:745
 AnalysisTrainHMPID.C:746
 AnalysisTrainHMPID.C:747
 AnalysisTrainHMPID.C:748
 AnalysisTrainHMPID.C:749
 AnalysisTrainHMPID.C:750
 AnalysisTrainHMPID.C:751
 AnalysisTrainHMPID.C:752
 AnalysisTrainHMPID.C:753
 AnalysisTrainHMPID.C:754
 AnalysisTrainHMPID.C:755
 AnalysisTrainHMPID.C:756
 AnalysisTrainHMPID.C:757
 AnalysisTrainHMPID.C:758
 AnalysisTrainHMPID.C:759
 AnalysisTrainHMPID.C:760
 AnalysisTrainHMPID.C:761
 AnalysisTrainHMPID.C:762
 AnalysisTrainHMPID.C:763
 AnalysisTrainHMPID.C:764
 AnalysisTrainHMPID.C:765
 AnalysisTrainHMPID.C:766
 AnalysisTrainHMPID.C:767
 AnalysisTrainHMPID.C:768
 AnalysisTrainHMPID.C:769
 AnalysisTrainHMPID.C:770
 AnalysisTrainHMPID.C:771
 AnalysisTrainHMPID.C:772
 AnalysisTrainHMPID.C:773
 AnalysisTrainHMPID.C:774
 AnalysisTrainHMPID.C:775
 AnalysisTrainHMPID.C:776
 AnalysisTrainHMPID.C:777
 AnalysisTrainHMPID.C:778
 AnalysisTrainHMPID.C:779
 AnalysisTrainHMPID.C:780
 AnalysisTrainHMPID.C:781
 AnalysisTrainHMPID.C:782
 AnalysisTrainHMPID.C:783
 AnalysisTrainHMPID.C:784
 AnalysisTrainHMPID.C:785
 AnalysisTrainHMPID.C:786
 AnalysisTrainHMPID.C:787
 AnalysisTrainHMPID.C:788
 AnalysisTrainHMPID.C:789
 AnalysisTrainHMPID.C:790
 AnalysisTrainHMPID.C:791
 AnalysisTrainHMPID.C:792
 AnalysisTrainHMPID.C:793
 AnalysisTrainHMPID.C:794
 AnalysisTrainHMPID.C:795
 AnalysisTrainHMPID.C:796
 AnalysisTrainHMPID.C:797
 AnalysisTrainHMPID.C:798
 AnalysisTrainHMPID.C:799
 AnalysisTrainHMPID.C:800
 AnalysisTrainHMPID.C:801
 AnalysisTrainHMPID.C:802
 AnalysisTrainHMPID.C:803
 AnalysisTrainHMPID.C:804
 AnalysisTrainHMPID.C:805
 AnalysisTrainHMPID.C:806
 AnalysisTrainHMPID.C:807
 AnalysisTrainHMPID.C:808
 AnalysisTrainHMPID.C:809
 AnalysisTrainHMPID.C:810
 AnalysisTrainHMPID.C:811
 AnalysisTrainHMPID.C:812
 AnalysisTrainHMPID.C:813
 AnalysisTrainHMPID.C:814
 AnalysisTrainHMPID.C:815
 AnalysisTrainHMPID.C:816
 AnalysisTrainHMPID.C:817
 AnalysisTrainHMPID.C:818
 AnalysisTrainHMPID.C:819
 AnalysisTrainHMPID.C:820
 AnalysisTrainHMPID.C:821
 AnalysisTrainHMPID.C:822
 AnalysisTrainHMPID.C:823
 AnalysisTrainHMPID.C:824
 AnalysisTrainHMPID.C:825
 AnalysisTrainHMPID.C:826
 AnalysisTrainHMPID.C:827
 AnalysisTrainHMPID.C:828
 AnalysisTrainHMPID.C:829
 AnalysisTrainHMPID.C:830
 AnalysisTrainHMPID.C:831
 AnalysisTrainHMPID.C:832
 AnalysisTrainHMPID.C:833
 AnalysisTrainHMPID.C:834
 AnalysisTrainHMPID.C:835
 AnalysisTrainHMPID.C:836
 AnalysisTrainHMPID.C:837
 AnalysisTrainHMPID.C:838
 AnalysisTrainHMPID.C:839
 AnalysisTrainHMPID.C:840
 AnalysisTrainHMPID.C:841
 AnalysisTrainHMPID.C:842
 AnalysisTrainHMPID.C:843
 AnalysisTrainHMPID.C:844
 AnalysisTrainHMPID.C:845
 AnalysisTrainHMPID.C:846
 AnalysisTrainHMPID.C:847
 AnalysisTrainHMPID.C:848
 AnalysisTrainHMPID.C:849
 AnalysisTrainHMPID.C:850
 AnalysisTrainHMPID.C:851
 AnalysisTrainHMPID.C:852
 AnalysisTrainHMPID.C:853
 AnalysisTrainHMPID.C:854
 AnalysisTrainHMPID.C:855
 AnalysisTrainHMPID.C:856
 AnalysisTrainHMPID.C:857
 AnalysisTrainHMPID.C:858
 AnalysisTrainHMPID.C:859
 AnalysisTrainHMPID.C:860
 AnalysisTrainHMPID.C:861
 AnalysisTrainHMPID.C:862
 AnalysisTrainHMPID.C:863
 AnalysisTrainHMPID.C:864
 AnalysisTrainHMPID.C:865
 AnalysisTrainHMPID.C:866
 AnalysisTrainHMPID.C:867
 AnalysisTrainHMPID.C:868
 AnalysisTrainHMPID.C:869
 AnalysisTrainHMPID.C:870
 AnalysisTrainHMPID.C:871
 AnalysisTrainHMPID.C:872
 AnalysisTrainHMPID.C:873
 AnalysisTrainHMPID.C:874
 AnalysisTrainHMPID.C:875
 AnalysisTrainHMPID.C:876
 AnalysisTrainHMPID.C:877
 AnalysisTrainHMPID.C:878
 AnalysisTrainHMPID.C:879
 AnalysisTrainHMPID.C:880
 AnalysisTrainHMPID.C:881
 AnalysisTrainHMPID.C:882
 AnalysisTrainHMPID.C:883
 AnalysisTrainHMPID.C:884
 AnalysisTrainHMPID.C:885
 AnalysisTrainHMPID.C:886
 AnalysisTrainHMPID.C:887
 AnalysisTrainHMPID.C:888
 AnalysisTrainHMPID.C:889
 AnalysisTrainHMPID.C:890
 AnalysisTrainHMPID.C:891
 AnalysisTrainHMPID.C:892
 AnalysisTrainHMPID.C:893
 AnalysisTrainHMPID.C:894
 AnalysisTrainHMPID.C:895
 AnalysisTrainHMPID.C:896
 AnalysisTrainHMPID.C:897
 AnalysisTrainHMPID.C:898
 AnalysisTrainHMPID.C:899
 AnalysisTrainHMPID.C:900
 AnalysisTrainHMPID.C:901
 AnalysisTrainHMPID.C:902
 AnalysisTrainHMPID.C:903
 AnalysisTrainHMPID.C:904
 AnalysisTrainHMPID.C:905
 AnalysisTrainHMPID.C:906
 AnalysisTrainHMPID.C:907
 AnalysisTrainHMPID.C:908
 AnalysisTrainHMPID.C:909
 AnalysisTrainHMPID.C:910
 AnalysisTrainHMPID.C:911
 AnalysisTrainHMPID.C:912
 AnalysisTrainHMPID.C:913
 AnalysisTrainHMPID.C:914
 AnalysisTrainHMPID.C:915
 AnalysisTrainHMPID.C:916
 AnalysisTrainHMPID.C:917
 AnalysisTrainHMPID.C:918
 AnalysisTrainHMPID.C:919
 AnalysisTrainHMPID.C:920
 AnalysisTrainHMPID.C:921
 AnalysisTrainHMPID.C:922
 AnalysisTrainHMPID.C:923
 AnalysisTrainHMPID.C:924
 AnalysisTrainHMPID.C:925
 AnalysisTrainHMPID.C:926
 AnalysisTrainHMPID.C:927
 AnalysisTrainHMPID.C:928
 AnalysisTrainHMPID.C:929
 AnalysisTrainHMPID.C:930
 AnalysisTrainHMPID.C:931
 AnalysisTrainHMPID.C:932
 AnalysisTrainHMPID.C:933
 AnalysisTrainHMPID.C:934
 AnalysisTrainHMPID.C:935
 AnalysisTrainHMPID.C:936
 AnalysisTrainHMPID.C:937
 AnalysisTrainHMPID.C:938
 AnalysisTrainHMPID.C:939
 AnalysisTrainHMPID.C:940
 AnalysisTrainHMPID.C:941
 AnalysisTrainHMPID.C:942
 AnalysisTrainHMPID.C:943
 AnalysisTrainHMPID.C:944
 AnalysisTrainHMPID.C:945
 AnalysisTrainHMPID.C:946
 AnalysisTrainHMPID.C:947
 AnalysisTrainHMPID.C:948
 AnalysisTrainHMPID.C:949
 AnalysisTrainHMPID.C:950
 AnalysisTrainHMPID.C:951
 AnalysisTrainHMPID.C:952
 AnalysisTrainHMPID.C:953
 AnalysisTrainHMPID.C:954
 AnalysisTrainHMPID.C:955
 AnalysisTrainHMPID.C:956
 AnalysisTrainHMPID.C:957
 AnalysisTrainHMPID.C:958
 AnalysisTrainHMPID.C:959
 AnalysisTrainHMPID.C:960
 AnalysisTrainHMPID.C:961
 AnalysisTrainHMPID.C:962
 AnalysisTrainHMPID.C:963
 AnalysisTrainHMPID.C:964
 AnalysisTrainHMPID.C:965
 AnalysisTrainHMPID.C:966
 AnalysisTrainHMPID.C:967
 AnalysisTrainHMPID.C:968
 AnalysisTrainHMPID.C:969
 AnalysisTrainHMPID.C:970
 AnalysisTrainHMPID.C:971
 AnalysisTrainHMPID.C:972
 AnalysisTrainHMPID.C:973
 AnalysisTrainHMPID.C:974
 AnalysisTrainHMPID.C:975
 AnalysisTrainHMPID.C:976
 AnalysisTrainHMPID.C:977
 AnalysisTrainHMPID.C:978
 AnalysisTrainHMPID.C:979
 AnalysisTrainHMPID.C:980
 AnalysisTrainHMPID.C:981
 AnalysisTrainHMPID.C:982
 AnalysisTrainHMPID.C:983
 AnalysisTrainHMPID.C:984
 AnalysisTrainHMPID.C:985
 AnalysisTrainHMPID.C:986
 AnalysisTrainHMPID.C:987
 AnalysisTrainHMPID.C:988
 AnalysisTrainHMPID.C:989
 AnalysisTrainHMPID.C:990
 AnalysisTrainHMPID.C:991
 AnalysisTrainHMPID.C:992
 AnalysisTrainHMPID.C:993
 AnalysisTrainHMPID.C:994
 AnalysisTrainHMPID.C:995
 AnalysisTrainHMPID.C:996
 AnalysisTrainHMPID.C:997
 AnalysisTrainHMPID.C:998
 AnalysisTrainHMPID.C:999
 AnalysisTrainHMPID.C:1000
 AnalysisTrainHMPID.C:1001
 AnalysisTrainHMPID.C:1002
 AnalysisTrainHMPID.C:1003
 AnalysisTrainHMPID.C:1004
 AnalysisTrainHMPID.C:1005
 AnalysisTrainHMPID.C:1006
 AnalysisTrainHMPID.C:1007
 AnalysisTrainHMPID.C:1008
 AnalysisTrainHMPID.C:1009
 AnalysisTrainHMPID.C:1010
 AnalysisTrainHMPID.C:1011
 AnalysisTrainHMPID.C:1012
 AnalysisTrainHMPID.C:1013
 AnalysisTrainHMPID.C:1014
 AnalysisTrainHMPID.C:1015
 AnalysisTrainHMPID.C:1016
 AnalysisTrainHMPID.C:1017
 AnalysisTrainHMPID.C:1018
 AnalysisTrainHMPID.C:1019
 AnalysisTrainHMPID.C:1020
 AnalysisTrainHMPID.C:1021
 AnalysisTrainHMPID.C:1022
 AnalysisTrainHMPID.C:1023
 AnalysisTrainHMPID.C:1024
 AnalysisTrainHMPID.C:1025
 AnalysisTrainHMPID.C:1026
 AnalysisTrainHMPID.C:1027
 AnalysisTrainHMPID.C:1028
 AnalysisTrainHMPID.C:1029
 AnalysisTrainHMPID.C:1030
 AnalysisTrainHMPID.C:1031
 AnalysisTrainHMPID.C:1032
 AnalysisTrainHMPID.C:1033
 AnalysisTrainHMPID.C:1034
 AnalysisTrainHMPID.C:1035
 AnalysisTrainHMPID.C:1036
 AnalysisTrainHMPID.C:1037
 AnalysisTrainHMPID.C:1038
 AnalysisTrainHMPID.C:1039
 AnalysisTrainHMPID.C:1040
 AnalysisTrainHMPID.C:1041
 AnalysisTrainHMPID.C:1042
 AnalysisTrainHMPID.C:1043
 AnalysisTrainHMPID.C:1044
 AnalysisTrainHMPID.C:1045
 AnalysisTrainHMPID.C:1046
 AnalysisTrainHMPID.C:1047
 AnalysisTrainHMPID.C:1048
 AnalysisTrainHMPID.C:1049
 AnalysisTrainHMPID.C:1050
 AnalysisTrainHMPID.C:1051
 AnalysisTrainHMPID.C:1052
 AnalysisTrainHMPID.C:1053
 AnalysisTrainHMPID.C:1054
 AnalysisTrainHMPID.C:1055
 AnalysisTrainHMPID.C:1056
 AnalysisTrainHMPID.C:1057
 AnalysisTrainHMPID.C:1058
 AnalysisTrainHMPID.C:1059
 AnalysisTrainHMPID.C:1060
 AnalysisTrainHMPID.C:1061
 AnalysisTrainHMPID.C:1062
 AnalysisTrainHMPID.C:1063
 AnalysisTrainHMPID.C:1064
 AnalysisTrainHMPID.C:1065
 AnalysisTrainHMPID.C:1066
 AnalysisTrainHMPID.C:1067
 AnalysisTrainHMPID.C:1068
 AnalysisTrainHMPID.C:1069
 AnalysisTrainHMPID.C:1070
 AnalysisTrainHMPID.C:1071
 AnalysisTrainHMPID.C:1072
 AnalysisTrainHMPID.C:1073
 AnalysisTrainHMPID.C:1074
 AnalysisTrainHMPID.C:1075
 AnalysisTrainHMPID.C:1076
 AnalysisTrainHMPID.C:1077
 AnalysisTrainHMPID.C:1078
 AnalysisTrainHMPID.C:1079
 AnalysisTrainHMPID.C:1080
 AnalysisTrainHMPID.C:1081
 AnalysisTrainHMPID.C:1082
 AnalysisTrainHMPID.C:1083
 AnalysisTrainHMPID.C:1084
 AnalysisTrainHMPID.C:1085
 AnalysisTrainHMPID.C:1086
 AnalysisTrainHMPID.C:1087
 AnalysisTrainHMPID.C:1088
 AnalysisTrainHMPID.C:1089
 AnalysisTrainHMPID.C:1090
 AnalysisTrainHMPID.C:1091
 AnalysisTrainHMPID.C:1092
 AnalysisTrainHMPID.C:1093
 AnalysisTrainHMPID.C:1094
 AnalysisTrainHMPID.C:1095