ROOT logo
// ### Settings that make sense when using the Alien plugin
//==============================================================================
Int_t       runOnData          = 1;       // Set to 1 if processing real data
Int_t       iCollision         = 1;       // 0=pp, 1=Pb-Pb
//==============================================================================
Bool_t      usePhysicsSelection = kFALSE; // 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              = kFALSE;  // 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       iESDMCLabelAddition= 1;
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       iMUONRefit         = 0;      // Refit ESD muon tracks before producing AODs
Int_t       iMUONPerformance   = 0;      // Task to study the muon performances in MC simulation
Int_t       iMUONEfficiency    = 0;      // Task to measure the muon efficiency
Int_t       iJETAN             = 0;      // Jet analysis (PWG4)
Int_t       iJETANdelta        = 0;      // Jet delta AODs
Int_t       iPWG3vertexing     = 0;      // Vertexing HF task (PWG3)
Int_t       iPWG3JPSIfilter    = 0;      // JPSI filtering (PWG3)
Int_t       iPWG3d2h           = 0;      // D0->2 hadrons (PWG3)

// ### Configuration macros used for each module
//==============================================================================
TString configPWG3d2h = (iCollision==0)?"$ALICE_ROOT/PWG3/vertexingHF/ConfigVertexingHF.C"
:"$ALICE_ROOT/PWG3/vertexingHF/ConfigVertexingHF_highmult.C";

// Temporaries.
class AliOADBPhysicsSelection;                                                                                                                  
AliOADBPhysicsSelection *CreateOADBphysicsSelection();
void AODmerge();
void AddAnalysisTasks(Int_t);
Bool_t LoadCommonLibraries();
Bool_t LoadAnalysisLibraries();
Bool_t LoadLibrary(const char *);
TChain *CreateChain();

//______________________________________________________________________________
void AODtrain(Int_t merge=0)
{
  // Main analysis train macro.
  // merge = 0: production
  // merge = 1: intermediate merging
  // merge = 2: final merging + terminate
  
  if (merge) {
    TGrid::Connect("alien://");
    if (!gGrid || !gGrid->IsConnected()) {
      ::Error("QAtrain", "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 (iPWG3vertexing) printf("=  PWG3 vertexing                                                =\n");
  if (iPWG3JPSIfilter) printf("=  PWG3 j/psi filter                                             =\n");
  if (iPWG3d2h) printf("=  PWG3 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->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(merge);
  if (merge) {
    AODmerge();
    if (merge > 1) {
      mgr->InitAnalysis();
      mgr->SetGridHandler(new AliAnalysisAlien());
      mgr->StartAnalysis("grid terminate",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(Int_t merge){                                                                                                                                          
  // 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");
  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(kFALSE);
    //      AliOADBPhysicsSelection * oadbDefaultPbPb = CreateOADBphysicsSelection();      
    //      physSelTask->GetPhysicsSelection()->SetCustomOADBObjects(oadbDefaultPbPb,0,0);
    //      if (!merge) mgr->AddStatisticsTask(AliVEvent::kAny);
  }
  // Centrality (only Pb-Pb)
  if (iCollision && useCentrality) {
    gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskCentrality.C");
    AliCentralitySelectionTask *taskCentrality = AddTaskCentrality();
    taskCentrality->SelectCollisionCandidates(AliVEvent::kAny);
  }
  
  if (iMUONRefit) {
    gROOT->LoadMacro("$ALICE_ROOT/PWG/muondep/AddTaskMuonRefit.C");
    AliAnalysisTaskMuonRefit* refit = AddTaskMuonRefit(-1., -1., kTRUE, -1., -1.);
    refit->RemoveMonoCathodClusters(kTRUE, kFALSE);
  }
  
  if(iESDMCLabelAddition) {
    gROOT->LoadMacro("$ALICE_ROOT/PWG/muondep/AddTaskESDMCLabelAddition.C");
    AliAnalysisTaskESDMCLabelAddition *esdmclabel = AddTaskESDMCLabelAddition();
  }
  
  if (useMC && useTR && iMUONPerformance) {
    gROOT->LoadMacro("$ALICE_ROOT/PWGPP/MUON/dep/AddTaskMuonPerformance.C");
    AliAnalysisTaskMuonPerformance* muonPerformance = AddTaskMuonPerformance();
    if (usePhysicsSelection) muonPerformance->SelectCollisionCandidates(AliVEvent::kAny);
    muonPerformance->UseMCKinematics(kTRUE);
    muonPerformance->SetMCTrigLevelFromMatchTrk(kTRUE);
  }
  
  if (iMUONEfficiency) {
    gROOT->LoadMacro("$ALICE_ROOT/PWGPP/MUON/dep/AddTaskMUONTrackingEfficiency.C");
    AliAnalysisTaskMuonTrackingEff* muonEfficiency = AddTaskMUONTrackingEfficiency(kTRUE, kTRUE);
    if (usePhysicsSelection) muonEfficiency->SelectCollisionCandidates(AliVEvent::kAny);
    muonEfficiency->UseMCLabel(kTRUE);
  }
  
  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");
      int muonMCMode=VAR_MUONMCMODE; // 1 to keep all ancestors, whether or not we get something in the muon arm
      AliAnalysisTaskESDfilter *taskesdfilter = AddTaskESDFilter(useKFILTER, kTRUE, kFALSE, kFALSE /*usePhysicsSelection*/,kFALSE,kTRUE,kTRUE,kTRUE,1100,muonMCMode); // others
    } else {
      AliAnalysisTaskESDfilter *taskesdfilter = AddTaskESDFilter(useKFILTER, kFALSE, kFALSE, kFALSE /*usePhysicsSelection*/,kFALSE,kTRUE,kTRUE,kTRUE,1100,muonMCMode); // others
    }
    
    if ( 0 && VAR_USE_ITS_RECO ) /* 0 for the moment to get this macro running also with AliRoot <= .... */      
    {
      AliAnalysisTaskESDMuonFilter* muFilter = mgr->GetTask("ESD Muon Filter");
      if ( !muFilter )
      {
        std::cout << "ERROR : got a NULL muFilter ! so I cannot ask to keep SPD tracklets !" << std::endl;
      }
      else
      {
        muFilter->SetWithSPDtracklets(kTRUE);
      }
    }
  }   
  
  // ********** PWG3 wagons ******************************************************           
  // PWG3 vertexing
  if (iPWG3vertexing) {
    gROOT->LoadMacro("$ALICE_ROOT/PWG3/vertexingHF/macros/AddTaskVertexingHF.C");
    if (!iPWG3d2h) 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 (iPWG3JPSIfilter && (iCollision==0)) {
    gROOT->LoadMacro("$ALICE_ROOT/PWG3/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 (iPWG3d2h) {   
    gROOT->LoadMacro("$ALICE_ROOT/PWG3/vertexingHF/AddD2HTrain.C");
    TFile::Cp(gSystem->ExpandPathName(configPWG3d2h.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 = 128;// from esd filter
  UInt_t iPhysicsSelectionFlag = AliVEvent::kMB;
  if (iJETAN) {
    gROOT->LoadMacro("$ALICE_ROOT/PWG4/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/PWG4/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/PWG4/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("libCORRFW.so");
  success &= LoadLibrary("libESDfilter.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) {
    if (!LoadLibrary("TENDER") ||
	!LoadLibrary("TENDERSupplies")) return kFALSE;
  }       
  if (iESDfilter || iPWG3MuonTrain) {
    if (!LoadLibrary("PWGmuon")) return kFALSE;
    //      if (!LoadLibrary("PWG3base")) return kFALSE;
    //      if (!LoadLibrary("PWG3muon")) return kFALSE;
  }   
  if (iMUONRefit || iESDMCLabelAddition) {
    if (!LoadLibrary("PWGmuondep")) return kFALSE;
  }
  if ((useMC && useTR && iMUONPerformance) || iMUONEfficiency) {
    if (!LoadLibrary("PWGPPMUONdep")) 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 (iPWG3vertexing || iPWG3d2h) {
    if (!LoadLibrary("PWG3base") ||
	!LoadLibrary("PWG3vertexingHF")) return kFALSE;
  }   
  // PWG3 dielectron
  if (iPWG3JPSIfilter) {
    if (!LoadLibrary("PWG3dielectron")) 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 = "AliAOD.root,AliAOD.Muons.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());
      return;
    }
  }
  // all outputs merged, validate
  ofstream out;
  out.open("outputs_valid_merge", ios::out);
  out.close();
  timer.Print();
}
 AODtrain.C:1
 AODtrain.C:2
 AODtrain.C:3
 AODtrain.C:4
 AODtrain.C:5
 AODtrain.C:6
 AODtrain.C:7
 AODtrain.C:8
 AODtrain.C:9
 AODtrain.C:10
 AODtrain.C:11
 AODtrain.C:12
 AODtrain.C:13
 AODtrain.C:14
 AODtrain.C:15
 AODtrain.C:16
 AODtrain.C:17
 AODtrain.C:18
 AODtrain.C:19
 AODtrain.C:20
 AODtrain.C:21
 AODtrain.C:22
 AODtrain.C:23
 AODtrain.C:24
 AODtrain.C:25
 AODtrain.C:26
 AODtrain.C:27
 AODtrain.C:28
 AODtrain.C:29
 AODtrain.C:30
 AODtrain.C:31
 AODtrain.C:32
 AODtrain.C:33
 AODtrain.C:34
 AODtrain.C:35
 AODtrain.C:36
 AODtrain.C:37
 AODtrain.C:38
 AODtrain.C:39
 AODtrain.C:40
 AODtrain.C:41
 AODtrain.C:42
 AODtrain.C:43
 AODtrain.C:44
 AODtrain.C:45
 AODtrain.C:46
 AODtrain.C:47
 AODtrain.C:48
 AODtrain.C:49
 AODtrain.C:50
 AODtrain.C:51
 AODtrain.C:52
 AODtrain.C:53
 AODtrain.C:54
 AODtrain.C:55
 AODtrain.C:56
 AODtrain.C:57
 AODtrain.C:58
 AODtrain.C:59
 AODtrain.C:60
 AODtrain.C:61
 AODtrain.C:62
 AODtrain.C:63
 AODtrain.C:64
 AODtrain.C:65
 AODtrain.C:66
 AODtrain.C:67
 AODtrain.C:68
 AODtrain.C:69
 AODtrain.C:70
 AODtrain.C:71
 AODtrain.C:72
 AODtrain.C:73
 AODtrain.C:74
 AODtrain.C:75
 AODtrain.C:76
 AODtrain.C:77
 AODtrain.C:78
 AODtrain.C:79
 AODtrain.C:80
 AODtrain.C:81
 AODtrain.C:82
 AODtrain.C:83
 AODtrain.C:84
 AODtrain.C:85
 AODtrain.C:86
 AODtrain.C:87
 AODtrain.C:88
 AODtrain.C:89
 AODtrain.C:90
 AODtrain.C:91
 AODtrain.C:92
 AODtrain.C:93
 AODtrain.C:94
 AODtrain.C:95
 AODtrain.C:96
 AODtrain.C:97
 AODtrain.C:98
 AODtrain.C:99
 AODtrain.C:100
 AODtrain.C:101
 AODtrain.C:102
 AODtrain.C:103
 AODtrain.C:104
 AODtrain.C:105
 AODtrain.C:106
 AODtrain.C:107
 AODtrain.C:108
 AODtrain.C:109
 AODtrain.C:110
 AODtrain.C:111
 AODtrain.C:112
 AODtrain.C:113
 AODtrain.C:114
 AODtrain.C:115
 AODtrain.C:116
 AODtrain.C:117
 AODtrain.C:118
 AODtrain.C:119
 AODtrain.C:120
 AODtrain.C:121
 AODtrain.C:122
 AODtrain.C:123
 AODtrain.C:124
 AODtrain.C:125
 AODtrain.C:126
 AODtrain.C:127
 AODtrain.C:128
 AODtrain.C:129
 AODtrain.C:130
 AODtrain.C:131
 AODtrain.C:132
 AODtrain.C:133
 AODtrain.C:134
 AODtrain.C:135
 AODtrain.C:136
 AODtrain.C:137
 AODtrain.C:138
 AODtrain.C:139
 AODtrain.C:140
 AODtrain.C:141
 AODtrain.C:142
 AODtrain.C:143
 AODtrain.C:144
 AODtrain.C:145
 AODtrain.C:146
 AODtrain.C:147
 AODtrain.C:148
 AODtrain.C:149
 AODtrain.C:150
 AODtrain.C:151
 AODtrain.C:152
 AODtrain.C:153
 AODtrain.C:154
 AODtrain.C:155
 AODtrain.C:156
 AODtrain.C:157
 AODtrain.C:158
 AODtrain.C:159
 AODtrain.C:160
 AODtrain.C:161
 AODtrain.C:162
 AODtrain.C:163
 AODtrain.C:164
 AODtrain.C:165
 AODtrain.C:166
 AODtrain.C:167
 AODtrain.C:168
 AODtrain.C:169
 AODtrain.C:170
 AODtrain.C:171
 AODtrain.C:172
 AODtrain.C:173
 AODtrain.C:174
 AODtrain.C:175
 AODtrain.C:176
 AODtrain.C:177
 AODtrain.C:178
 AODtrain.C:179
 AODtrain.C:180
 AODtrain.C:181
 AODtrain.C:182
 AODtrain.C:183
 AODtrain.C:184
 AODtrain.C:185
 AODtrain.C:186
 AODtrain.C:187
 AODtrain.C:188
 AODtrain.C:189
 AODtrain.C:190
 AODtrain.C:191
 AODtrain.C:192
 AODtrain.C:193
 AODtrain.C:194
 AODtrain.C:195
 AODtrain.C:196
 AODtrain.C:197
 AODtrain.C:198
 AODtrain.C:199
 AODtrain.C:200
 AODtrain.C:201
 AODtrain.C:202
 AODtrain.C:203
 AODtrain.C:204
 AODtrain.C:205
 AODtrain.C:206
 AODtrain.C:207
 AODtrain.C:208
 AODtrain.C:209
 AODtrain.C:210
 AODtrain.C:211
 AODtrain.C:212
 AODtrain.C:213
 AODtrain.C:214
 AODtrain.C:215
 AODtrain.C:216
 AODtrain.C:217
 AODtrain.C:218
 AODtrain.C:219
 AODtrain.C:220
 AODtrain.C:221
 AODtrain.C:222
 AODtrain.C:223
 AODtrain.C:224
 AODtrain.C:225
 AODtrain.C:226
 AODtrain.C:227
 AODtrain.C:228
 AODtrain.C:229
 AODtrain.C:230
 AODtrain.C:231
 AODtrain.C:232
 AODtrain.C:233
 AODtrain.C:234
 AODtrain.C:235
 AODtrain.C:236
 AODtrain.C:237
 AODtrain.C:238
 AODtrain.C:239
 AODtrain.C:240
 AODtrain.C:241
 AODtrain.C:242
 AODtrain.C:243
 AODtrain.C:244
 AODtrain.C:245
 AODtrain.C:246
 AODtrain.C:247
 AODtrain.C:248
 AODtrain.C:249
 AODtrain.C:250
 AODtrain.C:251
 AODtrain.C:252
 AODtrain.C:253
 AODtrain.C:254
 AODtrain.C:255
 AODtrain.C:256
 AODtrain.C:257
 AODtrain.C:258
 AODtrain.C:259
 AODtrain.C:260
 AODtrain.C:261
 AODtrain.C:262
 AODtrain.C:263
 AODtrain.C:264
 AODtrain.C:265
 AODtrain.C:266
 AODtrain.C:267
 AODtrain.C:268
 AODtrain.C:269
 AODtrain.C:270
 AODtrain.C:271
 AODtrain.C:272
 AODtrain.C:273
 AODtrain.C:274
 AODtrain.C:275
 AODtrain.C:276
 AODtrain.C:277
 AODtrain.C:278
 AODtrain.C:279
 AODtrain.C:280
 AODtrain.C:281
 AODtrain.C:282
 AODtrain.C:283
 AODtrain.C:284
 AODtrain.C:285
 AODtrain.C:286
 AODtrain.C:287
 AODtrain.C:288
 AODtrain.C:289
 AODtrain.C:290
 AODtrain.C:291
 AODtrain.C:292
 AODtrain.C:293
 AODtrain.C:294
 AODtrain.C:295
 AODtrain.C:296
 AODtrain.C:297
 AODtrain.C:298
 AODtrain.C:299
 AODtrain.C:300
 AODtrain.C:301
 AODtrain.C:302
 AODtrain.C:303
 AODtrain.C:304
 AODtrain.C:305
 AODtrain.C:306
 AODtrain.C:307
 AODtrain.C:308
 AODtrain.C:309
 AODtrain.C:310
 AODtrain.C:311
 AODtrain.C:312
 AODtrain.C:313
 AODtrain.C:314
 AODtrain.C:315
 AODtrain.C:316
 AODtrain.C:317
 AODtrain.C:318
 AODtrain.C:319
 AODtrain.C:320
 AODtrain.C:321
 AODtrain.C:322
 AODtrain.C:323
 AODtrain.C:324
 AODtrain.C:325
 AODtrain.C:326
 AODtrain.C:327
 AODtrain.C:328
 AODtrain.C:329
 AODtrain.C:330
 AODtrain.C:331
 AODtrain.C:332
 AODtrain.C:333
 AODtrain.C:334
 AODtrain.C:335
 AODtrain.C:336
 AODtrain.C:337
 AODtrain.C:338
 AODtrain.C:339
 AODtrain.C:340
 AODtrain.C:341
 AODtrain.C:342
 AODtrain.C:343
 AODtrain.C:344
 AODtrain.C:345
 AODtrain.C:346
 AODtrain.C:347
 AODtrain.C:348
 AODtrain.C:349
 AODtrain.C:350
 AODtrain.C:351
 AODtrain.C:352
 AODtrain.C:353
 AODtrain.C:354
 AODtrain.C:355
 AODtrain.C:356
 AODtrain.C:357
 AODtrain.C:358
 AODtrain.C:359
 AODtrain.C:360
 AODtrain.C:361
 AODtrain.C:362
 AODtrain.C:363
 AODtrain.C:364
 AODtrain.C:365
 AODtrain.C:366
 AODtrain.C:367
 AODtrain.C:368
 AODtrain.C:369
 AODtrain.C:370
 AODtrain.C:371
 AODtrain.C:372
 AODtrain.C:373
 AODtrain.C:374
 AODtrain.C:375
 AODtrain.C:376
 AODtrain.C:377
 AODtrain.C:378
 AODtrain.C:379
 AODtrain.C:380
 AODtrain.C:381
 AODtrain.C:382
 AODtrain.C:383
 AODtrain.C:384
 AODtrain.C:385
 AODtrain.C:386
 AODtrain.C:387
 AODtrain.C:388
 AODtrain.C:389
 AODtrain.C:390
 AODtrain.C:391
 AODtrain.C:392
 AODtrain.C:393
 AODtrain.C:394
 AODtrain.C:395
 AODtrain.C:396
 AODtrain.C:397
 AODtrain.C:398
 AODtrain.C:399
 AODtrain.C:400
 AODtrain.C:401
 AODtrain.C:402
 AODtrain.C:403
 AODtrain.C:404
 AODtrain.C:405
 AODtrain.C:406
 AODtrain.C:407
 AODtrain.C:408
 AODtrain.C:409
 AODtrain.C:410
 AODtrain.C:411
 AODtrain.C:412
 AODtrain.C:413
 AODtrain.C:414
 AODtrain.C:415
 AODtrain.C:416
 AODtrain.C:417
 AODtrain.C:418
 AODtrain.C:419
 AODtrain.C:420
 AODtrain.C:421
 AODtrain.C:422
 AODtrain.C:423
 AODtrain.C:424
 AODtrain.C:425
 AODtrain.C:426
 AODtrain.C:427
 AODtrain.C:428
 AODtrain.C:429
 AODtrain.C:430
 AODtrain.C:431
 AODtrain.C:432
 AODtrain.C:433
 AODtrain.C:434
 AODtrain.C:435
 AODtrain.C:436
 AODtrain.C:437
 AODtrain.C:438
 AODtrain.C:439
 AODtrain.C:440
 AODtrain.C:441
 AODtrain.C:442
 AODtrain.C:443
 AODtrain.C:444
 AODtrain.C:445
 AODtrain.C:446
 AODtrain.C:447
 AODtrain.C:448
 AODtrain.C:449
 AODtrain.C:450
 AODtrain.C:451
 AODtrain.C:452
 AODtrain.C:453
 AODtrain.C:454
 AODtrain.C:455
 AODtrain.C:456
 AODtrain.C:457
 AODtrain.C:458
 AODtrain.C:459
 AODtrain.C:460
 AODtrain.C:461
 AODtrain.C:462
 AODtrain.C:463
 AODtrain.C:464
 AODtrain.C:465
 AODtrain.C:466
 AODtrain.C:467
 AODtrain.C:468
 AODtrain.C:469
 AODtrain.C:470
 AODtrain.C:471
 AODtrain.C:472