Last Ran: 2021-05-27

 

Gather ADNI Scans

1. 'ADNI_QC_Aqual2.txt' files...

DIR=("/Volumes/IGNITE_Imaging/QC_Output/R_IGNITE/Phantom/ADNI/")
setwd(DIR)
ADNI.FILES<-list.files(DIR, ".csv")
df<-""
for (i in ADNI.FILES) {
  x<-paste(DIR, i, sep="")
  setwd(DIR)
  ADNI <- readr::read_csv(x,
    col_types = cols(`ADNI END Time` = col_character()))
  ADNI<-ADNI[complete.cases(ADNI$`Scan Date`),]
  ADNI<-ADNI[complete.cases(ADNI$`Scan ID`),]
  ADNI$`Scan ID`<-str_replace(ADNI$`Scan ID`  ,pattern = "__", replacement ="_ADNI_" )
  if ("MR Tech" %in% names(ADNI)==TRUE) {
  ADNI$Tech<-ADNI$`MR Tech`
  ADNI$Tech<-toupper(ADNI$Tech)} else {NULL}
  
  if ("MR Operator" %in% names(ADNI)==TRUE) {
  ADNI$Tech<-ADNI$`MR Operator`
  ADNI$Tech<-toupper(ADNI$Tech)
  }else {NULL}
  temp<-strsplit(ADNI$`Scan ID`, "_ADNI_")
  mat<-matrix(unlist(temp), ncol=2, byrow = TRUE)
  df.mat   <- as.data.frame(mat)
  df.mat$V1<-as.character(df.mat$V1)
  ADNI$Site<-if_else(str_detect(df.mat$V1,"01")==TRUE, "PITT", as.character(df.mat$V1))
  ADNI$Site<-if_else(str_detect(df.mat$V1,"02")==TRUE, "KU", as.character(ADNI$Site))
  ADNI$Site<-if_else(str_detect(df.mat$V1,"03")==TRUE, "NEU", as.character(ADNI$Site))

  ADNI$Scanner<-if_else(str_detect(df.mat$V1,"01_1")==TRUE, "Prisma 1", df.mat$V1)
  ADNI$Scanner<-if_else(str_detect(ADNI$Scanner,"01_2")==TRUE, "Prisma 2",  ADNI$Scanner)
  ADNI$Scanner<-if_else(str_detect(ADNI$Scanner,"01_3")==TRUE, "Prisma 3", ADNI$Scanner)
  ADNI$Scanner<- if_else(ADNI$Scanner=="01", " ",ADNI$Scanner)
  ADNI$Scanner<- if_else(ADNI$Scanner=="02", " ",ADNI$Scanner)
  ADNI$Scanner<- if_else(ADNI$Scanner=="03", " ",ADNI$Scanner)

  ADNI_1<-ADNI %>% select(`Scan ID`,Site,Scanner,`Scan Date` ,
                          `ADNI END Time`,`MPRAGE Norm#`,`MPRAGE #`,`MPRAGE Changed?`,
                          Tech)
  
df<-rbind(df, ADNI_1)
}
df<-df[!duplicated(df),]
date<-format(Sys.Date(),"%b%y")

file<-paste(DIR,"IN/","merged_ADNI_Phantom", date,"_base.csv", sep="")
readr::write_csv(df,file )
rm(list=setdiff(ls(), "df")) 

2. 'ADNI_QC_Output.csv' files...

DIR=("/Volumes/IGNITE_Imaging/QC_Output/R_IGNITE/Phantom/ADNI/")
setwd(DIR)
ADNI.FILES<-list.files(DIR, pattern=".txt")
ADNI.df<-NULL
#i=ADNI.FILES[3]
for (i in ADNI.FILES) {
setwd(DIR)
 x<- paste("/Volumes/IGNITE_Imaging/QC_Output/R_IGNITE/Phantom/ADNI/", i,sep="")
ADNI <- read.delim(x, header=FALSE, stringsAsFactors=FALSE)
ADNI <- ADNI[complete.cases(ADNI$V2),]

temp<-strsplit(ADNI$V1, "_ADNI_")
mat  <- matrix(unlist(temp), ncol=2, byrow=TRUE)
df   <- as.data.frame(mat)
ADNI$Date<-as.Date(df$V2, "%Y%m%d")

ADNI$Scanner<-as.character(df$V1)
ADNI$Scanner<-as.character(ADNI$Scanner)

  ADNI$Site<-if_else(str_detect(ADNI$Scanner,"01")==TRUE, "PITT", as.character(ADNI$Scanner))
  ADNI$Site<-if_else(str_detect(ADNI$Site,"02")==TRUE, "KU", as.character(ADNI$Site))
  ADNI$Site<-if_else(str_detect(ADNI$Site,"03")==TRUE, "NEU", as.character(ADNI$Site))
  
  ADNI$Scanner<-if_else(str_detect(ADNI$V1,"01_1")==TRUE, "Prisma 1", ADNI$Scanner)
  ADNI$Scanner<-if_else(str_detect(ADNI$Scanner,"01_2")==TRUE, "Prisma 2",  ADNI$Scanner)
  ADNI$Scanner<-if_else(str_detect(ADNI$Scanner,"01_3")==TRUE, "Prisma 3", ADNI$Scanner)
  ADNI$Scanner<- if_else(ADNI$Scanner=="01", " ",ADNI$Scanner)
  ADNI$Scanner<- if_else(ADNI$Scanner=="02", " ",ADNI$Scanner)
  ADNI$Scanner<- if_else(ADNI$Scanner=="03", " ",ADNI$Scanner)

ADNI$ADNI_SNR<-(ADNI$V2)

ADNI$Month<-format(as.Date(ADNI$Date), "%b/%y")

df<- ADNI %>% select(Date,Month, Site,Scanner, ADNI_SNR )
ADNI.df<-rbind(ADNI.df, df)
}
ADNI.df$Date<-as.Date(ADNI.df$Date)
ADNI.df<-ADNI.df[!(duplicated(ADNI.df)),]
date<-format(Sys.Date(),"%b%y")
file<-paste(DIR,"IN/","merged_ADNI_Phantom", date,"_data.csv", sep="")
readr::write_csv(ADNI.df,file )
rm(list=setdiff(ls(), "ADNI.df")) 

ADNI.df<-ADNI.df[complete.cases(ADNI.df$ADNI_SNR),]

3. Merge Full ADNI Dataset

data<-list.files("/Volumes/IGNITE_Imaging/QC_Output/R_IGNITE/Phantom/ADNI/IN/", "data.csv")
data<-read.csv(paste("/Volumes/IGNITE_Imaging/QC_Output/R_IGNITE/Phantom/ADNI/IN/",data,sep=""),stringsAsFactors = FALSE)
data$Date<-as.character(data$Date)

base<-list.files("/Volumes/IGNITE_Imaging/QC_Output/R_IGNITE/Phantom/ADNI/IN/", "base.csv")
base<-read.csv(paste("/Volumes/IGNITE_Imaging/QC_Output/R_IGNITE/Phantom/ADNI/IN/",base,sep=""),stringsAsFactors = FALSE)
base<-base[-1,]
base<-base[complete.cases(base$Scan.Date),]
base$Scan.Date<-as.character(base$Scan.Date)
base$Date<-as.Date(base$Scan.Date, format="%Y%m%d")
base$Date<-as.character(base$Date)

ADNI<-full_join(data,base)
ADNI<-ADNI[!duplicated(ADNI),]
date<-format(Sys.Date(),"%b%y")

file<-paste("/Volumes/IGNITE_Imaging/QC_Output/R_IGNITE/Phantom/ADNI/OUT/","ADNI_", date,".csv", sep="")
readr::write_csv(ADNI,file)
rm(list=setdiff(ls(), "ADNI")) 

4. Index/sort/organize

data<-list.files("/Volumes/IGNITE_Imaging/QC_Output/R_IGNITE/Phantom/ADNI/OUT/", "ADNI_")
ADNI<-read.csv(paste("/Volumes/IGNITE_Imaging/QC_Output/R_IGNITE/Phantom/ADNI/OUT/", data,sep=""))
ADNI<-ADNI[complete.cases(ADNI$ADNI_SNR),]

# Scanner
ADNI$Scanner<-if_else(ADNI$Site=="KU", "KU Skyra", as.character(ADNI$Scanner))
ADNI$Scanner<-if_else(ADNI$Site=="NEU", "NEU Prisma", as.character(ADNI$Scanner))
ADNI$Scanner<-if_else(ADNI$Scanner==" ", "NAN", as.character(ADNI$Scanner))

# Remove duplicated rows and unsorted 'Scan ID's (some scan IDs don't indicate Prisma 1 or 2)
ADNI<-ADNI[!(ADNI$Scanner=="NAN"),]
ADNI<-ADNI[!duplicated(ADNI),]
ADNI$Scanner<-as.factor(ADNI$Scanner)

### Count duplicated entries for indexing
ADNI<-ADNI %>% 
  group_by(Date,Scanner,ADNI_SNR) %>% 
  select(Scan.ID,Scanner,Date,Scan.Date,ADNI.END.Time, ADNI_SNR,MPRAGE.., MPRAGE.Changed., Tech)%>%
  add_count()

### Generate index and remove duplicated/errored processing runs
ADNI$index<-if_else(ADNI$n>1 &ADNI$MPRAGE.Changed.==0 | ADNI$n==1, "Keep","" )
ADNI<-ADNI[ADNI$index=="Keep",]
ADNI<-ADNI %>% select(Scan.ID, Scanner,Scan.Date, Date,ADNI.END.Time,ADNI_SNR,MPRAGE..,MPRAGE.Changed.,Tech )
names(ADNI)<-c("Scan.ID","Scanner","Scan.Date","Date", "ADNI.END.Time","ADNI_SNR","N_vol","Parameter_Changed", "Tech")

### Write out .csv of organized data 
date<-format(Sys.Date(),"%b%y")

file<-paste("/Volumes/IGNITE_Imaging/QC_Output/R_IGNITE/Phantom/ADNI/OUT/","CLEAN.ADNI", date,".csv", sep="")
readr::write_csv(ADNI,file)
rm(list=setdiff(ls(), "ADNI")) 

5. ADNI Plots

ADNI$Scan.Date<-as.character(ADNI$Scan.Date)
ADNI$Date<-as.Date(ADNI$Scan.Date, format="%Y%m%d")
ADNI$Month.YR <- format(as.Date(ADNI$Date), "%b/%y")
ADNI<-arrange(ADNI, "Date")
ADNI$Month.YR <-factor(ADNI$Month.YR,
                      levels=c(  "Nov/17" , "Dec/17" ,
                                "Jan/18" , "Feb/18", "Mar/18" ,
                                "Apr/18" ,"May/18", "Jun/18" ,"Jul/18" , "Aug/18" , 
                                "Sep/18", "Oct/18",  "Nov/18" ,"Dec/18",
                                "Jan/19" , "Feb/19", "Mar/19" ,
                                "Apr/19" ,"May/19", "Jun/19" ,"Jul/19" , "Aug/19" , 
                                "Sep/19", "Oct/19",  "Nov/19" , "Dec/19" ,
                                "Jan/20" , "Feb/20", "Mar/20" ,
                                "Apr/20" ,"May/20", "Jun/20" ,"Jul/20" , "Aug/20" , 
                                "Sep/20", "Oct/20",  "Nov/20" , "Dec/20" ,"Jan/21", 
                                "Feb/21", "Mar/21" , "Apr/21", "May/21"))

#scan frequency by site for each Quarter 
scannerXmonth<- as.data.frame(table(Month.YR=ADNI$Month.YR, by=ADNI$Scanner))
names(scannerXmonth)[names(scannerXmonth) == "by"] <- "Scanner"
#reorder the database according to Quarter.time, so that when it comes to data visualization the weekdays will be in the right order##
scannerXmonth$Month<- factor(scannerXmonth$Month, levels=c( "Nov/17" , "Dec/17" ,
                                "Jan/18" , "Feb/18", "Mar/18" ,
                                "Apr/18" ,"May/18", "Jun/18" ,"Jul/18" , "Aug/18" , 
                                "Sep/18", "Oct/18",  "Nov/18" ,"Dec/18",
                                "Jan/19" , "Feb/19", "Mar/19" ,
                                "Apr/19" ,"May/19", "Jun/19" ,"Jul/19" , "Aug/19" , 
                                "Sep/19", "Oct/19",  "Nov/19" , "Dec/19" ,
                                "Jan/20" , "Feb/20", "Mar/20" ,
                                "Apr/20" ,"May/20", "Jun/20" ,"Jul/20" , "Aug/20" , 
                                "Sep/20", "Oct/20",  "Nov/20" , "Dec/20" ,"Jan/21", 
                                "Feb/21", "Mar/21" , "Apr/21", "May/21"))

Scan_freq<-scannerXmonth[order(scannerXmonth$Month),]
Counts_by_MONTH<-ggplot(data=Scan_freq,
       aes(x =Month, y=Freq,  fill=Scanner))+
  geom_bar(stat = "identity")+
  ggtitle(label = "Phantom Frequency by Month")+
  theme_minimal()+
  theme(plot.title = element_text(hjust = 0.5, 
        lineheight = 0.8, face = "bold"),
        axis.text.x=element_text(angle=35,hjust=1, size=7))+
        xlab(" ")+ylab("Scan Freq")
plotly::ggplotly(Counts_by_MONTH)
names(ADNI)
##  [1] "Scan.ID"           "Scanner"           "Scan.Date"        
##  [4] "Date"              "ADNI.END.Time"     "ADNI_SNR"         
##  [7] "N_vol"             "Parameter_Changed" "Tech"             
## [10] "Month.YR"
ADNI.2020.for.plot=ADNI %>%  
  dplyr::group_by(ADNI$Scanner)%>% 
  dplyr::mutate( 
    ADNI.SNR.avg =mean(ADNI_SNR, na.rm = TRUE),
    ADNI.SNR.sd=sd(ADNI_SNR),
    count = n())

ADNI.SNR.PLOT<-ggplot(ADNI.2020.for.plot, aes(Scanner, ADNI.SNR.avg, fill=Scanner)) + 
  geom_col(stat="identity", position="dodge") +
  geom_text(aes(label=count, y=0))+
  geom_errorbar(aes(ymin = ADNI.SNR.avg - ADNI.SNR.sd, ymax = ADNI.SNR.avg + ADNI.SNR.sd), width=0.2)
ADNI.SNR.PLOT

df.plot<-ggplot(ADNI, aes(x = Date, y = ADNI_SNR)) + 
  geom_point(aes(y = ADNI_SNR, color=Scanner, text = paste("Parameter Changed:",Parameter_Changed)))+ geom_line(aes(y = ADNI_SNR, color=Scanner)) +
  ggtitle("Phantom Quality Parameters Across Time")+ylab("SNR \n \n")+
   facet_grid(vars(Scanner), scales = "free")+theme(legend.position="none",
                                                    strip.text = element_text(size = 7))
plotly::ggplotly(df.plot)
ADNI<-ADNI %>% group_by(Scanner,Month.YR) %>%add_count(Scanner)
df<-ADNI %>% select(Scanner,Month.YR , ADNI_SNR, n)
df<-df %>% group_by(Scanner,Month.YR) %>%mutate(
  'Monthly_SNR.avg'=mean(ADNI_SNR),
  'Monthly_SNR.sd'=sd(ADNI_SNR, na.rm = TRUE))

   

6. Curate BULLET OUTPUT .csvs

DIR=("/Volumes/IGNITE_Imaging/QC_Output/R_IGNITE/Phantom/BULL/")
setwd(DIR)
BULL.FILES<-list.files(DIR, "_QC_Output")
df<-""
#i=BULL.FILES[4]
for (i in BULL.FILES) {
  x<-paste(DIR,i, sep="")
  BULL<-read.csv(x, row.names=NULL)
  names(BULL)<- c("Scan.ID","Scan.Date","BULL.Start.Time", "Tech"   ,  "REST.Norm.","REST.."   ,       "REST.Changed."  )
  BULL$Scan.ID<-as.character(BULL$Scan.ID)
  BULL$Scan.ID<-toupper(BULL$Scan.ID)
  BULL<-BULL[complete.cases(BULL$Scan.ID),]
  BULL<-BULL[complete.cases(BULL$Scan.Date),]
  BULL$Scan.ID<-str_replace(BULL$Scan.ID  ,pattern = "__", replacement ="_BULL_" )
BULL$Site<-if_else(str_detect(BULL$Scan.ID, "01_")==1, "PITT", as.character(BULL$Scan.ID))
BULL$Site<-if_else(str_detect(BULL$Site, "02_")==1, "KU", as.character(BULL$Site))
BULL$Site<-if_else(str_detect(BULL$Site, "03_")==1, "NEU", as.character(BULL$Site))

  BULL$Scanner<-if_else(str_detect(BULL$Scan.ID,"01_1")==TRUE, "Prisma 1", as.character(BULL$Scan.ID))
  BULL$Scanner<-if_else(str_detect(BULL$Scanner,"01_2")==TRUE, "Prisma 2",  BULL$Scanner)
  BULL$Scanner<-if_else(str_detect(BULL$Scanner,"01_3")==TRUE, "Prisma 3", BULL$Scanner)
  BULL$Scanner<- if_else(BULL$Scanner=="01", " ",BULL$Scanner)
  BULL$Scanner<- if_else(BULL$Scanner=="02", " ",BULL$Scanner)
  BULL$Scanner<- if_else(BULL$Scanner=="03", " ",BULL$Scanner)


BULL<-BULL %>% select(Scan.ID,Site, Scanner, Scan.Date,BULL.Start.Time, Tech  ,REST..   ,REST.Changed.)
names(BULL)<-c("Scan.ID","Site", "Scanner","Scan.Date","BULL.Start.Time", "Tech"   , "N_vol"   ,"Parameter_Changed" )
print(i)
df <-rbind(df,BULL)
}
## [1] "IGNITE_BULL_QC_Output (1).csv"
## [1] "IGNITE_BULL_QC_Output_201802_201902.csv"
## [1] "IGNITE_BULL_QC_Output_New (1).csv"
## [1] "IGNITE_BULL_QC_Output_New (2).csv"
## [1] "IGNITE_BULL_QC_Output_New_test (1).csv"
## [1] "IGNITE_BULL_QC_Output_New_test (2).csv"
## [1] "IGNITE_BULL_QC_Output_New_test.csv"
## [1] "IGNITE_BULL_QC_Output_New.csv"
## [1] "IGNITE_BULL_QC_Output.csv"
df<-df[!duplicated(df),]
### Write out .csv of organized data 
date<-format(Sys.Date(),"%b%y")

file<-paste("/Volumes/IGNITE_Imaging/QC_Output/R_IGNITE/Phantom/BULL/IN/","merged_BASE", date,".csv", sep="")
readr::write_csv(df,file)

6.1. Stability History

BULL<-read.delim("/Volumes/IGNITE_Imaging/QC_Output/R_IGNITE/Phantom/BULL/ignite_stability_history_2018.txt")
BULL$Date<-paste(BULL$year, BULL$Month, BULL$Day, sep="-")
BULL$Date<-as.Date(BULL$Date, format="%Y-%b-%d")
BULL<-BULL[!duplicated(BULL),]
BULL$Site<-as.character(BULL$Site)
BULL$Site_0<-if_else(str_detect(BULL$Site, "UPMC")==1, "PITT", as.character(BULL$Site))
BULL$Site_0<-if_else(str_detect(BULL$Site_0, "MRRC")==1, "PITT", as.character(BULL$Site_0))
BULL$Site_0<-if_else(str_detect(BULL$Site_0, "MRRC")==1, "PITT", as.character(BULL$Site_0))
BULL$Site_0<-if_else(str_detect(BULL$Site_0, "Hoglund")==1, "KU", as.character(BULL$Site_0))
BULL$Site_0<-if_else(str_detect(BULL$Site_0, "Hogland")==1, "KU", as.character(BULL$Site_0))
BULL$Site_0<-if_else(str_detect(BULL$Site_0, "Northeastern")==1, "NEU", as.character(BULL$Site_0))
BULL$Site_0<-if_else(str_detect(BULL$Site_0, "NUBIC")==1, "NEU", as.character(BULL$Site_0))

Previous version of 'Curate BULLET Dataset'

DIR=("/Volumes/IGNITE_Imaging/QC_Output/R_IGNITE/Phantom/BULL/")
setwd(DIR)

BULL_DATE<-read.csv("/Volumes/IGNITE_Imaging/QC_Output/R_IGNITE/Phantom/BULL/IGNITE_BULL_QC_Output_New.csv",header = FALSE)
colnames(BULL_DATE)<-c("Scan.ID" ,"ScanDate","BULLStartTime", "MROperator", "RESTNormN","RESTN", "RESTChanged", "ScannerID" ,"MR TECH")
BULL_DATE<-BULL_DATE[-(1),]
BULL_DATE<-BULL_DATE[,-c(10)]
BULL_DATE<-BULL_DATE[!duplicated(BULL_DATE),]
BULL_DATE$Scan.ID<-as.character(BULL_DATE$Scan.ID)
BULL_DATE$ScanDate<-as.Date(BULL_DATE$ScanDate, format=("%Y%m%d"))

BULL_DATE$ScannerID<-as.character(BULL_DATE$ScannerID)

BULL_DATE$Scanner<-if_else(BULL_DATE$ScannerID=="MRC67078", "Pitt Prisma 1", as.character(BULL_DATE$ScannerID))
BULL_DATE$Scanner<-if_else(BULL_DATE$ScannerID=="AWP167046", "Pitt Prisma 2", as.character(BULL_DATE$Scanner))
BULL_DATE$Scanner<-if_else(BULL_DATE$ScannerID=="MRC35073", "Pitt Prisma 3", as.character(BULL_DATE$Scanner))
BULL_DATE$Scanner<-if_else(BULL_DATE$ScannerID=="AWP45135", "KU Skyra", as.character(BULL_DATE$Scanner))
BULL_DATE$Scanner<-if_else(BULL_DATE$ScannerID=="AWP166030", "NEU Prisma", as.character(BULL_DATE$Scanner))


BULL_DATA<-read.csv("/Volumes/IGNITE_Imaging/QC_Output/R_IGNITE/Phantom/BULL/IGNITE_BULL_QC_Stability.csv",header = TRUE)
BULL_DATA$Scan.ID<-as.character(BULL_DATA$Scan.ID)
BULL_DATA<-BULL_DATA[!duplicated(BULL_DATA),]

BULL<-full_join(BULL_DATA,BULL_DATE, by="Scan.ID")
BULL<-BULL[complete.cases(BULL$Timepts),]
rm(BULL_DATE, BULL_DATA)
BULL$ScanDate<-as.character(BULL$ScanDate)
DIR=("/Volumes/IGNITE_Imaging/QC_Output/R_IGNITE/Phantom/BULL/")
setwd(DIR)

BULL<-read.delim("/Volumes/IGNITE_Imaging/QC_Output/R_IGNITE/Phantom/BULL/",header = FALSE)
colnames(BULL_DATE)<-c("Scan.ID" ,"ScanDate","BULLStartTime", "MROperator", "RESTNormN","RESTN", "RESTChanged", "ScannerID" ,"MR TECH")
BULL_DATE<-BULL_DATE[-(1),]
BULL_DATE<-BULL_DATE[,-c(10)]
BULL_DATE<-BULL_DATE[!duplicated(BULL_DATE),]
BULL_DATE$Scan.ID<-as.character(BULL_DATE$Scan.ID)
BULL_DATE$ScanDate<-as.Date(BULL_DATE$ScanDate, format=("%Y%m%d"))

BULL_DATE$ScannerID<-as.character(BULL_DATE$ScannerID)

BULL_DATE$Scanner<-if_else(BULL_DATE$ScannerID=="MRC67078", "Pitt Prisma 1", as.character(BULL_DATE$ScannerID))
BULL_DATE$Scanner<-if_else(BULL_DATE$ScannerID=="AWP167046", "Pitt Prisma 2", as.character(BULL_DATE$Scanner))
BULL_DATE$Scanner<-if_else(BULL_DATE$ScannerID=="MRC35073", "Pitt Prisma 3", as.character(BULL_DATE$Scanner))
BULL_DATE$Scanner<-if_else(BULL_DATE$ScannerID=="AWP45135", "KU Skyra", as.character(BULL_DATE$Scanner))
BULL_DATE$Scanner<-if_else(BULL_DATE$ScannerID=="AWP166030", "NEU Prisma", as.character(BULL_DATE$Scanner))


BULL_DATA<-read.csv("/Volumes/IGNITE_Imaging/QC_Output/R_IGNITE/Phantom/BULL/IGNITE_BULL_QC_Stability.csv",header = TRUE)
BULL_DATA$Scan.ID<-as.character(BULL_DATA$Scan.ID)
BULL_DATA<-BULL_DATA[!duplicated(BULL_DATA),]

BULL<-full_join(BULL_DATA,BULL_DATE, by="Scan.ID")
BULL<-BULL[complete.cases(BULL$Timepts),]
rm(BULL_DATE, BULL_DATA)
BULL$ScanDate<-as.character(BULL$ScanDate)