Skip to content

mmaggi/CMS_GEM_Analysis_Framework

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

# CMS_GEM_Analysis_Framework
# ========================================================

	Software tools for the analysis of experimental data collected by the CMS GEM community

	Designed to work on lxplus running slc6 with ROOT version 6.00.02 or higher and g++
    version 4.8.4.

    Instructions below assume the user is using a sh/bash/zsh shell.  Scripts for csh/tsch
    have not been implemented yet.

    This README serves as the single point of entry for all installation and usage instructions.
    Significant documentation for users (developers not yet!) has also been included.

    If you are having problems please consult Section 5 "Known & Outstanding Issues" first.  The
    problem and solution may already be present.  If you do not find your issue please navigate to:

        https://github.com/bdorney/CMS_GEM_Analysis_Framework/issues

    and submit an issue that describes your problem (commands you executed, output, etc...).  You
    may need to provide any input files or a link to the fork of the repository for us to troubleshoot.

# Table of Contents
# ========================================================

    1. Contributors & License
    2. Installation Instructions
    3. Usage
        3.a. analyzeUniformity
            3.a.i               Helper Script - Run Mode: Grid
            3.a.ii              Helper Script - Run Mode: Rerun
            3.a.iii             Helper Script - Run Mode: Series
            3.a.iv              Helper Script - Run Mode: Comparison
    4. Documentation
        4.a. Namespaces
        4.b. Class Map
            4.b.i.              FrameworkBase
            4.b.ii.             Analyzers & Visualization
                4.b.ii.I        AnalyzeResponseUniformity
                4.b.ii.II       AnalyzeResponseUniformityClusters
                4.b.ii.III      AnalyzeResponseUniformityHits
                4.b.ii.IV       Visualizer
                4.b.ii.V        VisualizerComparison
                4.b.ii.VI       VisualizerUniformity
            4.b.iii.            Interfaces
                4.b.iii.I       Interface
                4.b.iii.II      InterfaceAnalysis
                4.b.iii.III     InterfaceRun
            4.b.iv.             Selectors
                4.b.iv.I        Selector
                4.b.iv.II       SelectorCluster
                4.b.iv.III      SelectorHit
            4.b.v.              Loaders
                4.b.v.I         ParameterLoaderAmoreSRS
                4.b.v.II    	ParameterLoaderAnalysis
                4.b.v.III       ParameterLoaderRun
            4.b.vi.             Readouts
                4.b.vi.I        ReadoutSector
                4.b.vi.II       ReadoutSectorEta
                4.b.vi.III      ReadoutSectorPhi
            4.b.vii.            DetectorMPGD
        4.c. Utilities
            4.c.i   Timing
            4.c.ii  Uniformity
        4.d. Types
            4.d.i   Timing
            4.d.ii  Uniformity
                4.d.ii.I        AnalysisSetupUniformity
                4.d.ii.II       Cluster
                4.d.ii.III      Event
                4.d.ii.IV       HistosPhysObj
                4.d.ii.V        Hit
                4.d.ii.VI       RunSetup
                4.d.ii.VII      SectorSlice
                4.d.ii.VIII     SelParam
                4.d.ii.IX       SummaryStatistics
        4.e. Configuration Files
            4.e.i   amoreSRS Mapping Config File
            4.e.ii  Analysis Config File
                4.e.ii.I        HEADER PARAMETERS - ANALYSIS_INFO
                4.e.ii.II       HEADER PARAMETERS - TIMING_INFO
                4.e.ii.III      HEADER PARAMETERS - UNIFORMITY_INFO
                4.e.ii.IV       HEADER PARAMETERS - ADC_FIT_INFO
                4.e.ii.V        HEADER PARAMETERS - HISTO_INFO
                4.e.ii.VI       Example Config File
            4.e.iii Run Config File
                4.e.iii.I       HEADER PARAMETERS - RUN_INFO
                4.e.iii.II      HEADER PARAMETERS - RUN_LIST
                4.e.iii.III     HEADER PARAMETERS - COMP_INFO
                4.e.iii.IV      Configuration Options
                4.e.iii.V       Example Config File - Mode: Series
                4.e.iii.VI      Example Config File - Mode: Grid
                4.e.iii.VII     Example Config File - Mode: Re-Run
                4.e.iii.VIII    Example Config File - Mode: Comparison
        4.f. Output Files
            4.f.i               Output ROOT File - Analysis Mode
                4.f.i.I         "Segmented" Plots Stored in "Summary" folder
                4.f.i.II        "Dataset" Plots Stored in "Summary" folder
                4.f.i.III       1D Fit Summary Plots Stored in "Summary" folder
                4.f.i.IV        2D Fit Trapezoidal Map Plots Stored in "Summary" folder
            4.f.ii              Output ROOT File - Comparison Mode
            4.f.iii             Output Text File
        4.g. Source Code Name Conventions
            4.g.i   STL Objects
            4.g.ii  ROOT Objects
    5. Known & Outstanding Issues

# 1. Contributors & License
# ========================================================

    Contributors: B. Dorney

    This package has been designed by B. Dorney with input from J. Merlin & S. Colafranceschi.
    The original selection & analysis algorithms are based off work done by J. Merlin.  This
    package makes use of several features from the CMS_GEM_TB_Timing repository (also by B. Dorney).
    Hopefully one day the CMS_GEM_TB_Timing repository will be fully integrated into this
    repository.

    This package makes use of the "C++ Mathematical Expression Library" designed by Arash Partow,
    available at (http://www.partow.net/programming/exprtk/index.html), and referred to as ExprTk.
    ExprTk is available under the "Common Public License" from the the url above, but has been
    included in this repository for convenience.

    The CMS_GEM_Analysis_Framework is licensed under the "GNU General Public License."

# 2. Installation Instructions
# ========================================================

    This repository follows the guidelines of Vincent Driessen in
    "A successful Git branching model" available at:

    http://nvie.com/posts/a-successful-git-branching-model/

    The source code available in the origin/master branch always reflects a "production-ready"
    state.  The origin/develop branch reflects a state with the latest implemented changes
    for the next release.  This branch is not gauranteed to be stable.

    To checkout the repository:

        git clone https://github.com/bdorney/CMS_GEM_Analysis_Framework.git

        cd CMS_GEM_Analysis_Framework

        git pull origin master

    You will now have the latest version of the master branch.  To compile the repository:

        source scripts/setup_CMS_GEM.sh

        make -f Makefile.gpp clean

        make -f Makefile.gpp

    The repository is now compiled.  Additionally the base directory of the repository
    has been exported to the shell variable "$GEM_BASE".

    Please check https://github.com/bdorney/CMS_GEM_Analysis_Framework for the most-up-to-date
    release.  You migrate your master branch to the most-up-to-date branch via:

        git checkout -b <local_branch_name>

        git pull origin <remote_branch_name>

        make -f Makefile.gpp clean

        make -f Makefile.gpp

    The local_branch_name is the name of the branch on your local machine.The
    remote_branch_name is the name of the branch you are checking out from the remote repository.
    It is a good practice to make local_branch_name = remote_branch_name.  You can see the list
    of available branches from command line via:

        git fetch

        git branch -a

    The branch you are currently on will have the "*" character next to it.

    NOTE: a make file for clang has been included "Makefile.clang" for MAC OS users.  However
    presently there is no support for any installation/runtime errors on a MAC OS environemnt.
    It is strongly urged that you use the Linux computing environment mentioned above (since it
    is so readily available to us).

# 3. Usage
# ========================================================

    The following gives the usage case for each of the executables produced during the installation.
    It is assumed that you have successfully performed the steps listed in Section 2.

    # 3.a. analyzeUniformity
    # --------------------------------------------------------

    For each new shell navigate to the base directory of the repository and setup the environment via:

        source scripts/setup_CMS_GEM.sh

    The usage for the analyzeUniformity executable is:

        For help menu:  ./analyzeUniformity -h
        For executing:  ./analyzeUniformity <PFN of Run Config File> <Verbose Mode true/false>

    Here the physical file name (PFN) represents the full path+filename to the file in question.
    The configuration files, including the run config file, are described in Section 4.e.  The
    executable can analyze files produced either by amoreSRS/amoreSRS_ZS or by the
    CMS_GEM_Analysis_Framework.  For a full explanation of the available configurations please
    consult Sections 4.e for a description, and Sections 3.a.i through 3.a.iii for examples.

    The contents and layout of the output files are described in Section 4.f.

    Three example config files: 1) mapping config file, 2) analysis config file, and 3) run config
    file have been provided in the default repository.  A usage example is given as:

        ./analyzeUniformity config/configRun.cfg true

    As a general rule each detector you are testing will usually have a series of raw files associated
    with it.  It is recommended each raw file should have a run number associated with it.  The set of
    run numbers for a given detector should be unique (i.e. two different detectors can have a run 1
    but for a specific detector run 1 is unique).  The framework expects that you provide a run number,
    form "_RunX_" for X some integer, in each of the input files defined in your config/configRun.cfg
    (see Section 4.e.iii).

    In addition to analyzing raw data to produce a framework output ROOT file it is also possible to
    analyze a series of framework outpt files to plot comparisons of any TH1F object stored in the
    output ROOT file.  For More details on running in this mode see Sections 3.a.iv and 4.e.iii.

            # 3.a.i Helper Script - Run Mode: Grid
            # --------------------------------------------------------

            The script:

                scripts/runMode_Grid.sh

            is for running the framework the lxplus batch submission system using the scheduler bsub.
            This script will setup the run config file and launch one job for each input file in the
            data file directory below.  The expected synatx is:

                source scripts/runMode_Grid.sh <Data File Directory> <Config File - Analysis> <Config File - Mapping> <Queue Names>

            Where: "Data File Directory" is the physical file path (PFP) where the input data files to
            be analyzed are located, "Config File - Analysis" is the PFN of the input analysis config
            file, "Config File - Mapping" is the input mapping config file, and "Queue Names" are the
            requested submission queue on the lxplus batch submmission system.  The available queues
            on lxplus are {8nm, 1nh, 8nh, 1nd} for 8 natural minutes, 1 natural hour, 8 natural hours,
            and 1 natural day, respectively.

            Additionally for each job a run config file (described in Section 4.e.iii.V), named
            config/configRun_RunNoX.cfg where X is the job number, will be created.  One script per job, named
            scripts/submitFrameworkJob_RunNoX.sh, will created; this script will be what the job executes when
            it runs.  Three directories will also be created, if they do not already exist, called $GEM_BASE/stderr,
            $GEM_BASE/stdlog, and $GEM_BASE/stdout.  Each of these directories will respectively store the
            stderr (stderr/frameworkErr_RunNoX.txt), stdlog (stdlog/frameworkLog_RunNoX.txt), and stdout
            (stdout/frameworkOut_RunNoX.txt) files produced for each job.  The stderr file for a job should be
            checked if a job fails to produce an output TFile.  The stdlog file for a job shows any output to
            terminal that would be created if the executable was run locally.  The stdout file shows a summary
            of the job prepared by the scheduler showing time taken, memory usage, and stderr file for the job.

            After scripts/runMode_Grid.sh has submitted all your jobs it will dump some useful information for
            how to check running jobs and kill running jobs if necessary.  The scripts/runMode_Grid.sh will also
            show how to add all output TFiles together from command line using the "hadd" command.  After you have
            added all TFiles together you should run the framework over this summary TFile in re-run mode to
            perform the fitting and uniformity analysis.

            After you have had a chance to investigate the created run config files, submission scripts, stderr,
            stdlog, and stdout files you can safely remove them by calling:

                source scripts/cleanGridFiles.sh

            Eample:

                source scripts/runMode_Grid.sh $DATA_QC5/GE11-VII-L-CERN-0001 config/configAnalysis.cfg config/Mapping_GE11-VII-L.cfg 1nh
                cd $DATA_QC5/GE11-VII-L-CERN-0001
                hadd summaryFile_Ana.root *Ana.root
                cd $GEM_BASE
                source scripts/cleanGridFiles.sh
                source scripts/runMode_Rerun.sh GE11-VII-L-CERN-0001 $DATA_QC5/GE11-VII-L-CERN-0001 config/configAnalysis.cfg config/Mapping_GE11-VII-L.cfg

            NOTE: Modications to config/configRun_Template_Grid.cfg may lead to undefined behavior or failures;
            it is recommended to not modify the template config file.

            If you are interested in merging only a subset of the output TFile's the scripts/mergeSelectedRuns.sh
            is provided to perform this task.  The expected syntax is:

                source mergeSelectedRuns.sh <Output ROOT Filename w/Key Phrase> <Key Phrase> <Data File Directory> <Comma and/or Dash Delimited Run List>

            Where: the "Output ROOT Filename w/Key Phrase" is the name of the merged ROOT file which includes a
            "Key Phrase" that the script will use string replacement to indicate the total number of events from
            the input run list (provided each input run has the field "YYkEvt" present in the filename); "Data Directory"
            is the PFP where the input data files to be merged are located; and "Comma and/or Dash Delimited Run List"
            is the list of input runs to be considered for merging.  Example:

                source mergeSelectedRuns.sh GE11-VII-S-CERN-0002_Summary_Physics_RandTrig_XRay40kV99uA_580uA_YYkEvt_Ana.root YY $DATA_QC5/GE11-VII-S-CERN-0002 133,135,137-158

            Here the key phrase is "YY" and runs 133, 135, and 137 through 158 will be merged together to make
            GE11-VII-S-CERN-0002_Summary_Physics_RandTrig_XRay40kV99uA_580uA_YYkEvt_Ana.root with YY replaced
            with the total event number indicated in the filenames.

            # 3.a.ii Helper Script - Run Mode: Rerun
            # --------------------------------------------------------

            The script:

                scripts/runMode_Rerun.sh

            is for running the framework over a previously produced framework output TFile. This script will
            setup the run config file to re-run over each input file found in the data file directory below.
            One output TFile will be produced for each input file.  The expected synatx is:

                source scripts/runMode_Rerun.sh <Detector Name> <Data File Directory> <Config File - Analysis> <Config File - Mapping>

            Where: "Detector Name" is the detector serial number; and "Data File Directory," "Config File - Analysis,"
            and "Config File - Mapping" are as described in Section 3.a.i.

            After calling this script it is recommended to cross-check the created config/configRun.cfg file
            before executing the framework.  This will let you ensure the correct set of input files will be
            re-analyzed.

            The script will only consider files that end in *Ana.root, the output of each will be *NewAna.root.

            Example:

                source scripts/runMode_Rerun.sh GE11-VII-L-CERN-0001 $DATA_QC5/GE11-VII-L-CERN-0001 config/configAnalysis.cfg config/Mapping_GE11-VII-L.cfg
                ./analyzeUniformity config/configRun.cfg true

            NOTE: Modications to config/configRun_Template_Rerun.cfg may lead to undefined behavior or failures;
            it is recommended to not modify the template config file.

            # 3.a.iii Helper Script - Run Mode: Series
            # --------------------------------------------------------

            The script:

                scripts/runMode_Series.sh

            is for running the framework over a set of input files in series, i.e. one after the other, and
            creating a single output TFile.  The expected syntax is:

                            source runMode_Series.sh <Detector Name> <Data File Directory> <Config File - Analysis> <Config File - Mapping> <Output Data Filename>

            Where: "Detector Name," "Data File Directory," "Config File - Analysis," and "Config File - Mapping"
            are as described in Sections 3.a.i and 3.a.ii; and "Output Data Filename" is the desired name of
            the output TFile to be created.

            After calling this script it is recommended to cross-check the created config/configRun.cfg file
            before executing the framework.  This will let you ensure the correct set of input files will be analyzed.

            Example:

                source runMode_Series.sh GE11-VII-L-CERN-0001 $DATA_QC5/GE11-VII-L-CERN-0001 config/configAnalysis.cfg config/Mapping_GE11-VII-L.cfg GE11-VII-L-CERN-0001_FrameworkAna.root
                ./analyzeUniformity config/configRun.cfg true

            NOTE: Modications to config/configRun_Template_Series.cfg may lead to undefined behavior or failures;
            it is recommended to not modify the template config file.

            # 3.a.iv  Helper Script - Run Mode: Comparison
            # --------------------------------------------------------

            The script:

                scripts/runMode_Comparison.sh

            is for running the framework over a set of framework output files and creating a single output TFile
            containing a TCanvas with a set of TH1F objects drawn on it (and also stored in the ROOT file).  The
            expected syntax is:

                source runMode_Comparison.sh <Data File Directory> <Output Data Filename> <Obs Name> <iEta,iPhi,iSlice> <Identifier>

            Where: "Data File Directory" is as above; "Output Data Filename" is the name of the output TFile;
            "Obs Name" is a regular expression found in the TName of the TH1F objects you wish to compare from your
            set of input files; "iEta,iPhi,iSlice" is a comma separated triplet of the (iEta,iPhi,iSlice) coordinate
            within the detector; and "Identifier" is a regular expression contained in the filenames of each of your
            input files found in the "Data File Directory."

            When giving the "Obs Name" this is the "ObservableNameX" referred to in Section 4.f.i. To familiarize
            yourself with the possible inputs it is suggestion to run the framework in one of the above outputs and
            study the produced TFile.

            For the "iEta,iPhi,iSlice" field you must always enter a set of three integers.  However, you can access
            observables created at either the "Summary," "SectorEta," "SectorPhi," or "Slice" level (Again see
            Section 4.f.i) based on the input that is given.  The following table shows how to access observables at
            each level:

                                            Obs Level       "iEta,iPhi,iSlice"

                                            Summary         -1,-1,-1
                                            SectorEta       iEta,-1,-1
                                            SectorPhi       iEta,iPhi,-1
                                            Slice           iEta,iPhi,iSlice

            As you can see by placing "-1" in the relevant coordinate point you can select the level you are interested in.

            Since this is a different run mode, to prevent any previous Run Config file from being over-written, this
            script will produce a Run Config file called:

                config/configComp.cfg

            This should help you distinguish your different configurations.

            After calling this script it is recommended to cross-check the created config/configRun.cfg file
            before executing the framework.  This will let you ensure the correct set of input files will be analyzed.

            Example:

                source runMode_Comparison.sh data/clustSelStudy/GE11-VII-L-CERN-0002 GE11-VII-L-CERN-0002_ClustSize_Comparison.root clustADC 4,2,-1 ClustSize

            In this example the contents of my Data File Directory are:

                ls data/clustSelStudy/GE11-VII-L-CERN-0002

                GE11-VII-L-CERN-0002_Summary_Physics_RandTrig_AgXRay40kV100uA_580uA_15004kEvt_ClustTime6to27_ClustSize1to20_Ana.root
                GE11-VII-L-CERN-0002_Summary_Physics_RandTrig_AgXRay40kV100uA_580uA_15004kEvt_ClustTime6to27_ClustSize1_Ana.root
                GE11-VII-L-CERN-0002_Summary_Physics_RandTrig_AgXRay40kV100uA_580uA_15004kEvt_ClustTime6to27_ClustSize2_Ana.root
                GE11-VII-L-CERN-0002_Summary_Physics_RandTrig_AgXRay40kV100uA_580uA_15004kEvt_ClustTime6to27_ClustSize3_Ana.root
                GE11-VII-L-CERN-0002_Summary_Physics_RandTrig_AgXRay40kV100uA_580uA_15004kEvt_ClustTime6to27_ClustSize4_Ana.root
                GE11-VII-L-CERN-0002_Summary_Physics_RandTrig_AgXRay40kV100uA_580uA_15004kEvt_ClustTime6to27_ClustSize5_Ana.root
                GE11-VII-L-CERN-0002_Summary_Physics_RandTrig_AgXRay40kV100uA_580uA_15004kEvt_ClustTime6to27_ClustSize6_Ana.root

            You can see the "Identifier" regular expression is "ClustSize" which is contained in each filename as
            "ClustSizeX" for X = {"1to20","1","2",...,"5","6"}.  And the observable I will be comparing across these
            files is the clustADC TH1F found in the (iEta,iPhi) = (4,2) sector.  Since "iSlice = -1" the full SectorPhi
            is considered.

            Right now this mode is somewhat primitive.  If you enter an "Obs Name" and "iEta,iPhi,iSlice" combination
            that does not exist it will crash and seg-fault.  If this occurs please double-check your input file.
            Note that there is a difference between "clustADC" and "ClustADC" with the former working, and the latter
            causing a seg fault (i.e. the "c" is not capitalized).

            NOTE: Modications to config/configComp_Template.cfg may lead to undefined behavior or failures;
            it is recommended to not modify the template config file.

# 4. Documentation
# ========================================================

    This section describes the contents of the repository, the expected inputs, and the produced outputs.
    Developers should have a firm grasp of this entire section; users need only be concerned with sections
    4.e and 4.f.  However users may be interested in understanding what TObjects are created/stored in the
    output ROOT file and may wish to browse the sections below.

    # 4.a. Namespaces
    # --------------------------------------------------------

    This repository at presently makes use of two namespaces: Timing, Uniformity.  Both of these
    namespaces reside within the QualityControl namespace.

    The Timing namespace includes several operators, types, and utility functions that were developed
    in CMS_GEM_TB_Timing; the contents of the Timing namespace offer substantial utility and "quality
    of life features."

    The Uniformity namespace contains the majority of source code for analyzing response uniformity
    measurements performed for GE1/1 detectors; and hopefully GE2/1 & ME0 detectors in the future.

    # 4.b. Class Map
    # --------------------------------------------------------

    Inheritance relations:

        FrameworkBase
            |
            |--->AnalyzeResponseUniformity
            |       |
            |       |--->AnalyzeResponseUniformityClusters
            |       |--->AnalyzerResponseUniformityHits
            |       |--->Visualizer
            |               |
            |               |--->VisualizeComparison
            |               |--->VisualizeUniformity
            |
            |--->Interface
            |       |
            |       |--->InterfaceAnalysis
            |       |--->InterfaceRun   (Depreciated)
            |
            |--->Selector
                    |
                    |--->SelectorCluster
                    |--->SelectorHit

        ParameterLoader
            |
            |--->ParameterLoaderAmoreSRS
            |--->ParameterLoaderAnalysis
            |--->ParameterLoaderRun

        ReadoutSector
            |
            |--->ReadoutSectorEta
            |--->ReadoutSectorPhi

        DetectorMPGD (no children presently)

    Friendship relations:

        AnalyzeResponseUniformity, AnalyzeResponseUniformityClusters, AnalyzeResponseUniformityHits,
        and ParameterLoaderAmoreSRS are all friend classes to DetectorMPGD.

    Interactions:

        Classes ParameterLoaderAmoreSRS, those inheriting from Selector, and those inheriting from
        AnalyzeResponseUniformity all act on an object of DetectorMPGD.

        The ParameterLoaderAnalysis class interacts with objects who inherit from Selector and
        AnalyzResponseUniformity classes.

        InterfaceAnalysis -> interface between main() and the framework; runs the analysis for loaded case.
        ParameterLoaderAmoreSRS -> creates a DetectorMPGD object
        ParameterLoaderAnalysis -> sets up the user specified analysis; this info is passed separately to Selector & AnalyzeResponseUniformity classes (and their inherited classes).
        ParameterLoaderRun -> sets up the run configuration, the files to be analyzed, and what analysis stages (e.g. hits, clusters, fitting, etc...) to be exectued.
        ReadoutSector -> A single readout sector, used by DetectorMPGD to track distributions in a certain portion of the detector
        ReadoutSectorEta -> As ReadoutSector, but for an iEta row inside the detector, stores the detectors ReadoutSectorPhi objects
        ReadoutSectorPhi -> As ReadoutSectorEta, but for an iPhi sector within an iEta row, stores the detector's hits, clusters, and slices
        SelectorCluster -> Assigned an input DetectorMPGD object the opens an input root file and performs the cluster selection; selected clusters are stored based on their location in the DetectorMPGD object.
        SelectorHit -> As SelectorCluster but for hits (e.g. single strips).
        AnalyzeResponseUniformityCluster -> Acts on a DetectorMPGD object that has stored clusters and performs the user requested analysis
        AnalyzeResponseUniformityHit -> As AnalyzeResponseUniformityCluster but for hits.
        VisualizeUniformity -> Takes the raw plots produced by AnalyzeResponseUniformity and presents them in a user friendly manner.
        VisualizeComparison -> Compares TH1F objects from different Framework output files and makes simple comparison plots

        # 4.b.i. FrameworkBase
        # --------------------------------------------------------

        More coming "soon"

        Defined in include/FrameworkBase.h
        Non-inherited member attributes shown below.

        Public Member Functions
            FrameworkBase();

            virtual Uniformity::DetectorMPGD getDetector();
            virtual int getRunNum();

            virtual void setAnalysisParameters(Uniformity::AnalysisSetupUniformity inputSetup);
            virtual void setDetector(Uniformity::DetectorMPGD & inputDet);
            virtual void setRunNum(int iInput);
            virtual void setRunParameters(Uniformity::RunSetup inputSetup);
            virtual void setVerboseMode(bool bInput);

        Protected Attributes
            bool bVerboseMode;
            int iNum_Run;

            QualityControl::Uniformity::RunSetup rSetup;
            QualityControl::Uniformity::AnalysisSetupUniformity aSetup;
            QualityControl::Uniformity::DetectorMPGD detMPGD;

        # 4.b.ii. Analyzers & Visualization
        # --------------------------------------------------------

        Coming "soon"

            # 4.b.ii.I AnalyzeResponseUniformity
            # --------------------------------------------------------

            More coming "soon"

            Defined in include/AnalyzeResponseUniformity.h
            Inherits from FrameworkBase.
            Non-inherited member attributes shown below.

            Public Types
                typedef exprtk::symbol_table<float> symbol_table_t;
                typedef exprtk::expression<float> expression_t;
                typedef exprtk::parser<float> parser_t;

            Public Member Functions
                AnalyzeResponseUniformity()
                AnalyzeResponseUniformity(Uniformity::AnalysisSetupUniformity inputSetup, Uniformity::DetectorMPGD & inputDet);

            Protected Member Functions
                void calcStatistics(Uniformity::SummaryStatistics &inputStatObs, multiset<float> &mset_fInputObs, std::string strObsName);
                bool isQualityFit(std::shared_ptr<TF1> fitInput);
                bool isQualityFit(std::shared_ptr<TF1> fitInput, int iPar);
                TF1 getFit(int iEta, int iPhi, int iSlice, Timing::HistoSetup & setupHisto, shared_ptr<TH1F> hInput, TSpectrum &specInput );
                float getParsedInput(string &strInputExp, shared_ptr<TH1F> hInput, TSpectrum &specInput);
                TGraphErrors getGraph(int iEta, int iPhi, Timing::HistoSetup &setupHisto);
                TH1F getHistogram(int iEta, int iPhi, Timing::HistoSetup &setupHisto);
                TH2F getHistogram2D(int iEta, int iPhi, Timing::HistoSetup &setupHisto_X, Timing::HistoSetup &setupHisto_Y);
                string getNameByIndex(int iEta, int iPhi, int iSlice, string & strInputPrefix, string & strInputName);
                string getNameByIndex(int iEta, int iPhi, int iSlice, const string & strInputPrefix, const string & strInputName);
                float getParam( shared_ptr<TF1> fitInput, Timing::HistoSetup & setupHisto, string strParam );
                float getParamError( shared_ptr<TF1> fitInput, Timing::HistoSetup & setupHisto, string strParam );
                float getValByKeyword(string strInputKeyword, shared_ptr<TH1F> hInput, TSpectrum &specInput);

            Protected Attributes
                string strAnalysisName;
                vector<string> vec_strSupportedKeywords;

            # 4.b.ii.II AnalyzeResponseUniformityClusters
            # --------------------------------------------------------

            Coming "soon"

            # 4.b.ii.III AnalyzeResponseUniformityHits
            # --------------------------------------------------------

            Coming "soon"

            # 4.b.ii.IV Visualizer
            # --------------------------------------------------------

            Coming "soon"

            # 4.b.ii.V VisualizeComparison
            # --------------------------------------------------------

            Coming "soon"

            # 4.b.ii.VI VisualizeUniformity
            # --------------------------------------------------------

            Coming "soon"

        # 4.b.iii. Interfaces
        # --------------------------------------------------------

        Coming "soon"

            # 4.b.iii.I Interface
            # --------------------------------------------------------

            Coming "soon"

            # 4.b.iii.II InterfaceAnalysis
            # --------------------------------------------------------

            Coming "soon"

            # 4.b.iii.III InterfaceRun
            # --------------------------------------------------------

            Depreciated class, no longer used but kept in Framework.

        # 4.b.iv. Selectors
        # --------------------------------------------------------

        These classes are for performing the cluster/event/hit selection specified by the user.

            # 4.b.iv.I Selector
            # --------------------------------------------------------

            Coming "soon"

            # 4.b.iv.II SelectorCluster
            # --------------------------------------------------------

            Coming "soon"

            # 4.b.iv.III SelectorHit
            # --------------------------------------------------------

            Coming "soon"

        # 4.b.v. Loaders
        # --------------------------------------------------------

        These classes are loading user specified parameters at runtime.

            # 4.b.v.I ParameterLoaderAmoreSRS
            # --------------------------------------------------------

            Coming "soon"

            # 4.b.v.II ParameterLoaderAnalysis
            # --------------------------------------------------------

            Coming "soon"

            # 4.b.v.III ParameterLoaderRun
            # --------------------------------------------------------

            Coming "soon"

        # 4.b.vi. Readouts
        # --------------------------------------------------------

        Coming "soon"

            # 4.b.vi.I ReadoutSector
            # --------------------------------------------------------

            More coming "soon"

            Defined in include/ReadoutSector.h
            Non-inherited member attributes shown below.

            Public Member Functions
                ReadoutSector();
                ReadoutSector(const ReadoutSector & other);

            Public Attributs
                float fWidth;

                Uniformity::HistosPhysObj clustHistos;
                Uniformity::HistosPhysObj hitHistos;


            Each of these are described below:

                fWidth      //Width of sector in mm along the x-dir at the sector's y-location;

                clustHistos //Tracks observables for clusters
                hitHistos   //Tracls observables for hits

            # 4.b.vi.II ReadoutSectorEta
            # --------------------------------------------------------

            The Uniformity::ReadoutSectorEta represents one iEta row of a detector. Each instance of a
            Uniformity::ReadoutSectorEta will store nbConnect objects of a Uniformity::ReadoutSectorPhi
            class where nbConnect is a field found in the amoreSRS mapping file defining the number of
            readout conncetors per iEta row. Each object of a Uniformity::ReadoutSectorPhi will store
            Uniformity::AnalysisSetupUniformity::iUniformityGranularity number of Uniformity::SectorSlice
            struct objects.  An object of a Uniformity::DetectorMPGD class will store a number of objects
            of Uniformity::ReadoutSectorEta as defined in the amoreSRS mapping file (e.g. number of "DET" rows).

            Defined in include/ReadoutSectorEta.h
            Inherits from ReadoutSector.
            Non-inherited member attributes shown below.

            Public Member Functions
                ReadoutSectorEta();
                ReadoutSectorEta(const ReadoutSectorEta & other);

            Public Attributs
                float fPos_Y;

                std::map<int, Uniformity::ReadoutSectorPhi> map_sectorsPhi;

                std::shared_ptr<TGraphErrors> gEta_ClustADC_Fit_NormChi2;
                std::shared_ptr<TGraphErrors> gEta_ClustADC_Fit_PkPos;
                std::shared_ptr<TGraphErrors> gEta_ClustADC_Fit_PkRes;
                std::shared_ptr<TGraphErrors> gEta_ClustADC_Fit_Failures;

                std::shared_ptr<TGraphErrors> gEta_ClustADC_Spec_NumPks;
                std::shared_ptr<TGraphErrors> gEta_ClustADC_Spec_PkPos;

            Operators
                ReadoutSectorEta & operator=(const ReadoutSectorEta & other);

            Each of these items are described below:


                fPos_Y                       //Vertical Midpoint, in mm, of iEta row from wide base of trapezoid

                map_sectorsPhi               //Container storing nbConnect instances of ReadoutSectorPhi objects

                gEta_ClustADC_Fit_NormChi2   //NormChi2 of fits from all SectorSlice::hSlice_ClustADC
                gEta_ClustADC_Fit_PkPos      //ADC spec peak position from fits of all SectorSlice::hSlice_ClustADC
                gEta_ClustADC_Fit_PkRes      //ADC spec peak resolution.  Resolution is taken as (FWHM / Mean).  The FWHM and mean are taken from the fit results from fits of all SectorSlice::hSlice_ClustADC.  See Section 4.e.ii.IV for more details.

                gEta_ClustADC_Fit_Failures   //As SectorEta::gEta_ClustADC_Fit_PkPos but for when the minimizer did not succeed in finding a minima

                gEta_ClustADC_Spec_NumPks    //Number of peaks found in the SectorSlice::hSlice_ClustADC histogram; based on TSpectrum::Search() and TSpectrum::GetNPeaks()
                gEta_ClustADC_Spec_PkPos     //As SectorEta::gEta_ClustADC_Fit_PkPos but from TSpectrum::Search() and TSpectrum::GetPositionX() instead of fitting

            The copy constructor and one overloaded assignment operator perform a deep copy of the
            std::shared_ptr objects above.

            # 4.b.vi.III ReadoutSectorPhi
            # --------------------------------------------------------

            Defined in include/ReadoutSectorPhi.h
            Inherits from ReadoutSector.
            Non-inherited member attributes shown below.

            Public Member Functions
                ReadoutSectorPhi();
                ReadoutSectorPhi(const ReadoutSectorPhi & other);

            Public Attributs
                float fNFitSuccess;
                float fPos_Xlow;
                float fPos_Xhigh;

                int iStripNum_Min;
                int iStripNum_Max;

                std::map<int, Uniformity::SectorSlice> map_slices;

                std::multimap<int, Uniformity::Cluster> map_clusters;
                std::multimap<int, Uniformity::Hit> map_hits;

            Operators
                ReadoutSectorPhi & operator=(const ReadoutSectorPhi & other);

            Each of these items are described below:

                fNFitSuccess             //Tracks the number of slices that were successfully fit
                fPos_Xlow                //X lower boundary of iPhi sector, in mm, at ReadoutSectorEta::fPos_Y
                fPos_Xhigh               //X upper boundary of iPhi sector, in mm, at ReadoutSectorEta::fPos_Y
                iStripNum_Min            //lower bound of strip number for this iPhi sector, e.g. 0, 128, 256
                iStripNum_Max            //upper bound of strip number for this iPhi sector, e.g. 127, 255, 383

                map_slices               //Stores Uniformity::AnalysisSetupUniformity::iUniformityGranularity number of Uniformity::SectorSlice objects
                map_clusters             //Stores clusters located in this iPhi sector.  Here the key value is the event number the Cluster is associated with
                map_hits                 //As map_clusters but for Hits

            The copy constructor and overloaded assignment operator perform a deep copy of
            the std::shared_ptr objects above.

        # 4.b.vii. DetectorMPGD
        # --------------------------------------------------------

        Coming "soon"

    # 4.c. Utilities
    # --------------------------------------------------------

    For utility functions defined in the Timing namespace see
    $GEM_BASE/include/TimingUtilityFunctions.h and it's implementation in
    $GEM_BASE/src/TimingUtilityFunctions.cpp.

    For utility functions defined in the Uniformity namespace see
    $GEM_BASE/include/UniformityUtilityFunctions.h and it's implementation in
    $GEM_BASE/src/UniformityUtilityFunctions.cpp.

        # 4.c.i. Timing
        # --------------------------------------------------------

        Coming "soon"


        # 4.c.ii. Uniformity
        # --------------------------------------------------------

        Coming "soon"

    # 4.d Types
    # --------------------------------------------------------

    For types defined in the Timing namespace see
    $GEM_BASE/include/TimingUtilityTypes.h and it's implementation in
    $GEM_BASE/src/TimingUtilityTypes.cpp.

    For utility functions defined in the Uniformity namespace see
    $GEM_BASE/include/UniformityUtilityTypes.h and it's implementation in
    $GEM_BASE/src/UniformityUtilityTypes.cpp.

        # 4.d.i. Timing
        # --------------------------------------------------------

        More Coming "soon"

        The Timing::HistoSetup struct is used for storing user input defined in the Analysis Config file.
        Objects of this struct store values to be set to data members of TH1 and TF1 objects.

        An instance of the Timing::HistoSetup struct is used by private methods of the
        Uniformity::AnalyzeResponseUniformity class for producing & manipulating TH1 & TF1 objects.

        Data members of Timing::HistoSetup struct relevant to the ROOT::TH1 class are:

            HistoSetup::fHisto_xLower       //lower x range of a TH1 object
            HistoSetup::fHisto_xUpper       //upper x range of a TH1 object

            HistoSetup::iHisto_nBins        //number of bins a TH1 object will have

            HistoSetup::strHisto_Name       //TName of a TH1 object
            HistoSetup::strHisto_Title_X    //X-axis title of a TH1 object
            HistoSetup::strHisto_Title_Y    //Y-axis title of a TH1 object

        Data members of Timing::HistoSetup struct relevant to the ROOT::TF1 class are:

            HistoSetup::strFit_Formula              //TFormula of a TF1 object
            HistoSetup::strFit_Name                 //TName of a TF1 object
            HistoSetup::strFit_Option               //Option to be used when fitting some TObject with a TF1
            HistoSetup::vec_strFit_ParamMeaning     //Vector storing meaning of each fit parameter
            HistoSetup::vec_strFit_ParamIGuess      //Vector storing initial guess of each parameter (stof conversion occurs)
            HistoSetup::vec_strFit_ParamLimit_Min   //Vector storing lower bound of each parameter (stof conversion occurs)
            HistoSetup::vec_strFit_ParamLimit_Max   //Vector storing upper bound of each parameter (stof conversion occurs)
            HistoSetup::vec_strFit_Range            //Vector storing range of TF1 object

        In the case of the vector members above, stof conversion occurs via the utility
        function Timing::stofSafe.  Unfortunately scientific notation is not presently supported.
        However this allows the user to enter complex expressions beyond simple numeric input.

        The following members of Timing::HistoSetup are not used presently (legacy from CMS_GEM_TB_Timing,
        kept in case the two repositories are ever merged):

            HistoSetup::bFit
            HistoSetup::bFit_AutoRanging
            HistoSetup::bIsTrig
            HistoSetup::iTDC_Chan;

        # 4.d.ii. Uniformity
        # --------------------------------------------------------

        The list of structs defined in namespace Uniformity is as follows:

            AnalysisSetupUniformity
            Cluster
            HistoPhysObj
            Hit
            RunSetup
            SectorEta
            SectorPhi
            SectorSlice
            SelParam
            SummaryStatistics

        Each of these items are described in detail below.

        Several of the above structs have both copy constructors and overloaded assignment operators which perform
        a deep copy of all the objects stored in the struct.  For those unfamiliar with the term "deep copy" please
        consult:

            http://stackoverflow.com/questions/184710/what-is-the-difference-between-a-deep-copy-and-a-shallow-copy

        or perform a google search of "deep copy C++" for further explanation.

            # 4.d.ii.I AnalysisSetupUniformity
            # --------------------------------------------------------

            The AnalysisSetupUniformity struct stores user input defined in the Analysis Config file.  This
            struct has one instance of a HistoSetup struct for each cluster physical obserable (e.g. ADC,
            position, etc...).  Additionally this struct has one instance of a SelParam struct; which
            stores user input defined in the Analysis Config file for cluster selection.

            Data members of Uniformity::AnalysisSetupUniformity are:

                AnalysisSetupUniformity::iEvt_First             //First event of TTree, produced by amoreSRS, to process.
                AnalysisSetupUniformity::iEvt_Total             //Total events of a TTree, produced by amoreSRS, to process.
                AnalysisSetupUniformity::iUniformityGranularity //The level of granularity the analysis will be carried out on  all iPhi sectors of a DetectorMPGD object (e.g. a value of 128 means at the strip level, a value of 2 means two groups of 64 strips).

                AnalysisSetupUniformity::histoSetup_clustADC    //HistoSetup obejct for specifying cluster ADC TH1 & TF1 objects
                AnalysisSetupUniformity::histoSetup_clustMulti  //HistoSetup obejct for specifying cluster multiplicity TH1 objects
                AnalysisSetupUniformity::histoSetup_clustPos    //HistoSetup obejct for specifying cluster position TH1 objects
                AnalysisSetupUniformity::histoSetup_clustSize   //HistoSetup obejct for specifying cluster size TH1 objects
                AnalysisSetupUniformity::histoSetup_clustTime   //HistoSetup obejct for specifying cluster time bin TH1 objects

                AnalysisSetupUniformity::histoSetup_hitADC      //HistoSetup object for specifying hit ADC TH1 objects
                AnalysisSetupUniformity::histoSetup_hitMulti    //HistoSetup obejct for specifying hit multiplicity TH1 objects
                AnalysisSetupUniformity::histoSetup_hitPos      //HistoSetup object for specifying hit position TH1 objects (in strip No.)
                AnalysisSetupUniformity::histoSetup_hitTime     //HistoSetup object for specifying hit time bin TH1 objects

                AnalysisSetupUniformity::selClust               //SelParam object specifying cluster selection cuts
                AnalysisSetupUniformity::selHit                 //SelParam object specifying hit selection cuts

            # 4.d.ii.II Cluster
            # --------------------------------------------------------

            The Uniformity::Cluster struct stores information relating to one reconstructed cluster
            stored in the TCluster TTree created by amoreSRS.  Data members of Uniformity::Cluster are:

                Cluster::iPos_Y     //Distance in mm from wide base of trapezoid to cluster (e.g. vertical midpoint of iEta sector)
                Cluster::fPos_X     //Horizontal position within iEta sector (used to assign to correct iPhi sector)
                Cluster::fADC       //ADC value of cluster
                Cluster::iSize      //Number of strips in cluster
                Cluster::iTimeBin   //Time bin, e.g. latency value, of the cluster

                Cluster::map_hits   //map of Uniformity::Hit objects used to reconstruct this cluster.  Note presently just a placeholder.  Empty for all clusters presently.

            Note data types of Uniformity::Cluster (e.g. int, float, etc...) should closely match what amoreSRS stores
            in TCluster TTree; e.g. ADC is intrinscially integer physically, but it is defined as a float in amoreSRS.

            # 4.d.ii.III Event
            # --------------------------------------------------------

            The Uniformity::Event struct stores information relating to the physics objects contained
            in an event.  Attributes of Uniformity::Event are:

                Event::iNum_Evt         //Event number
                Event::iNum_Run         //Run number

                Event::vec_clusters     //Vector of Uniformity::Cluster objects
                Event::vec_hits         //Vector of Uniformity::Hit objects

                Event::clear()          //sets all ints to -1, and clears all stl containers

            There is also one copy constructor

            # 4.d.ii.IV HistosPhysObj
            # --------------------------------------------------------

            The Uniformity::HistosPhysObj struct is used as a container for ROOT histograms (i.e. TH1, TH2, etc...).
            These histograms are tracked at varying levels of the DetectorMPGD geometry (e.g. per SectorEta, per
            SectorPhi, etc...).  Each data member of Uniformity::HistosPhysObj is a std::shared_ptr of a ROOT object,
            they are given specifically as:

                HistosPhysObj::hADC             //ADC Spectrum for some physics object (e.g. clusters, hits, etc...)
                HistosPhysObj::hMulti           //Multiplicity "                                                    "
                HistosPhysObj::hPos             //Position     "                                                    "
                HistosPhysObj::hSize            //Size         "                                                    "
                HistosPhysObj::hTime            //Time bin (e.g. latency) "                                         "
                HistosPhysObj::hADC_v_Pos       //ADC vs Position "                                                 "
                HistosPhysObj::hADC_v_Size      //ADC vs Size "                                                     "
                HistosPhysObj::hADC_v_Time      //ADC vs Latency "                                                  "
                HistosPhysObj::hADCMax_v_ADCInt //Max ADC (from all latency bins) of an object vs Integral of object's ADC (sum of all latency bins)

                HistosPhysObj::map_hADC_v_EvtNum_by_Run //map of TH2F objects, each TH2F shows ADC vs evt no. for a given run (i.e. input file)
                HistosPhysObj::map_hTime_v_EvtNum_by_Run //As HistosPhysObj::map_hADC_v_EvtNum_by_Run but for Time

            For clusters hPos is the position along the detector trapezoid in mm with the detector axis being 0 mm in
            the iPhi=2 sector, negative (positive) position values occur in iPhi = 1 (3).  For hits the position is
            the strip number along the detector from 1 to 384 increasing with increasing iPhi.

            There is also one copy constructor and one overloaded assignment operator.  These items perform a
            deep copy of the std::shared_ptr objects above.

            # 4.d.ii.V Hit
            # --------------------------------------------------------

            The Uniformity::Hit struct stores information relating to one reconstructed hit stored in the THit TTree
            created by amoreSRS.  Data members of Uniformity::Hit are:

                Hit::iPos_Y         //Distance in mm from wide base of trapezoid to hit (e.g. vertical midpoint of iEta sector)
                Hit::iStripNum      //Strip number of the hit, this ranges from 0 to 383?
                Hit::iTimeBin       //Time bin, e.g. latency value, of the hit
                Hit::sADCIntegral   //Integral of ADC values from all time bins
                Hit::vec_sADC       //Vector of ADC values, each element of the vector represents ADC value at that time bin; e.g. vec_sADC[Hit::iTimeBin] gives the ADV value at the defined time bin

            Again, data types of Uniformity::Hit should match what amoreSRS stores in the THit TTree.

            # 4.d.ii.VI RunSetup
            # --------------------------------------------------------

            The Uniformity::RunSetup struct stores user input defined in the RUN_INFO header of the Run Config
            File.  It does not store the list of input files.  This struct is responsible for setting the analysis
            configuration and is used by InterfaceAnalysis class for identifying what stages of the analysis
            should be performed.

            Data members of Uniformity::RunSetup are:

                RunSetup::strRunMode            //string, tracks whether executable is doing analysis or comparison

                RunSetup::bAnaStep_Clusters     //True: perform the cluster analysis; false: do not.
                RunSetup::bAnaStep_Fitting      //True: fit stored distributions; false: do not.  Note bAnaStep_Clusters (bAnaStep_Hits) must also be true for cluster (hit) distributions to be fitted.
                RunSetup::bAnaStep_Hits         //True: perform the hit analysis; false: do not.
                RunSetup::bAnaStep_Reco         //True: reconstruct clusters from hits; false: take clusters from input amoreSRS TTree.  Right now just a placeholder value.  Does nothing presently.
                RunSetup::bAnaStep_Visualize    //True: make summary TCanvas objects after analyzing all input files; false: do not.

                RunSetup::strIdent              //string, unique identifier in input filenames
                RunSetup::strObsName            //string, name of observable to be compared across input files in comparsion mode

                RunSetup::iEta                  //int, iEta index to be used in comparsion mode
                RunSetup::iPhi                  //int, iPhi index to be used in comparsion mode
                RunSetup::iSlice                //int, iSlice index to be used in comparsion mode

                RunSetup::strDetName            //Stores a string acting as the unique detector serial number.  Resolves ambiguity in TObject TName data members when opening multiple output TFiles.

                RunSetup::bInputFromFrmwrk      //True (false): input files are produced by the CMS_GEM_Analysis_Framework (amoreSRS)
                RunSetup::bLoadSuccess          //True (false): the input parameters were (not) loaded successfully from the Run Config File. Defaults to false.  If after attempting to load these parameters from the Run Config File this is still false the analysis routine exits.
                RunSetup::bMultiOutput          //True: one output file is made which represents the sum of all input files; false: one output file is made for each input file.  Note when bInputFromFrmwrk is true bMultiOutput must also be true.

                RunSetup::strFile_Config_Ana    //PFN of input analysis config file
                RunSetup::strFile_Config_Map    //PFN of input mapping config file

                RunSetup::strFile_Output_Name   //PFN of output TFile to be created when bMultiOutput is false
                RunSetup::strFile_Output_Option //Option for TFile, e.g. CREATE, RECRATE, UPDATE, etc...

                RunSetup::bDrawNormalized       //True: in comaprison mode TH1F objects are drawn to have area=1; false: no change
                RunSetup::bVisPlots_PhiLines    //True: draw lines denoting iPhi sectors in plots spanning iEta sectors; false: do not.
                RunSetup::bVisPlots_AutoSaving  //True: automatically save TCanvas objects stored in the Summary folder of the output TFile as *.png and *.pdf files; false: do not.

                RunSetup::strDrawOption         //string, draw option to be used in comparison mode

            4.d.ii.VII SectorSlice
            # --------------------------------------------------------

            The data members of the Uniformity::SectorSlice struct are:

                SectorSlice::bFitAccepted       //True: fit of SectorSlice::hSlice_ClustADC passed quality checks
                SectorSlice::fPos_Center        //Location of the center of the slice, in mm, within the SectorPhi (iPhi value)
                SectorSlice::fWidth             //Width of the slice in mm
                SectorSlice::iMinuitStatus      //Minuit status code after attempting to fit SectorSlice::hSlice_ClustADC
                SectorSlice::fitSlice_ClustADC  //std::shared_ptr of a TF1; used to fit SectorSlice::hSlice_ClustADC
                SectorSlice::hSlice_ClustADC    //As SectorEta::hEta_ClustADC but only for this SectorSlice

            There is also one copy constructor and one overloaded assignment operator.  These items perform a
            deep copy of the std::shared_ptr objects above.

            4.d.ii.VIII SelParam
            # --------------------------------------------------------

            Data members of Uniformity::SelParam are:

                SelParam::iCut_ADCNoise     //Hit or Cluster rejected if ADC LESS than value
                SelParam::iCut_ADCSat       //Hit rejected if ADC GREATER than value
                SelParam::iCut_MultiMin     //EVENT rejected if cluster multiplicity LESS than or equal to value
                SelParam::iCut_MultiMax     //EVENT rejected if cluster multiplicity GREATER than or equal to value
                SelParam::iCut_SizeMin      //Cluster rejected if size LESS than value
                SelParam::iCut_SizeMax      //Cluster rejected if size GREATER than value
                SelParam::iCut_TimeMin      //Hit or Cluster rejected if time bin LESS than value
                SelParam::iCut_TimeMax      //Hit or Cluster rejected if time bin GREATER than value

            4.d.ii.IX SummaryStatistics
            # --------------------------------------------------------

            The Uniformity::SummaryStatistics is a container for storing statistical parameters of a dataset
            (e.g. fit results from all strips).  Data members of Uniformity::SummaryStatistics are:

                SummaryStatistics::fIQR             //Interquantile range of dataset; IQR = Q3 - Q1; intrinsically positive
                SummaryStatistics::fMax             //Max value of dataset
                SummaryStatistics::fMean            //Mean value of dataset
                SummaryStatistics::fMin             //Min value of dataset
                SummaryStatistics::fQ1              //First quantile (Q1) of dataset
                SummaryStatistics::fQ2              //Second quantile (Q2) of dataset
                SummaryStatistics::fQ3              //Third quantile (Q3) of dataset
                SummaryStatistics::fStdDev          //Standard deviation of dataset
                SummaryStatistics::mset_fOutliers   //Container storing outliers of a dataset; outlier definition is defined per Analyzer
                SummaryStatistics::hDist            //TH1F object of which stores the distribution of the dataset
                SummaryStatistics::fitDist          //TF1 object which attempts a Gaussian fit to hDist

                SummaryStatistics::clear()          //resets all floats to -1, resets TObjects, and clears all stl containers

            There is also one copy constructor and one overloaded assignment operator.  These items perform a
            deep copy of the std::shared_ptr objects above.

    # 4.e. Configuration Files
    # --------------------------------------------------------

    Two configuration files are require to run the analyzeUniformity exectuable.  The first is the amoreSRS
    mapping file.  The second is the Analysis Config file.  Examples of both files have been included in
    the $GEM_BASE/config directory

        # 4.e.i. amoreSRS Mapping Config File
        # --------------------------------------------------------

        The amoreSRS mapping config file is the file used by amoreSRS when analyzing data collected with the SRS
        system.  Right now only the part of the file specifying the detectors (e.g. lines starting with
        "DET") are used:

            # CMSGEM
            #################################################################################################
            #   ReadoutType  DetType    DetName    Sector     SectPos   SectSize   nbConnect  orient
            #################################################################################################
            DET,   CMSGEM,    CMSGEM,    CMS,    CMSSECTOR1,    1014.95,         411.402,       3,       1
            ...     ...         ...      ...        ...         ...          ...        ...     ...
            ...     ...         ...      ...        ...         ...          ...        ...     ...
            DET,   CMSGEM,    CMSGEM,    CMS,    CMSSECTOR8,    0,        231.186,       3,       1

        For each "DET" line defined in this file an entry in the DetectorMPGD::map_sectorsEta map will be
        stored.  In this way the amoreSRS mapping config file specifies the geometry of the DetectorMPGD object.

        Right now the framework only supports detectors with 1D readouts.  Although the future plan would be
        to extend the software to 2D readouts.

        # 4.e.ii. Analysis Config File
        # --------------------------------------------------------

        The analysis config file expects a certain "nested-header" style. The format should look something like:

            [BEGIN_ANALYSIS_INFO]
                ...
                ...
                [BEGIN_UNIFORMITY_INFO]
                    ...
                    ...
                    [BEGIN_ADC_FIT_INFO]
                        ...
                        ...
                    [END_ADC_FIT_INFO]
                    [BEGIN_HISTO_INFO]
                        ...
                        ...
                    [END_HISTO_INFO]
                    ...
                    ...
                    ...
                    ...
                    [BEGIN_HISTO_INFO]
                        ...
                        ...
                    [END_HISTO_INFO]
                [END_UNIFORMITY_INFO]
            [END_ANALYSIS_INFO]

        For each of the higher level header sections (i.e. "[BEGIN_ANALYSIS_INFO]" and "[BEGIN_UNIFORMITY_INFO]")
        the header parameters should *always* be placed before the declaration of lower headers.  Placing top
        level header parameters after the declaration of lower level headers could lead to undefined behavior
        or at worst crashes.

        Parameters are expected to be entered in the following format:

            field_name = 'value';

        The field_name should be on the left followed by an equals sign "=" then the value should be enclosed
        in single quote marks "'".  A semicolon ";" ends the statement.  Tabs "\t" and spaces outside of the
        single quotes will be ignored, but will be preserved inside the single quotes.  Text after the ";" will
        also be ignored.  The template at the end of this subsection showns an example.

        The Uniformity::ParameterLoaderAnalysis class understands the "#" character to indicate a comment; so
        it is possible to comment out lines in the Analysis Config file you create for ease of use.

        Please note that for all field_names that scientific notation is, unfortunately, not yet supported and
        WILL lead to crashes (i.e. enter 1000 instead of 1e3).

        # 4.e.ii.I HEADER PARAMETERS - ANALYSIS_INFO
        # --------------------------------------------------------

            The following parameters are supported:
            #		<FIELD>			<DATA TYPE, DESCRIPTION>

        None for now, placeholder

        # 4.e.ii.II HEADER PARAMETERS - TIMING_INFO
        # --------------------------------------------------------

            The following parameters are supported:
            #		<FIELD>			<DATA TYPE, DESCRIPTION>

        None for now, placeholder

        # 4.e.ii.III HEADER PARAMETERS - UNIFORMITY_INFO
        # --------------------------------------------------------

        The table below describes the allowed input fields and their data types.

            The following parameters are supported:
            #		<FIELD>             <DATA TYPE, DESCRIPTION>

                Cut_ClusterADC_Min      integer, clusters with ADC values less than this value are rejected.

                Cut_ClusterMulti_Min    integer, events with clusters multiplicity less than or equal to this
                                        value are rejected.

                Cut_ClusterMulti_Max    integer, events with clusters multiplicity greater than or equal to this
                                        value are rejected.

                Cut_ClusterSize_Min     integer, clusters with sizes less than this value are rejected.

                Cut_ClusterSize_Max     integer, clusters with sizes greater than this value are rejected.

                Cut_ClusterTime_Min     integer, clusters with time bins less than this value are rejected.

                Cut_ClusterTime_Max     integer, clusters with time bins greater than this value are rejected.

                Cut_HitAdc_Min          integer, hits with ADC value less than this value are rejected.

                Cut_HitAdc_Max          integer, hits with ADV value greater than this value are rejected.

                Cut_HitMulti_Min        integer, events with hit multiplicity less than or equal to this
                                        value are rejected.

                Cut_HitMulti_Max        integer, events with hit multiplicity greater than or equal to this
                                        value are rejected.

                Cut_HitTime_Min         integer, hits with time bins less than this value are rejected.

                Cut_HitTime_Max         integer, hits with time bins greater than this value are rejected.

                Event_First             integer, the first event, of the TTree found in the input root file
                                        (created by amoreSRS with ROOTDATATYPE = CLUSTERS_ONLY), to start
                                        processing the cluster selection at.

                Event_Total             integer, total number of events to process from the Event_First of the
                                        TTree found in the input root file (created by amoreSRS with
                                        ROOTDATATYPE = CLUSTERS_ONLY) A value of -1 sets indicates all events
                                        from the first event will be processed.

                Uniformity_Granularity  integer, numer of slices, or partitions, to split one iPhi sector into
                                        for the response uniformity measurement.

        # 4.e.ii.IV HEADER PARAMETERS - ADC_FIT_INFO
        # --------------------------------------------------------

        A set of keywords = {"AMPLITUDE","FWHM","HWHM","MEAN","PEAK","SIGMA"} is presently supported
        which allows the user to configure complex expressions for the initial guess of fit parameters,
        their limits, and the fit range.  In the future additional keywords may be added as requested.
        The table below describes the keywords:

            The following keywords are supported and describe how they define the initial guess for a
            given fit:
            #       <KEYWORD>       <DESCRIPTION>

                AMPLITUDE           The fit parameter is set to the value of the TH1 bin with the largest
                                    content (e.g. TH1::GetBinContent(TH1::GetMaximumBin() ) ).

                FWHM                The fit parameter is set to the RMS of the distribution stored in
                                    the TH1 object (e.g. TH1::GetRMS() ).

                HWHM                The fit parameter is set to half the RMS of the distribution stored in
                                    the TH1 object (e.g. TH1::GetRMS() ).

                MEAN                The fit parameter is set to the mean of the distribution stored in
                                    the TH1 object (e.g. TH1::GetMean() ).

                PEAK                An instance of the ROOT::TSpectrum class is created and searches the TH1
                                    object that will be fitted for all peaks.  The TSpectrum parameters are
                                    hard coded and "should" ensure only one peak is found (open issue).  The
                                    x-position of the first peak found in the TH1 distribution is set to the
                                    fit parameter (e.g. TSpectrum::Search() and TSpectrum::GetPositionX()
                                    are used).

                SIGMA               As "FWHM"

        The framework will calculate the energy resolution of a given slice of the detector.  The energy
        resolution is always taken as:

            E_Res = PEAK_FWHM / PEAK_Pos

        In your fit formula you must label one parameter in the "Fit_Param_Map" (see table below) from
        the peak width set {"FWHM","HWHM","SIGMA"}.  Failure to do so will cause the energy resolution
        to be zero for all slices (i.e. all points in gEta_ClustADC_Fit_PkRes will be 0 for all SectorEta
        objects defined).  The table below shows how the PEAK_FWHM is determined for each of the entires
        in the peak width set:

            Energy resolution determination for each of the three input parameter values:
            #       <KEYWORD>       <DESCRIPTION>

                FWHM                E_Res = FWHM / PEAK_Pos; where FWHM is the value of the fit
                                    parameter, post fit, given the meaning "FWHM" in the Fit_Param_Map
                                    field.

                HWHM                E_Res = (2.*HWHM) / PEAK_Pos; where HWHM is the value of the
                                    fit parameter, post fit, given the meaning "HWHM" in the Fit_Param_Map
                                    field.

                SIGMA               E_Res = (2. * sqrt( 2. * ln(2.) ) * SIGMA ) / PEAK_Pos; where SIGMA
                                    is the value of the fit parameter, post fit, given the meaning "SIGMA"
                                    in the Fit_Param_Map field.

        The table below describes the allowed input fields and their data types:

            The following parameters are supported:
            #		<FIELD>             <DATA TYPE, DESCRIPTION>

                Fit_Formula             string, TFormula to be given to a ROOT::TF1 object.  Note the syntax
                                        and full complexity of inputs expected/available in ROOT works!
                                        e.g. "[0]*x^2+[1]" or "gaus(0)+pol2(3)" or "[1]*TMath::Erf(x) + [2]"
                                        are all supported.

                Fit_Formula_Sig         string, as Fit_Formula but this is understood to be the portion of the
                                        formula which describes the signal peak.  Note the parameters here must
                                        be indexed from 0 and follow the same order as they due in Fit_Formula.
                                        E.g. if your Fit_Formula is "pol2(0) + [3]*TMath::CauchyDist(x,[4],[5])"
                                        with the CauchyDist describing your signal peak then Fit_Formula_Sig
                                        would be written as "[0]*TMath::CauchyDist(x,[1],[2])".  Here the index
                                        of the parameters has been restarted at [0] but the order is preserved.
                                        This, in conjunction with Fit_Formula_Sig_Param_Idx_Range, will ensure
                                        the parameter determined for [3] in Fit_Formula is assigned to [0] in
                                        Fit_Formula_Sig.

                Fit_Formula_BKG         string, as Fit_Formula_Sig but for the background.

                Fit_Formula_Sig_Param_Idx_Range     integers, two comma separated integers.  This gives the range
                                                    of the parameters that correspond to the signal peak in Fit_Formula.
                                                    E.g. if your Fit_Formula is "pol2(0) + [3]*TMath::CauchyDist(x,[4],[5])"
                                                    with the CauchyDist describing your signal peak then
                                                    Fit_Formula_Sig_Param_Idx_Range is "3,5" which, in conjunction
                                                    with Fit_Formula_Sig, will ensure the parameter determined for
                                                    [3] in Fit_Formula is assigned to [0] in Fit_Formula_Sig.


                Fit_Formula_Sig_Param_Idx_Range     integers, as Fit_Formula_Sig_Param_Idx_Range but for the
                                                    background.

                Fit_Option              string, the fit option to be used for fitting the ADC spectrums made
                                        from each slice.

                Fit_Param_IGuess        string, comma separated list of the initial values for the parameters
                                        defined in the Fit_Formula field.  Note the order in which the parameters
                                        are given in the Fit_Formula field should match the order listed here.
                                        Explicitly for the Fit_Formula '[0]*x^2+[1]*x+[2]' the initial guess
                                        of '4,5,6' would mean [0] = 4, [1] = 5, and [2] = 6.  Additionally,
                                        both numeric values and expressions formed from the above supported
                                        keywords can be used.  E.g. for a Fit_Formula = 'gaus(0)' the initial
                                        guess of '12.3, MEAN, 2.*SIGMA+23.5' can be assigned.

                Fit_Param_Limit_Max     string, as Fit_Param_IGuess but for the upper limit on fit parameters.

                Fit_Param_Limit_Min     string, as Fit_Param_IGuess but for the lower limit on fit parameters.

                Fit_Param_Map           string, words to help the user track the meaning of the fit parameter.
                                        The order follows the ordering schema described in Fit_Param_IGuess.
                                        NOTE: at least one parameter must be given the value "PEAK" and one
                                        parameter must be given a value from the set {"FWHM","HWHM","SIGMA"}.
                                        The vertical error-bar on these two parameters comes from the error
                                        on the corresponding fit parameter determined in ROOT (e.g. TF1::GetParError() )

                Fit_Range               string, as Fit_Param_IGuess but for the fit range.  NOTE: must supply
                                        exactly two parameters.  If more then two parameters are supplied
                                        only those that evaluate to the maximum and minimum are used.

        # 4.e.ii.V HEADER PARAMETERS - HISTO_INFO
        # --------------------------------------------------------

        The user at runtime is able to specify the data members of the TH1 objects that will be created
        (e.g. number of bins, TName, etc...).  However, unlike amoreSRS these histograms are hard coded and
        the user cannot choose at runtime to make new distributions.  If a distribution you would like to
        see does not already exist please navigate to:

            https://github.com/bdorney/CMS_GEM_Analysis_Framework/issues

        and submit a request; or if you are a developer implement the distribution yourself and then submit
        a pull request to the repository (https://github.com/bdorney/CMS_GEM_Analysis_Framework/pulls).

        The table below describes the allowed input fields and their data types.

            The following parameters are supported:
            #		<FIELD>             <DATA TYPE, DESCRIPTION>

                Histo_Name              string, type of histogram you are specifying information for.  NOTE:
                                        this entry should appear as the first line below the section
                                        header ("BEGIN_HISTO_INFO") and only entries from the following
                                        set are allowed: {"clustADC", "clustMulti", "clustPos", "clustSize",
                                        "clustTime", "hitADC", "hitMulti", "hitPos", "hitTime"}.

                Histo_XTitle            string, title of the x-axis, full TLatex style entires are supported.
                                        Explicitly "cluster position #left(#mum#right)" will result in a
                                        well formatted x-axis with parenthesis that are sized accordingly
                                        and proper Greek lettering.

                Histo_YTitle            string, as Histo_XTitle but for the y-axis.

                Histo_BinRange          float, two floats separated by a comma specifying the lowest and
                                        highest values of the x-axis.  In the case of Histo_Name = {clustPos, hitPos}
                                        this field is automatically set based on input from amoreSRS mapping file.

                Histo_NumBins           integer, number of bins in the histogram.  In the case of
                                        Histo_Name = {clustPos, hitPos} this field is automatically set
                                        based on input from amoreSRS mapping file.

        # 4.e.ii.VI Example Config File
        # --------------------------------------------------------

        An example config file is shown below (feel free to remove the leading tabs, they are shown here
        just for readablility):

            [BEGIN_ANALYSIS_INFO]
                [BEGIN_UNIFORMITY_INFO]
                    #Selection Cuts
                    ####################################
                    Cut_ClusterADC_Min = '300';
                    Cut_ClusterMulti_Min = '0';
                    Cut_ClusterMulti_Max = '20';
                    Cut_ClusterSize_Min = '2';
                    Cut_ClusterSize_Max = '10';
                    Cut_ClusterTime_Min = '6';
                    Cut_ClusterTime_Max = '27';
                    #Selection Cuts - Hit
                    ####################################
                    Cut_HitAdc_Min = '60';
                    Cut_HitAdc_Max = '3000';
                    Cut_HitMulti_Min = '1';
                    Cut_HitTime_Min = '2';
                    Cut_HitTime_Max = '29';
                    #Event Range
                    ####################################
                    Event_First = '0';
                    Event_Total = '-1';
                    #Requested Granularity
                    ####################################
                    Uniformity_Granularity = '64';
                    #Requested Tolerance on Uniformity
                    ####################################
                    [BEGIN_ADC_FIT_INFO]
                        Fit_Formula = '[0]*TMath::CauchyDist(x, [1], [2])+pol5(3)';
                        Fit_Formula_Sig = '[0]*TMath::CauchyDist(x, [1], [2])';
                        Fit_Formula_Sig_Param_Idx_Range = '0,2';
                        Fit_Formula_Bkg = 'pol5';
                        Fit_Formula_Bkg_Param_Idx_Range = '3,8';
                        Fit_Param_Map = 'AMPLITUDE, PEAK, HWHM';
                        Fit_Param_IGuess = '1000000,PEAK,PEAK*0.3';
                        Fit_Param_Limit_Min = '10, PEAK-0.2*PEAK, 0.1*PEAK';
                        Fit_Param_Limit_Max = '10000000, PEAK+0.2*PEAK, 0.70*PEAK';
                        Fit_Range = 'PEAK-0.57*PEAK, 3*PEAK';
                    [END_ADC_FIT_INFO]
                    [BEGIN_HISTO_INFO]
                        Histo_Name = 'clustADC';
                        Histo_XTitle = 'Cluster ADC';
                        Histo_YTitle = 'N';
                        Histo_BinRange = '0,10000';
                        #Histo_NumBins = '150';
                        Histo_NumBins = '100';
                    [END_HISTO_INFO]
                    [BEGIN_HISTO_INFO]
                        Histo_Name = 'clustMulti';'
                        Histo_XTitle = 'Cluster Multiplicity';
                        Histo_YTitle = 'N';
                        Histo_BinRange = '0,20';
                        Histo_NumBins = '20';
                    [END_HISTO_INFO]
                    [BEGIN_HISTO_INFO]
                        Histo_Name = 'clustPos';
                        Histo_XTitle = 'Cluster Position #left(mm#right)';
                        Histo_YTitle = 'N';
                        #Here Histo_BinRange is set automatically based on input amoreSRS mapping file
                        #Here Histo_NumBins is set automatically based off Bin_Range
                    [END_HISTO_INFO]
                    [BEGIN_HISTO_INFO]
                        Histo_Name = 'clustSize';
                        Histo_XTitle = 'Size #left(N_{strips}#right)';
                        Histo_YTitle = 'N';
                        Histo_BinRange = '0,20';
                        Histo_NumBins = '20';
                    [END_HISTO_INFO]
                    [BEGIN_HISTO_INFO]
                        Histo_Name = 'clustTime';
                        Histo_XTitle = 'Time Bin';
                        Histo_YTitle = 'N';
                        Histo_BinRange = '0,30';
                        Histo_NumBins = '30';
                    [END_HISTO_INFO]
                    [BEGIN_HISTO_INFO]
                        Histo_Name = 'hitADC';
                        Histo_XTitle = 'Hit ADC';
                        Histo_YTitle = 'N';
                        Histo_BinRange = '0,2000';
                        Histo_NumBins = '200';
                    [END_HISTO_INFO]
                    [BEGIN_HISTO_INFO]
                        Histo_Name = 'hitMulti';'
                        Histo_XTitle = 'Hit Multiplicity';
                        Histo_YTitle = 'N';
                        Histo_BinRange = '0,50';
                        Histo_NumBins = '50';
                    [END_HISTO_INFO]
                    [BEGIN_HISTO_INFO]
                        Histo_Name = 'hitPos';
                        Histo_XTitle = 'Hit Position #left(mm#right)';
                        Histo_YTitle = 'N';
                        #Here Histo_BinRange is set automatically based on input amore mapping file
                        #Here Histo_NumBins is set automatically based off Bin_Range
                    [END_HISTO_INFO]
                    [BEGIN_HISTO_INFO]
                        Histo_Name = 'hitTime';
                        Histo_XTitle = 'Time Bin';
                        Histo_YTitle = 'N';
                        Histo_BinRange = '0,30';
                        Histo_NumBins = '30';
                    [END_HISTO_INFO]
                [END_UNIFORMITY_INFO]
            [END_ANALYSIS_INFO]

        # 4.e.iii. Run Config File
        # --------------------------------------------------------

        The run config file expects a certain "nested-header" style. The format should look something like:

            [BEGIN_RUN_INFO]
                ...
                ...
                ...
            [END_RUN_INFO]
            [BEGIN_RUN_LIST]
                ...
                ...
                ...
            [END_RUN_LIST]

        Parameters found inside the "[BEGIN_RUN_INFO]" header expected to be entered in the following format:

            field_name = 'value';

        The field_name should be on the left followed by an equals sign "=" then the value should be enclosed
        in single quote marks "'".  A semicolon ";" ends the statement.  Tabs "\t" and spaces outside of the
        single quotes will be ignored, but will be preserved inside the single quotes.  Text after the ";" will
        also be ignored.

        Contrary to the "[BEGIN_RUN_INFO]" header the "[BEGIN_RUN_LIST]" header is simply a list of PFN of the
        input files to be analyzed by the call of the executable.  Again tabs "\t" and spaces will be ignored.

        The Uniformity::ParameterLoaderRun class understands the "#" character to indicate a comment; so
        it is possible to comment out lines in the Run Config file you create for ease of use.  The template
        run config file at the end of this subsection showns an example.

        The value of true is understood as being from the case-insensitive set {t, true, 1} while the value of
        false is understood as being from the case-insensitive set {f, false, 0}.

        # 4.e.iii.I HEADER PARAMETERS - RUN_INFO
        # --------------------------------------------------------

        The table below describes the allowed input fields and their data types.

            The following parameters are supported:
            #		<FIELD>             <DATA TYPE, DESCRIPTION>

                Config_Analysis             string, PFN of the input analysis configuration file.

                Config_Mapping              string, PFN of the input mapping configuration file.

                Detector_Name               string, the serial number of the detector (do not include special
                                            characters such as '/' but dashes '-' are allowed)

                Input_Identifier            string, a regular expression found in each input filename, separated
                                            by underscores '_', that is understood to have the run number after
                                            the expression. e.g. if the filename contains "_RunX_" for some set
                                            of integers X then this field should be set to "Run." This field must
                                            always be set.

                Input_Is_Frmwrk_Output      boolean, set to true (false) if the input file/files is/are created
                                            by the CMS_GEM_Analysis_Framework (amoreSRS).  Note that if this
                                            option is set to true then Output_Individual must also be set to true.

                Output_File_Name            string, PFN of the output TFile.  Note that if Output_Individual is
                                            set to true and Input_Is_Frmwrk_Output is set to false then the PFN
                                            defined here is not used.  Instead the PFN of the input TFile, created
                                            by amoreSRS, is used but the "dataTree.root" ending of the file name is
                                            removed and replaced with "Ana.root".  If Input_Is_Frmwrk_Output is set
                                            to true then the PFN defined here is again not used.  Instead the PFN of
                                            the input TFile, created by CMS_GEM_Analysis_Framework, is used but the
                                            filename is appended with "NewAna.root".  This could be potentially
                                            improved in the future.

                Output_File_Option          string, the option for the output TFile taken from the standard set
                                            defined in the TFile documentation, e.g. "CREATE, NEW, READ,
                                            RECREATE, UPDATE"

                Output_Individual           boolean, setting to true produces one output file for each input file.
                                            Setting to false produces one output file that represents the entirity
                                            of the analysis of all input files.  Note that this should only be set
                                            to false if Input_Is_Frmwrk_Output is also set to false.

                Ana_Reco_Clusters           boolean, set to true if you would like to the framework to reconstruct
                                            clusters from input hits found in the amoreSRS input TFile. Setting to
                                            false takes the clusters from the input amoreSRS TFile.  Right now this
                                            field does nothing and is only a placeholder.

                Ana_Hits                    boolean, setting to true will tell the framework to perform the analysis
                                            of the input hits.

                Ana_Clusters                boolean, setting to true will tell the framework to perform the analysis
                                            of the input clusters.

                Ana_Fitting                 boolean, setting to true will tell the framework to fit the obtained
                                            distributions.  Note that Ana_Clusters must also be true for those
                                            distributions to be fitted.

                Visualize_Plots             boolean, setting to true will tell the framework to prepare several
                                            TCanvases after analyzing all input files (Output_Individual = false)
                                            or each input file (Output_Individual = true).

                Visualize_AutoSaveImages    boolean, setting to true will tell the framework to automatically create
                                            *.png and *.pdf files of all TCanvases stored in the "Summary" folder.
                                            The name of these files will match the TName of the corresponding TCanvas.
                                            They will be found in the working directory (the directory you execute
                                            the framework executable from).  If these files already exist they will
                                            be over-written.

                Visualize_DrawPhiLines      boolean, setting to true will tell the framework to draw lines on the
                                            summary TCanvases that show the iPhi segmentation.


        # 4.e.iii.II  HEADER PARAMETERS - RUN_LIST
        # --------------------------------------------------------

        This header contains a list of PFN of the input files.  It is expected that there is one line for per
        file.  White space, such as tabs '\t' and spaces ' ', is ignored when reading in these input files.
        For example:

            [BEGIN_RUN_LIST]
                ...
                ...
                /filepath/filename3.root
                /filepath/filename4.root
                ...
                ...
            [END_RUN_LIST]

        # 4.e.iii.III  HEADER PARAMETERS - COMP_INFO
        # --------------------------------------------------------

        The table below describes the allowed input fields and their data types.

        The following parameters are supported:
        #		<FIELD>             <DATA TYPE, DESCRIPTION>

                Obs_Name                    string, the "ObservableNameX" (See Section 4.f.i) found in the TName of the
                                            TH1F object that you wish to compare across all input files.

                Obs_Eta                     int, the iEta index you wish to comapre TH1F objects from.  This must be from
                                            [1, iNumEta] or -1.  If set to -1 summary level TH1F objects are compared.

                Obs_Phi                     int, as Obs_Eta but for phi index.

                Obs_Slice                   int, as Obs_Eta but for slice index.

                Input_Identifier            string, a regular expression found in each input filename, separated
                                            by underscores '_'.  From each filename this expression will be drawn on a
                                            TLegend to identify the TH1F object from the corresponding filename.

                Output_File_Name            string, PFN of the output TFile.  Note that if Output_Individual is
                                            set to true and Input_Is_Frmwrk_Output is set to false then the PFN
                                            defined here is not used.  Instead the PFN of the input TFile, created
                                            by amoreSRS, is used but the "dataTree.root" ending of the file name is
                                            removed and replaced with "Ana.root".  If Input_Is_Frmwrk_Output is set
                                            to true then the PFN defined here is again not used.  Instead the PFN of
                                            the input TFile, created by CMS_GEM_Analysis_Framework, is used but the
                                            filename is appended with "NewAna.root".  This could be potentially
                                            improved in the future.

                Output_File_Option          string, the option for the output TFile taken from the standard set
                                            defined in the TFile documentation, e.g. "CREATE, NEW, READ,
                                            RECREATE, UPDATE"

                Visualize_AutoSaveImages    boolean, setting to true will tell the framework to automatically create
                                            *.png and *.pdf files of all TCanvases stored in the "Summary" folder.
                                            The name of these files will match the TName of the corresponding TCanvas.
                                            They will be found in the working directory (the directory you execute
                                            the framework executable from).  If these files already exist they will
                                            be over-written.

                Visualize_DrawNormalized    boolean, setting to true will tell the framework all distributions plotted
                                            should be re-scaled to have an integral = 1.

                Visualize_DrawOption        string, the draw option to use for the selected distributions.


        # 4.e.iii.IV  Configuration Options
        # --------------------------------------------------------

        The framework can run in an analysis mode, which has three configurations, and it can run in a
        comparison mode which has one configuration. The three configurations of the analysis mode have
        the analyzeUniformity executable analyze raw data taken with RD51 Scaleable Readout System and
        unpacked amoreSRS. In the comparison mode the analyzeUniformity executable is used to compare
        plots across multiple Framework output files.

        The 1st analysis configuration is the "series" mode which will analyze all of the input files
        defined in the "[BEGIN_RUN_LIST]" header, one after another, created by either amoreSRS or the
        CMS_GEM_Analysis_Framework (but not a mix of both!).  The time of execution can vary depending on
        the number of input files and the number of events/slice granularity present in each of those files.
        However, care has been taken to maximimize performance while still maintaining modularity/flexibility
        in the design.  Here the "[BEGIN_RUN_INFO]" header can be configured to execute whatever level of
        the framework analysis is desired; but this will be applied to EACH of the input files defined in
        the "[BEGIN_RUN_LIST]" header.  If the need arises we can implement a way to assign a different
        analysis and mapping config file to each of the input files defined in the "[BEGIN_RUN_LIST]" header
        but right now this functionality is not foreseen.  It is recommended to just do two runs of the
        executable after changing the configuration.

        The 2nd analysis config is the computing cluster mode; to avoid confusion w/charge clusters this is
        referred to as "grid" mode. Here the input run config file contains only a single input file in the
        "[BEGIN_RUN_LIST]" header and the "[BEGIN_RUN_INFO]" header is configured such that Ana_Fitting and
        Visualize_Plots are set to false.  The user uses a script/scheduler of their choice to launch their
        jobs to a computing cluster to analyze a set of input files in parallel (scripts to do this with the
        batch submission system on CERN's lxplus are included in the repository).  Then after all jobs are
        finished and the outputs retrieved the user can merge the output files together (if running on
        amoreSRS input files) using the "hadd" command in ROOT.  Then this merged file can be reprocessed
        in series mode with Input_Is_Frmwrk_Output, Ana_Fitting, and Visualize_Plots set to true.

        The third analysis config is the "re-run" mode.  Here a TFile that has been previously produced by
        the CMS_GEM_Analysis_Framework is reanalyzed after changing the fit parameters defined in the
        analysis configuration file.  Each run will result in a new TFile (independent from the input) that
        has the updated results.  This allows the user to more rapidly study variations in parameters without
        having to waste time performing the base selection (which may not need to change).  Right now in
        "re-run" mode only cluster level plots are propogated to the new TFile.  Additionally none of the
        TH2F objects found in the RunHistory folder will be propogated to the new TFile.

        In the "comparison" configuration one can take a set of TFiles that have been previously
        produced by the CMS_GEM_Analysis_Framework and compare TH1F objects from the files against each other.
        Here the input Run Config file should be configured to have a "[BEGIN_COMP_INFO]" header instead of the
        "[BEGIN_RUN_HEADER]" that is used by the other modes.  The "[BEGIN_RUN_LIST]" header is still used
        normally; however now the input files listed here must be Framework output files produced in one of the
        three modes described above.

        Example configuration files illustrating these options are provided in the sections below.  Furthermore
        template config files and helper scripts are provided in the framework to run in each mode.  For details
        on this functionality see Sections 3.a.i through 3.a.iii.

        # 4.e.iii.V  Example Config File - Mode: Series
        # --------------------------------------------------------

        Two example files here are presented.

        The first example illustrates a series run in which the entire analysis is requested on a list of
        input TFile's create by amoreSRS.  Here the Output_Individual is set to false to create one output
        file representing the results of the analysis on all input files. Changing Output_Individual to true
        will produce one output file per input file.  The example is as follows:

            [BEGIN_RUN_INFO]
                #Config Files
                ####################################
                Config_Analysis = 'config/configAnalysis.cfg';
                Config_Mapping = 'config/Mapping_GE11-VII-L.cfg';
                #Detector
                ####################################
                Detector_Name = 'GE11-VII-L-CERN-0002';
                #Input Config
                ####################################
                Input_Is_Frmwrk_Output = 'false';   #indicates we are running on input created by amoreSRS
                Input_Identifier = 'Run';
                #Output Config
                ####################################
                Output_File_Name = 'GE11-VII-L-CERN-0002_Summary_RandTrig_AgXRay40kV100uA_1500kEvt_Ana.root';
                Output_File_Option = 'RECREATE';
                Output_Individual = 'false';        #indicates we are making one output file that represents results obtained from all inputs
                #Analysis Steps
                ####################################
                Ana_Reco_Clusters = 'false';
                Ana_Hits = 'true';
                Ana_Clusters = 'true';
                Ana_Fitting = 'true';
                #Visualizer Config
                ####################################
                Visualize_Plots = 'true';
                Visualize_AutoSaveImages = 'true';
                Visualize_DrawPhiLines = 'true';
            [END_RUN_INFO]
            [BEGIN_RUN_LIST]
                /base_dir/sub_dir/sub_dir/GE11-VII-L-CERN-0002_Run100_Physics_RandomTrigger_XRay40kV100uA_580uA_500kEvt_dataTree.root
                /base_dir/sub_dir/sub_dir/GE11-VII-L-CERN-0002_Run101_Physics_RandomTrigger_XRay40kV100uA_580uA_500kEvt_dataTree.root
                /base_dir/sub_dir/sub_dir/GE11-VII-L-CERN-0002_Run102_Physics_RandomTrigger_XRay40kV100uA_580uA_500kEvt_dataTree.root
            [END_RUN_LIST]

        Here leading tabs are shown just for convenience and can be kept/or omitted without consequence.

        The second example illustrates a series run in which only the final portion of the analysis (fitting
        and visualizing) is performed on an input TFile created by the CMS_GEM_Analysis_Framework.  Here
        Output_Individual is set to true, as it must be, and one output file for each input file will be
        produced.  The example is as follows:

            [BEGIN_RUN_INFO]
                #Config Files
                ####################################
                Config_Analysis = 'config/configAnalysis.cfg';
                Config_Mapping = 'config/Mapping_GE11-VII-S.cfg';
                #Detector
                ####################################
                Detector_Name = 'GE1/1-VII-S-CERN-0001';
                #Input Config
                ####################################
                Input_Is_Frmwrk_Output = 'true';    #indicates we are running on input created by the CMS_GEM_Analysis_Framework
                #Output Config
                ####################################
                Output_File_Option = 'RECREATE';
                Output_Individual = 'true';         #indicates we are making one output file for each input file
                #Analysis Steps
                ####################################
                Ana_Reco_Clusters = 'false';
                Ana_Hits = 'false';
                Ana_Clusters = 'true';              #this is set to true so we fit the cluster distributions
                Ana_Fitting = 'true';
                #Visualizer Config
                ####################################
                Visualize_Plots = 'true';
                Visualize_DrawPhiLines = 'true';
            [END_RUN_INFO]
            [BEGIN_RUN_LIST]
                /base_dir/sub_dir/sub_dir/GE11-VII-S-CERN-0002_Summary_RandTrig_AgXRay40kV100uA_1500kEvt_ClustSize2_Ana.root
                /base_dir/sub_dir/sub_dir/GE11-VII-S-CERN-0002_Summary_RandTrig_AgXRay40kV100uA_1500kEvt_ClustSize3_Ana.root
                /base_dir/sub_dir/sub_dir/GE11-VII-S-CERN-0002_Summary_RandTrig_AgXRay40kV100uA_1500kEvt_ClustSize4_Ana.root
            [END_RUN_LIST]

        Again the leading tabs are shown just for convenience and can be kept/or omitted without consequence.
        In this case the framework should create the following list of output files:

            /base_dir/sub_dir/sub_dir/GE11-VII-S-CERN-0002_Summary_RandTrig_AgXRay40kV100uA_1500kEvt_ClustSize2_NewAna.root
            /base_dir/sub_dir/sub_dir/GE11-VII-S-CERN-0002_Summary_RandTrig_AgXRay40kV100uA_1500kEvt_ClustSize3_NewAna.root
            /base_dir/sub_dir/sub_dir/GE11-VII-S-CERN-0002_Summary_RandTrig_AgXRay40kV100uA_1500kEvt_ClustSize4_NewAna.root

        If you're filename ends with "*_Ana.root" the input file will not be overwritten and instead a new file
        will be produced with the same PFN as the input but ending with *_NewAna.root instead.

        Pay special attention to the fact that these files will not necessarily be found in the directory you
        are calling the executable from but in the directory the input file is found in.

        # 4.e.iii.VI  Example Config File - Mode: Grid
        # --------------------------------------------------------

        Grid mode is really designed for running the analysis on multiple input TFiles, created by amoreSRS,
        in parallel.  One could use this option when running on multiple input TFiles created by the framework
        but the increase in analysis speed would be small in comparison since usually you are only interested
        in checking a new set of fit parameters on the previously obtained data.

        Ideally you should submit this with the provided script/runMode_Grid.sh script, included in the
        repository, to a fast queue such as the 8 natural minute (8nm) or 1 natural hour (1nh) queue.
        The example config file is shown as:

            [BEGIN_RUN_INFO]
                #Config Files
                ####################################
                Config_Analysis = 'config/configAnalysis.cfg';
                Config_Mapping = 'config/Mapping_GE11-VII-L.cfg';
                #Input Config
                ####################################
                Input_Is_Frmwrk_Output = 'false';   #indicates we are running on input created by amoreSRS
                Input_Identifier = 'Run';
                #Output Config
                ####################################
                Output_File_Option = 'RECREATE';
                Output_Individual = 'true';         #Here we are having the output PFN be the input PFN appended with "Ana.root"
                #Analysis Steps
                ####################################
                Ana_Reco_Clusters = 'false';
                Ana_Hits = 'true';
                Ana_Clusters = 'true';
                Ana_Fitting = 'false';              #Do not perform the fitting; input file is a subset of the total dataset
                #Visualizer Config
                ####################################
                Visualize_Plots = 'false';          #Do not perform the visualization; input file is a subset of the total dataset
            [END_RUN_INFO]
            [BEGIN_RUN_LIST]
                /base_dir/sub_dir/sub_dir/myFileForThisJob.root
            [END_RUN_LIST]

        Again leading tabs are shown just for convenience and can be kept/or omitted without consequence.

        # 4.e.iii.VII  Example Config File - Mode: Re-Run
        # --------------------------------------------------------

        The re-run mode is designed to allow a user to change the fit parameters defined in their analysis
        config file and re-run on an input TFile previously produced by the framework.  This saves significant
        time when tweaking the fit parameters being applied to a given input file since the selection does
        not have to be repeated.  Obviously this mode should not be applied to input TFiles produced by amoreSRS.
        The example config file is given below:

            [BEGIN_RUN_INFO]
                #Config Files
                ####################################
                Config_Analysis = 'config/configAnalysis.cfg';
                Config_Mapping = 'config/Mapping_GE11-VII-L.cfg';
                #Detector
                ####################################
                Detector_Name = 'DETECTORNAME';
                #Input Config
                ####################################
                Input_Is_Frmwrk_Output = 'true'     #indicates we are running on input created by the framework
                #Output Config
                ####################################
                Output_File_Option = 'RECREATE';
                Output_Individual = 'true';         #must be set to true since Input_Is_Frmwrk_Output = true
                #Analysis Steps
                ####################################
                Ana_Reco_Clusters = 'false';
                Ana_Hits = 'false';
                Ana_Clusters = 'true';              #this is set to true so we fit the cluster distributions
                Ana_Fitting = 'true';
                #Visualizer Config
                ####################################
                Visualize_Plots = 'true'; #true -> make summary canvas plots; false -> do not make summary canvas plots
                Visualize_AutoSaveImages = 'false';
                Visualize_DrawPhiLines = 'true'; #true -> draw iPhi lines; false -> do not draw iPhi lines
            [END_RUN_INFO]
            [BEGIN_RUN_LIST]
                /base_dir/sub_dir/sub_dir/myPreviousFrmwrkOutput_Detector1.root
            [END_RUN_LIST]

        Again the leading tabs are shown just for convenience and can be kept/or omitted without consequence.
        In this case the framework should create the following list of output files:

            /base_dir/sub_dir/sub_dir/myPreviousFrmwrkOutput_Detector1_NewAna.root

        Again pay special attention to the fact that these files will not necessarily be found in the directory you
        are calling the executable from but in the directory the input file is found in.

        Astute readers will note this is identical to the series mode example 2 with just one input file.
        This is true; however, I felt the explicit example could prove useful.

        # 4.e.iii.VII  Example Config File - Mode: Comparison
        # --------------------------------------------------------

        The comparison mode is designed to allow a user to quickly compare TH1F objects stored in different
        framework output files from different detectors, different acquisition conditions, or produced with
        different analysis parameters.  This can save signficant time for an analyst interested in performing
        these comparisons.  The example config file is given below:

            [BEGIN_COMP_INFO]
                #Observable
                ####################################
                Obs_Name = 'clustADC';
                Obs_Eta = '4';
                Obs_Phi = '2';
                Obs_Slice = '-1';
                #Input Config
                ####################################
                Input_Identifier = 'ClustTime';
                #Output Config
                ####################################
                Output_File_Name = 'GE11-VII-L-CERN-0002_ClustTime_Comparison.root';
                Output_File_Option = 'UPDATE';
                #Visualizer Config
                ####################################
                Visualize_AutoSaveImages = 'true';
                Visualize_DrawNormalized = 'false';
                Visualize_DrawOption = "E1"
                Visualize_DrawPhiLines = 'false';
            [END_COMP_INFO]
            [BEGIN_RUN_LIST]
                /base_dir/sub_dir/sub_dir/GE11-VII-L-CERN-0002_Summary_Physics_RandTrig_AgXRay40kV100uA_580uA_15004kEvt_ClustTime1to30_ClustSize1to20_Ana.root
                /base_dir/sub_dir/sub_dir/GE11-VII-L-CERN-0002_Summary_Physics_RandTrig_AgXRay40kV100uA_580uA_15004kEvt_ClustTime6to27_ClustSize1to20_Ana.root
            [END_RUN_LIST]

        Again the leading tabs are shown just for convenience and can be kept/or omitted without consequence.

    # 4.f. Output File - Analysis Mode
    # --------------------------------------------------------

    The framework will produce a number of output ROOT files and text files depending
    on the configuration used.  When Output_Individual = true one ROOT file and text
    file will be produced per input file.  Otherwise a single ROOT and text file will
    be produced which represents the aggregate of the input file(s) analyzed

    The output (text) ROOT file is described in Section (4.f.ii) 4.f.i.

        # 4.f.i Output ROOT File - Analysis Mode
        # --------------------------------------------------------

        The output ROOT file produced by classes inheriting from AnalyzeResponseUniformity will contain the
        TObjects described in Sections 4.b.i, 4.b.iii, and 4.d.ii.  The output file will have a repeating file
        structure.  For each SectorEta defined (i.e. "DET" line in the amoreSRS mapping config file) there
        will be one TDirectory named "SectorEtaX" where X is an integer.  Those TObject's stored in the
        Uniformity::SectorEta struct will be stored directly in this "SectorEtaX" TDirectory; and obviously
        they will represent only distributions from that iEta value.  The TName's for each TObject here
        will include the string "_iEtaX_" to ensure they are unique.

        Within each "SectorEtaX" folder will be nbConnect number of TDirectory's labeled "SectorPhiY" for
        Y = {1, ... , nbConnect}.  Similarly to the above, the TObject's stored in the Uniformity::SectorPhi struct
        will be stored directly in this "SectorPhiY" TDirectory; they will represent only distributions
        from this (iEta, iPhi) value.  Again, the TName's for each TObject here will include the string
        "_iEtaXiPhiY_" to ensure they are unique.

        Within each "SectorPhiY" folder there will exist AnalysisSetupUniformity::iUniformityGranularity
        number of TDirectory's labeled "SliceZ" where Z is an integer from 1 to
        AnalysisSetupUniformity::iUniformityGranularity.  Similarly, the TObject's stored in
        Uniformity::SectorSlice will be stored directly in this "SliceZ" TDirectory; they will only
        represent distributions from this (iEta, iPhi, Slice) value.  Again, the TName's for each TObject
        here will include the string "_iEtaXiPhiYSliceZ_" to ensure tehy are unique.

        In general all TObjcets stored in the output ROOT file will follow a convention for their TNames.
        For one dimensional TObjects we use the following convention/regular expression:

            <TypePrefix>_<Coordinate>_<ObservableNameX>

        For two dimensional TObjects we use the following convention:

            <TypePrefix>_<Coordinate>_<ObservableNameY>_v_<ObservableNameX>

        Where: the "TypePrefix" is described in Section 4.g.i (e.g. for TH1F objcets it is "h"); the
        "Coordinate" is the (iEta,iPhi,iSlice) point of the histogram as described above; the
        "ObservableNameX," and "ObservableNameY" fields are respectively what is plotted on the X & Y access
        of the TObject.

        One top level TDirectory named "Summary" will also exist.  This folder will store a set of histograms
        for each cluster/hit observable.  The contents of these histograms is simply the sum of the
        corresponding SectorEtaX histograms (e.g. TH1::Add() method).

        Additionally the VisualizeUniformity class places additional TObjects (e.g. TCanvas, TMultiGraph, etc...)
        to assist the analyst in making the "pass/fail" statement.  These are desribed below.

            # 4.f.i.I "Segmented" Plots Stored in "Summary" folder
            # --------------------------------------------------------

            Several TCanvas objects with TNames of the form:

                canv_<Detector_Name>_<Observable>_<ReadoutLevel>_Segmented

            will be stored in the folder.  Here the "Detector_Name" is the parameter defined in the given
            configRun.cfg file; "Observable" comes from the set {ClustADC, ClustMulti, ClustPos, ClustSize,
            ClustTime, HitADC, HitMulti, HitPos, HitTime}; and "ReadoutLevel" comes from the set {AllEta, AllPhi}.

            These will show a TCanvas with an array of TPads placed in a columns-by-row grid of (3x8) 2x4 grid
            for (AllPhi) AllEta case.  Each TPad will have iEta index written in the upper left corner of the pad
            and have the corresponding TObject from this ReadoutLevel (e.g. iEta or iPhi) drawn on the pad.

            # 4.f.ii.II "Dataset" Plots Stored in "Summary" folder
            # --------------------------------------------------------

            Several TCanvas objects with TNames of the form:

                canv_<Detector_Name>_<Observable>Dataset_AllEta

            will be stored in the folder along with matching TH1F objects for each TCanvas with the
            TName of the form:

                h_Summary_<Observable>Dataset

            Here the "Detector_Name" is the parameter defined in the given
            configRun.cfg file and "Observable" comes from the set {ResponseFitPkPos, ResponseFitPkRes},
            with expansions possible if requested.

            The x-axis will be the <Observable> in question (e.g. for ResponseFitPkPos this will be the cluster ADC
            of the peak determined from the fit).  The Y-axis will be counts.  These canvases show the distribution
            of the observable in question over the entire detector.  The TH1F in question will always have the bin
            range [Avg - 5 * StdDev, Avg + 5 * StdDev) with a bin width of 0.25 * StdDev.  Here "Avg" is the average
            of the dataset and "StdDev" is the dataset's standard deviation.  This TH1F will also be automatically
            fit with both a Gaussian and a Landau distribution.  The Fit with the lowest Normalized Chi2 value will
            be kept.  The whose mean (MPV) and sigma (scale) parameter of the stored Gaussian (Landau) will be written
            on the TPad.  The percent error of the dataset, defined as sigma / mean (scale / MPV) from the Gaussian
            (Landua), will also be displayed on the TPad.  This offers an "at a glance" look at the total distribution
            for a given observable and may help understand an immediate pass/fail condition.

            # 4.f.i.III 1D Fit Summary Plots Stored in "Summary" folder
            # --------------------------------------------------------

            Several TCanvas objects with TNames of the form:

                canv_<Detector_Name>_<FitObservable>_AllEta

            will be stored in the folder along with matching TMultiGraph objects for each TCanvas with the
            TName of the form:

                mgraph_<Detector_Name>_<FitObservable>_AllEta

            Here the "Detector_Name" is the parameter defined in the given configRun.cfg file. The "FitObservable"
            is from the set {ResponseFitChi2, ResponseFitPkPos, ResponseFitPkRes} for the normalized Chi2 value
            of the fit, determined peak position, and determined peak resolution (see Section 4.e.ii.IV for details),
            respectively.

            # 4.f.i.IV 2D Fit Trapezoidal Map Plots Stored in "Summary" folder
            # --------------------------------------------------------

            Several TCanvas objects with TNames of the form:

                canv_<Detector_Name>_<FitObservable>2D_AllEta

            will be stored in the folder along with matching TGraph2D objects for each TCanvas with the
            TName of the form:

                g2D_<Detector_Name>_<FitObservable>_AllEta

            Note in the case of the TCanvas a "2D" is placed in the TName to distinguish it from the 1D case.
            Here the "Detector_Name" is the parameter defined in the given configRun.cfg file. The "FitObservable"
            is from the set {ResponseFitPkPos, ResponseFitPkPosNormalized, ResponseFitPkRes,
            ResponseFitPkResNormalized}.  For the "Normalized" cases the z-axis at every point will be the point
            divided by the mean of the dataset formed by all points of the FitObservable (e.g. z / z_avg);

            These plots may take some time to load.  This is due to the rendering that is done by ROOT; be
            patient.  Consider transfering the file to your local machine if it is not already.  Once they load
            the plots will show a 3D plot of the detector.  The xy-plane will be the trapezoidal active area
            of the detector and the Z-axis will be the FitObservable.

        # 4.f.i Output ROOT File - Comparison Mode
        # --------------------------------------------------------

        Here the output ROOT file is produced by classes inheriting from VisualizeComparison.  The ROOT file will
        contain a TDirectory whose TName is equal to the value of the "Input_Identifier" field at the time of
        execution.  Inside this folder there will be a TDirectory whose TName is equal to the value of the "Obs_Name"
        field at the time of execution.

        If you have the "Output_File_Option" field equal to "UPDATE" then rather than over-writing the "Output_File_Name"
        TFile everytime it will simply add TDirectories (or sub-TDirectories) to the file.  This is perfect if you
        want to compare multiple "Obs_Name" distributions for the same "Input_Identifier" value.  Additionally you
        could have one TFile store several different "Input_Identifier" top-level TDirectories each with multipler
        "Obs_Name" sub-directories.

        In each "Obs_Name" sub directory you will find a TH1F object from each of the input files you considered on
        execution.  The TNames of these TH1F objects will be equivalent to what they are in their original TFile but
        they will be appended with the "Input_Identifier" field specific to that TFile.  These TH1F objects will
        automatically be drawn on a TCanvas, colored, and placed in a TLegend (also drawn on the TCanvas).  The TName
        of this TCanvas will follow the convention:

            canv_<Input_Identifier>_<Obs_Name>

        Example if you have "Input_Identifier" = ClustTime and you are running over the following list of input files:

            /some/file/path/GE11-VII-L-CERN-0002_Summary_Physics_RandTrig_AgXRay40kV100uA_580uA_15004kEvt_ClustTime1to30_ClustSize1to20_Ana.root
            /some/file/path/GE11-VII-L-CERN-0002_Summary_Physics_RandTrig_AgXRay40kV100uA_580uA_15004kEvt_ClustTime6to27_ClustSize1to20_Ana.root

        The "Obs_Name" sub directory will contain two TH1F objects with their regular TNames appended with "_ClustTime1to30"
        and "ClustTime6to27."  The TCanvas they are drawn on will be named "canv_ClustSize_<Obs_Name>"

        # 4.f.iii Output Text File
        # --------------------------------------------------------

        An output text file will be created that will show in tabular form a table which
        looks like:

                            Cut_HitAdc_Min = 60
                            iEta	iPhi	iStrip
                            1       1       64
                            1       1       65
                            1       2       64
                            1       3       64
                            ...     ...     ...
                            ...     ...     ...
                            7       1       128
                            7       2       1
                            8       3       64
                            8       2       1

        The first row will show Cut_HitAdc_Min, the minimum ADC cut on hits, applied
        during the analysis.

        A strip is considered dead if there are no entries in the corresponding bin of
        hit position histogram at the ieta level.  The algorithm will transpose this
        strip number from iEta numbering, e.g. [1,384], to iPhi numbering [1,128].
        This should allow the user to easily identify which strip on a connector is
        reported as dead.

        Note that having the Cut_HitAdc_Min "too high" may cause strips to be reported
        as dead.  Also when identifying dead strips it is important to understand if
        the problem is a dead strip on the detector or a dead channel on the front end
        used to readout the sector.

    # 4.g. Source Code Name Conventions
    # --------------------------------------------------------

    Developers are asked to adhere to the naming conventions below when working on the code base.  This
    improves readability and lowers the chance that ambiguity enters into the development.

        # 4.g.i. STL Objects
        # --------------------------------------------------------

        For those classes/data types/containers present in the STL the following naming conventions
        should be used:

            #		<TYPE>             <CONVENTION>
                    char                The character 'c' should start the object name, e.g. "cName".

                    int                 The character 'i' should start the object name, e.g. "iNumBins"

                    double              The character 'd' should start the object name, e.g. "dPeakPos"

                    float               The character 'f' should start the object name, e.g. "fPeakPos"

                    map                 For a std::map<T1 key, T2 val> the sequence 'map_' should start the
                                        object name followed by the character/sequence for type T2 if a
                                        convention already exists for it.  Right now T1 is mostly int type
                                        and is not specified.  If no convention for T2 exists use a starting
                                        sequence that is easily identifiable. e.g. "map_strName"
                                        or "map_hClustHisto"

                    multiset            For a std::multiset<T> the sequence 'mset_' should start the object
                                        name followed by the character/sequence for type T if a convention
                                        already exists for it. if no convention for T exists use a starting
                                        sequnce that is easily identified as described in the std::map
                                        description above.

                    shared_ptr          For std::shared_ptr<T> follow the convention for type T.

                    short               The sequence 's' should start the object name, e.g. sADC

                    string              The sequence 'str' should start the object name, e.g. "strName"

                    vector              Follow the convention for std::map but the starting sequence 'vec_'
                                        should be used instead. e.g. "vec_strName" or "vec_hClustHistos"


        # 4.g.i. ROOT Objects
        # --------------------------------------------------------

        For those classes in ROOT that are the following listed classes, or inherit from the following
        listed classes, use the naming conventions outlined below:

            #		<TYPE>             <CONVENTION>
                    TH1                 The character 'h' should start the object name, e.g. hClustADC

                    TH2                 As TH1 but the physical observables of the y & x axes should be
                                        included in the object name in "y vs. x" format,
                                        e.g. hEta_ClustADC_v_ClustPos

                    TF1                 The sequence 'fit' should start the object name, e.g. fitSlice_ClustADC

                    TGraph              The character 'g' should start the object name, e.g. gClustADC

                    TGraph2D            The character 'g2D' should start the object name, e.g. g2D_RespFitPkPos

# 5. Known & Outstanding Issues
# ========================================================

    Please consult the list of known/outstanding issues from the list below. If you do not find your
    issue please navigate to:

        https://github.com/bdorney/CMS_GEM_Analysis_Framework/issues

    And submit a new issue which outlines the problem, the commands exectued, the output error messages
    and a minimal piece of code to repeat the problem.  We will then try to get back to you with a solution.

    ********ISSUE********
    Compiling on MAC OS v10.9.X with g++ (GCC) version 4.9.2 20141029 fails.  This is due to the
    default C++ library in apple software.  Before 10.9.X the default was "libstdc++" but after 10.9.X
    it has been renamed to "libc++".  We have provided a make file for the clang compiler ("Makefile.clang)
    but do not support this computing environemnt since lxplus is so readily accessible and configurable.

    ********ISSUE********
    Running the analyzeUniformity executable in a MAC OS environment hangs indefinitely or seg faults
    when trying to parse the input analysis config file.  This appears to be due to the implementation of
    the standard library in MAC OS.  Specifically in the Timing::getlineNoSpaces() function declared in
    $GEM_BASE/include/TimingUtilityFunctions.h and implemented in $GEM_BASE/src/TimingUtilityFunctions.cpp.
    From what we can tell iterator operation e.g. strString.begin() + iNum seems to cause either a crash
    out right or the stl algorithm std::remove to exit the iterator range given and continue until the
    computer runs out of memory.  Our recommended solution is to use the linux computing environment
    specified above.

    ********ISSUE********
    Running analyzeUniformity executable on linux crashes when parsing the input analysis config file.
    This is a very rare occurrence and it seems to be again coming from Timing::getlineNoSpaces();
    function declared in $GEM_BASE/include/TimingUtilityFunctions.h and implemented in
    $GEM_BASE/src/TimingUtilityFunctions.cpp.  It is believed that for some reason the function tries to
    remove space or tab characters that are not there and return a null pointer causing the seg fault.
    If you identify the line of the input analysis config file the crash occurs at try adding or subtracting
    a few spaces or tabs and then re-running.  This has been seen to solve the issue in the past.  If a
    developer can come up with a better implementation of Timing::getlineNoSpaces() this might solve
    both this issue and the above issue.

    ********ISSUE********
    Runing analyzeUniformity gives error messages when parsing the input analysis config file stating
    it does not recognize a given (field, value) pair even though the field is listed in this README 
    file and have double checked that it is spelled correctly:

        strLine: = Cut_ClusterSize_Min='2';
        ParameterLoaderAnaysis::loadAnalysisParametersUniformity() - Error!!! Parameter Not Recognizd:
        ParameterLoaderAnaysis::loadAnalysisParametersUniformity() - 	Field = CUT_CLUSTERSIZE_MIN
        ParameterLoaderAnaysis::loadAnalysisParametersUniformity() - 	Value = 2

    We are puzzled by this also. Upon inspecting the output histograms it does appear that the specified
    selection cut is correctly applied.  Need to spend sometime with just ParameterLoaderAnalysis to
    understand what is going on.  Open issue.

    ********ISSUE********
    When attempting to run the executable analyzeUniformity I get the following error:

        ./analyzeUniformity: error while loading shared libraries:
        libSpectrum.so: cannot open shared object file: No such file or directory

    You did not run the setup script to initialize the computing environment.  Execute from the base 
    directory of the repository the following command:

        source scripts/setup_CMS_GEM.sh

    Now attempt to re-run the executable.

    ********ISSUE********
    When attempting to compile I get the following error (or similar):

        g++ -g3 -O0 `/bin/root-config --cflags --glibs --libs` -std=c++11 -I include/ -I/include/ -c src/DetectorMPGD.cpp -o src/DetectorMPGD.o  -L /lib/ -lSpectrum
        /bin/sh: /bin/root-config: No such file or directory
        cc1plus: error: unrecognized command line option "-std=c++11"
        make: *** [src/DetectorMPGD.o] Error 1

    You most likely did not run the setup script to initialize the computing environement.  Execute from
    the base directory of the repository the following command:

        source scripts/setup_CMS_GEM.sh

    Now attempt to recompile.

    ********ISSUE********
    When attempting to execute:

        source scripts/setup_CMS_GEM.sh

    The following error message is returned:

        gcc_config_version=4.8.4: Command not found.
        LCGPLAT=x86_64-slc6-gcc48-opt: Command not found.
        LCG_lib_name=lib64: Command not found.
        LCG_arch=x86_64: Command not found.
        BASH: Undefined variable.

    This has been traced to your $SHELL environment.  It seems the setup_CMS_GEM.sh script does not
    execute properly if you are not using zsh.  While we explore solutions to this problem we recommend
    running the framework using zsh.  We apologize for this inconvenience.

    ********ISSUE********
    When attempting to run with the comparison configuration you get a segmentation violation.

    Please double check that your "Obs_Name", "Obs_Eta", "Obs_Phi", and "Obs_Slice" result in a
    valid location within your input TFiles.  Note the value set to "Obs_Name" is case-sensitive.
    Then please try to re-run.

About

Analysis framework for the CMS GEM collaboration

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C++ 99.4%
  • Shell 0.6%