Skip to content
Snippets Groups Projects
CropUsageReader.java 2.96 KiB
Newer Older
Peter Alexander's avatar
Peter Alexander committed
package ac.ed.lurg.landuse;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import ac.ed.lurg.ModelConfig;
import ac.ed.lurg.country.CompositeCountry;
import ac.ed.lurg.country.CompositeCountryManager;
Peter Alexander's avatar
Peter Alexander committed
import ac.ed.lurg.country.CountryManager;
import ac.ed.lurg.country.SingleCountry;
Peter Alexander's avatar
Peter Alexander committed
import ac.ed.lurg.types.CropType;
import ac.ed.lurg.utils.LazyHashMap;
import ac.ed.lurg.utils.LogWriter;

public class CropUsageReader {
	private static final int COUNTRY_COL = 1; 
	private static final int COMMODITY_COL = 0; 
	private static final int NET_IMPORT_COL = 3; 
	private CompositeCountryManager compositeCountryManager;
	
	public CropUsageReader(CompositeCountryManager compositeCountryManager) {
		this.compositeCountryManager = compositeCountryManager;
	}

Peter Alexander's avatar
Peter Alexander committed
	@SuppressWarnings("serial")
	public Map<CompositeCountry, Map<CropType, CropUsageData>> getCommodityData() {
		LazyHashMap<CompositeCountry, Map<CropType, CropUsageData>> commodityMap = new LazyHashMap<CompositeCountry, Map<CropType, CropUsageData>>() {
			protected Map<CropType, CropUsageData> createValue() { 
				Map<CropType, CropUsageData> countryData = new HashMap<CropType, CropUsageData>();
				countryData.put(CropType.ENERGY_CROPS, new CropUsageData(Double.NaN, Double.NaN, 0.0, Double.NaN,Double.NaN, Double.NaN, Double.NaN)); // 2nd generation energy crops not in FAO data, so adding zero values.
		String filename = ModelConfig.NET_IMPORTS_FILE;
Peter Alexander's avatar
Peter Alexander committed
		try {
			BufferedReader fitReader = new BufferedReader(new FileReader(filename)); 
			String line, countryName, commodityName;
Peter Alexander's avatar
Peter Alexander committed
			fitReader.readLine(); // read header

			while ((line=fitReader.readLine()) != null) {
				String[] tokens = line.split(",");
				
Peter Alexander's avatar
Peter Alexander committed
					LogWriter.printlnError("Too few columns in " + filename + ", " + line);
				
				countryName = tokens[COUNTRY_COL];
				commodityName = tokens[COMMODITY_COL];
				netImports = Double.parseDouble(tokens[NET_IMPORT_COL]);

				SingleCountry country = CountryManager.getForName(countryName);
				
Peter Alexander's avatar
Peter Alexander committed
				CropType crop = CropType.getForFaoName(commodityName);
				CompositeCountry cc = compositeCountryManager.getForSingleCountry(country);
				
				Map<CropType, CropUsageData> countryData = commodityMap.lazyGet(cc);
				CropUsageData oldData = countryData.get(crop);
				
				// aggregate if multiple countries for cc
				if (oldData != null) {
					netImports += oldData.getNetImports();
				}
				CropUsageData newData = new CropUsageData(Double.NaN, Double.NaN, netImports, Double.NaN,Double.NaN, Double.NaN, Double.NaN);
				countryData.put(crop, newData);
Peter Alexander's avatar
Peter Alexander committed
			} 
			fitReader.close(); 
		
		} catch (IOException e) {
			LogWriter.printlnError("Failed in reading commodity demand fits");
			LogWriter.print(e);
Peter Alexander's avatar
Peter Alexander committed
		}
		LogWriter.println("Processed " + filename + ", create " + commodityMap.size() + " country commodity maps values");
		
		return commodityMap;
	}
}