WITH Theta AS -- Get total Observation time
(
   SELECT SUM(OnTime) AS ObsTime FROM ThetaDist
),
Area AS -- Get total simulated area
(
   SELECT POW(MinImpactHi,2)*PI() AS Area FROM MonteCarloArea
),
Binning AS -- Create binning and calculate weights per bin
(
   SELECT
      *,
      (%103:binwidth)  AS  Width,   -- Bin Windth in TeV or just 1
      Area*ObsTime  AS  AreaTime    -- Total scale dA*dT
   FROM
      %101:binning
   CROSS JOIN
      Theta, Area
),
Simulated AS -- Summarize simulated (corsika) data in bins
(
   SELECT
      %102:bin,
      SUM(CountN) AS SimCountN,
      SUM(SumW)   AS SimSumW,
      SUM(SumW2)  AS SimSumW2
   FROM
      WeightedOriginalMC
   GROUP BY
      %102:bin
),
Triggered AS -- Summarize triggered (ceres) data in bins
(
   SELECT
      %102:bin,
      SUM(CountN) AS TrigCountN,
      SUM(SumW)   AS TrigSumW,
      SUM(SumW2)  AS TrigSumW2
   FROM
      WeightedEventsMC
   GROUP BY
      %102:bin
),
Analyzed AS -- Summarize data after cuts (analyzed) in bins
(
   SELECT
      %102:bin,

      SUM(SignalN)          AS  SignalN,
      SUM(SignalW)          AS  SignalW,
      SUM(SignalW2)         AS  SignalW2,

      SUM(BackgroundN)/5    AS  BackgroundN,
      SUM(BackgroundW)/5    AS  BackgroundW,
      SUM(BackgroundW2)/25  AS  BackgroundW2,

      SUM(ResidualW)        AS  ResidualW,
      SUM(ResidualW2)       AS  ResidualW2,

      SUM(SumEnergySimW)    AS  SumEnergySimW,
      SUM(SumEnergyEstW)    AS  SumEnergyEstW
   FROM
      AnalysisMC
   GROUP BY
      %102:bin
),
CombinedData AS -- Combine all Data together
(
   SELECT
      *,
      TrigCountN/SimCountN     AS  TriggerEfficiencyN,
      TrigSumW/SimSumW         AS  TriggerEfficiencyW,

      SignalN  - BackgroundN   AS  ExcessN,

      SignalW  - BackgroundW   AS  ExcessW,
      SignalW2 + BackgroundW2  AS  ExcessW2
   FROM
      Simulated
   INNER JOIN
      Triggered USING (%102:bin)
   INNER JOIN
      Analyzed USING (%102:bin)
   INNER JOIN
      Binning ON Simulated.%102:bin=bin
),
Table0 AS   -- Derive valued
(
   SELECT   -- Everything scaled is "Flux", Everything unscaled is without "Flux", Corsika Data is Sim*, Triggered Data is Trig* and data after cuts is without prefix
      *,

      SQRT(SimCountN)                        AS  ErrSimCountN,
      SQRT(TrigCountN)                       AS  ErrTrigCountN,
      SQRT(SignalN)                          AS  ErrSignalN,
      SQRT(BackgroundN)                      AS  ErrBackgroundN,
      SQRT(SignalN + BackgroundN)            AS  ErrExcessN,

      SimSumW              /Width/AreaTime   AS  SimFluxW,
      TrigSumW             /Width/AreaTime   AS  TrigFluxW,
      SignalW              /Width/AreaTime   AS  SignalFluxW,
      BackgroundW          /Width/AreaTime   AS  BackgroundFluxW,
      ExcessW              /Width/AreaTime   AS  ExcessFluxW,

      SQRT(SimSumW2)       /Width/AreaTime   AS  ErrSimFluxW,
      SQRT(TrigSumW2)      /Width/AreaTime   AS  ErrTrigFluxW,
      SQRT(SignalW2)       /Width/AreaTime   AS  ErrSignalFluxW,
      SQRT(BackgroundW2)   /Width/AreaTime   AS  ErrBackgroundFluxW,
      SQRT(ExcessW2)       /Width/AreaTime   AS  ErrExcessFluxW,

      SumEnergyEstW/SignalW                  AS  AvgEnergyEstW,
      SumEnergySimW/SignalW                  AS  AvgEnergySimW,

      Area*TriggerEfficiencyN                AS  EffectiveAreaN,
      Area*TriggerEfficiencyW                AS  EffectiveAreaW,

      SignalN/TrigCountN                     AS  CutEfficiencyN,
      IF(ExcessW<0, 0, ExcessW/TrigSumW)     AS  CutEfficiencyW,

      TriggerEfficiencyN * SQRT(1/TrigCountN + 1/SimCountN)                          AS  ErrTriggerEfficiencyN,
      TriggerEfficiencyW * SQRT(TrigSumW2/POW(TrigSumW,2) + SimSumW2/POW(SimSumW,2)) AS  ErrTriggerEfficiencyW,

      IF(SignalW>0, ResidualW/SignalW,                                                             NULL)  AS  BiasW,
      IF(SignalW>0, ResidualW/SignalW*SQRT(ResidualW2/POW(ResidualW,2) + SignalW2/POW(SignalW,2)), NULL)  AS  ErrBiasW,
      IF(SignalW>0, SQRT(ResidualW2/SignalW - POW(ResidualW/SignalW, 2)),                          NULL)  AS  ResolutionW,

      (SUM(SignalW)       OVER Integral)                     AS  IntegralSignalW,
      (SUM(SignalW)       OVER Integral) / AreaTime          AS  IntegralSignalFluxW,
      (SUM(BackgroundW)   OVER Integral) / AreaTime          AS  IntegralBackgroundFluxW,
      (SUM(SignalW2)      OVER Integral) / POW(AreaTime, 2)  AS  IntegralSignalFluxW2,
      (SUM(BackgroundW2)  OVER Integral) / POW(AreaTime, 2)  AS  IntegralBackgroundFluxW2,

      (SUM(SimSumW)       OVER Integral) / AreaTime          AS  IntegralSimFluxW,
      (SUM(SimSumW2)      OVER Integral) / POW(AreaTime, 2)  AS  IntegralSimFluxW2,

      (SUM(SumEnergySimW) OVER Integral)                     AS  IntegralEnergySimW,
      (SUM(SumEnergyEstW) OVER Integral)                     AS  IntegralEnergyEstW
   FROM
      CombinedData
   WINDOW
      Integral AS (ORDER BY %102:bin DESC)
)
SELECT -- Return derived values and result
   *,

   Area*ErrTriggerEfficiencyN  AS  ErrEffectiveAreaN,
   Area*ErrTriggerEfficiencyW  AS  ErrEffectiveAreaW,

   CutEfficiencyN*SQRT(1/SignalN + 1/TrigCountN)                             AS  ErrCutEfficiencyN,
   CutEfficiencyW*SQRT(ExcessW2/POW(ExcessW,2) + TrigSumW2/POW(TrigSumW,2))  AS  ErrCutEfficiencyW,

   IntegralSignalFluxW - IntegralBackgroundFluxW        AS  IntegralExcessFluxW,
   SQRT(IntegralSignalFluxW2+IntegralBackgroundFluxW2)  AS  ErrIntegralExcessFluxW,
   SQRT(IntegralSignalFluxW2)                           AS  ErrIntegralSignalFluxW,
   SQRT(IntegralBackgroundFluxW2)                       AS  ErrIntegralBackgroundFluxW,
   SQRT(IntegralSimFluxW2)                              AS  ErrIntegralSimFluxW,

   IntegralEnergyEstW/IntegralSignalW                   AS  AvgIntegralEnergyEstW,
   IntegralEnergySimW/IntegralSignalW                   AS  AvgIntegralEnergySimW

FROM
   Table0
