package metab;
import java.io.*;
public class TDSubject implements Serializable{
public static final int _LIGHT = 1;
public static final int _MODERATE = 1 << 1;
public static final int _HEAVY = 1 << 2;
public static final int _BEER = 1 << 3;
public static final int _WINE = 1 << 4;
public static final int _HARD_LIQUOR = 1 << 5;
public static final int _METRIC = 1 << 6;
public static final int _IMPERIAL = 1 << 7;
public static final int _ERROR = 1 << 8;
private int bitFlag, age;
private double numberOfDrinks, hoursDrinking, weight;
private char gender;
private String subjectName;
TDSubject(int age, char gender, double numberOfDrinks, double hoursDrinking,
String subjectName, double weight, int bitFlag){
this.age = age;
this.gender = gender;
this.numberOfDrinks = numberOfDrinks;
this.hoursDrinking = hoursDrinking;
this.subjectName = subjectName;
this.bitFlag = bitFlag;
if ((bitFlag & _METRIC) != 0)
this.weight = weight;
else if ((bitFlag & _IMPERIAL) != 0)
this.weight = weight / 2.20462262; // lb to kg
}
public int getAge(){
return age;
}
public double getBAC(){
double oz = 0, BAC, hourlyDecrease = 0;
double TBW = ((gender == 'M')?(weight * .58):(weight * .49)) * 1000;
//Total Body Water in milliliters
double gramsIn100mlBlood = (23.36 / TBW) * .806 * 100;
//Grams alcohol per one hundred milliliters blood
if ((bitFlag & _BEER) != 0)
oz = numberOfDrinks * 12 * 0.06;
else if ((bitFlag & _WINE) != 0)
oz = numberOfDrinks * 10 * 0.10;
else if ((bitFlag & _HARD_LIQUOR) != 0)
oz = numberOfDrinks * 1 * 0.48;
//Actual amount of ethanol consumed in ounces
if ((bitFlag & _LIGHT) != 0)
hourlyDecrease = .012;
else if ((bitFlag & _MODERATE) != 0)
hourlyDecrease = .017;
else if ((bitFlag & _HEAVY) != 0)
hourlyDecrease = .020;
//Hourly decrease in BAC
BAC = oz * gramsIn100mlBlood;//Instantaneous BAC
BAC = BAC - (hoursDrinking * hourlyDecrease);//Final BAC for the subject
return BAC;
}
public int getDrinkingHistory(){
if ((bitFlag & _LIGHT) != 0)
return _LIGHT;
else if ((bitFlag & _MODERATE) != 0)
return _MODERATE;
else if ((bitFlag & _HEAVY) != 0)
return _HEAVY;
else
return _ERROR;
}
public char getGender(){
return gender;
}
public double getNumberOfDrinks(){
return numberOfDrinks;
}
public double getHoursDrinking(){
return hoursDrinking;
}
public String getSubjectName(){
return subjectName;
}
public int getTypeOfDrink(){
if ((bitFlag & _BEER) != 0)
return _BEER;
else if ((bitFlag & _WINE) != 0)
return _WINE;
else if ((bitFlag & _HARD_LIQUOR) != 0)
return _HARD_LIQUOR;
else
return _ERROR;
}
public double getWeight(){
if ((bitFlag & _IMPERIAL) != 0){
return weight * 2.20462262;
}
else {
return weight;
}
}
}