def main(args): fig = plt.figure() proj = _projections[args.loadfunc] ax = fig.gca(projection=proj) if proj == "polar": ax.set_theta_zero_location("N") ax.set_theta_direction("clockwise") anim = RadarAnim(fig, args.radarfiles, robust=args.robust, load_func=_load_funcs[args.loadfunc]) anim.add_axes(ax) anim.event_source.add_callback(lambda: _update_title(ax, anim)) if args.savefile is not None: anim.save(args.savefile) if args.doShow: plt.show()
def main(args) : fig = plt.figure() proj = _projections[args.loadfunc] ax = fig.gca(projection=proj) if proj == 'polar' : ax.set_theta_zero_location('N') ax.set_theta_direction('clockwise') anim = RadarAnim(fig, args.radarfiles, robust=args.robust, load_func=_load_funcs[args.loadfunc]) anim.add_axes(ax) anim.event_source.add_callback(lambda : _update_title(ax, anim)) if args.savefile is not None : anim.save(args.savefile) if args.doShow : plt.show()
def main(args): import os.path # for os.path.join() import glob # for globbing if args.bw_mode: BW_mode() # from TrackPlot module # FIXME: Currently, the code allows for trackFiles to be listed as well # as providing a simulation (which trackfiles are automatically # grabbed). Both situations can not be handled right now, though. trackFiles = [] trackTitles = [] polyfiles = args.polys if args.statName is not None and args.statLonLat is None: statData = ByName(args.statName)[0] args.statLonLat = (statData['LON'], statData['LAT']) if args.simName is not None: dirName = os.path.join(args.directory, args.simName) simParams = ParamUtils.ReadSimulationParams( os.path.join(dirName, "simParams.conf")) if args.trackRuns is not None: simParams['trackers'] = ExpandTrackRuns(simParams['trackers'], args.trackRuns) trackFiles = [ os.path.join(dirName, simParams['result_file'] + '_' + aTracker) for aTracker in simParams['trackers'] ] trackTitles = simParams['trackers'] if args.truthTrackFile is None: args.truthTrackFile = os.path.join(dirName, simParams['noisyTrackFile']) if args.simTagFile is None: args.simTagFile = os.path.join(dirName, simParams['simTagFile']) trackFiles += args.trackFiles trackTitles += args.trackFiles if args.trackTitles is not None: trackTitles = args.trackTitles if len(trackFiles) == 0: print "WARNING: No trackFiles given or found!" if args.layout is None: args.layout = (1, len(trackFiles)) if args.figsize is None: args.figsize = plt.figaspect(float(args.layout[0]) / args.layout[1]) if len(trackFiles) < len(polyfiles): raise ValueError("Can not have more polygon files than trackfiles!") trackerData = [ FilterMHTTracks(*ReadTracks(trackFile)) for trackFile in trackFiles ] polyData = [ _load_verts(f, tracks + falarms) for f, (tracks, falarms) in zip(polyfiles, trackerData) ] keeperIDs = None if args.simTagFile is not None: simTags = ParamUtils.ReadSimTagFile(args.simTagFile) keeperIDs = ParamUtils.process_tag_filters(simTags, args.filters) if args.statLonLat is not None: for aTracker in trackerData: CoordinateTransform(aTracker[0] + aTracker[1], args.statLonLat[0], args.statLonLat[1]) for polys in polyData: CoordinateTrans_lists(polys, args.statLonLat[0], args.statLonLat[1]) theFig = plt.figure(figsize=args.figsize) grid = AxesGrid( theFig, 111, nrows_ncols=args.layout, # aspect=False, share_all=True, axes_pad=0.45) if args.truthTrackFile is not None: (true_tracks, true_falarms) = FilterMHTTracks(*ReadTracks(args.truthTrackFile)) if args.statLonLat is not None: CoordinateTransform(true_tracks + true_falarms, args.statLonLat[0], args.statLonLat[1]) true_AssocSegs = CreateSegments(true_tracks) true_FAlarmSegs = CreateSegments(true_falarms) if keeperIDs is not None: true_AssocSegs = FilterSegments(keeperIDs, true_AssocSegs) true_FAlarmSegs = FilterSegments(keeperIDs, true_FAlarmSegs) (xLims, yLims, frameLims) = DomainFromTracks(true_tracks + true_falarms) else: true_AssocSegs = None true_FAlarmSegs = None stackedTracks = [] for aTracker in trackerData: stackedTracks += aTracker[0] + aTracker[1] (xLims, yLims, frameLims) = DomainFromTracks(stackedTracks) startFrame = args.startFrame endFrame = args.endFrame tail = args.tail if startFrame is None: startFrame = 0 if endFrame is None: endFrame = frameLims[1] if tail is None: tail = endFrame - startFrame # A common timer for all animations for syncing purposes. theTimer = None if args.radarFile is not None and args.statLonLat is not None: if endFrame >= len(args.radarFile): # Not enough radar files, so truncate the tracks. endFrame = len(args.radarFile) - 1 files = args.radarFile[startFrame:(endFrame + 1)] radAnim = RadarAnim(theFig, files) theTimer = radAnim.event_source for ax in grid: radAnim.add_axes(ax, alpha=0.6, zorder=0) else: radAnim = None showMap = (args.statLonLat is not None and args.displayMap) if showMap: bmap = Basemap(projection='cyl', resolution='i', suppress_ticks=False, llcrnrlat=yLims[0], llcrnrlon=xLims[0], urcrnrlat=yLims[1], urcrnrlon=xLims[1]) animator = SegAnimator(theFig, startFrame, endFrame, tail, event_source=theTimer, fade=args.fade) for index, (tracks, falarms) in enumerate(trackerData): curAxis = grid[index] if showMap: PlotMapLayers(bmap, mapLayers, curAxis, zorder=0.1) if true_AssocSegs is not None and true_FAlarmSegs is not None: trackAssocSegs = CreateSegments(tracks) trackFAlarmSegs = CreateSegments(falarms) if keeperIDs is not None: trackAssocSegs = FilterSegments(keeperIDs, trackAssocSegs) trackFAlarmSegs = FilterSegments(keeperIDs, trackFAlarmSegs) truthtable = CompareSegments(true_AssocSegs, true_FAlarmSegs, trackAssocSegs, trackFAlarmSegs) l, d = Animate_Segments(truthtable, (startFrame, endFrame), axis=curAxis) else: if keeperIDs is not None: filtFunc = lambda trk: FilterTrack(trk, cornerIDs=keeperIDs) tracks = map(filtFunc, tracks) falarms = map(filtFunc, falarms) CleanupTracks(tracks, falarms) l, d = Animate_PlainTracks(tracks, falarms, (startFrame, endFrame), axis=curAxis) animator._lines.extend(l) animator._lineData.extend(d) #curAxis.set_aspect("equal", 'datalim') #curAxis.set_aspect("equal") curAxis.set_title(trackTitles[index]) if not showMap: curAxis.set_xlabel("X") curAxis.set_ylabel("Y") else: curAxis.set_xlabel("Longitude (degrees)") curAxis.set_ylabel("Latitude (degrees)") polyAnims = [] for ax, verts in zip(grid, polyData): from matplotlib.animation import ArtistAnimation polyAnim = ArtistAnimation(theFig, _to_polygons(polys[startFrame:endFrame + 1], ax), event_source=theTimer) polyAnims.append(polyAnim) if args.xlims is not None and np.prod(grid.get_geometry()) > 0: grid[0].set_xlim(args.xlims) if args.ylims is not None and np.prod(grid.get_geometry()) > 0: grid[0].set_ylim(args.ylims) if args.saveImgFile is not None: if radAnim is not None: radAnim = [radAnim] else: radAnim = [] animator.save(args.saveImgFile, extra_anim=radAnim + polyAnims) if args.doShow: plt.show()
def main(args): import os.path # for os.path import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import AxesGrid inputDataFiles = [] titles = [] simTagFiles = [] if args.simName is not None: dirName = os.path.join(args.directory, args.simName) simParams = ParamUtils.ReadSimulationParams( os.path.join(dirName, "simParams.conf")) inputDataFiles.append(os.path.join(dirName, simParams['inputDataFile'])) titles.append(args.simName) simTagFiles.append(os.path.join(dirName, simParams['simTagFile'])) # Add on any files specified at the command-line inputDataFiles += args.inputDataFiles titles += args.inputDataFiles if args.simTagFiles is not None: simTagFiles += args.simTagFiles if len(inputDataFiles) == 0: print "WARNING: No inputDataFiles given or found!" if len(titles) != len(inputDataFiles): raise ValueError("The number of TITLEs does not match the" " number of INPUTFILEs.") if len(simTagFiles) < len(inputDataFiles): # Not an error, just simply append None simTagFiles.append([None] * (len(inputDataFiles) - len(simTagFiles))) if args.statName is not None and args.statLonLat is None: statData = ByName(args.statName)[0] args.statLonLat = (statData['LON'], statData['LAT']) if args.layout is None: args.layout = (1, len(inputDataFiles)) if args.figsize is None: args.figsize = plt.figaspect(float(args.layout[0]) / args.layout[1]) cornerVolumes = [ ReadCorners(inFileName, os.path.dirname(inFileName))['volume_data'] for inFileName in inputDataFiles ] multiTags = [(ReadSimTagFile(fname) if fname is not None else None) for fname in simTagFiles] for vols, simTags in zip(cornerVolumes, multiTags): keeperIDs = process_tag_filters(simTags, args.filters) if keeperIDs is None: continue for vol in vols: vol['stormCells'] = FilterTrack(vol['stormCells'], cornerIDs=keeperIDs) if args.statLonLat is not None: for vols in cornerVolumes: for vol in vols: CoordinateTransform(vol['stormCells'], args.statLonLat[0], args.statLonLat[1]) theFig = plt.figure(figsize=args.figsize) grid = AxesGrid(theFig, 111, nrows_ncols=args.layout, share_all=True, axes_pad=0.32) # A list to hold the CircleCollection arrays, it will have length # of max(tLims) - min(tLims) + 1 allCorners = None if args.trackFile is not None: (tracks, falarms) = FilterMHTTracks(*ReadTracks(args.trackFile)) if args.statLonLat is not None: CoordinateTransform(tracks + falarms, args.statLonLat[0], args.statLonLat[1]) (xLims, yLims, frameLims) = DomainFromTracks(tracks + falarms) else: volumes = [] for aVol in cornerVolumes: volumes.extend(aVol) (xLims, yLims, tLims, frameLims) = DomainFromVolumes(volumes) showMap = (args.statLonLat is not None and args.displayMap) if showMap: bmap = Basemap(projection='cyl', resolution='l', suppress_ticks=False, llcrnrlat=yLims[0], llcrnrlon=xLims[0], urcrnrlat=yLims[1], urcrnrlon=xLims[1]) startFrame = args.startFrame endFrame = args.endFrame tail = args.tail if startFrame is None: startFrame = frameLims[0] if endFrame is None: endFrame = frameLims[1] if tail is None: tail = 0 # A common event_source for synchronizing all the animations theTimer = None # Make the corners big big = False if args.radarFile is not None and args.statLonLat is not None: if endFrame - frameLims[0] >= len(args.radarFile): # Not enough radar files, so truncate the tracks. endFrame = (len(args.radarFile) + frameLims[0]) - 1 files = args.radarFile[startFrame - frameLims[0]:(endFrame + 1) - frameLims[0]] radAnim = RadarAnim(theFig, files) theTimer = radAnim.event_source for ax in grid: radAnim.add_axes(ax, alpha=0.6, zorder=0) # Radar images make it difficult to see corners, so make 'em big big = True else: radAnim = None theAnim = CornerAnimation(theFig, endFrame - startFrame + 1, tail=tail, interval=250, blit=False, event_source=theTimer, fade=args.fade) for (index, volData) in enumerate(cornerVolumes): curAxis = grid[index] if showMap: PlotMapLayers(bmap, mapLayers, curAxis, zorder=0.1) volFrames = [frameVol['frameNum'] for frameVol in volData] startIdx = volFrames.index(startFrame) endIdx = volFrames.index(endFrame) volTimes = [frameVol['volTime'] for frameVol in volData] startT = volTimes[startIdx] endT = volTimes[endIdx] corners = PlotCorners(volData, (startT, endT), axis=curAxis, big=big) #curAxis.set_aspect("equal", 'datalim') #curAxis.set_aspect("equal") curAxis.set_title(titles[index]) if not showMap: curAxis.set_xlabel("X") curAxis.set_ylabel("Y") else: curAxis.set_xlabel("Longitude") curAxis.set_ylabel("Latitude") theAnim.AddCornerVolume(corners) if args.xlims is not None and np.prod(grid.get_geometry()) > 0: grid[0].set_xlim(args.xlims) if args.ylims is not None and np.prod(grid.get_geometry()) > 0: grid[0].set_ylim(args.ylims) if args.saveImgFile is not None: if radAnim is not None: radAnim = [radAnim] theAnim.save(args.saveImgFile, extra_anim=radAnim) if args.doShow: plt.show()
def main(args) : import os.path # for os.path.join() import glob # for globbing if args.bw_mode : BW_mode() # from TrackPlot module # FIXME: Currently, the code allows for trackFiles to be listed as well # as providing a simulation (which trackfiles are automatically # grabbed). Both situations can not be handled right now, though. trackFiles = [] trackTitles = [] polyfiles = args.polys if args.statName is not None and args.statLonLat is None : statData = ByName(args.statName)[0] args.statLonLat = (statData['LON'], statData['LAT']) if args.simName is not None : dirName = os.path.join(args.directory, args.simName) simParams = ParamUtils.ReadSimulationParams(os.path.join(dirName, "simParams.conf")) if args.trackRuns is not None : simParams['trackers'] = ExpandTrackRuns(simParams['trackers'], args.trackRuns) trackFiles = [os.path.join(dirName, simParams['result_file'] + '_' + aTracker) for aTracker in simParams['trackers']] trackTitles = simParams['trackers'] if args.truthTrackFile is None : args.truthTrackFile = os.path.join(dirName, simParams['noisyTrackFile']) if args.simTagFile is None : args.simTagFile = os.path.join(dirName, simParams['simTagFile']) trackFiles += args.trackFiles trackTitles += args.trackFiles if args.trackTitles is not None : trackTitles = args.trackTitles if len(trackFiles) == 0 : print "WARNING: No trackFiles given or found!" if args.layout is None : args.layout = (1, len(trackFiles)) if args.figsize is None : args.figsize = plt.figaspect(float(args.layout[0]) / args.layout[1]) if len(trackFiles) < len(polyfiles): raise ValueError("Can not have more polygon files than trackfiles!") trackerData = [FilterMHTTracks(*ReadTracks(trackFile)) for trackFile in trackFiles] polyData = [_load_verts(f, tracks + falarms) for f, (tracks, falarms) in zip(polyfiles, trackerData)] keeperIDs = None if args.simTagFile is not None : simTags = ParamUtils.ReadSimTagFile(args.simTagFile) keeperIDs = ParamUtils.process_tag_filters(simTags, args.filters) if args.statLonLat is not None : for aTracker in trackerData : CoordinateTransform(aTracker[0] + aTracker[1], args.statLonLat[0], args.statLonLat[1]) for polys in polyData: CoordinateTrans_lists(polys, args.statLonLat[0], args.statLonLat[1]) theFig = plt.figure(figsize=args.figsize) grid = AxesGrid(theFig, 111, nrows_ncols=args.layout,# aspect=False, share_all=True, axes_pad=0.45) if args.truthTrackFile is not None : (true_tracks, true_falarms) = FilterMHTTracks(*ReadTracks(args.truthTrackFile)) if args.statLonLat is not None : CoordinateTransform(true_tracks + true_falarms, args.statLonLat[0], args.statLonLat[1]) true_AssocSegs = CreateSegments(true_tracks) true_FAlarmSegs = CreateSegments(true_falarms) if keeperIDs is not None : true_AssocSegs = FilterSegments(keeperIDs, true_AssocSegs) true_FAlarmSegs = FilterSegments(keeperIDs, true_FAlarmSegs) (xLims, yLims, frameLims) = DomainFromTracks(true_tracks + true_falarms) else : true_AssocSegs = None true_FAlarmSegs = None stackedTracks = [] for aTracker in trackerData : stackedTracks += aTracker[0] + aTracker[1] (xLims, yLims, frameLims) = DomainFromTracks(stackedTracks) startFrame = args.startFrame endFrame = args.endFrame tail = args.tail if startFrame is None : startFrame = 0 if endFrame is None : endFrame = frameLims[1] if tail is None : tail = endFrame - startFrame # A common timer for all animations for syncing purposes. theTimer = None if args.radarFile is not None and args.statLonLat is not None : if endFrame >= len(args.radarFile) : # Not enough radar files, so truncate the tracks. endFrame = len(args.radarFile) - 1 files = args.radarFile[startFrame:(endFrame + 1)] radAnim = RadarAnim(theFig, files) theTimer = radAnim.event_source for ax in grid : radAnim.add_axes(ax, alpha=0.6, zorder=0) else : radAnim = None showMap = (args.statLonLat is not None and args.displayMap) if showMap : bmap = Basemap(projection='cyl', resolution='i', suppress_ticks=False, llcrnrlat=yLims[0], llcrnrlon=xLims[0], urcrnrlat=yLims[1], urcrnrlon=xLims[1]) animator = SegAnimator(theFig, startFrame, endFrame, tail, event_source=theTimer, fade=args.fade) for index, (tracks, falarms) in enumerate(trackerData): curAxis = grid[index] if showMap : PlotMapLayers(bmap, mapLayers, curAxis, zorder=0.1) if true_AssocSegs is not None and true_FAlarmSegs is not None : trackAssocSegs = CreateSegments(tracks) trackFAlarmSegs = CreateSegments(falarms) if keeperIDs is not None : trackAssocSegs = FilterSegments(keeperIDs, trackAssocSegs) trackFAlarmSegs = FilterSegments(keeperIDs, trackFAlarmSegs) truthtable = CompareSegments(true_AssocSegs, true_FAlarmSegs, trackAssocSegs, trackFAlarmSegs) l, d = Animate_Segments(truthtable, (startFrame, endFrame), axis=curAxis) else : if keeperIDs is not None : filtFunc = lambda trk : FilterTrack(trk, cornerIDs=keeperIDs) tracks = map(filtFunc, tracks) falarms = map(filtFunc, falarms) CleanupTracks(tracks, falarms) l, d = Animate_PlainTracks(tracks, falarms, (startFrame, endFrame), axis=curAxis) animator._lines.extend(l) animator._lineData.extend(d) #curAxis.set_aspect("equal", 'datalim') #curAxis.set_aspect("equal") curAxis.set_title(trackTitles[index]) if not showMap : curAxis.set_xlabel("X") curAxis.set_ylabel("Y") else : curAxis.set_xlabel("Longitude (degrees)") curAxis.set_ylabel("Latitude (degrees)") polyAnims = [] for ax, verts in zip(grid, polyData): from matplotlib.animation import ArtistAnimation polyAnim = ArtistAnimation(theFig, _to_polygons(polys[startFrame:endFrame + 1], ax), event_source=theTimer) polyAnims.append(polyAnim) if args.xlims is not None and np.prod(grid.get_geometry()) > 0 : grid[0].set_xlim(args.xlims) if args.ylims is not None and np.prod(grid.get_geometry()) > 0 : grid[0].set_ylim(args.ylims) if args.saveImgFile is not None : if radAnim is not None : radAnim = [radAnim] else: radAnim = [] animator.save(args.saveImgFile, extra_anim=radAnim + polyAnims) if args.doShow : plt.show()
def MakeCornerPlots(fig, grid, cornerVolumes, titles, showMap=False, showRadar=False, startFrame=None, endFrame=None, tail=None, radarFiles=None, fade=False, multiTags=None, tag_filters=None) : if multiTags is None : multiTags = [None] * len(cornerVolumes) volumes = [] for volData in cornerVolumes : volumes.extend(volData) # the info in frameLims is completely useless because we # can't assume that each cornerVolumes has the same frame reference. xLims, yLims, tLims, frameLims = DomainFromVolumes(volumes) if startFrame is None : startFrame = frameLims[0] if endFrame is None : endFrame = frameLims[1] if tail is None : tail = 0 # A common event_source for synchronizing all the animations theTimer = None if showRadar : if endFrame - frameLims[0] >= len(radarFiles) : # Not enough radar files, so truncate the tracks. endFrame = (len(radarFiles) + frameLims[0]) - 1 files = radarFiles[startFrame - frameLims[0]:(endFrame + 1) - frameLims[0]] radAnim = RadarAnim(fig, files) theTimer = radAnim.event_source for ax in grid : radAnim.add_axes(ax, alpha=0.6, zorder=0) else : radAnim = None if showMap : bmap = Basemap(projection='cyl', resolution='l', suppress_ticks=False, llcrnrlat=yLims[0], llcrnrlon=xLims[0], urcrnrlat=yLims[1], urcrnrlon=xLims[1]) theAnim = CornerAnimation(fig, endFrame - startFrame + 1, tail=tail, interval=250, blit=False, event_source=theTimer, fade=fade) for ax, volData, title, simTags in zip(grid, cornerVolumes, titles, multiTags) : if showMap : PlotMapLayers(bmap, mapLayers, ax, zorder=0.1) ax.set_xlabel("Longitude") ax.set_ylabel("Latitude") else : ax.set_xlabel("X") ax.set_ylabel("Y") keeperIDs = process_tag_filters(simTags, tag_filters) if keeperIDs is not None : for frameVol in volData : frameVol['stormCells'] = FilterTrack(frameVol['stormCells'], cornerIDs=keeperIDs) # TODO: Need to figure out a better way to handle this for # volume data that do not have the same number of frames volFrames = [frameVol['frameNum'] for frameVol in volData] startIdx = volFrames.index(startFrame) endIdx = volFrames.index(endFrame) volTimes = [frameVol['volTime'] for frameVol in volData] startT = volTimes[startIdx] endT = volTimes[endIdx] # big=showRadar because radar maps make it difficult to see regular # corners. corners = PlotCorners(volData, (startT, endT), axis=ax, big=showRadar) ax.set_title(title) theAnim.AddCornerVolume(corners) return theAnim, radAnim
def main(args) : if args.layout is None : args.layout = (1, len(args.others) + 1) if args.figsize is None : args.figsize = plt.figaspect(float(args.layout[0]) / args.layout[1]) proj = _projections[args.loadfunc] """ fig = plt.figure(figsize=args.figsize) if proj is None : if args.shareall: grid = AxesGrid(fig, 111, nrows_ncols=args.layout, aspect=False, share_all=True) else: grid = [fig.add_subplot(args.layout[0], args.layout[1], index + 1) for index in range(np.prod(args.layout))] elif proj == 'polar' : # Currently can't make an AxesGrid of PolarAxes grid = [fig.add_subplot(args.layout[0], args.layout[1], index + 1, polar=True) for index in range(np.prod(args.layout))] for ax in grid : ax.set_theta_zero_location('N') ax.set_theta_direction('clockwise') """ fig, grid = plt.subplots(args.layout[0], args.layout[1], sharex=args.shareall, sharey=args.shareall, squeeze=False, subplot_kw=dict(projection=proj,axisbg='0.78'), figsize=args.figsize) if proj == 'polar': for ax in grid.flat: ax.set_theta_zero_location('N') ax.set_theta_direction('clockwise') filelists = [args.radarfiles] + args.others anims = [] event_source = None time_markers = None for index, (radarFiles, ax) in enumerate(zip(filelists, grid.flat)) : anim = RadarAnim(fig, radarFiles, robust=args.robust, load_func=_load_funcs[args.loadfunc], sps=600.0, event_source=event_source, time_markers=time_markers, blit=False) anim.add_axes(ax) anims.append(anim) event_source = anim.event_source time_markers = anim.time_markers # Remember, Python is late-binding. If I had just # simply passed ax and anim to the lambda function, _update_title() # would have been called only with the last axes and animation objects. #anim.event_source.add_callback(lambda i : _update_title(anims[i], # grid[i]), # index) #anim = SyncedRadar(fig, grid, filelists, robust=args.robust, # load_func=_load_funcs[args.loadfunc]) text_anims = [] for anim, ax in zip(anims, grid.flat) : text_anims.append(TitleAnim(anim, ax, event_source=anim.event_source, frames=len(time_markers))) if args.savefile is not None : anims[0].save(args.savefile, extra_anim=text_anims + anims[1:]) if args.doShow : plt.show()
def main(args) : import os.path # for os.path import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import AxesGrid inputDataFiles = [] titles = [] simTagFiles = [] if args.simName is not None : dirName = os.path.join(args.directory, args.simName) simParams = ParamUtils.ReadSimulationParams(os.path.join(dirName, "simParams.conf")) inputDataFiles.append(os.path.join(dirName, simParams['inputDataFile'])) titles.append(args.simName) simTagFiles.append(os.path.join(dirName, simParams['simTagFile'])) # Add on any files specified at the command-line inputDataFiles += args.inputDataFiles titles += args.inputDataFiles if args.simTagFiles is not None : simTagFiles += args.simTagFiles if len(inputDataFiles) == 0 : print "WARNING: No inputDataFiles given or found!" if len(titles) != len(inputDataFiles) : raise ValueError("The number of TITLEs does not match the" " number of INPUTFILEs.") if len(simTagFiles) < len(inputDataFiles) : # Not an error, just simply append None simTagFiles.append([None] * (len(inputDataFiles) - len(simTagFiles))) if args.statName is not None and args.statLonLat is None : statData = ByName(args.statName)[0] args.statLonLat = (statData['LON'], statData['LAT']) if args.layout is None : args.layout = (1, len(inputDataFiles)) if args.figsize is None : args.figsize = plt.figaspect(float(args.layout[0]) / args.layout[1]) cornerVolumes = [ReadCorners(inFileName, os.path.dirname(inFileName))['volume_data'] for inFileName in inputDataFiles] multiTags = [(ReadSimTagFile(fname) if fname is not None else None) for fname in simTagFiles] for vols, simTags in zip(cornerVolumes, multiTags) : keeperIDs = process_tag_filters(simTags, args.filters) if keeperIDs is None : continue for vol in vols : vol['stormCells'] = FilterTrack(vol['stormCells'], cornerIDs=keeperIDs) if args.statLonLat is not None : for vols in cornerVolumes : for vol in vols : CoordinateTransform(vol['stormCells'], args.statLonLat[0], args.statLonLat[1]) theFig = plt.figure(figsize=args.figsize) grid = AxesGrid(theFig, 111, nrows_ncols=args.layout, share_all=True, axes_pad=0.32) # A list to hold the CircleCollection arrays, it will have length # of max(tLims) - min(tLims) + 1 allCorners = None if args.trackFile is not None : (tracks, falarms) = FilterMHTTracks(*ReadTracks(args.trackFile)) if args.statLonLat is not None : CoordinateTransform(tracks + falarms, args.statLonLat[0], args.statLonLat[1]) (xLims, yLims, frameLims) = DomainFromTracks(tracks + falarms) else : volumes = [] for aVol in cornerVolumes : volumes.extend(aVol) (xLims, yLims, tLims, frameLims) = DomainFromVolumes(volumes) showMap = (args.statLonLat is not None and args.displayMap) if showMap : bmap = Basemap(projection='cyl', resolution='l', suppress_ticks=False, llcrnrlat=yLims[0], llcrnrlon=xLims[0], urcrnrlat=yLims[1], urcrnrlon=xLims[1]) startFrame = args.startFrame endFrame = args.endFrame tail = args.tail if startFrame is None : startFrame = frameLims[0] if endFrame is None : endFrame = frameLims[1] if tail is None : tail = 0 # A common event_source for synchronizing all the animations theTimer = None # Make the corners big big = False if args.radarFile is not None and args.statLonLat is not None : if endFrame - frameLims[0] >= len(args.radarFile) : # Not enough radar files, so truncate the tracks. endFrame = (len(args.radarFile) + frameLims[0]) - 1 files = args.radarFile[startFrame - frameLims[0]:(endFrame + 1) - frameLims[0]] radAnim = RadarAnim(theFig, files) theTimer = radAnim.event_source for ax in grid : radAnim.add_axes(ax, alpha=0.6, zorder=0) # Radar images make it difficult to see corners, so make 'em big big = True else : radAnim = None theAnim = CornerAnimation(theFig, endFrame - startFrame + 1, tail=tail, interval=250, blit=False, event_source=theTimer, fade=args.fade) for (index, volData) in enumerate(cornerVolumes) : curAxis = grid[index] if showMap : PlotMapLayers(bmap, mapLayers, curAxis, zorder=0.1) volFrames = [frameVol['frameNum'] for frameVol in volData] startIdx = volFrames.index(startFrame) endIdx = volFrames.index(endFrame) volTimes = [frameVol['volTime'] for frameVol in volData] startT = volTimes[startIdx] endT = volTimes[endIdx] corners = PlotCorners(volData, (startT, endT), axis=curAxis, big=big) #curAxis.set_aspect("equal", 'datalim') #curAxis.set_aspect("equal") curAxis.set_title(titles[index]) if not showMap : curAxis.set_xlabel("X") curAxis.set_ylabel("Y") else : curAxis.set_xlabel("Longitude") curAxis.set_ylabel("Latitude") theAnim.AddCornerVolume(corners) if args.xlims is not None and np.prod(grid.get_geometry()) > 0 : grid[0].set_xlim(args.xlims) if args.ylims is not None and np.prod(grid.get_geometry()) > 0 : grid[0].set_ylim(args.ylims) if args.saveImgFile is not None : if radAnim is not None : radAnim = [radAnim] theAnim.save(args.saveImgFile, extra_anim=radAnim) if args.doShow : plt.show()