ROOT logo
// ### Settings that make sense when using the Alien plugin
//==============================================================================
Int_t       runOnData          = 0;       // Set to 1 if processing real data
Int_t       iCollision         = 0;       // 0=pp, 1=Pb-Pb
Int_t       run_flag           = 1100;   // year (2011 = 1100)
//==============================================================================
Bool_t      doCDBconnect      = 1;
Bool_t      usePhysicsSelection = kTRUE; // use physics selection
Bool_t      useTender           = kFALSE; // use tender wagon
Bool_t      useCentrality       = kFALSE; // centrality
Bool_t      useV0tender         = kFALSE;  // use V0 correction in tender
Bool_t      useDBG              = kTRUE;  // activate debugging
Bool_t      useMC               = kTRUE;  // use MC info
Bool_t      useKFILTER          = kTRUE;  // use Kinematics filter
Bool_t      useTR               = kTRUE;  // use track references
Bool_t      useCORRFW           = kFALSE; // do not change
Bool_t      useAODTAGS          = kFALSE; // use AOD tags
Bool_t      useSysInfo          = kFALSE; // use sys info

// ### Analysis modules to be included. Some may not be yet fully implemented.
//==============================================================================
Int_t       iAODhandler        = 1;      // Analysis produces an AOD or dAOD's
Int_t       iESDfilter         = 1;      // ESD to AOD filter (barrel + muon tracks)
Int_t       iMUONcopyAOD       = 1;      // Task that copies only muon events in a separate AOD (PWG3)
Int_t       iJETAN             = 0;      // Jet analysis (PWG4)
Int_t       iJETANdelta        = 0;      // Jet delta AODs
Int_t       iPWGHFvertexing     = 1;      // Vertexing HF task (PWG3)
Int_t       iPWGDQJPSIfilter    = 0;      // JPSI filtering (PWG3)
Int_t       iPWGHFd2h           = 1;      // D0->2 hadrons (PWG3)
Int_t       iPIDResponse        = 1;      // PID response
Int_t       iPWGLFForward       = 1;      // Forward mult task (PWGLF)

Int_t run_number = 0;

// ### Configuration macros used for each module
//==============================================================================
 TString configPWGHFd2h = (iCollision==0)?"$ALICE_ROOT/PWGHF/vertexingHF/ConfigVertexingHF.C"
                          :"$ALICE_ROOT/PWGHF/vertexingHF/ConfigVertexingHF_Pb_AllCent.C";
//                            :"$ALICE_ROOT/PWGHF/vertexingHF/ConfigVertexingHF_Pb_AllCent_NoLS_NoDstar_16var.C";
//                            :"$ALICE_ROOT/PWGHF/vertexingHF/ConfigVertexingHF_ITSUpgrade_16var.C";
// Temporaries.
class AliOADBPhysicsSelection;                                                                                                                  
AliOADBPhysicsSelection *CreateOADBphysicsSelection();
void AODmerge();
void AddAnalysisTasks();
Bool_t LoadCommonLibraries();
Bool_t LoadAnalysisLibraries();
Bool_t LoadLibrary(const char *);

TChain *CreateChain();
const char *cdbPath = "raw://";

//______________________________________________________________________________
void AODtrainsim(Int_t merge=0)
{
// Main analysis train macro.

  if (merge || doCDBconnect) {
    TGrid::Connect("alien://");
    if (!gGrid || !gGrid->IsConnected()) {
      ::Error("AODtrainsim", "No grid connection");
      return;
    }
  }
  // Set temporary merging directory to current one
  gSystem->Setenv("TMPDIR", gSystem->pwd());
  // Set temporary compilation directory to current one
  gSystem->SetBuildDir(gSystem->pwd(), kTRUE);
   printf("==================================================================\n");
   printf("===========    RUNNING FILTERING TRAIN   ==========\n");
   printf("==================================================================\n");
   printf("=  Configuring analysis train for:                               =\n");
   if (usePhysicsSelection)   printf("=  Physics selection                                                =\n");
   if (useTender)    printf("=  TENDER                                                        =\n");
   if (iESDfilter)   printf("=  ESD filter                                                    =\n");
   if (iMUONcopyAOD) printf("=  MUON copy AOD                                                 =\n");
   if (iJETAN)       printf("=  Jet analysis                                                  =\n");
   if (iJETANdelta)  printf("=     Jet delta AODs                                             =\n");
   if (iPWGHFvertexing) printf("=  PWGHF vertexing                                                =\n");
   if (iPWGDQJPSIfilter) printf("=  PWGDQ j/psi filter                                             =\n");
   if (iPWGHFd2h) printf("=  PWGHF D0->2 hadrons QA                                     =\n");

   // Load common libraries and set include path
   if (!LoadCommonLibraries()) {
      ::Error("AnalysisTrain", "Could not load common libraries");
      return;
   }
    
   // Make the analysis manager and connect event handlers
   AliAnalysisManager *mgr  = new AliAnalysisManager("Analysis Train", "Production train");
   if (useSysInfo) mgr->SetNSysInfo(100);
   // Load analysis specific libraries
   if (!LoadAnalysisLibraries()) {
      ::Error("AnalysisTrain", "Could not load analysis libraries");
      return;
   }   

   // Create input handler (input container created automatically)
   // ESD input handler
   AliESDInputHandler *esdHandler = new AliESDInputHandler();
   mgr->SetInputEventHandler(esdHandler);       
   // Monte Carlo handler
   if (useMC) {
      AliMCEventHandler* mcHandler = new AliMCEventHandler();
      mgr->SetMCtruthEventHandler(mcHandler);
      mcHandler->SetPreReadMode(1);
      mcHandler->SetReadTR(useTR); 
   }   
   // AOD output container, created automatically when setting an AOD handler
   if (iAODhandler) {
      // AOD output handler
      AliAODHandler* aodHandler   = new AliAODHandler();
      aodHandler->SetOutputFileName("AliAOD.root");
      mgr->SetOutputEventHandler(aodHandler);
   }
   // Debugging if needed
   if (useDBG) mgr->SetDebugLevel(3);

   AddAnalysisTasks(cdbPath);
   if (merge) {
      AODmerge();
      mgr->InitAnalysis();
      mgr->SetGridHandler(new AliAnalysisAlien);
      mgr->StartAnalysis("gridterminate",0);
      return;
   }   
   // Run the analysis                                                                                                                     
   //
   TChain *chain = CreateChain();
   if (!chain) return;
                                                                                                                                                   
   TStopwatch timer;
   timer.Start();
   mgr->SetSkipTerminate(kTRUE);
   if (mgr->InitAnalysis()) {
      mgr->PrintStatus();
      mgr->StartAnalysis("local", chain);
   }
   timer.Print();
}                                                                                                                                          
                                                                                                                                            
//______________________________________________________________________________                                                           
void AddAnalysisTasks(const char *cdb_location){                                                                                                                                          
  // Add all analysis task wagons to the train                                                                                               
   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();                                                                     

  //
  // Tender and supplies. Needs to be called for every event.
  //
   AliAnalysisManager::SetCommonFileName("AODQA.root");
    //
   // PIDResponse(JENS)
   //
   if (iPIDResponse) {
     gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPIDResponse.C"); 
     AliAnalysisTaskPIDResponse *PIDResponse = AddTaskPIDResponse(kTRUE);
//     PIDResponse->SelectCollisionCandidates(AliVEvent::kAny);
   }  
  // CDB connection
  //
  if (doCDBconnect && !useTender) {
    gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskCDBconnect.C");
    AliTaskCDBconnect *taskCDB = AddTaskCDBconnect(cdb_location, run_number);
    if (!taskCDB) return;
    AliCDBManager *cdb = AliCDBManager::Instance();
    cdb->SetDefaultStorage(cdb_location);
//    taskCDB->SetRunNumber(run_number);
  }    
   if (useTender) {
      gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/TenderSupplies/AddTaskTender.C");
      // IF V0 tender needed, put kTRUE below
      AliAnalysisTaskSE *tender = AddTaskTender(useV0tender);
//      tender->SetDebugLevel(2);
   }

   if (usePhysicsSelection) {
   // Physics selection task
      gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
      mgr->RegisterExtraFile("event_stat.root");
      AliPhysicsSelectionTask *physSelTask = AddTaskPhysicsSelection(useMC);
//      AliOADBPhysicsSelection * oadbDefaultPbPb = CreateOADBphysicsSelection();      
//      physSelTask->GetPhysicsSelection()->SetCustomOADBObjects(oadbDefaultPbPb,0,0);
      mgr->AddStatisticsTask(AliVEvent::kAny);
    }
   // Centrality (only Pb-Pb)
   if (useCentrality) {
      gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskCentrality.C");
      AliCentralitySelectionTask *taskCentrality = AddTaskCentrality();
      taskCentrality->SetMCInput();
    //  taskCentrality->SelectCollisionCandidates(AliVEvent::kAny);
   }
   
// --- PWGLF - Forward (cholm@nbi.dk) -----------------------------
   if (iPWGLFForward && usePhysicsSelection) { 
        gROOT->LoadMacro("$ALICE_ROOT/PWGLF/FORWARD/analysis2/AddTaskForwardMult.C");
     UShort_t pwglfForwardSys = 0; // iCollision+1; // pp:1, PbPb:2, pPb:3
     UShort_t pwglfSNN        = 0;            // GeV, 0==unknown
     Short_t  pwglfField      = 0;
     AddTaskForwardMult(useMC && useTR,        // Need track-refs 
			pwglfForwardSys,       // Collision system
			pwglfSNN, 
			pwglfField);
        gROOT->LoadMacro("$ALICE_ROOT/PWGLF/FORWARD/analysis2/AddTaskCentralMult.C");
        AddTaskCentralMult(useMC, pwglfForwardSys, pwglfSNN, pwglfField);
   }
 
   
   
    if (iESDfilter) {
      //  ESD filter task configuration.
      gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/ESDfilter/macros/AddTaskESDFilter.C");
      if (iMUONcopyAOD) {
         printf("Registering delta AOD file\n");
         mgr->RegisterExtraFile("AliAOD.Muons.root");
         mgr->RegisterExtraFile("AliAOD.Dimuons.root");
      }
      AliAnalysisTaskESDfilter *taskesdfilter = 
                 AddTaskESDFilter(useKFILTER, 
                                  iMUONcopyAOD,         // write Muon AOD
                                  kFALSE,               // write dimuon AOD 
                                  kFALSE,               // usePhysicsSelection 
                                  kFALSE,               // centrality OBSOLETE
                                  kTRUE,                // enable TPS only tracks
                                  kFALSE,               // disable cascades
                                  kFALSE,               // disable kinks
                                  run_flag);            // run flag (YY00)
   }   

// ********** PWG3 wagons ******************************************************           
   // PWG3 vertexing
   if (iPWGHFvertexing) {
      gROOT->LoadMacro("$ALICE_ROOT/PWGHF/vertexingHF/macros/AddTaskVertexingHF.C");
      if (!iPWGHFd2h) TFile::Cp(gSystem->ExpandPathName(configPWG3d2h.Data()), "file:ConfigVertexingHF.C");
      AliAnalysisTaskSEVertexingHF *taskvertexingHF = AddTaskVertexingHF();
      if (!taskvertexingHF) ::Warning("AnalysisTrainNew", "AliAnalysisTaskSEVertexingHF cannot run for this train conditions - EXCLUDED");
      else mgr->RegisterExtraFile("AliAOD.VertexingHF.root");
      taskvertexingHF->SelectCollisionCandidates(0);
   }   
      
   // PWG3 JPSI filtering (only pp)
   if (iPWGDQJPSIfilter && (iCollision==0)) {
      gROOT->LoadMacro("$ALICE_ROOT/PWGDQ/dielectron/macros/AddTaskJPSIFilter.C");
      AliAnalysisTaskSE *taskJPSIfilter = AddTaskJPSIFilter();
      if (!taskJPSIfilter) ::Warning("AnalysisTrainNew", "AliAnalysisTaskDielectronFilter cannot run for this train conditions - EXCLUDED");
      else mgr->RegisterExtraFile("AliAOD.Dielectron.root");
      taskJPSIfilter->SelectCollisionCandidates(0);
   }   

   // PWG3 D2h
   if (iPWGHFd2h) {   
     gROOT->LoadMacro("$ALICE_ROOT/PWGHF/vertexingHF/AddD2HTrain.C");
     TFile::Cp(gSystem->ExpandPathName(configPWGHFd2h.Data()), "file:ConfigVertexingHF.C");
     AddD2HTrain(kFALSE, 1,0,0,0,0,0,0,0,0,0,0);                                 
   }
   
   // ********** PWG4 wagons ******************************************************
   // Jet analysis

   // Configurations flags, move up?
   TString kDeltaAODJetName = "AliAOD.Jets.root"; //
   Bool_t  kIsPbPb = (iCollision==0)?false:true; // can be more intlligent checking the name of the data set
   TString kDefaultJetBackgroundBranch = "";
   TString kJetSubtractBranches = "";
   UInt_t kHighPtFilterMask = 768;// from esd filter
   UInt_t iPhysicsSelectionFlag = 0;
   if (iJETAN) {
     gROOT->LoadMacro("$ALICE_ROOT/PWGJE/macros/AddTaskJets.C");
     // Default jet reconstructor running on ESD's
     AliAnalysisTaskJets *taskjets = AddTaskJets("AOD","UA1",0.4,kHighPtFilterMask,1.,0); // no background subtraction     
     if (!taskjets) ::Fatal("AnalysisTrainNew", "AliAnalysisTaskJets cannot run for this train conditions - EXCLUDED");
     if(kDeltaAODJetName.Length()>0) taskjets->SetNonStdOutputFile(kDeltaAODJetName.Data());
     if (iJETANdelta) {
        //            AddTaskJetsDelta("AliAOD.Jets.root"); // need to modify this accordingly in the add task jets
        mgr->RegisterExtraFile(kDeltaAODJetName.Data());
        TString cTmp("");
        if(kIsPbPb){
          // UA1 intrinsic background subtraction
          taskjets = AddTaskJets("AOD","UA1",0.4,kHighPtFilterMask,1.,2); // background subtraction
          if(kDeltaAODJetName.Length()>0)taskjets->SetNonStdOutputFile(kDeltaAODJetName.Data());
       }
       // SICONE 
       taskjets = AddTaskJets("AOD","SISCONE",0.4,kHighPtFilterMask,0.15,0); //no background subtration to be done later....                                                                                  
       if(kDeltaAODJetName.Length()>0)taskjets->SetNonStdOutputFile(kDeltaAODJetName.Data());
       cTmp = taskjets->GetNonStdBranch();
       if(cTmp.Length()>0)kJetSubtractBranches += Form("%s ",cTmp.Data());
	 
       // Add the clusters..
       gROOT->LoadMacro("$ALICE_ROOT/PWGJE/macros/AddTaskJetCluster.C");
       AliAnalysisTaskJetCluster *taskCl = 0;
       Float_t fCenUp = 0;
       Float_t fCenLo = 0;
       Float_t fTrackEtaWindow = 0.9;
       taskCl = AddTaskJetCluster("AOD","",kHighPtFilterMask,iPhysicsSelectionFlag,"KT",0.4,0,1, kDeltaAODJetName.Data(),0.15,fTrackEtaWindow,0); // this one is for the background and random jets, random cones with no skip                                                                                 
       taskCl->SetBackgroundCalc(kTRUE);
       taskCl->SetNRandomCones(10);
       taskCl->SetCentralityCut(fCenLo,fCenUp);
       taskCl->SetGhostEtamax(fTrackEtaWindow);
       kDefaultJetBackgroundBranch = Form("%s_%s",AliAODJetEventBackground::StdBranchName(),taskCl->GetJetOutputBranch());

       taskCl = AddTaskJetCluster("AOD","",kHighPtFilterMask,iPhysicsSelectionFlag,"ANTIKT",0.4,2,1,kDeltaAODJetName.Data(),0.15);
       taskCl->SetCentralityCut(fCenLo,fCenUp);
       if(kIsPbPb)taskCl->SetBackgroundBranch(kDefaultJetBackgroundBranch.Data());
       taskCl->SetNRandomCones(10);
       kJetSubtractBranches += Form("%s ",taskCl->GetJetOutputBranch());

       taskCl = AddTaskJetCluster("AOD","",kHighPtFilterMask,iPhysicsSelectionFlag,"ANTIKT",0.2,0,1,kDeltaAODJetName.Data(),0.15);
       taskCl->SetCentralityCut(fCenLo,fCenUp);
       if(kIsPbPb)taskCl->SetBackgroundBranch(kDefaultJetBackgroundBranch.Data());
       kJetSubtractBranches += Form("%s ",taskCl->GetJetOutputBranch());
	 
       // DO THE BACKGROUND SUBTRACTION
       if(kIsPbPb&&kJetSubtractBranches.Length()){
         gROOT->LoadMacro("$ALICE_ROOT/PWGJE/macros/AddTaskJetBackgroundSubtract.C");
         AliAnalysisTaskJetBackgroundSubtract *taskSubtract = 0;
         taskSubtract = AddTaskJetBackgroundSubtract(kJetSubtractBranches,1,"B0","B%d");
         taskSubtract->SetBackgroundBranch(kDefaultJetBackgroundBranch.Data());
         if(kDeltaAODJetName.Length()>0)taskSubtract->SetNonStdOutputFile(kDeltaAODJetName.Data());
       }
     } 
   }
}

//______________________________________________________________________________
Bool_t LoadCommonLibraries()
{
// Load common analysis libraries.
   if (!gSystem->Getenv("ALICE_ROOT")) {
      ::Error("AnalysisTrainNew.C::LoadCommonLibraries", "Analysis train requires that analysis libraries are compiled with a local AliRoot"); 
      return kFALSE;
   }   
   Bool_t success = kTRUE;
   // 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");
   gROOT->ProcessLine(".include $ALICE_ROOT/include");
   if (success) {
      ::Info("AnalysisTrainNew.C::LoadCommodLibraries", "Load common libraries:    SUCCESS");
      ::Info("AnalysisTrainNew.C::LoadCommodLibraries", "Include path for Aclic compilation:\n%s",
              gSystem->GetIncludePath());
   } else {           
      ::Info("AnalysisTrainNew.C::LoadCommodLibraries", "Load common libraries:    FAILED");
   }   
   return success;
}

//______________________________________________________________________________
Bool_t LoadAnalysisLibraries()
{
// Load common analysis libraries.
   if (useTender || doCDBconnect) {
      if (!LoadLibrary("TENDER") ||
          !LoadLibrary("TENDERSupplies")) return kFALSE;
   }       
   // CDBconnect
   if (doCDBconnect && !useTender) {
      if (!LoadLibrary("PWGPP")) return kFALSE;
   }

   if (iESDfilter || iPWGMuonTrain) {
      if (!LoadLibrary("PWGmuon")) return kFALSE;
   }   
   // JETAN
   if (iJETAN) {
      if (!LoadLibrary("JETAN")) return kFALSE;
   }
   if (iJETANdelta) {
      if (!LoadLibrary("JETAN") ||
          !LoadLibrary("CGAL") ||
          !LoadLibrary("fastjet") ||
          !LoadLibrary("siscone") ||
          !LoadLibrary("SISConePlugin") ||
          !LoadLibrary("FASTJETAN")) return kFALSE;
   }     
   // PWG3 Vertexing HF
   if (iPWGHFvertexing || iPWGHFd2h) {
      if (!LoadLibrary("PWGflowBase") ||
          !LoadLibrary("PWGflowTasks") ||
          !LoadLibrary("PWGHFvertexingHF")) return kFALSE;
   }    
 //    if (iPWGHFvertexing || iPWG3d2h) {
 //     if (!LoadLibrary("PWG3base") ||
 //         !LoadLibrary("PWGHFvertexingHF")) return kFALSE;
 //  }   
   // PWG3 dielectron
   if (iPWGDQJPSIfilter) {
      if (!LoadLibrary("PWGDQdielectron")) return kFALSE;
   }   
   
   ::Info("AnalysisTrainNew.C::LoadAnalysisLibraries", "Load other libraries:   SUCCESS");
   return kTRUE;
}


//______________________________________________________________________________
Bool_t LoadLibrary(const char *module)
{
// Load a module library in a given mode. Reports success.
   Int_t result;
   TString mod(module);
   if (!mod.Length()) {
      ::Error("AnalysisTrainNew.C::LoadLibrary", "Empty module name");
      return kFALSE;
   }   
   // If a library is specified, just load it
   if (mod.EndsWith(".so")) {
      mod.Remove(mod.Index(".so"));
      result = gSystem->Load(mod);
      if (result < 0) {
         ::Error("AnalysisTrainNew.C::LoadLibrary", "Could not load library %s", module);
         return kFALSE;
      }
      return kTRUE;
   } 
   // Check if the library is already loaded
   if (strlen(gSystem->GetLibraries(Form("%s.so", module), "", kFALSE)) > 0) return kTRUE;    
   result = gSystem->Load(Form("lib%s.so", module));
   if (result < 0) {
      ::Error("AnalysisTrainNew.C::LoadLibrary", "Could not load module %s", module);
      return kFALSE;
   }
   return kTRUE;
}           


//______________________________________________________________________________
TChain *CreateChain()
{
// Create the input chain
   chain = new TChain("esdTree");
   if (gSystem->AccessPathName("AliESDs.root")) 
      ::Error("AnalysisTrainNew.C::CreateChain", "File: AliESDs.root not in ./data dir");
   else 
       chain->Add("AliESDs.root");
   if (chain->GetNtrees()) return chain;
   return NULL;
}   

//______________________________________________________________________________
void AODmerge()
{
// Merging method. No staging and no terminate phase.
  TStopwatch timer;
  timer.Start();
  TString outputDir = "wn.xml";
  TString outputFiles = "EventStat_temp.root,AODQA.root,AliAOD.root,AliAOD.VertexingHF.root,AliAOD.Muons.root,AliAOD.Jets.root,pyxsec_hists.root";
  TString mergeExcludes = "";
  TObjArray *list = outputFiles.Tokenize(",");
  TIter *iter = new TIter(list);
  TObjString *str;
  TString outputFile;
  Bool_t merged = kTRUE;
  while((str=(TObjString*)iter->Next())) {
    outputFile = str->GetString();
    // Skip already merged outputs
    if (!gSystem->AccessPathName(outputFile)) {
       printf("Output file <%s> found. Not merging again.",outputFile.Data());
       continue;
    }
    if (mergeExcludes.Contains(outputFile.Data())) continue;
    merged = AliAnalysisAlien::MergeOutput(outputFile, outputDir, 10, 0);
    if (!merged) {
       printf("ERROR: Cannot merge %s\n", outputFile.Data());
       continue;
    }
  }
  // all outputs merged, validate
  ofstream out;
  out.open("outputs_valid", ios::out);
  out.close();
  timer.Print();
}
 AODtrainsim.C:1
 AODtrainsim.C:2
 AODtrainsim.C:3
 AODtrainsim.C:4
 AODtrainsim.C:5
 AODtrainsim.C:6
 AODtrainsim.C:7
 AODtrainsim.C:8
 AODtrainsim.C:9
 AODtrainsim.C:10
 AODtrainsim.C:11
 AODtrainsim.C:12
 AODtrainsim.C:13
 AODtrainsim.C:14
 AODtrainsim.C:15
 AODtrainsim.C:16
 AODtrainsim.C:17
 AODtrainsim.C:18
 AODtrainsim.C:19
 AODtrainsim.C:20
 AODtrainsim.C:21
 AODtrainsim.C:22
 AODtrainsim.C:23
 AODtrainsim.C:24
 AODtrainsim.C:25
 AODtrainsim.C:26
 AODtrainsim.C:27
 AODtrainsim.C:28
 AODtrainsim.C:29
 AODtrainsim.C:30
 AODtrainsim.C:31
 AODtrainsim.C:32
 AODtrainsim.C:33
 AODtrainsim.C:34
 AODtrainsim.C:35
 AODtrainsim.C:36
 AODtrainsim.C:37
 AODtrainsim.C:38
 AODtrainsim.C:39
 AODtrainsim.C:40
 AODtrainsim.C:41
 AODtrainsim.C:42
 AODtrainsim.C:43
 AODtrainsim.C:44
 AODtrainsim.C:45
 AODtrainsim.C:46
 AODtrainsim.C:47
 AODtrainsim.C:48
 AODtrainsim.C:49
 AODtrainsim.C:50
 AODtrainsim.C:51
 AODtrainsim.C:52
 AODtrainsim.C:53
 AODtrainsim.C:54
 AODtrainsim.C:55
 AODtrainsim.C:56
 AODtrainsim.C:57
 AODtrainsim.C:58
 AODtrainsim.C:59
 AODtrainsim.C:60
 AODtrainsim.C:61
 AODtrainsim.C:62
 AODtrainsim.C:63
 AODtrainsim.C:64
 AODtrainsim.C:65
 AODtrainsim.C:66
 AODtrainsim.C:67
 AODtrainsim.C:68
 AODtrainsim.C:69
 AODtrainsim.C:70
 AODtrainsim.C:71
 AODtrainsim.C:72
 AODtrainsim.C:73
 AODtrainsim.C:74
 AODtrainsim.C:75
 AODtrainsim.C:76
 AODtrainsim.C:77
 AODtrainsim.C:78
 AODtrainsim.C:79
 AODtrainsim.C:80
 AODtrainsim.C:81
 AODtrainsim.C:82
 AODtrainsim.C:83
 AODtrainsim.C:84
 AODtrainsim.C:85
 AODtrainsim.C:86
 AODtrainsim.C:87
 AODtrainsim.C:88
 AODtrainsim.C:89
 AODtrainsim.C:90
 AODtrainsim.C:91
 AODtrainsim.C:92
 AODtrainsim.C:93
 AODtrainsim.C:94
 AODtrainsim.C:95
 AODtrainsim.C:96
 AODtrainsim.C:97
 AODtrainsim.C:98
 AODtrainsim.C:99
 AODtrainsim.C:100
 AODtrainsim.C:101
 AODtrainsim.C:102
 AODtrainsim.C:103
 AODtrainsim.C:104
 AODtrainsim.C:105
 AODtrainsim.C:106
 AODtrainsim.C:107
 AODtrainsim.C:108
 AODtrainsim.C:109
 AODtrainsim.C:110
 AODtrainsim.C:111
 AODtrainsim.C:112
 AODtrainsim.C:113
 AODtrainsim.C:114
 AODtrainsim.C:115
 AODtrainsim.C:116
 AODtrainsim.C:117
 AODtrainsim.C:118
 AODtrainsim.C:119
 AODtrainsim.C:120
 AODtrainsim.C:121
 AODtrainsim.C:122
 AODtrainsim.C:123
 AODtrainsim.C:124
 AODtrainsim.C:125
 AODtrainsim.C:126
 AODtrainsim.C:127
 AODtrainsim.C:128
 AODtrainsim.C:129
 AODtrainsim.C:130
 AODtrainsim.C:131
 AODtrainsim.C:132
 AODtrainsim.C:133
 AODtrainsim.C:134
 AODtrainsim.C:135
 AODtrainsim.C:136
 AODtrainsim.C:137
 AODtrainsim.C:138
 AODtrainsim.C:139
 AODtrainsim.C:140
 AODtrainsim.C:141
 AODtrainsim.C:142
 AODtrainsim.C:143
 AODtrainsim.C:144
 AODtrainsim.C:145
 AODtrainsim.C:146
 AODtrainsim.C:147
 AODtrainsim.C:148
 AODtrainsim.C:149
 AODtrainsim.C:150
 AODtrainsim.C:151
 AODtrainsim.C:152
 AODtrainsim.C:153
 AODtrainsim.C:154
 AODtrainsim.C:155
 AODtrainsim.C:156
 AODtrainsim.C:157
 AODtrainsim.C:158
 AODtrainsim.C:159
 AODtrainsim.C:160
 AODtrainsim.C:161
 AODtrainsim.C:162
 AODtrainsim.C:163
 AODtrainsim.C:164
 AODtrainsim.C:165
 AODtrainsim.C:166
 AODtrainsim.C:167
 AODtrainsim.C:168
 AODtrainsim.C:169
 AODtrainsim.C:170
 AODtrainsim.C:171
 AODtrainsim.C:172
 AODtrainsim.C:173
 AODtrainsim.C:174
 AODtrainsim.C:175
 AODtrainsim.C:176
 AODtrainsim.C:177
 AODtrainsim.C:178
 AODtrainsim.C:179
 AODtrainsim.C:180
 AODtrainsim.C:181
 AODtrainsim.C:182
 AODtrainsim.C:183
 AODtrainsim.C:184
 AODtrainsim.C:185
 AODtrainsim.C:186
 AODtrainsim.C:187
 AODtrainsim.C:188
 AODtrainsim.C:189
 AODtrainsim.C:190
 AODtrainsim.C:191
 AODtrainsim.C:192
 AODtrainsim.C:193
 AODtrainsim.C:194
 AODtrainsim.C:195
 AODtrainsim.C:196
 AODtrainsim.C:197
 AODtrainsim.C:198
 AODtrainsim.C:199
 AODtrainsim.C:200
 AODtrainsim.C:201
 AODtrainsim.C:202
 AODtrainsim.C:203
 AODtrainsim.C:204
 AODtrainsim.C:205
 AODtrainsim.C:206
 AODtrainsim.C:207
 AODtrainsim.C:208
 AODtrainsim.C:209
 AODtrainsim.C:210
 AODtrainsim.C:211
 AODtrainsim.C:212
 AODtrainsim.C:213
 AODtrainsim.C:214
 AODtrainsim.C:215
 AODtrainsim.C:216
 AODtrainsim.C:217
 AODtrainsim.C:218
 AODtrainsim.C:219
 AODtrainsim.C:220
 AODtrainsim.C:221
 AODtrainsim.C:222
 AODtrainsim.C:223
 AODtrainsim.C:224
 AODtrainsim.C:225
 AODtrainsim.C:226
 AODtrainsim.C:227
 AODtrainsim.C:228
 AODtrainsim.C:229
 AODtrainsim.C:230
 AODtrainsim.C:231
 AODtrainsim.C:232
 AODtrainsim.C:233
 AODtrainsim.C:234
 AODtrainsim.C:235
 AODtrainsim.C:236
 AODtrainsim.C:237
 AODtrainsim.C:238
 AODtrainsim.C:239
 AODtrainsim.C:240
 AODtrainsim.C:241
 AODtrainsim.C:242
 AODtrainsim.C:243
 AODtrainsim.C:244
 AODtrainsim.C:245
 AODtrainsim.C:246
 AODtrainsim.C:247
 AODtrainsim.C:248
 AODtrainsim.C:249
 AODtrainsim.C:250
 AODtrainsim.C:251
 AODtrainsim.C:252
 AODtrainsim.C:253
 AODtrainsim.C:254
 AODtrainsim.C:255
 AODtrainsim.C:256
 AODtrainsim.C:257
 AODtrainsim.C:258
 AODtrainsim.C:259
 AODtrainsim.C:260
 AODtrainsim.C:261
 AODtrainsim.C:262
 AODtrainsim.C:263
 AODtrainsim.C:264
 AODtrainsim.C:265
 AODtrainsim.C:266
 AODtrainsim.C:267
 AODtrainsim.C:268
 AODtrainsim.C:269
 AODtrainsim.C:270
 AODtrainsim.C:271
 AODtrainsim.C:272
 AODtrainsim.C:273
 AODtrainsim.C:274
 AODtrainsim.C:275
 AODtrainsim.C:276
 AODtrainsim.C:277
 AODtrainsim.C:278
 AODtrainsim.C:279
 AODtrainsim.C:280
 AODtrainsim.C:281
 AODtrainsim.C:282
 AODtrainsim.C:283
 AODtrainsim.C:284
 AODtrainsim.C:285
 AODtrainsim.C:286
 AODtrainsim.C:287
 AODtrainsim.C:288
 AODtrainsim.C:289
 AODtrainsim.C:290
 AODtrainsim.C:291
 AODtrainsim.C:292
 AODtrainsim.C:293
 AODtrainsim.C:294
 AODtrainsim.C:295
 AODtrainsim.C:296
 AODtrainsim.C:297
 AODtrainsim.C:298
 AODtrainsim.C:299
 AODtrainsim.C:300
 AODtrainsim.C:301
 AODtrainsim.C:302
 AODtrainsim.C:303
 AODtrainsim.C:304
 AODtrainsim.C:305
 AODtrainsim.C:306
 AODtrainsim.C:307
 AODtrainsim.C:308
 AODtrainsim.C:309
 AODtrainsim.C:310
 AODtrainsim.C:311
 AODtrainsim.C:312
 AODtrainsim.C:313
 AODtrainsim.C:314
 AODtrainsim.C:315
 AODtrainsim.C:316
 AODtrainsim.C:317
 AODtrainsim.C:318
 AODtrainsim.C:319
 AODtrainsim.C:320
 AODtrainsim.C:321
 AODtrainsim.C:322
 AODtrainsim.C:323
 AODtrainsim.C:324
 AODtrainsim.C:325
 AODtrainsim.C:326
 AODtrainsim.C:327
 AODtrainsim.C:328
 AODtrainsim.C:329
 AODtrainsim.C:330
 AODtrainsim.C:331
 AODtrainsim.C:332
 AODtrainsim.C:333
 AODtrainsim.C:334
 AODtrainsim.C:335
 AODtrainsim.C:336
 AODtrainsim.C:337
 AODtrainsim.C:338
 AODtrainsim.C:339
 AODtrainsim.C:340
 AODtrainsim.C:341
 AODtrainsim.C:342
 AODtrainsim.C:343
 AODtrainsim.C:344
 AODtrainsim.C:345
 AODtrainsim.C:346
 AODtrainsim.C:347
 AODtrainsim.C:348
 AODtrainsim.C:349
 AODtrainsim.C:350
 AODtrainsim.C:351
 AODtrainsim.C:352
 AODtrainsim.C:353
 AODtrainsim.C:354
 AODtrainsim.C:355
 AODtrainsim.C:356
 AODtrainsim.C:357
 AODtrainsim.C:358
 AODtrainsim.C:359
 AODtrainsim.C:360
 AODtrainsim.C:361
 AODtrainsim.C:362
 AODtrainsim.C:363
 AODtrainsim.C:364
 AODtrainsim.C:365
 AODtrainsim.C:366
 AODtrainsim.C:367
 AODtrainsim.C:368
 AODtrainsim.C:369
 AODtrainsim.C:370
 AODtrainsim.C:371
 AODtrainsim.C:372
 AODtrainsim.C:373
 AODtrainsim.C:374
 AODtrainsim.C:375
 AODtrainsim.C:376
 AODtrainsim.C:377
 AODtrainsim.C:378
 AODtrainsim.C:379
 AODtrainsim.C:380
 AODtrainsim.C:381
 AODtrainsim.C:382
 AODtrainsim.C:383
 AODtrainsim.C:384
 AODtrainsim.C:385
 AODtrainsim.C:386
 AODtrainsim.C:387
 AODtrainsim.C:388
 AODtrainsim.C:389
 AODtrainsim.C:390
 AODtrainsim.C:391
 AODtrainsim.C:392
 AODtrainsim.C:393
 AODtrainsim.C:394
 AODtrainsim.C:395
 AODtrainsim.C:396
 AODtrainsim.C:397
 AODtrainsim.C:398
 AODtrainsim.C:399
 AODtrainsim.C:400
 AODtrainsim.C:401
 AODtrainsim.C:402
 AODtrainsim.C:403
 AODtrainsim.C:404
 AODtrainsim.C:405
 AODtrainsim.C:406
 AODtrainsim.C:407
 AODtrainsim.C:408
 AODtrainsim.C:409
 AODtrainsim.C:410
 AODtrainsim.C:411
 AODtrainsim.C:412
 AODtrainsim.C:413
 AODtrainsim.C:414
 AODtrainsim.C:415
 AODtrainsim.C:416
 AODtrainsim.C:417
 AODtrainsim.C:418
 AODtrainsim.C:419
 AODtrainsim.C:420
 AODtrainsim.C:421
 AODtrainsim.C:422
 AODtrainsim.C:423
 AODtrainsim.C:424
 AODtrainsim.C:425
 AODtrainsim.C:426
 AODtrainsim.C:427
 AODtrainsim.C:428
 AODtrainsim.C:429
 AODtrainsim.C:430
 AODtrainsim.C:431
 AODtrainsim.C:432
 AODtrainsim.C:433
 AODtrainsim.C:434
 AODtrainsim.C:435
 AODtrainsim.C:436
 AODtrainsim.C:437
 AODtrainsim.C:438
 AODtrainsim.C:439
 AODtrainsim.C:440
 AODtrainsim.C:441
 AODtrainsim.C:442
 AODtrainsim.C:443
 AODtrainsim.C:444
 AODtrainsim.C:445
 AODtrainsim.C:446
 AODtrainsim.C:447
 AODtrainsim.C:448
 AODtrainsim.C:449
 AODtrainsim.C:450
 AODtrainsim.C:451
 AODtrainsim.C:452
 AODtrainsim.C:453
 AODtrainsim.C:454
 AODtrainsim.C:455
 AODtrainsim.C:456
 AODtrainsim.C:457
 AODtrainsim.C:458
 AODtrainsim.C:459
 AODtrainsim.C:460
 AODtrainsim.C:461
 AODtrainsim.C:462
 AODtrainsim.C:463
 AODtrainsim.C:464
 AODtrainsim.C:465
 AODtrainsim.C:466
 AODtrainsim.C:467
 AODtrainsim.C:468
 AODtrainsim.C:469
 AODtrainsim.C:470
 AODtrainsim.C:471
 AODtrainsim.C:472
 AODtrainsim.C:473
 AODtrainsim.C:474
 AODtrainsim.C:475
 AODtrainsim.C:476
 AODtrainsim.C:477
 AODtrainsim.C:478