# -*- coding: utf-8 -*- #------------------------------------------------------------------------------------------------------------------------------# # Flash Freeze Index # # Filename: wssi_flash_freeze.py # # Description: Calculates when temperature has dropped below zero after liquid precipitation has falled # # Authors: Andy Nash/Josh Kastman/Jim Nelson # # Change Log: # # Modified to only show 24 hours of day for Daily Breakout of WSSI - Josh Kastman # # Established Functions - Kastman 2019-03-19 # # Modified algorithim; now using three hour avg. temperature blocks instead of hourly - Kastman/Nelson - 2019-09-01 # # Updated for rolling 24 hr output - Kastman 2021-07--01 # #------------------------------------------------------------------------------------------------------------------------------# import arcpy, os, shutil, datetime, time from datetime import datetime import linecache from time import gmtime, strftime from arcpy import env from arcpy.sa import * import traceback import glob from shutil import copyfile, copy2 from dateutil import tz from_zone = tz.tzutc() to_zone = tz.tzlocal() from arcpy import env from arcpy.sa import * arcpy.env.overwriteOutput = True import wssi_config as cfg import glob import logging # set up log file log_stamp = strftime("%Y%m%d%H", gmtime()) logging.basicConfig(filename=cfg.log_dir+'/wssi_log_'+str(log_stamp)+'_FF.log',level=logging.DEBUG, format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') def flash_freeze(): start_time = strftime("%a, %d %b %Y %H:%M:%S", gmtime()) #print "Flash Freeze Processing Start Time "+start_time datadir = cfg.grb_dir #----------------------------------------# # simple formula: # # deltaT = tmin - prevtmax # # reclass delaT [1-5] # # if tmin below zero reclass value [1-5] # # check to see if precip fell during the # # temperature change. If yes sum reclass # #----------------------------------------# try: if arcpy.CheckExtension("Spatial") == "Available": arcpy.CheckOutExtension("Spatial") else: # Raise a custom exception # raise LicenseError except LicenseError: print "Spatial Analyst license is unavailable" try: os.mkdir (cfg.work_dir+"ff_working") except: print "folder exists" ff_dir = cfg.work_dir+"ff_working\\" wssi_ff_working = ff_dir ########################## # Temperature Processing # ########################## #----------------------# # Create 3 HR Avg Temp # #----------------------# for i in range (1,37): hr = i hr2 = i + 3 try: hr_temp = datadir + "temp"+str(hr2)+".flt" print datadir + "temp"+str(hr2)+".flt" except Exception as e: print(e) arcpy.gp.CellStatistics_sa(datadir+"temp1.flt;"+datadir+"temp2.flt;"+datadir+"temp3.flt", wssi_ff_working+"avg2_temp_1t3.tif", "MEAN", "DATA") arcpy.gp.CellStatistics_sa(datadir+"temp4.flt;"+datadir+"temp5.flt;"+datadir+"temp6.flt", wssi_ff_working+"avg2_temp_4t6.tif", "MEAN", "DATA") arcpy.gp.CellStatistics_sa(datadir+"temp7.flt;"+datadir+"temp8.flt;"+datadir+"temp9.flt", wssi_ff_working+"avg2_temp_7t9.tif", "MEAN", "DATA") arcpy.gp.CellStatistics_sa(datadir+"temp10.flt;"+datadir+"temp11.flt;"+datadir+"temp12.flt", wssi_ff_working+"avg2_temp_10t12.tif", "MEAN", "DATA") arcpy.gp.CellStatistics_sa(datadir+"temp13.flt;"+datadir+"temp14.flt;"+datadir+"temp15.flt", wssi_ff_working+"avg2_temp_13t15.tif", "MEAN", "DATA") arcpy.gp.CellStatistics_sa(datadir+"temp16.flt;"+datadir+"temp17.flt;"+datadir+"temp18.flt", wssi_ff_working+"avg2_temp_16t18.tif", "MEAN", "DATA") arcpy.gp.CellStatistics_sa(datadir+"temp19.flt;"+datadir+"temp20.flt;"+datadir+"temp21.flt", wssi_ff_working+"avg2_temp_19t21.tif", "MEAN", "DATA") arcpy.gp.CellStatistics_sa(datadir+"temp22.flt;"+datadir+"temp23.flt;"+datadir+"temp24.flt", wssi_ff_working+"avg2_temp_22t24.tif", "MEAN", "DATA") arcpy.gp.CellStatistics_sa(datadir+"temp25.flt;"+datadir+"temp26.flt;"+datadir+"temp27.flt", wssi_ff_working+"avg2_temp_25t27.tif", "MEAN", "DATA") arcpy.gp.CellStatistics_sa(datadir+"temp28.flt;"+datadir+"temp29.flt;"+datadir+"temp30.flt", wssi_ff_working+"avg2_temp_28t30.tif", "MEAN", "DATA") arcpy.gp.CellStatistics_sa(datadir+"temp31.flt;"+datadir+"temp32.flt;"+datadir+"temp33.flt", wssi_ff_working+"avg2_temp_31t33.tif", "MEAN", "DATA") arcpy.gp.CellStatistics_sa(datadir+"temp34.flt;"+datadir+"temp35.flt;"+datadir+"temp36.flt", wssi_ff_working+"avg2_temp_34t36.tif", "MEAN", "DATA") arcpy.gp.CellStatistics_sa(datadir+"temp37.flt;"+datadir+"temp38.flt;"+datadir+"temp39.flt", wssi_ff_working+"avg2_temp_37t39.tif", "MEAN", "DATA") temp_blocks = [wssi_ff_working+"avg2_temp_1t3.tif",wssi_ff_working+"avg2_temp_4t6.tif",wssi_ff_working+"avg2_temp_7t9.tif",wssi_ff_working+"avg2_temp_10t12.tif",wssi_ff_working+"avg2_temp_13t15.tif",wssi_ff_working+"avg2_temp_16t18.tif",wssi_ff_working+"avg2_temp_19t21.tif",wssi_ff_working+"avg2_temp_22t24.tif",wssi_ff_working+"avg2_temp_25t27.tif",wssi_ff_working+"avg2_temp_28t30.tif",wssi_ff_working+"avg2_temp_31t33.tif",wssi_ff_working+"avg2_temp_34t36.tif", wssi_ff_working+"avg2_temp_37t39.tif"] #block_list = ["4t6", "7t9", "10t12", "13t15", "16t18", "19t21", "22t24", "25t27", "28t30", "31t33", "34t36", "37t39"] #-----------------------# # Calculate Temp Change # #-----------------------# for t in range (0,12): a = t b = t+1 outf = wssi_ff_working+"temp_chg"+str(b)+".tif" try: print temp_blocks[b] + " - " +temp_blocks[a] outMinus = Minus(temp_blocks[b] , temp_blocks[a]) outMinus.save(outf) except Exception as e: print(e) #-----------------------------------------------------# # Check Temperature for Greater than or Less than 32F # #-----------------------------------------------------# for t in range (0,12): a = t b = t+1 crit_t = "32" try: print "generating "+"temp"+str(a)+"_abv"+" & "+"temp"+str(a)+"_blw" arcpy.gp.GreaterThan_sa(temp_blocks[a], crit_t, wssi_ff_working+"temp"+str(a)+"_abv.tif") arcpy.gp.LessThan_sa(temp_blocks[a], crit_t, wssi_ff_working+"temp"+str(a)+"_blw.tif") except Exception as e: print(e) #--------------------------------------------# # Temp Falling Below 32F Frrom peroid a to b # #--------------------------------------------# for t in range (0,12): a = t b = t+1 try: print "temp"+str(a)+"_abv" + " times " + "temp"+str(b)+"_blw" arcpy.gp.Times_sa(wssi_ff_working+"temp"+str(a)+"_abv.tif", wssi_ff_working+"temp"+str(b)+"_blw.tif", wssi_ff_working+"temp_"+str(b)+"abvblw.tif") except Exception as e: print(e) #-----------------------------------------------------# # Reclassify Temperature Blocks to WSSI impact levels # #-----------------------------------------------------# print 'Creating hourly change and category grids' logging.debug ('Creating hourly change and category grids') temp_blocks_rc = [] for t in range(0,12): a = t temp_block_o = temp_blocks[a] temp_block_rc = temp_blocks[a][:-4] + "_RE.tif" temp_blocks_rc.append(temp_blocks[a][:-4] + "_RE.tif") try: print "Reclassifying temperature block: "+temp_blocks[a][73:] arcpy.gp.Reclassify_sa(temp_block_o, "Value", "-100 24 5;24 26 4;26 28 3;28 30 2;30 32 1;32 130 0", temp_block_rc, "DATA") except Exception as e: print(e) ## this categorizes the temperature change and flash freeze - which start at hour 4. #----------------------------------------------------# # Categorize the Temperature Change and Flash Freeze # #----------------------------------------------------# for t in range(0,12): a = t b = t+1 temp_block_rc = temp_blocks_rc[a] #test2 = str(in_mem) + "temp_Hr"+str(hour)+"RE" tmp_chg = wssi_ff_working+"temp_chg"+str(b)+".tif" #test3 = str(wssi_ff_working) + "temp_Chg_"+str(hour) tmp_chg_rc = wssi_ff_working+"temp_chg"+str(b)+"_RE.tif" #test4 = str(wssi_ff_working) + "temp_Chg_"+str(hour)+"RE" ff_tmp = str(wssi_ff_working) + "ff_"+str(b)+".tif" #test5 = str(wssi_ff_working) + "ff_"+str(hour) try: print "Reclassify " + tmp_chg[73:] arcpy.gp.Reclassify_sa(tmp_chg, "Value", "-60 -10 5;-10 -8 4;-8 -6 3;-6 -4 2;-4 -2 1;-2 100 0", tmp_chg_rc, "DATA") #arcpy.gp.Reclassify_sa(tmp_chg, "Value", "-60 -20 5;-20 -15 4;-15 -11 3;-11 -8 2;-8 -5 1;-5 100 0", tmp_chg_rc, "DATA") #arcpy.gp.Reclassify_sa(test3, "Value", "-60 -20 5;-20 -15 4;-15 -11 3;-11 -8 2;-8 -5 1;-5 100 0", test4, "DATA") print "generating " + ff_tmp[73:] arcpy.gp.Plus_sa(temp_block_rc,tmp_chg_rc,ff_tmp) except Exception as e: print(e) ################## # QPF PROCESSING # ################## ##Turn QPF yes/no grids into hourly (hr1=original, hr2=hourly copy) ## don't know the command for copy raster, so create new one by multiplying old one by 1 for i in range(1,8): qpf_hr = i Reclass_flt2 = wssi_ff_working+ "qpf_re" + str(qpf_hr)+".tif" #qpf_re" + str(qpf_hr) arcpy.gp.Reclassify_sa(datadir+"\\qpf" + str(qpf_hr) + ".flt", "Value", "0 0.03 0;0.03 5 1", Reclass_flt2, "DATA") print 'creating hourly copies of the 6 hourly QPF, original method' logging.debug ('creating hourly copies of the 6 hourly QPF, original method') ## for i in range(1,8): qpf_hr = i Reclass_flt2 = wssi_ff_working+ "qpf_re" + str(qpf_hr)+".tif" #qpf_re" + str(qpf_hr) arcpy.gp.Reclassify_sa(datadir+"\\qpf" + str(qpf_hr) + ".flt", "Value", "0 0.03 0;0.03 5 1", Reclass_flt2, "DATA") for i in range(0,7): for j in range (1,7): hr1 = i+1 hr2 = (3*(i))+j #file1=wssi_ff_working+"qpf" + str(hr1)+"_RE" file1=Reclass_flt2 file2=wssi_ff_working+"qpfHRLY_re" + str(hr2)+".tif" #arcpy.CopyRaster_management(file1,file2) #copy2(file1, file2) arcpy.gp.Times_sa(file1,1,file2) #-------------------------------------------------------------------------# # Compare Where is QPF is Present and where Temperature Paramters are met # #-------------------------------------------------------------------------# print 'Create hourly matches with QPF and flash freeze and populate raw value' logging.debug ('Create hourly matches with QPF and flash freeze and populate raw value') try: arcpy.gp.Times_sa(wssi_ff_working+"qpf_re1.tif", wssi_ff_working+"temp_1abvblw.tif", wssi_ff_working+"qpftemp_1.tif") arcpy.gp.Times_sa(wssi_ff_working + "ff_1.tif", wssi_ff_working+"qpftemp_1.tif", wssi_ff_working+"flash_freeze_1.tif") print "generated: "+"flash_freeze_1" logging.debug ("generated: "+"flash_freeze_1") print "--" arcpy.gp.Times_sa(wssi_ff_working+"qpf_re2.tif", wssi_ff_working+"temp_2abvblw.tif", wssi_ff_working+"qpftemp_2.tif") arcpy.gp.Times_sa(wssi_ff_working + "ff_2.tif", wssi_ff_working+"qpftemp_2.tif", wssi_ff_working+"flash_freeze_2.tif") print "generated: "+"flash_freeze_2.tif" logging.debug ("generated: "+"flash_freeze_2") print "--" arcpy.gp.Times_sa(wssi_ff_working+"qpf_re2.tif", wssi_ff_working+"temp_3abvblw.tif", wssi_ff_working+"qpftemp_3.tif") arcpy.gp.Times_sa(wssi_ff_working + "ff_3.tif", wssi_ff_working+"qpftemp_3.tif", wssi_ff_working+"flash_freeze_3.tif") print "generated: "+"flash_freeze_3.tif" logging.debug ("generated: "+"flash_freeze_3") print "--" arcpy.gp.Times_sa(wssi_ff_working+"qpf_re3.tif", wssi_ff_working+"temp_4abvblw.tif", wssi_ff_working+"qpftemp_4.tif") arcpy.gp.Times_sa(wssi_ff_working + "ff_4.tif", wssi_ff_working+"qpftemp_4.tif", wssi_ff_working+"flash_freeze_4.tif") print "generated: "+"flash_freeze_4" logging.debug ("generated: "+"flash_freeze_4") print "--" arcpy.gp.Times_sa(wssi_ff_working+"qpf_re3.tif", wssi_ff_working+"temp_5abvblw.tif", wssi_ff_working+"qpftemp_5.tif") arcpy.gp.Times_sa(wssi_ff_working + "ff_5.tif", wssi_ff_working+"qpftemp_5.tif", wssi_ff_working+"flash_freeze_5.tif") print "generated: "+"flash_freeze_5" logging.debug ("generated: "+"flash_freeze_5") print "--" arcpy.gp.Times_sa(wssi_ff_working+"qpf_re4.tif", wssi_ff_working+"temp_6abvblw.tif", wssi_ff_working+"qpftemp_6.tif") arcpy.gp.Times_sa(wssi_ff_working + "ff_6.tif", wssi_ff_working+"qpftemp_6.tif", wssi_ff_working+"flash_freeze_6.tif") print "generated: "+"flash_freeze_6" logging.debug ("generated: "+"flash_freeze_6") print "--" arcpy.gp.Times_sa(wssi_ff_working+"qpf_re4.tif", wssi_ff_working+"temp_7abvblw.tif", wssi_ff_working+"qpftemp_7.tif") arcpy.gp.Times_sa(wssi_ff_working + "ff_7.tif", wssi_ff_working+"qpftemp_7.tif", wssi_ff_working+"flash_freeze_7.tif") print "generated: "+"flash_freeze_7" logging.debug ("generated: "+"flash_freeze_7") print "--" arcpy.gp.Times_sa(wssi_ff_working+"qpf_re5.tif", wssi_ff_working+"temp_8abvblw.tif", wssi_ff_working+"qpftemp_8.tif") arcpy.gp.Times_sa(wssi_ff_working + "ff_8.tif", wssi_ff_working+"qpftemp_8.tif", wssi_ff_working+"flash_freeze_8.tif") print "generated: "+"flash_freeze_8" logging.debug ("generated: "+"flash_freeze_8") print "--" arcpy.gp.Times_sa(wssi_ff_working+"qpf_re5.tif", wssi_ff_working+"temp_9abvblw.tif", wssi_ff_working+"qpftemp_9.tif") arcpy.gp.Times_sa(wssi_ff_working + "ff_9.tif", wssi_ff_working+"qpftemp_9.tif", wssi_ff_working+"flash_freeze_9.tif") print "generated: "+"flash_freeze_9" logging.debug ("generated: "+"flash_freeze_9") print "--" arcpy.gp.Times_sa(wssi_ff_working+"qpf_re6.tif", wssi_ff_working+"temp_10abvblw.tif", wssi_ff_working+"qpftemp_10.tif") arcpy.gp.Times_sa(wssi_ff_working + "ff_10.tif", wssi_ff_working+"qpftemp_10.tif", wssi_ff_working+"flash_freeze_10.tif") print "generated: "+"flash_freeze_10" logging.debug ("generated: "+"flash_freeze_10") print "--" arcpy.gp.Times_sa(wssi_ff_working+"qpf_re6.tif", wssi_ff_working+"temp_11abvblw.tif", wssi_ff_working+"qpftemp_11.tif") arcpy.gp.Times_sa(wssi_ff_working + "ff_11.tif", wssi_ff_working+"qpftemp_11.tif", wssi_ff_working+"flash_freeze_11.tif") print "generated: "+"flash_freeze_11" logging.debug ("generated: "+"flash_freeze_12") print "--" except Exception as e: print(e) #---------------------------------------------------# # Combine to find Max Flash Freeze in 6 Hour Blocks # #---------------------------------------------------# print "Combine to find Max Flash Freeze in 6 Hour Blocks" try: arcpy.gp.CellStatistics_sa(wssi_ff_working+"flash_freeze_1.tif", wssi_ff_working+"Flash_6HR.tif", "MAXIMUM", "DATA") arcpy.gp.CellStatistics_sa(wssi_ff_working+"flash_freeze_2.tif;"+wssi_ff_working+"flash_freeze_3.tif", wssi_ff_working+"Flash_12HR.tif", "MAXIMUM", "DATA") arcpy.gp.CellStatistics_sa(wssi_ff_working+"flash_freeze_4.tif;"+wssi_ff_working+"flash_freeze_5.tif", wssi_ff_working+"Flash_18HR.tif", "MAXIMUM", "DATA") arcpy.gp.CellStatistics_sa(wssi_ff_working+"flash_freeze_6.tif;"+wssi_ff_working+"flash_freeze_7.tif", wssi_ff_working+"Flash_24HR.tif", "MAXIMUM", "DATA") arcpy.gp.CellStatistics_sa(wssi_ff_working+"flash_freeze_8.tif;"+wssi_ff_working+"flash_freeze_9.tif", wssi_ff_working+"Flash_30HR.tif", "MAXIMUM", "DATA") arcpy.gp.CellStatistics_sa(wssi_ff_working+"flash_freeze_10.tif;"+wssi_ff_working+"flash_freeze_3.tif", wssi_ff_working+"Flash_36HR.tif", "MAXIMUM", "DATA") except Exception as e: print(e) #-----------------------------------------# # Find Max Flash Freeze in 24 Hour Blocks # #-----------------------------------------# # Set Mask environment arcpy.env.mask = cfg.States print "Find Max Flash Freeze in 24 Hour Blocks" logging.debug ("Find Max Flash Freeze in 24 Hour Blocks") try: arcpy.gp.CellStatistics_sa(wssi_ff_working+"Flash_6HR.tif;"+wssi_ff_working+"Flash_12HR.tif;"+wssi_ff_working+"Flash_18HR.tif;"+wssi_ff_working+"Flash_24HR.tif;"+wssi_ff_working+"Flash_30HR.tif;"+wssi_ff_working+"Flash_36HR.tif", cfg.work_dir+"ff_max.tif", "MAXIMUM", "DATA") #arcpy.gp.CellStatistics_sa(wssi_ff_working+"Flash_6HR.tif;"+wssi_ff_working+"Flash_12HR.tif;"+wssi_ff_working+"Flash_18HR.tif;"+wssi_ff_working+"Flash_24HR.tif;"+wssi_ff_working+"Flash_30HR.tif; wssi_ff_working+"ff_max_full_n", "MAXIMUM", "DATA") arcpy.gp.CellStatistics_sa(wssi_ff_working+"Flash_6HR.tif;"+wssi_ff_working+"Flash_12HR.tif;"+wssi_ff_working+"Flash_18HR.tif;"+wssi_ff_working+"Flash_24HR.tif;", cfg.work_dir+"ff_max_24hr.tif", "MAXIMUM", "DATA") arcpy.gp.CellStatistics_sa(wssi_ff_working+"Flash_12HR.tif;"+wssi_ff_working+"Flash_18HR.tif;"+wssi_ff_working+"Flash_24HR.tif;"+wssi_ff_working+"Flash_30HR.tif;", cfg.work_dir+"ff_max_30hr.tif", "MAXIMUM", "DATA") arcpy.gp.CellStatistics_sa(wssi_ff_working+"Flash_18HR.tif;"+wssi_ff_working+"Flash_24HR.tif;"+wssi_ff_working+"Flash_30HR.tif;"+wssi_ff_working+"Flash_36HR.tif;", cfg.work_dir+"ff_max_36hr.tif", "MAXIMUM", "DATA") except Exception as e: print(e) #----------------# # Reproject Data # #----------------# print "Reproject Data" try: arcpy.DefineProjection_management(cfg.work_dir+"ff_max.tif", "PROJCS['NDFD',GEOGCS['GCS_Unknown',DATUM['D_unknown',SPHEROID['Sphere',6371000.0,0.0]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]],PROJECTION['Lambert_Conformal_Conic'],PARAMETER['false_easting',0.0],PARAMETER['false_northing',0.0],PARAMETER['central_meridian',-95.0],PARAMETER['standard_parallel_1',25.0],PARAMETER['standard_parallel_2',25.0],PARAMETER['latitude_of_origin',25.0],UNIT['Meter',1.0]]") arcpy.DefineProjection_management(cfg.work_dir+"ff_max_24hr.tif", "PROJCS['NDFD',GEOGCS['GCS_Unknown',DATUM['D_unknown',SPHEROID['Sphere',6371000.0,0.0]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]],PROJECTION['Lambert_Conformal_Conic'],PARAMETER['false_easting',0.0],PARAMETER['false_northing',0.0],PARAMETER['central_meridian',-95.0],PARAMETER['standard_parallel_1',25.0],PARAMETER['standard_parallel_2',25.0],PARAMETER['latitude_of_origin',25.0],UNIT['Meter',1.0]]") arcpy.DefineProjection_management(cfg.work_dir+"ff_max_30hr.tif", "PROJCS['NDFD',GEOGCS['GCS_Unknown',DATUM['D_unknown',SPHEROID['Sphere',6371000.0,0.0]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]],PROJECTION['Lambert_Conformal_Conic'],PARAMETER['false_easting',0.0],PARAMETER['false_northing',0.0],PARAMETER['central_meridian',-95.0],PARAMETER['standard_parallel_1',25.0],PARAMETER['standard_parallel_2',25.0],PARAMETER['latitude_of_origin',25.0],UNIT['Meter',1.0]]") arcpy.DefineProjection_management(cfg.work_dir+"ff_max_36hr.tif", "PROJCS['NDFD',GEOGCS['GCS_Unknown',DATUM['D_unknown',SPHEROID['Sphere',6371000.0,0.0]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]],PROJECTION['Lambert_Conformal_Conic'],PARAMETER['false_easting',0.0],PARAMETER['false_northing',0.0],PARAMETER['central_meridian',-95.0],PARAMETER['standard_parallel_1',25.0],PARAMETER['standard_parallel_2',25.0],PARAMETER['latitude_of_origin',25.0],UNIT['Meter',1.0]]") except Exception as e: print(e) #----------------------------------------------------------------------------------------------------# # Copy total, day1 and day2 output to components output folder. Day3 will be coppied in summary step # #----------------------------------------------------------------------------------------------------# os.chdir(cfg.work_dir) infiles = ["ff_max.tif","ff_max_24hr.tif"] outfiles = ["ff_fp.tif","ff_d1.tif"] for i,o in zip (infiles,outfiles): copyfile(cfg.work_dir+i, cfg.comp_out+o) rolling_web_list = [] for file in glob.glob("*ff_max_*"+"*.tif"): rolling_web_list.append(file) print rolling_web_list for f in rolling_web_list: rf = 'r24h_FlashFreeze_f'+f[7:9]+'.tif' copyfile(cfg.work_dir+f, cfg.roll_out+rf) end_time = strftime("%a, %d %b %Y %H:%M:%S", gmtime()) #print "Flash Freeze Processing Start Time "+start_time #print "Flash Freeze Processing End Time "+end_time logging.debug ("Flash Freeze Processing Start Time "+start_time) logging.debug ("Flash Freeze Processing End Time "+end_time) flash_freeze()