test prog
testing faster TreeEvent
be more careful with multiple copy functions causing modified products to be overwritten. Add a flag to the BranchHandler that can be set to prevent overwrite when GetEntry is called more than once on a particular event
Finish revamp of the TreeEvent/AnalysisBase code

Changes (roughly in order of decreasing importance):
  - AnalysisBase now supports multiple module sequences. Existing calls
    to AddModule(ic::ModuleBase*) will append the given module pointer
    to a sequence labelled "default". To add a module to a different
    sequence (and automatically create that sequence if necessary) use
    AddModule(std::string, ic::ModuleBase*), where the first argument is
    the module label. RunAnalysis() will process each sequence of
    modules, one after the other, for each event. At the beginning of a
    new sequence the TreeEvent is reset, i.e. all products are cleared
    and objects loaded from the TTree are reset to their initial state.
  - AnalysisBase no longer counts the sum of weighted events passing
    each module. This means it's possible to run on ntuples that don't
    contain an EventInfo branch. If there is demand for this feature
    something similar (but more flexible) can be restored.
  - AnalysisBase no longer provides a complete interface to check which
    module particular events failed in. The printing of this information
    is now triggered by a module's Execute method returning the status
    code 3. For convenience, a new module, "CheckEvents" has been added
    in the Modules package that can be given a list of event numbers for
    which this status code will be injected. So to recap, these are the
    status codes in use at the moment:
      0 : event passed, continue processing and increase yield counter
      1 : event failed, stop processing and don't increase counter
      2 : event failed, continue processing and don't increase counter
      3 : event passed, switch on failure checking, continue processing
      and increase counter
  - Bugfix in TreeEvent: if a collection was loaded from a branch into two
    different Event products, the second load operation would overwrite any
    changes made to objects in the collection since the first load. E.g.

        // First load the pfJets branch into PtrVec "jets1"
        auto jets1 = event.GetPtrVec<Jet>("jets1", "pfJets");
        // Change the jet pT (e.g. doing JES uncertainty)
        jets[0]->set_pt(...);
        // Load the same branch as another PtrVec "jets2"
        // => jet pt reset to initial values
        auto jets2 = event.GetPtrVec<Jet>("jets2", "pfJets");

    With this fix the second load won't reset the pfJets vector. Please
    check if any of your code would have been affected by this bug. Note
    that with multiple Module sequences the loaded objects will always
    be reset when switching from one sequence to the next.
  - TreeEvent: it is now possible to explicitly check if a branch
    exists in the TTree, using the method ExistsInTree(std::string).
    This will work regardless of whether the product you are checking
    has been loaded into the event. For the sake of parity, the method
    ExistsInEvent(std::string) has been added and will just call
    Exists() for the underlying ic::Event storage
  - Runtime errors in these classes that previously threw unnamed
    expections now throw exceptions with some info about what actually
    went wrong.
  - Experimental: The TreeEvent should now correctly handle
    branches that store fundamental types, e.g. float, char* etc. These
    have to be treated differently when doing SetBranchAddress, e.g.

        double x;
        tree->SetBranchAddress("some_double", &x);

    instead of:

        double *x = nullptr;
        tree->SetBranchAddress("some_double", &x);

    which is what we do for all non-fundamental (i.e. class) types. The
    actual interface in TreeEvent is the same however, e.g.

        double *x = tree_event->GetPtr("some_double");

    If you have use for this feature please test and report back.
  - Various optimisations to the underlying TreeEvent code, should
    result in a small speed-up
  - Removed program_options parsing in ModuleBase, was experimental and
    not actually used anywhere
  - Changed the constructor for AnalysisBase slightly, instead of two
    arguments for the folder containing the TTree and the TTree name,
    just have one argument for the complete path. Fixed all calls to
    this in the framework: e.g. "icEventProducer", "EventTree" -->
    "icEventProducer/EventTree" everywhere
  - Re-formated some of the AnalysisBase printout
fix end of job message
update doxygen a bit
Merge pull request #7 from ajgilbert/test-core-updates-2

Updates to Core code