ROOT logo
#error This file is not for compilation 
/** 
    @page train_setup_doc Using the TrainSetup facility 
 
    @tableofcontents
 
    @section train_setup_overview Overview 
    
    The TrainSetup framework allows users to easily set up an analysis
    train which can be executed in all environments supported by ALICE. 
    
    The train definition takes the form of a class deriving from the
    base class TrainSetup.
    
    Specific hooks in the base class allows users to customize the
    various aspects of a train.  The base class also facilities to
    easily define parameters of the train which can be set by parsing
    simple command line options or strings.  Furthermore, the basic
    setup ensures that the analysis becomes a self-contained,
    self-documenting unit by storing all relevant files together with
    the various kinds of output generated during the analysis job.
    
    The execution environment (local, Proof, Grid) is specified as a
    simple URL like string, with room for environment specific
    options.  This scheme allows a user to run the same analysis in
    various environments by simply changing the execution environment
    URL with another URL.  Various helpers for each type of
    environment ensures that all needed steps are taken to help ensure
    successful execution of the analysis regardless of the underlying
    execution environment.
    
    Trains defined using this framework can either be executed in an
    interactive AliROOT session or using a stand-alone program.
    
    @section train_setup_usage Usage
    
    Users should define a class that derives from TrainSetup.  The
    class should implement the member function TrainSetup::CreateTasks
    to add needed tasks to the train.  The derived class must also
    override the member function TrainSetup::ClassName to return the
    name of the derived class as a C-string.
    
    @code 
    // MyTrain.C 
    class MyTrain : public TrainSetup
    {
    public:
      MyTrain(const char  name="MyTrain")
       : TrainSetup(name), 
      {
         // fOptions.Set("type", "AOD"); // AOD input
         // fOptions.Set("type", "ESD"); // ESD input
         fOptions.Add("parameter", "VALUE", "Help on parameter", "value");
      }
    protected:
      void CreateTasks(AliAnalysisManager  mgr)
      {
        AliAnalysisManager::SetCommonFileName("my_analysis.root");
        fHelper->LoadLibrary("MyAnalysis", true);
        Bool_t mc = mgr->GetMCtruthEventHandler() != 0;
        Double_t param = fOptions.AsDouble("parameter");
        gROOT->Macro(Form("AddTaskMyAnalysis.C(%f)",param));
      }
      const char* ClassName() const { return "MyTrain"; }
    };
    @endcode 
    (Please note, that TrainSetup does not inherit from TObject so one
    should _not_ put in a call to the *ClassDef* macro)

    @section train_setup_params Parameters of the setup 
    
    Parameters of the user defined class deriving from TrainSetup is
    best handled by adding options to the internal member @c fOptions
    in the constructor e.g.,
    @code
    fOptions.Add("<name>", "<dummy>", "<description>", "<default>");
    fOptions.Add("<name>", "<dummy>", "<description>", defaultInt_t);
    fOptions.Add("<name>", "<dummy>", "<description>", defaultLong64_t);
    fOptions.Add("<name>", "<dummy>", "<description>", defaultDouble_t);
    fOptions.Add("<name>", "<description>");
    fOptions.Add("<name>", "<description>", defaultBool);
    @endcode
    
    The first 4 forms defined a parameter that has a value, while the
    last 2 forms defines a flag (or toggle).  The values or flags can be
    retrieved later by doing
    @code 
    Double_t value = fOptions.AsDouble("<name>",<value if not set>);
    Int_t    value = fOptions.AsInt("<name>",<value if not set>);
    Long64_t value = fOptions.AsLong("<name>",<value if not set>);
    Bool_t   value = fOptions.AsBool("<name>",<value if not set>)
    TString  value = fOptions.Get("<name>");
    Bool_t   value = fOptions.Has("<name>");
    @endcode
    
    Parameters defined this way are directly accessible as options to
    pass to either runTrain or RunTrain.C
    
    @section train_setup_exec Execution of the train 
    
    A user defined TrainSetup class can then be run like
    @code
    Root> .x RunTrain.C("<class>", "<name>", "<uri>", "<options>")
    @endcode

    or using the program @b runTrain
    @verbatim
    > runTrain --class=<class> --name=<name> --url=<uri> [<options>] 
    @endverbatim

    Here, 
    <dl>
      <dt>`<class>`</dt>
      <dd> is the name of the user defined class deriving from
        TrainSetup.</dd>
      <dt>`<name>`</dt> 
      <dd> is an arbitary name to give to the train. Note, an @e
        escaped @e name will be generated from this, which replaces
        all spaces and the like with '_' and (optionally) with the
        date and time appended.</dd>
      <dt>`<uri>`</dt>
      <dd> is the job execution URI which specified both the
        execution environment and the input data, as well as some options.  
	See more below. </dd>
      <dt>`<options>`</dt>
      <dd> is a list of options.  For RunTrain this is a
        comma separated list of options in the form
	&lt;option&gt;=&lt;value&gt; for value options and &lt;option&gt;
	for flags (booleans).  For @c runTrain, the options are of the
	traditional Unix long type: `--<option>=<value>` and
	@c `--<option>`.  The exact list of options for a given train
	can be listed by passing the option @b help.
	</dd>
    </dl>
    See also ::RunTrain and ::main
    
    In both cases, a new sub-directory called @e escaped @e name of
    the train is created, and various files are copied there -
    depending on the mode of execution.
    
    For local analysis, no aditional files are copied there, but the
    output will be put there.
    
    For PROOF analysis, the needed PAR files are copied there and
    expanded.  The output of the job may end up in this directory if
    so instructed.
    
    For Grid analysis, various JDL and steering scripts are copied to
    this directory.  Scripts to run merge/terminate stages and to
    download the results are also generated for the users convinence.
    The special generated script <tt>Watch.C</tt> will monitor the
    progess of the jobs and automatically execute the needed merging
    and terminate stages.  Various files needed by the train are
    copied to the Grid working directory as a form of documentation.
    
    In all cases, a file named @c ReRun.C (and for @b runTrain:
    rerun.sh) is generated in this sub-directory.  It contains the
    setting used for the train and can easily be used to run jobs
    again as well as serve as a form of documentation.
    
    @section train_setup_url_spec Execution URI 
    
    This URI has the form 
    @verbatim 
    <protocol>://[[<user>@]<host>]/<input>[?<options>][#<treename>]
    @endverbatim
    and specifies several things.
    
    <dl>
      <dt>`<protocol>`</dt>
      <dd>One of 
        <dl>
          <dt><tt>local</tt></dt>
          <dd>Local analysis on local data executed sequentially on the
            local machine</dd>
          <dt><tt>lite</tt></dt>
          <dd>Proof-Lite analysis on local data executed in parallel on
            the local machine</dd>
          <dt><tt>proof</tt></dt> 
          <dd>Proof analysis on cluster data executed in parallel on a
            PROOF cluster</dd>
          <dt><tt>alien</tt></dt>
          <dd>Grid analysis on grid data executed on the Grid</dd>
        </dl>
      </dd>
      <dt>`[[<user>@]<host>]`</dt>
      <dd>Sets the master host for Proof analysis</dd>
      <dt>`<input>`</dt>
      <dd>Input data specification.  The exact form depends on the
        protocol used e.g., for local analysis it can be a single,
        while for other environments it could be a data set name, and
        so on.</dd>
      <dt>`<options>`</dt>
      <dd>Protocol specific options</dd>
      <dt>`<treename>`</dt>
      <dd>If specified, gives what data to analyse</dd>
     </dl>
          
    @section train_setup_proof_spec PROOF specifics
    
    Local and Grid jobs are in a sense very similar.  That is, the
    individual Grid jobs are very much like Local jobs, in that they
    always produce output files (albiet not after Terminate, though
    parameter container files are (re)made). 
    
    PROOF jobs are very different.  In a PROOF analysis, each slave
    only produces in memory output which is then sent via net
    connections (sockets) to the master.  One therefore needs to be
    very of output object ownership and the like.  
    
    Another major difference is that output files are generated within
    the PROOF cluster, and are generally not accessible from the
    outside.  For plain PROOF clusters in a local area network or
    so-called <i>Lite</i> session, it is generally not a problem since
    the files are accessible on the LAN or local machine for Lite
    sessions.  However, for large scale analysis farms (AAFs), the
    workers and masters are generally on a in-accessible sub-net, and
    there's no direct access to the produced files.  Now, for normal
    output files, like histogram files, etc. there are provisions for
    this, which means the final merged output is sent back to the
    client.  Special output, such as AODs, are however not merged nor
    sent back to the user by default.  There are two ways to deal with this: 
    
    <ol>
     <li> Register the output tree as a data set on the cluster.  This
       is useful if you need to process the results again on the
       cluster.</li>
     <li> Send the output to a (possibly custom) XRootd server.  This
       is useful if you need to process the output outside of the
       cluster</li>
    </ol>
    
    The first mode is specified by passing the option
    <tt>dsname=</tt><i>&lt;name&gt;</i> in the cluster URI.  The created
    dataset will normally be made in
    <tt>/default/</tt><i>&lt;user&gt;</i><tt>/</tt><i>&lt;name&gt;</i>. If the
    <tt>=</tt><i>&lt;name&gt;</i> part is left out, the <i>escaped name</i> of
    the job will be used.  
    
    The second mode is triggered by passing the option
    <tt>storage=<i>URI</i></tt> to the train setup.  The <i>URI</i>
    should be of the form
    
    @verbatim
    rootd://<host>[:<port>]/<path>
    @endverbatim
    
    where <i>&lt;host&gt;</i> is the name of a machine accessible by
    the cluster, <i>&lt;port&gt;</i> is an optional port number (e.g.,
    if different from 1093), and <i>&lt;path&gt;</i> is an absolute
    path on <i>&lt;host&gt;</i>.
    
    The XRootd process should be started (optionally by the user) on
    <i>&lt;host&gt;</i> as
    
    @verbatim
    xrootd -p <port> <path>
    @endverbatim
    
    When running jobs on AAFs, one can use the Grid handler to set-up
    aspects of the job.  To enable the Grid handler, pass the option
    <tt>plugin</tt> in the execution URI
    
    @section train_setup_input Specifying the input
    @subsection train_setup_local Local and Lite data input
    
    For both ESD and AOD input for local jobs, one must specify the
    root of the sub-tree that holds the data.  That is, if - for
    example - the data resides in a directory structure like
    
    @verbatim
    /some/directory/<run>/<seq>/AliESDs.root 
    @endverbatim
    
    then one should specify the input location like 
    
    @verbatim 
    local:///some/directory[?pattern=AliESDs.root][#esdTree]
    lite:///some/directory[?pattern=AliESDs.root][#esdTree]
    @endverbatim
    
    <tt>/some/directory</tt> is then search recursively for input files
    that match the pattern given by the analysis type (ESD:
    <tt>AliESDs.root</tt>, AOD: <tt>AliAOD.root</tt>).  The found files
    are then chained together.  If MC input is specified, then the
    companion files <tt>galice.root</tt>, <tt>Kinematics.root</tt>, and
    <tt>TrackRefs.root</tt> must be found in the same directories as
    the <tt>AliESDs.root</tt> files
    
    @subsection train_setup_proof PROOF input. 
    
    The input data for a PROOF based analysis is specified as data set
    names,
    
    @verbatim
    proof://[<user>@]<host>/<data-set-name>[?options][#<treename>]
    @endverbatim
    
    @subsection train_setup_grid_esd Grid ESD input. 
    
    Suppose the ESD files are stored on the Grid as 
    
    @verbatim
    /alice/data/<year>/<period>/<run>/ESDs/pass<no>/<year><run><chunk>.<part>/AliESDs.root 
    @endverbatim
    
    where &lt;run&gt; is zero-padded by typically 3 '0's.  One should
    specify the input location like
    
    @verbatim
    alien:///alice/data/<year>/<period>?pattern=ESDs/pass<no>/*&run=<run>[#<treename>]
    @endverbatim
    
    If a particular kind of pass is needed, say
    <tt>pass&lt;no&gt;_MUON</tt>, one should do modify the
    <tt>pattern</tt> option accordingly
    
    @verbatim
    /alice/data/<year>/<period>/<run>/ESDs/pass<no>_MUON/* /AliESDs.root 
    @endverbatim
    
    For simulation output, the files are generally stored like 
    @verbatim
    /alice/sim/<year>/<prod>/<run>/<seq>/AliESDs.root 
    @endverbatim
    
    where &lt;run&gt; is generally @e not zero-padded. One should
    specify the input location like
    
    @verbatim
    alien:///alice/data/<year>/<period>?pattern=*&mc&run=<run>[#<treename>]
    @endverbatim
    
    
    @subsection train_setup_grid_aod Grid AOD input 
    
    Suppose your AOD files are placed in directories like 
    
    @verbatim
    /some/directory/<run>/<seq>/AliAOD.root
    @endverbatim
    
    where &lt;run&gt; is zero-padded by typically 3 '0's.  One should
    then specify the input as 
    
    @verbatim
    alien:///some/directory?pattern=*&run=<run>[#<treename>
    @endverbatim
    
    The AliEn analysis plug-in is then instructed to look for data files under 
    
    @verbatim
    /some/directory/<run>/* /AliAOD.root 
    @endverbatim
    
    for each added run.  
    
    Suppose the AODs are in 
    
    @verbatim
    /alice/data/<year>/<period>/<run>/ESDs/pass<no>/AOD<vers>/<seq>/AliAOD.root 
    @endverbatim
    
    Then the url should be 
    @verbatim
    alien:///alice/data/<year>/<period>?pattern=ESDs/pass<no>/AOD<vers>/*&run=<run>[#<treename>]
    @endverbatim
    
    @section train_setup_other Other features  
    
    @subsection train_setup_aux Auxillary libraries, sources, and files
    
    Auxillary libraries should be loaded using 

    @code
    Helper::LoadLibrary(const char*)
    @endcode 

    where the argument is the name of the library
    
    If the train needs additional files, say a script for setting up
    the tasks, or some data file, it can be passed on the the
    PROOF/Grid workers using the member functions 

    @code 
    Helper::LoadAux(const char*)
    Helper::LoadSource(const TString&,bool)
    @endcode 
    
    @subsection train_setup_overload Overloading the behaviour 
    
    The base class TrainSetup tries to implement a sensible setup for a
    given type of analysis, but some times a particular train needs a
    bit of tweaking.  One can therefore overload the following functions 
    
    - TrainSetup::CreateInputHandler(UShort_t)
    - TrainSetup::CreateMCHandler(UShort_t,bool)
    - TrainSetup::CreateOutputHandler(UShort_t)
    - TrainSetup::CreatePhysicsSelection(Bool_t,AliAnalysisManager*)
    - TrainSetup::CreateCentralitySelection(Bool_t,AliAnalysisManager*)
    
    @section train_setup_scripts Tasks defined in scripts 
    
    A task can even be defined in a script, like for example a task like 
    
    @include MyAnalysis.C 
    
    Our train set-up can then use the member function
    ParUtilities::MakeScriptPAR to make a PAR file of the script and use
    that to make a library loaded on the workers and then generate an
    object of our task defined in the script.
    
    @include MyTrain.C
    
    This can allow for fast development and testing of analysis tasks
    without having to wait for official tasks and builds of all of
    AliROOT
    
    @section train_setup_impl Implementation details
    
    @subsection train_setup_imp_helper Helpers 
    
    The specifics of the each possible execution environment and input
    is handled by sub-classes of the base class Helper. Each of these
    helpers define
    
    - URI options. 
    - Steps to be done before the tasks are added to the train 
    - How to load libraries, additional scripts and files 
    - Steps to be done after the setup of tasks 
    - How to execute the analysis 
    
    Currently defined helpers are 
    
    - LocalHelper for local jobs 
    - ProofHelper for jobs running on a PROOF farm 
    - LiteHelper for jobs running in a PROOF-Lite session 
    - AAFHelper Special kind of ProofHelper for jobs running on AAFs 
    - AAFPluginHelper As AAFHelper, but uses the AliEn plugin 
    - GridHelper for Grid jobs 
*/
//
// EOF
//
 Trains.C:1
 Trains.C:2
 Trains.C:3
 Trains.C:4
 Trains.C:5
 Trains.C:6
 Trains.C:7
 Trains.C:8
 Trains.C:9
 Trains.C:10
 Trains.C:11
 Trains.C:12
 Trains.C:13
 Trains.C:14
 Trains.C:15
 Trains.C:16
 Trains.C:17
 Trains.C:18
 Trains.C:19
 Trains.C:20
 Trains.C:21
 Trains.C:22
 Trains.C:23
 Trains.C:24
 Trains.C:25
 Trains.C:26
 Trains.C:27
 Trains.C:28
 Trains.C:29
 Trains.C:30
 Trains.C:31
 Trains.C:32
 Trains.C:33
 Trains.C:34
 Trains.C:35
 Trains.C:36
 Trains.C:37
 Trains.C:38
 Trains.C:39
 Trains.C:40
 Trains.C:41
 Trains.C:42
 Trains.C:43
 Trains.C:44
 Trains.C:45
 Trains.C:46
 Trains.C:47
 Trains.C:48
 Trains.C:49
 Trains.C:50
 Trains.C:51
 Trains.C:52
 Trains.C:53
 Trains.C:54
 Trains.C:55
 Trains.C:56
 Trains.C:57
 Trains.C:58
 Trains.C:59
 Trains.C:60
 Trains.C:61
 Trains.C:62
 Trains.C:63
 Trains.C:64
 Trains.C:65
 Trains.C:66
 Trains.C:67
 Trains.C:68
 Trains.C:69
 Trains.C:70
 Trains.C:71
 Trains.C:72
 Trains.C:73
 Trains.C:74
 Trains.C:75
 Trains.C:76
 Trains.C:77
 Trains.C:78
 Trains.C:79
 Trains.C:80
 Trains.C:81
 Trains.C:82
 Trains.C:83
 Trains.C:84
 Trains.C:85
 Trains.C:86
 Trains.C:87
 Trains.C:88
 Trains.C:89
 Trains.C:90
 Trains.C:91
 Trains.C:92
 Trains.C:93
 Trains.C:94
 Trains.C:95
 Trains.C:96
 Trains.C:97
 Trains.C:98
 Trains.C:99
 Trains.C:100
 Trains.C:101
 Trains.C:102
 Trains.C:103
 Trains.C:104
 Trains.C:105
 Trains.C:106
 Trains.C:107
 Trains.C:108
 Trains.C:109
 Trains.C:110
 Trains.C:111
 Trains.C:112
 Trains.C:113
 Trains.C:114
 Trains.C:115
 Trains.C:116
 Trains.C:117
 Trains.C:118
 Trains.C:119
 Trains.C:120
 Trains.C:121
 Trains.C:122
 Trains.C:123
 Trains.C:124
 Trains.C:125
 Trains.C:126
 Trains.C:127
 Trains.C:128
 Trains.C:129
 Trains.C:130
 Trains.C:131
 Trains.C:132
 Trains.C:133
 Trains.C:134
 Trains.C:135
 Trains.C:136
 Trains.C:137
 Trains.C:138
 Trains.C:139
 Trains.C:140
 Trains.C:141
 Trains.C:142
 Trains.C:143
 Trains.C:144
 Trains.C:145
 Trains.C:146
 Trains.C:147
 Trains.C:148
 Trains.C:149
 Trains.C:150
 Trains.C:151
 Trains.C:152
 Trains.C:153
 Trains.C:154
 Trains.C:155
 Trains.C:156
 Trains.C:157
 Trains.C:158
 Trains.C:159
 Trains.C:160
 Trains.C:161
 Trains.C:162
 Trains.C:163
 Trains.C:164
 Trains.C:165
 Trains.C:166
 Trains.C:167
 Trains.C:168
 Trains.C:169
 Trains.C:170
 Trains.C:171
 Trains.C:172
 Trains.C:173
 Trains.C:174
 Trains.C:175
 Trains.C:176
 Trains.C:177
 Trains.C:178
 Trains.C:179
 Trains.C:180
 Trains.C:181
 Trains.C:182
 Trains.C:183
 Trains.C:184
 Trains.C:185
 Trains.C:186
 Trains.C:187
 Trains.C:188
 Trains.C:189
 Trains.C:190
 Trains.C:191
 Trains.C:192
 Trains.C:193
 Trains.C:194
 Trains.C:195
 Trains.C:196
 Trains.C:197
 Trains.C:198
 Trains.C:199
 Trains.C:200
 Trains.C:201
 Trains.C:202
 Trains.C:203
 Trains.C:204
 Trains.C:205
 Trains.C:206
 Trains.C:207
 Trains.C:208
 Trains.C:209
 Trains.C:210
 Trains.C:211
 Trains.C:212
 Trains.C:213
 Trains.C:214
 Trains.C:215
 Trains.C:216
 Trains.C:217
 Trains.C:218
 Trains.C:219
 Trains.C:220
 Trains.C:221
 Trains.C:222
 Trains.C:223
 Trains.C:224
 Trains.C:225
 Trains.C:226
 Trains.C:227
 Trains.C:228
 Trains.C:229
 Trains.C:230
 Trains.C:231
 Trains.C:232
 Trains.C:233
 Trains.C:234
 Trains.C:235
 Trains.C:236
 Trains.C:237
 Trains.C:238
 Trains.C:239
 Trains.C:240
 Trains.C:241
 Trains.C:242
 Trains.C:243
 Trains.C:244
 Trains.C:245
 Trains.C:246
 Trains.C:247
 Trains.C:248
 Trains.C:249
 Trains.C:250
 Trains.C:251
 Trains.C:252
 Trains.C:253
 Trains.C:254
 Trains.C:255
 Trains.C:256
 Trains.C:257
 Trains.C:258
 Trains.C:259
 Trains.C:260
 Trains.C:261
 Trains.C:262
 Trains.C:263
 Trains.C:264
 Trains.C:265
 Trains.C:266
 Trains.C:267
 Trains.C:268
 Trains.C:269
 Trains.C:270
 Trains.C:271
 Trains.C:272
 Trains.C:273
 Trains.C:274
 Trains.C:275
 Trains.C:276
 Trains.C:277
 Trains.C:278
 Trains.C:279
 Trains.C:280
 Trains.C:281
 Trains.C:282
 Trains.C:283
 Trains.C:284
 Trains.C:285
 Trains.C:286
 Trains.C:287
 Trains.C:288
 Trains.C:289
 Trains.C:290
 Trains.C:291
 Trains.C:292
 Trains.C:293
 Trains.C:294
 Trains.C:295
 Trains.C:296
 Trains.C:297
 Trains.C:298
 Trains.C:299
 Trains.C:300
 Trains.C:301
 Trains.C:302
 Trains.C:303
 Trains.C:304
 Trains.C:305
 Trains.C:306
 Trains.C:307
 Trains.C:308
 Trains.C:309
 Trains.C:310
 Trains.C:311
 Trains.C:312
 Trains.C:313
 Trains.C:314
 Trains.C:315
 Trains.C:316
 Trains.C:317
 Trains.C:318
 Trains.C:319
 Trains.C:320
 Trains.C:321
 Trains.C:322
 Trains.C:323
 Trains.C:324
 Trains.C:325
 Trains.C:326
 Trains.C:327
 Trains.C:328
 Trains.C:329
 Trains.C:330
 Trains.C:331
 Trains.C:332
 Trains.C:333
 Trains.C:334
 Trains.C:335
 Trains.C:336
 Trains.C:337
 Trains.C:338
 Trains.C:339
 Trains.C:340
 Trains.C:341
 Trains.C:342
 Trains.C:343
 Trains.C:344
 Trains.C:345
 Trains.C:346
 Trains.C:347
 Trains.C:348
 Trains.C:349
 Trains.C:350
 Trains.C:351
 Trains.C:352
 Trains.C:353
 Trains.C:354
 Trains.C:355
 Trains.C:356
 Trains.C:357
 Trains.C:358
 Trains.C:359
 Trains.C:360
 Trains.C:361
 Trains.C:362
 Trains.C:363
 Trains.C:364
 Trains.C:365
 Trains.C:366
 Trains.C:367
 Trains.C:368
 Trains.C:369
 Trains.C:370
 Trains.C:371
 Trains.C:372
 Trains.C:373
 Trains.C:374
 Trains.C:375
 Trains.C:376
 Trains.C:377
 Trains.C:378
 Trains.C:379
 Trains.C:380
 Trains.C:381
 Trains.C:382
 Trains.C:383
 Trains.C:384
 Trains.C:385
 Trains.C:386
 Trains.C:387
 Trains.C:388
 Trains.C:389
 Trains.C:390
 Trains.C:391
 Trains.C:392
 Trains.C:393
 Trains.C:394
 Trains.C:395
 Trains.C:396
 Trains.C:397
 Trains.C:398
 Trains.C:399
 Trains.C:400
 Trains.C:401
 Trains.C:402
 Trains.C:403
 Trains.C:404
 Trains.C:405
 Trains.C:406
 Trains.C:407
 Trains.C:408
 Trains.C:409
 Trains.C:410
 Trains.C:411
 Trains.C:412
 Trains.C:413
 Trains.C:414
 Trains.C:415
 Trains.C:416
 Trains.C:417
 Trains.C:418
 Trains.C:419
 Trains.C:420
 Trains.C:421
 Trains.C:422
 Trains.C:423
 Trains.C:424
 Trains.C:425
 Trains.C:426
 Trains.C:427
 Trains.C:428
 Trains.C:429
 Trains.C:430
 Trains.C:431
 Trains.C:432
 Trains.C:433
 Trains.C:434
 Trains.C:435
 Trains.C:436
 Trains.C:437
 Trains.C:438
 Trains.C:439
 Trains.C:440
 Trains.C:441
 Trains.C:442
 Trains.C:443
 Trains.C:444
 Trains.C:445