diff --git a/aggregateShocks.R b/aggregateShocks.R
new file mode 100644
index 0000000000000000000000000000000000000000..bde754eefbcfd9f9a5a3edec2c760bc9bebc06fa
--- /dev/null
+++ b/aggregateShocks.R
@@ -0,0 +1,26 @@
+#
+# aggregate the flood2010 and earthquake scenarios to country level
+# 
+
+source('funAggregateNuts2CNT.R')
+codes <- read.csv("helperData/nuts3fid4Codes.csv")
+codes <- codes[,c('fid4','CNTR_CODE','CNTR_NAME','CNTR_CODE_iso2','CNTR_CODE_iso3','CNTR_CODE_Eurostat')]
+codes <- codes[!duplicated(codes),]
+
+# files to aggregate
+
+files <- list.files('scenarios',pattern = 'csv',recursive = T)
+files <- paste0('scenarios/',files[grep('.csv$(?<!aggCNT.csv)',files,perl=T)])
+files <- files[grep('.csv$(?<!rel.csv)',files,perl=T)]
+cat('Aggregating NUTS3 to CNT for...\n')
+for(f.i in 1:length(files)){
+	file <- files[f.i]
+	cat(sprintf('%i of %i %s\n',f.i, length(files),file))
+	data <- read.csv(file,row.names=NULL)
+	if(!('fid4'%in%names(data))){
+		cat('    fid4 col missing probably already country level data\n')
+	} else {
+		data.CNT <- aggregateNUTS3ToCountry(data,codes)
+		write.csv(data.CNT,gsub('.csv','-aggCNT.csv',file),row.names = F)
+	}
+}
diff --git a/funAggregateNuts2CNT.R b/funAggregateNuts2CNT.R
new file mode 100644
index 0000000000000000000000000000000000000000..90028f34278ab36201eb06f7657f93d9d44ea329
--- /dev/null
+++ b/funAggregateNuts2CNT.R
@@ -0,0 +1,18 @@
+aggregateNUTS3ToCountry <- function(data,codes){
+	sectorCols <- grep('ALL|TOTAL|^[A-Z]$',names(data),perl = T)
+	for(s in sectorCols){
+		suppressWarnings(data[[s]] <- as.numeric(data[[s]]))
+	}
+	data[is.na(data)] <- 0
+	if(!('CNTR_CODE'%in%names(data))){
+		data <- merge(codes,data,by = 'fid4')
+	}
+	sectorCols <- grep('ALL|TOTAL|^[A-Z]$',names(data),perl = T)
+	data <- aggregate(data[,c(sectorCols)],
+											 by = list(Category=data$CNTR_CODE),FUN=sum)
+	names(data)[1] <- 'CNTR_CODE'
+	codesCNT <- codes[,-1]
+	codesCNT <- codesCNT[!duplicated(codesCNT),]
+	data <- merge(codesCNT,data)
+	return(data)
+}
diff --git a/funRelData.R b/funRelData.R
new file mode 100644
index 0000000000000000000000000000000000000000..1b3cb75a4817a5e3abb3a20334ffb2b882615093
--- /dev/null
+++ b/funRelData.R
@@ -0,0 +1,33 @@
+relData <- function(data,stocksNUTS3=NULL,stocksCNT=NULL){
+	names(data)[names(data)=='ALL'] <- 'TOTAL'
+	names(stocksNUTS3)[names(stocksNUTS3)=='ALL'] <- 'TOTAL'
+	names(stocksCNT)[names(stocksCNT)=='ALL'] <- 'TOTAL'
+	sectorCols <- grep('ALL|TOTAL|^[A-Z]$',names(data),perl = T)
+	data.rel <- data
+	data.rel[,sectorCols] <- NA
+	for(i in 1:nrow(data)){
+		if('fid4' %in% names(data)){
+			stocks <- stocksNUTS3
+			rowInStocks <- which(stocks$fid4 == data$fid4[i])
+		} else if (nchar(data$CNTR_CODE[i])==2){
+			stocks <- stocksCNT
+			rowInStocks <- which(stocks$CNTR_CODE_Eurostat == data$CNTR_CODE[i])
+			if(length(rowInStocks)==0){
+				rowInStocks <- which(stocks$CNTR_CODE_iso2== data$CNTR_CODE[i])
+			} 
+		} else if (nchar(data$CNTR_CODE[i])==3){
+			stocks <- stocksCNT
+			rowInStocks <- which(stocks$CNTR_CODE_iso3 == data$CNTR_CODE[i])
+		}
+		if(length(rowInStocks)==0){
+			warning(paste('no region match for data row',i))
+		}
+		for(s in names(data)[sectorCols]){
+			suppressWarnings(data.rel[i,s] <- as.numeric(data[i,s]) / as.numeric(stocks[rowInStocks,s]))
+			if (is.nan(data.rel[i,s])|is.na(data.rel[i,s])){
+				data.rel[i,s] <- 0
+			}
+		}
+	}
+	return(data.rel)
+}
diff --git a/relativizeShocks.R b/relativizeShocks.R
new file mode 100644
index 0000000000000000000000000000000000000000..6a2fdc19e03e7cd49e962a0ce376fcd53ad7fdc0
--- /dev/null
+++ b/relativizeShocks.R
@@ -0,0 +1,23 @@
+#
+# Uses the stocks in the flood scenario 2 and in the country level aggregate stocks derived
+# from it to relativize the shocks in the earthquake and flood1 scenarios.
+# 
+
+source('funRelData.R')
+
+nuts3LevelStocks <- read.csv("helperData/nuts3LevelStocks.csv", row.names=NULL)
+countryLevelStocks <- read.csv("helperData/countryLevelStocks.csv", row.names=NULL)
+
+
+files <- list.files('scenarios',pattern = 'csv',recursive = T)
+files <- paste0('scenarios/',files[grep('.csv$(?<!rel.csv)',files,perl=T)])
+cat('Calculating relative impacts for...\n')
+for(f.i in 1:length(files)){
+	file <- files[f.i]
+	cat(sprintf('%i of %i %s\n',f.i, length(files),file))
+	data <- read.csv(file,row.names=NULL)
+	data.CNT <- relData(data,nuts3LevelStocks,countryLevelStocks)
+	write.csv(data.CNT,gsub('.csv','-rel.csv',file),row.names = F)
+}
+
+
diff --git a/stockAggregation.R b/stockAggregation.R
new file mode 100644
index 0000000000000000000000000000000000000000..9c7cdad179054bb1221f2a1caac7deccf11b0b22
--- /dev/null
+++ b/stockAggregation.R
@@ -0,0 +1,72 @@
+# 
+# Aggregate NUTS3 scenario data to country level
+# 
+# library(sf)
+# worldAdmin1 <- read_sf('scenarios/ne_10m_admin_1_states_provinces/ne_10m_admin_1_states_provinces.shp')
+
+# read scenario file with NUTS3 data ####
+library(readxl)
+library(countrycode)
+# skip two rows so headings are the NACE letters
+stocksNUTS3 <- read_excel("scenarios/flood Scenario 2.0/Flood_Scenario_2010.xlsx", 
+										 sheet = "stocks")
+stockCols <- grep('STOCK',names(stocksNUTS3))
+for( n in grep('STOCK',names(stocksNUTS3))){
+	colnames(stocksNUTS3)[n] <- stocksNUTS3[[n]][2]
+}
+stockUnit <- 'mEUR'
+stockTypes <- stocksNUTS3[3,stockCols]
+stockLabels <- stocksNUTS3[1,stockCols]
+stocksNUTS3 <- stocksNUTS3[-(1:5),]
+for( n in colnames(stocksNUTS3)[stockCols]){
+	stocksNUTS3[[n]] <- as.numeric(stocksNUTS3[[n]])
+}
+stocksNUTS3$CNTR_CODE[stocksNUTS3$CNTR_CODE=='SRB_1'] <- 'SRB'
+stocksNUTS3$CNTR_CODE[stocksNUTS3$CNTR_CODE=='RS'] <- 'SRB'
+stocksNUTS3 <- stocksNUTS3[order(stocksNUTS3$CNTR_CODE),]
+suppressWarnings(stocksNUTS3$CNTR_CODE_iso3 <- countrycode(stocksNUTS3$CNTR_CODE,'eurostat','iso3c'))
+stocksNUTS3$CNTR_CODE_iso3[is.na(stocksNUTS3$CNTR_CODE_iso3)] <- countrycode(stocksNUTS3$CNTR_CODE[is.na(stocksNUTS3$CNTR_CODE_iso3)],'iso3c','iso3c')
+stocksNUTS3$CNTR_NAME <- countrycode(stocksNUTS3$CNTR_CODE_iso3,'iso3c','iso.name.en')
+stocksNUTS3$CNTR_CODE_Eurostat <- countrycode(stocksNUTS3$CNTR_CODE_iso3,'iso3c','eurostat')
+stocksNUTS3$CNTR_CODE_iso2 <- countrycode(stocksNUTS3$CNTR_CODE_iso3,'iso3c','iso2c')
+stocksNUTS3 <- stocksNUTS3[,c(1:5,29,30,31,28,6:27)]
+write.csv(stocksNUTS3,file = 'helperData/nuts3LevelStocks.csv',row.names=F)
+codes <- stocksNUTS3[,1:9]
+write.csv(codes,file = 'helperData/nuts3fid4Codes.csv',row.names=F)
+sink('helperData/nuts3LevelStocksMetadata.csv')
+cat(sprintf('Unit %s,,\n',stockUnit))
+cat(sprintf('Labels,, \n'))
+cat(sprintf('Sector,Label,Type\n'))
+sectorCols <- grep('ALL|TOTAL|^[A-Z]$',names(stocksNUTS3),perl = T)
+for(n in colnames(stocksNUTS3)[sectorCols]){	
+	cat(sprintf('"%s", "%s", "%s"\n',n,stockLabels[n],stockTypes[n]))
+}
+sink()
+
+
+# aggregate to country level
+sectorCols <- grep('ALL|TOTAL|^[A-Z]$',names(stocksNUTS3),perl = T)
+stocksCNT <- aggregate(stocksNUTS3[,sectorCols],
+											 by = list(Category=stocksNUTS3$CNTR_CODE),FUN=sum)
+colnames(stocksCNT)[1] <- 'CNTR_CODE'
+# add country codes and country names back to data
+# two and three letter country codes as seperate columns
+library(countrycode)
+stocksCNT$CNTR_CODE[stocksCNT$CNTR_CODE=='SRB_1'] <- 'SRB'
+stocksCNT$CNTR_CODE[stocksCNT$CNTR_CODE=='RS'] <- 'SRB'
+suppressWarnings(stocksCNT$CNTR_CODE_iso3 <- countrycode(stocksCNT$CNTR_CODE,'eurostat','iso3c'))
+stocksCNT$CNTR_CODE_iso3[is.na(stocksCNT$CNTR_CODE_iso3)] <- countrycode(stocksCNT$CNTR_CODE[is.na(stocksCNT$CNTR_CODE_iso3)],'iso3c','iso3c')
+stocksCNT$CNTR_NAME <- countrycode(stocksCNT$CNTR_CODE_iso3,'iso3c','iso.name.en')
+stocksCNT$CNTR_CODE_Eurostat <- countrycode(stocksCNT$CNTR_CODE_iso3,'iso3c','eurostat')
+stocksCNT$CNTR_CODE_iso2 <- countrycode(stocksCNT$CNTR_CODE_iso3,'iso3c','iso2c')
+stocksCNT <- stocksCNT[,c(25,26,27,24,2:23)]
+write.csv(stocksCNT,file = 'helperData/countryLevelStocks.csv',row.names = F)
+sink('helperData/countryLevelStocksMetadata.csv')
+cat(sprintf('Unit %s,,\n',stockUnit))
+cat(sprintf('Labels,, \n'))
+cat(sprintf('Sector,Label,Type\n'))
+sectorCols <- grep('ALL|TOTAL|^[A-Z]$',names(stocksNUTS3),perl = T)
+for(n in colnames(stocksNUTS3)[sectorCols]){	
+	cat(sprintf('"%s", "%s", "%s"\n',n,stockLabels[n],stockTypes[n]))
+}
+sink()