## ------------------------------------------------------------------------------ ##
## Shire HAE model
## Use this R file to generate virtual patient samples
## ------------------------------------------------------------------------------ ##

if (require(MASS) == FALSE) {
	install.packages('MASS')
}
library(MASS)
source('Init_HAE.r')
source('SimInput_HAE.r')
source('Param_HAE.r')


cat(paste('Generating HAE virtual patients with acute attacks and missing doses for Lanadelumab...\n'))
patients_info <- c()
for (ptID in seq(num_patients)) {
	nrow <- length(popPK_Param_info[,1])
	body_weight <- weight_Param_info$mean
	sample <- popPK_Param_info$Eta_Mean
	if (ptID > 1) {
		mean <- weight_Param_info$mean
		variance <- weight_Param_info$stdev^2
		log_mean <- log(mean/sqrt(1+variance/mean^2))
		log_std <- sqrt(log(1+variance/mean^2))
		body_weight <- rlnorm(1, meanlog = log_mean, sdlog = log_std)
		while (body_weight < weight_Param_info$min | body_weight > weight_Param_info$max) {
			body_weight <- rlnorm(1, meanlog = log_mean, sdlog = log_std)
		}
		mean_PK <- popPK_Param_info$Eta_Mean
		cov_PK <- diag(popPK_Param_info$Eta_Cov, nrow, nrow)
		outlier <- FALSE
		while (!outlier) {
			sample <- mvrnorm(1, mean_PK, cov_PK)
			for (i in seq(nrow)) {
				value <- (popPK_Param_info[i,]$mean*(body_weight/weight_Param_info$normal)^popPK_Param_info[i,]$WT_exponent)*exp(sample[i])
				if (value < popPK_Param_info[i,]$min | value > popPK_Param_info[i,]$max) {
					break
				} else {
					if (i == nrow) outlier <- TRUE
				}
			}
		}
	}
	sampled_PK <- c()
	for (i in seq(nrow)) {
		sampled_value <- (popPK_Param_info[i,]$mean*(body_weight/weight_Param_info$normal)^popPK_Param_info[i,]$WT_exponent)*exp(sample[i])
		sampled_PK <- c(sampled_PK, round(sampled_value, popPK_Param_info[i,]$digits))
	}
	
	num_AA_quarterly_sampled <- rnorm(1, mean = AA_quarterly_freq_info$mean, sd = AA_quarterly_freq_info$stdev)
	while (num_AA_quarterly_sampled < AA_quarterly_freq_info$min | num_AA_quarterly_sampled > AA_quarterly_freq_info$max) {
		num_AA_quarterly_sampled <- rnorm(1, mean = AA_quarterly_freq_info$mean, sd = AA_quarterly_freq_info$stdev)
	}
	tp_duration_in_hr <- time_end
	max_num_events <- Max_Num_of_AA
	hours_in_a_quarter = 24*7*4*3
	num_rounded_event <- as.integer((1.0*tp_duration_in_hr)/hours_in_a_quarter*num_AA_quarterly_sampled) + 1
	if (num_rounded_event < min_num_events) num_rounded_event = min_num_events
	if (num_rounded_event > max_num_events) num_rounded_event = max_num_events
	rateParameter <- 1.0/(hours_in_a_quarter/num_AA_quarterly_sampled)
	events_timing <- c()
	events_fold <- c()
	tprevious <- 0
	for (ith_event in seq(num_rounded_event)) {
		time_to_next <- -log(1.0 - runif(1, min = 0, max = 1))/rateParameter
		while (time_to_next < min_event_interval | time_to_next > max_event_interval) {
			time_to_next <- -log(1.0 - runif(1, min = 0, max = 1))/rateParameter
		}
		event_timing_in_hours <- tprevious + time_to_next
		events_timing <- c(events_timing, round(event_timing_in_hours, 1))
		
		fold_normalized <- rnorm(1, mean = Fold_normalized_info$mean, sd = Fold_normalized_info$stdev)
		while (fold_normalized <= Fold_normalized_info$min | fold_normalized > Fold_normalized_info$max) {
			fold_normalized <- rnorm(1, mean = Fold_normalized_info$mean, sd = Fold_normalized_info$stdev)
		}
		events_fold <- c(events_fold, round(fold_normalized, 3))
		tprevious <- event_timing_in_hours
	}
	num_zeros <- max_num_events-num_rounded_event
	PoissonEvents <- cbind(c(events_timing, rep(0, num_zeros)), c(events_fold, rep(0, num_zeros)))
	colnames(PoissonEvents) <- c('Timing', 'Fold')
	sampled_AA <- data.frame(PoissonEvents)
	
	dose_interval_days <- Dose_interval/24
	duration_days <- N_dose*dose_interval_days
	doses_fold <- rep(0, duration_days)
	if (Missing_dose_freq_info$mean != 0) {
		num_dose_missing <- round(rnorm(1, mean = Missing_dose_freq_info$mean, sd = Missing_dose_freq_info$stdev))
		while (num_dose_missing < Missing_dose_freq_info$min | num_dose_missing > Missing_dose_freq_info$max) {
			num_dose_missing <- round(rnorm(1, mean = Missing_dose_freq_info$mean, sd = Missing_dose_freq_info$stdev))
		}
		sample_missing_dose <- sort(sample(1:N_dose, num_dose_missing))
		doses_time <- c()
		if (sample_missing_dose[1] > 1) {
			doses_time <- seq(0, (sample_missing_dose[1]-2) * dose_interval_days, dose_interval_days)
		}
		last_missing_dose <- 1
		for (i in seq(length(sample_missing_dose))) {
			missing_time <- (sample_missing_dose[i]-1) * dose_interval_days + last_missing_dose * dose_interval_days / 2
			max_missing_time <- duration_days
			if (is.na(sample_missing_dose[i+1]) == FALSE) {
				max_missing_time <- (sample_missing_dose[i+1]-1) * dose_interval_days
			}
			while (missing_time < max_missing_time) {
				doses_time <- c(doses_time, missing_time)
				missing_time <- missing_time + dose_interval_days
			}
			last_missing_dose <- sample_missing_dose[i]
		}
		if (ptID == 1) doses_time <- seq(0, duration_days-1, dose_interval_days)
		doses_fold <- rep(0, duration_days)
		for (i in doses_time) {
			doses_fold[i+1] <- 1
		}
	} else {
		doses_time <- seq(0, duration_days-1, dose_interval_days)
		doses_fold <- rep(0, duration_days)
		for (i in doses_time) {
			doses_fold[i+1] <- 1
		}
	}
	
	single_patient_info <- c(ptID, sampled_PK, num_rounded_event, sampled_AA$Timing, sampled_AA$Fold, doses_fold)
	patients_info <- rbind(patients_info, single_patient_info)
}

header <- c('Sample')
for (i in seq(length(popPK_Param_info[,1]))) header <- c(header, paste(popPK_Param_info[i,]$name))
header <- c(header, 'AA.Num_of_AA')
for (i in seq(Max_Num_of_AA)) header <- c(header, paste('AA.AA_t_onset(', i, ')', sep=''))
for (i in seq(Max_Num_of_AA)) header <- c(header, paste('AA.AA_Fold_Normalized(', i, ')', sep=''))
for (i in seq(N_dose*Dose_interval/24)) header <- c(header, paste('Dosing_Flux.AA_Fold_Normalized(', i, ')', sep=''))
colnames(patients_info) <- header
write.csv(patients_info, file=inputFileName, row.names=FALSE)
cat(paste('The results have been saved in:', inputFileName, '\n'))
