Skip to content

Commit aa38517

Browse files
authored
Merge pull request #127 from moia-oss/master
Update MATSim CW 6
2 parents 5889452 + b9d66ad commit aa38517

File tree

291 files changed

+14823
-2307
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

291 files changed

+14823
-2307
lines changed

contribs/application/src/main/java/org/matsim/application/CommandRunner.java

+24-24
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,18 @@ public void run(Path input) {
7575
for (Map.Entry<Class<? extends MATSimAppCommand>, String[]> e : args.entrySet()) {
7676
Class<? extends MATSimAppCommand> clazz = e.getKey();
7777
graph.addVertex(clazz);
78-
Class<? extends MATSimAppCommand>[] depends = ApplicationUtils.getSpec(clazz).dependsOn();
79-
for (Class<? extends MATSimAppCommand> d : depends) {
80-
graph.addVertex(d);
81-
graph.addEdge(d, clazz);
78+
Dependency[] depends = ApplicationUtils.getSpec(clazz).dependsOn();
79+
80+
boolean hasDependencies = false;
81+
for (Dependency d : depends) {
82+
// Add dependency graph if the dependency is executed as well
83+
if (args.containsKey(d.value())) {
84+
graph.addVertex(d.value());
85+
graph.addEdge(d.value(), clazz);
86+
hasDependencies = true;
87+
}
8288
}
83-
if (depends.length == 0)
89+
if (!hasDependencies)
8490
start.add(clazz);
8591
}
8692

@@ -142,33 +148,27 @@ private String[] createArgs(Class<? extends MATSimAppCommand> command, String[]
142148
for (String require : spec.requires()) {
143149

144150
// Whether this file is produced by a dependency
145-
boolean depFile = false;
146151
String arg = "--input-" + InputOptions.argName(require);
147152

148153
boolean present = ArrayUtils.contains(existingArgs, arg);
149154
if (present)
150155
continue;
151156

152-
for (Class<? extends MATSimAppCommand> depend : spec.dependsOn()) {
153-
CommandSpec dependency = ApplicationUtils.getSpec(depend);
154-
if (ArrayUtils.contains(dependency.produces(), require)) {
155-
156-
String path = getPath(depend, require);
157+
// Look for this file on the input
158+
String path = ApplicationUtils.matchInput(require, input).toString();
159+
args.add(arg);
160+
args.add(path);
161+
}
157162

163+
for (Dependency depend : spec.dependsOn()) {
164+
for (String file : depend.files()) {
165+
String arg = "--input-" + InputOptions.argName(file);
166+
if (!ArrayUtils.contains(existingArgs, arg)) {
167+
String path = getPath(depend.value(), file);
158168
args.add(arg);
159169
args.add(path);
160-
161-
// Add arg for this file
162-
depFile = true;
163170
}
164171
}
165-
166-
// Look for this file on the input
167-
if (!depFile) {
168-
String path = ApplicationUtils.matchInput(require, input).toString();
169-
args.add(arg);
170-
args.add(path);
171-
}
172172
}
173173

174174
if (spec.requireEvents() && !ArrayUtils.contains(existingArgs, "--events")) {
@@ -308,9 +308,9 @@ public void add(Class<? extends MATSimAppCommand> command, String... args) {
308308
CommandSpec spec = ApplicationUtils.getSpec(command);
309309

310310
// Add dependent classes
311-
for (Class<? extends MATSimAppCommand> depends : spec.dependsOn()) {
312-
if (!this.args.containsKey(depends))
313-
add(depends);
311+
for (Dependency depends : spec.dependsOn()) {
312+
if (depends.required() && !this.args.containsKey(depends.value()))
313+
add(depends.value());
314314
}
315315
}
316316

contribs/application/src/main/java/org/matsim/application/CommandSpec.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@
4848
String[] produces() default {};
4949

5050
/**
51-
* Other commands that produce the input needed by this command.
51+
* Other commands that produce input needed by this command.
5252
*/
53-
Class<? extends MATSimAppCommand>[] dependsOn() default {};
53+
Dependency[] dependsOn() default {};
5454

5555
/**
5656
* Group name / identifier. Will use the package name if this is not changed here.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package org.matsim.application;
2+
3+
import java.lang.annotation.ElementType;
4+
import java.lang.annotation.Retention;
5+
import java.lang.annotation.RetentionPolicy;
6+
import java.lang.annotation.Target;
7+
8+
/**
9+
* Defines a dependency to be used in a {@link CommandSpec}.
10+
* This annotation is not used directly on other classes.
11+
*/
12+
@Retention(RetentionPolicy.RUNTIME)
13+
@Target(ElementType.TYPE_USE)
14+
public @interface Dependency {
15+
16+
/**
17+
* Analysis command required by this command.
18+
*/
19+
Class<? extends MATSimAppCommand> value();
20+
21+
/**
22+
* List of file names that are used as input for this class.
23+
*/
24+
String[] files() default {};
25+
26+
/**
27+
* Whether this dependency is required.
28+
*/
29+
boolean required() default false;
30+
31+
}

contribs/application/src/main/java/org/matsim/application/analysis/emissions/AirPollutionAnalysis.java

+71-9
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
11
package org.matsim.application.analysis.emissions;
22

3-
import it.unimi.dsi.fastutil.floats.FloatArrayList;
4-
import it.unimi.dsi.fastutil.floats.FloatFloatPair;
5-
import it.unimi.dsi.fastutil.floats.FloatList;
6-
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
7-
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
83
import it.unimi.dsi.fastutil.objects.Object2DoubleLinkedOpenHashMap;
94
import it.unimi.dsi.fastutil.objects.Object2DoubleMap;
10-
import it.unimi.dsi.fastutil.objects.Object2FloatMap;
11-
import it.unimi.dsi.fastutil.objects.Object2FloatOpenHashMap;
125
import org.apache.avro.file.CodecFactory;
136
import org.apache.avro.file.DataFileWriter;
147
import org.apache.avro.io.DatumWriter;
@@ -25,7 +18,6 @@
2518
import org.matsim.application.ApplicationUtils;
2619
import org.matsim.application.CommandSpec;
2720
import org.matsim.application.MATSimAppCommand;
28-
import org.matsim.application.avro.AvroNetwork;
2921
import org.matsim.application.avro.XYTData;
3022
import org.matsim.application.options.InputOptions;
3123
import org.matsim.application.options.OutputOptions;
@@ -34,6 +26,7 @@
3426
import org.matsim.contrib.analysis.time.TimeBinMap;
3527
import org.matsim.contrib.emissions.EmissionModule;
3628
import org.matsim.contrib.emissions.Pollutant;
29+
import org.matsim.contrib.emissions.analysis.EmissionsByVehicleTypeEventHandler;
3730
import org.matsim.contrib.emissions.analysis.EmissionsOnLinkEventHandler;
3831
import org.matsim.contrib.emissions.analysis.FastEmissionGridAnalyzer;
3932
import org.matsim.contrib.emissions.analysis.Raster;
@@ -48,6 +41,7 @@
4841
import org.matsim.core.scenario.ProjectionUtils;
4942
import org.matsim.core.scenario.ScenarioUtils;
5043
import org.matsim.core.utils.io.IOUtils;
44+
import org.matsim.vehicles.VehicleType;
5145
import picocli.CommandLine;
5246

5347
import java.io.IOException;
@@ -68,7 +62,9 @@
6862
"emissions_per_link_per_m.csv",
6963
"emissions_grid_per_hour.%s",
7064
"emissions_vehicle_info.csv",
71-
"emissions_grid_per_day.%s"
65+
"emissions_grid_per_day.%s",
66+
"emissions_per_vehicle_type.csv",
67+
"emissions_per_network_mode.csv"
7268
}
7369
)
7470
public class AirPollutionAnalysis implements MATSimAppCommand {
@@ -79,10 +75,13 @@ public class AirPollutionAnalysis implements MATSimAppCommand {
7975
private final InputOptions input = InputOptions.ofCommand(AirPollutionAnalysis.class);
8076
@CommandLine.Mixin
8177
private final OutputOptions output = OutputOptions.ofCommand(AirPollutionAnalysis.class);
78+
8279
@CommandLine.Mixin
8380
private final ShpOptions shp = new ShpOptions();
81+
8482
@CommandLine.Mixin
8583
private SampleOptions sample;
84+
8685
@CommandLine.Option(names = "--grid-size", description = "Grid size in meter", defaultValue = "100")
8786
private double gridSize;
8887

@@ -126,7 +125,11 @@ public void install() {
126125
String eventsFile = ApplicationUtils.matchInput("events", input.getRunDirectory()).toString();
127126

128127
EmissionsOnLinkEventHandler emissionsEventHandler = new EmissionsOnLinkEventHandler(3600, 86400);
128+
EmissionsByVehicleTypeEventHandler emissionsByVehicleType = new EmissionsByVehicleTypeEventHandler(scenario.getVehicles(), filteredNetwork);
129+
129130
eventsManager.addHandler(emissionsEventHandler);
131+
eventsManager.addHandler(emissionsByVehicleType);
132+
130133
eventsManager.initProcessing();
131134
MatsimEventsReader matsimEventsReader = new MatsimEventsReader(eventsManager);
132135
matsimEventsReader.readFile(eventsFile);
@@ -135,6 +138,9 @@ public void install() {
135138
log.info("Finish processing...");
136139
eventsManager.finishProcessing();
137140

141+
writeEmissionsByVehicleType(emissionsByVehicleType);
142+
writeEmissionsByNetworkMode(emissionsByVehicleType);
143+
138144
writeOutput(filteredNetwork, emissionsEventHandler);
139145

140146
writeTotal(filteredNetwork, emissionsEventHandler);
@@ -164,6 +170,62 @@ private Config prepareConfig() {
164170
return config;
165171
}
166172

173+
private void writeEmissionsByNetworkMode(EmissionsByVehicleTypeEventHandler emissionsByVehicleType) throws IOException {
174+
175+
log.info("Writing emissions by vehicle type...");
176+
Map<String, Object2DoubleMap<Pollutant>> pollutants = emissionsByVehicleType.getByNetworkMode();
177+
178+
CSVPrinter emissionsCSV = new CSVPrinter(Files.newBufferedWriter(output.getPath("emissions_per_network_mode.csv")), CSVFormat.DEFAULT);
179+
180+
emissionsCSV.print("vehicleType");
181+
emissionsCSV.print("pollutant");
182+
emissionsCSV.print("value");
183+
emissionsCSV.println();
184+
185+
for (Map.Entry<String, Object2DoubleMap<Pollutant>> entry : pollutants.entrySet()) {
186+
String vehicleTypeId = entry.getKey();
187+
Object2DoubleMap<Pollutant> emissionMap = entry.getValue();
188+
189+
for (Pollutant pollutant : Pollutant.values()) {
190+
double emissionValue = emissionMap.getDouble(pollutant);
191+
emissionsCSV.print(vehicleTypeId);
192+
emissionsCSV.print(pollutant);
193+
emissionsCSV.print(emissionValue * sample.getUpscaleFactor());
194+
emissionsCSV.println();
195+
}
196+
}
197+
198+
emissionsCSV.close();
199+
}
200+
201+
private void writeEmissionsByVehicleType(EmissionsByVehicleTypeEventHandler emissionsByVehicleType) throws IOException {
202+
203+
log.info("Writing emissions by vehicle type...");
204+
Map<Id<VehicleType>, Object2DoubleMap<Pollutant>> pollutants = emissionsByVehicleType.getByVehicleType();
205+
206+
CSVPrinter emissionsCSV = new CSVPrinter(Files.newBufferedWriter(output.getPath("emissions_per_vehicle_type.csv")), CSVFormat.DEFAULT);
207+
208+
emissionsCSV.print("vehicleType");
209+
emissionsCSV.print("pollutant");
210+
emissionsCSV.print("value");
211+
emissionsCSV.println();
212+
213+
for (Map.Entry<Id<VehicleType>, Object2DoubleMap<Pollutant>> entry : pollutants.entrySet()) {
214+
Id<VehicleType> vehicleTypeId = entry.getKey();
215+
Object2DoubleMap<Pollutant> emissionMap = entry.getValue();
216+
217+
for (Pollutant pollutant : Pollutant.values()) {
218+
double emissionValue = emissionMap.getDouble(pollutant);
219+
emissionsCSV.print(vehicleTypeId);
220+
emissionsCSV.print(pollutant);
221+
emissionsCSV.print(emissionValue * sample.getUpscaleFactor());
222+
emissionsCSV.println();
223+
}
224+
}
225+
226+
emissionsCSV.close();
227+
}
228+
167229

168230
private void writeOutput(Network network, EmissionsOnLinkEventHandler emissionsEventHandler) throws IOException {
169231

0 commit comments

Comments
 (0)