Module: BrighterPlanet::RailTrip::CarbonModel

Defined in:
lib/rail_trip/carbon_model.rb

Class Method Summary collapse

Class Method Details

.included(base) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
# File 'lib/rail_trip/carbon_model.rb', line 25

def self.included(base)
  base.decide :emission, :with => :characteristics do
    ### Emission calculation
    # Returns the `emission` estimate (*kg CO<sub>2</sub>e*).
    committee :emission do
      #### From fuel and passengers
      # **Complies:** GHG Protocol, ISO-140641, Climate Registry Protocol
      #
      # - Checks whether the trip occurred during the `timeframe`
      # - Multiplies `diesel use` (*l diesel*) by the `diesel emission factor` (*kg CO<sub>2</sub>e / l diesel*) to give diesel emissions (*kg CO<sub>2</sub>e*)
      # - Multiplies `electricity use` (*kWh*) by the `electricity emission factor` (*kg CO<sub>2</sub>e / kWh electricity*) to give electricity emissions (*kg CO<sub>2</sub>e*)
      # - Adds diesel and electricity emissions to give total emissions (*kg CO<sub>2</sub>e*)
      # - Divides by passengers to give emissions per passenger (*kg CO<sub>2</sub>e*)
      # - If the trip did not occur during the `timeframe`, `emission` is zero
      quorum 'from date, fuel, emission factors, and passengers', :needs => [:diesel_consumed, :diesel_emission_factor, :electricity_consumed, :electricity_emission_factor, :passengers, :date] do |characteristics, timeframe|
        date = characteristics[:date].is_a?(Date) ? characteristics[:date] : Date.parse(characteristics[:date].to_s)
        if timeframe.include? date
          (characteristics[:diesel_consumed] * characteristics[:diesel_emission_factor] + characteristics[:electricity_consumed] * characteristics[:electricity_emission_factor]) / characteristics[:passengers]
        else
          0
        end
      end
    end
    
    ### Diesel emission factor calculation
    # Returns the `diesel emission factor` (*kg CO<sub>2</sub>e / l*).
    committee :diesel_emission_factor do
      #### Default diesel emission factor
      # **Complies:** GHG Protocol, ISO 14064-1, Climate Registry Protocol
      #
      # Looks up [Distillate Fuel Oil 2](http://data.brighterplanet.com/fuel_types)'s `emission factor` (*kg CO<sub>2</sub>e / l*).
      quorum 'default' do
        diesel = FuelType.find_by_name "Distillate Fuel Oil 2"
        diesel.emission_factor
      end
    end
    
    ### Electricity emission factor calculation
    # Returns the `electricity emission factor` (*kg CO<sub>2</sub>e / kWh*).
    committee :electricity_emission_factor do
      #### Default electricity emission factor
      # **Complies:** GHG Protocol, ISO 14064-1, Climate Registry Protocol
      #
      # - Looks up the [U.S. Average](http://data.brighterplanet.com/egrid_subregions) `electricity emission factor` (*kg CO<sub>2</sub>e / l*)
      # - Looks up the [U.S. Average](http://data.brighterplanet.com/egrid_regions) grid region `loss factor`
      # - Divides the `electricity emission factor` by (1 - `loss factor`) to account for transmission and distribution losses
      quorum 'default' do
        subregion = EgridSubregion.find_by_abbreviation "US"
        region = subregion.egrid_region
        emission_factor = subregion.electricity_emission_factor / (1 - region.loss_factor)
        emission_factor
      end
    end
    
    ### Diesel consumed calculation
    # Returns the `diesel use` (*l*).
    committee :diesel_consumed do
      #### From distance and diesel intensity
      # **Complies:** GHG Protocol, ISO-140641, Climate Registry Protocol
      #
      # Multiplies `distance` (*km*) by `diesel intensity` (*l / km*) to give *l*.
      quorum 'from distance and diesel intensity', :needs => [:distance, :diesel_intensity] do |characteristics|
        characteristics[:distance] * characteristics[:diesel_intensity]
      end
    end
    
    ### Electricity consumed calculation
    # Returns the `electricity use` (*kWh*).
    committee :electricity_consumed do
      #### From distance and electricity intensity
      # **Complies:** GHG Protocol, ISO-140641, Climate Registry Protocol
      #
      # Multiplies `distance` (*km*) by `electricity intensity` (*kWh / km*) to give *kWh*.
      quorum 'from distance and electricity intensity', :needs => [:distance, :electricity_intensity] do |characteristics|
        characteristics[:distance] * characteristics[:electricity_intensity]
      end
    end
    
    ### Distance calculation
    # Returns the `distance` traveled (*km*).
    committee :distance do
      #### Distance from client input
      # **Complies:** All
      #
      # Uses the client-input `distance` (*km*).
      
      #### Distance from duration and speed
      # **Complies:** GHG Protocol, ISO-140641, Climate Registry Protocol
      #
      # Multiplies the `duration` (*hours*) by the `speed` (*km / hour*) to give *km*.
      quorum 'from duration and speed', :needs => [:duration, :speed] do |characteristics|
        characteristics[:duration] * characteristics[:speed]
      end
      
      #### Distance from rail class
      # **Complies:** GHG Protocol, ISO-140641, Climate Registry Protocol
      #
      # Looks up the [rail class](http://data.brighterplanet.com/rail_classes) `distance`.
      quorum 'from rail class', :needs => :rail_class do |characteristics|
        characteristics[:rail_class].distance
      end
    end
    
    ### Duration calculation
    # Returns the trip's `duration` (*hours*).
      #### Duration from client input
      # **Complies:** All
      #
      # Uses the client-input `duration` (*hours*).
    
    ### Diesel intensity calculation
    # Returns the `diesel intensity` (*l / km*).
    committee :diesel_intensity do
      #### Diesel intensity from rail class
      # **Complies:** GHG Protocol, ISO-140641, Climate Registry Protocol
      #
      # Looks up the [rail class](http://data.brighterplanet.com/rail_classes) `diesel intensity`.
      quorum 'from rail class', :needs => :rail_class do |characteristics|
        characteristics[:rail_class].diesel_intensity
      end
    end
    
    ### Electricity intensity calculation
    # Returns the `electricity intensity` (*kWh / km*).
    committee :electricity_intensity do
      #### Electricity intensity from rail class
      # **Complies:** GHG Protocol, ISO-140641, Climate Registry Protocol
      #
      # Looks up the [rail class](http://data.brighterplanet.com/rail_classes) `electricity intensity`.
      quorum 'from rail class', :needs => :rail_class do |characteristics|
        characteristics[:rail_class].electricity_intensity
      end
    end
    
    ### Speed calculation
    # Returns the average `speed` (*km / hour*).
    committee :speed do
      #### Speed from rail class
      # **Complies:** GHG Protocol, ISO-140641, Climate Registry Protocol
      #
      # Looks up the [rail class](http://data.brighterplanet.com/rail_classes) `speed`.
      quorum 'from rail class', :needs => :rail_class, :complies => [:ghg_protocol, :iso, :tcr] do |characteristics|
        characteristics[:rail_class].speed
      end
    end
    
    ### Passengers calculation
    # Returns the total number of `passengers`.
    committee :passengers do
      #### Passengers from rail class
      # **Complies:** GHG Protocol, ISO-140641, Climate Registry Protocol
      #
      # Looks up the [rail class](http://data.brighterplanet.com/rail_classes) `passengers`.
      quorum 'from rail class', :needs => :rail_class, :complies => [:ghg_protocol, :iso, :tcr]  do |characteristics|
        characteristics[:rail_class].passengers
      end
    end
    
    ### Rail class calculation
    # Returns the [rail class](http://data.brighterplanet.com/rail_classes).
    # This is the type of rail the trip used.
    committee :rail_class do
      #### Rail class from client input
      # **Complies:** All
      #
      # Uses the client-input [rail class](http://data.brighterplanet.com/rail_classes).
      
      #### Default rail class
      # **Complies:** GHG Protocol, ISO 14064-1, Climate Registry Protocol
      #
      # Uses an artificial [rail class](http://data.brighterplanet.com/rail_classes) representing the U.S. average.
      quorum 'default', :complies => [:ghg_protocol, :iso, :tcr] do
        RailClass.find_by_name "US average"
      end
    end
    
    ### Date calculation
    # Returns the `date` on which the trip occurred.
    committee :date do
      #### Date from client input
      # **Complies:** All
      #
      # Uses the client-input `date`.
      
      #### Date from timeframe
      # **Complies:** GHG Protocol, ISO-14064-1, Climate Registry Protocol
      #
      # Assumes the trip occurred on the first day of the `timeframe`.
      quorum 'from timeframe', :complies => [:ghg_protocol, :iso, :tcr] do |characteristics, timeframe|
        timeframe.from
      end
    end
    
    ### Timeframe calculation
    # Returns the `timeframe`.
    # This is the period during which to calculate emissions.
      
      #### Timeframe from client input
      # **Complies:** All
      #
      # Uses the client-input `timeframe`.
      
      #### Default timeframe
      # **Complies:** All
      #
      # Uses the current calendar year.
  end
end