001 /*
002 * This file is part of McIDAS-V
003 *
004 * Copyright 2007-2013
005 * Space Science and Engineering Center (SSEC)
006 * University of Wisconsin - Madison
007 * 1225 W. Dayton Street, Madison, WI 53706, USA
008 * https://www.ssec.wisc.edu/mcidas
009 *
010 * All Rights Reserved
011 *
012 * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and
013 * some McIDAS-V source code is based on IDV and VisAD source code.
014 *
015 * McIDAS-V is free software; you can redistribute it and/or modify
016 * it under the terms of the GNU Lesser Public License as published by
017 * the Free Software Foundation; either version 3 of the License, or
018 * (at your option) any later version.
019 *
020 * McIDAS-V is distributed in the hope that it will be useful,
021 * but WITHOUT ANY WARRANTY; without even the implied warranty of
022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
023 * GNU Lesser Public License for more details.
024 *
025 * You should have received a copy of the GNU Lesser Public License
026 * along with this program. If not, see http://www.gnu.org/licenses.
027 */
028
029 package edu.wisc.ssec.mcidasv.data.cyclone;
030
031 import java.util.ArrayList;
032 import java.util.HashMap;
033 import java.util.Iterator;
034 import java.util.List;
035 import java.util.Set;
036
037 import visad.DateTime;
038
039 /**
040 * Created by IntelliJ IDEA. User: yuanho Date: Apr 9, 2008 Time: 5:00:40 PM To
041 * change this template use File | Settings | File Templates.
042 */
043
044 public class StormTrackCollection {
045
046 /** _more_ */
047 // private HashMap forecastWayMapStartDates;
048
049 /** _more_ */
050 // private StormTrack obsTrack;
051
052 /** _more_ */
053 private HashMap<Way, List> wayToTracksHashMap;
054
055 /** _more_ */
056 List<StormTrack> tracks = new ArrayList<StormTrack>();
057
058 /**
059 * _more_
060 */
061 public StormTrackCollection() {
062 wayToTracksHashMap = new HashMap<Way, List>();
063 // forecastWayMapStartDates = new HashMap();
064 // obsTrack = null;
065 }
066
067 /**
068 * _more_
069 *
070 *
071 * @return _more_
072 */
073 public List<Way> getWayList() {
074 Set ss = wayToTracksHashMap.keySet();
075 ArrayList ways = new ArrayList();
076 ways.addAll(ss);
077 return ways;
078 }
079
080 /**
081 * _more_
082 *
083 * @param tracks
084 * _more_
085 */
086 public void addTrackList(List<StormTrack> tracks) {
087 for (StormTrack track : tracks) {
088 addTrack(track);
089 }
090 }
091
092 /**
093 * _more_
094 *
095 * @param track
096 * _more_
097 */
098 public void addTrack(StormTrack track) {
099 List list = wayToTracksHashMap.get(track.getWay());
100 if (list == null) {
101 wayToTracksHashMap.put(track.getWay(),
102 list = new ArrayList<StormTrack>());
103
104 }
105 list.add(track);
106 tracks.add(track);
107 }
108
109 /**
110 * _more_
111 *
112 * @return _more_
113 */
114 public List<StormTrack> getTracks() {
115 return new ArrayList<StormTrack>(tracks);
116 }
117
118 /**
119 * _more_
120 *
121 *
122 * @param way
123 * _more_
124 * @return _more_
125 */
126 public List<StormTrack> getTrackList(Way way) {
127 return (List<StormTrack>) wayToTracksHashMap.get(way);
128 }
129
130 /**
131 * _more_
132 *
133 * @return _more_
134 */
135 public HashMap<Way, List> getWayToTracksHashMap() {
136 return wayToTracksHashMap;
137 }
138
139 /**
140 * _more_
141 *
142 * @return _more_
143 */
144 public HashMap getWayToStartDatesHashMap() {
145 HashMap wayToStartDatesHashMap = new HashMap();
146 int size = wayToTracksHashMap.size();
147 Set ways = wayToTracksHashMap.keySet();
148 Iterator itr = ways.iterator();
149 for (int i = 0; i < size; i++) {
150 Way way = (Way) itr.next();
151 List tracks = getTrackList(way);
152 List startTimes = new ArrayList();
153 if (tracks != null) {
154 Iterator its = tracks.iterator();
155 while (its.hasNext()) {
156 StormTrack track = (StormTrack) its.next();
157 DateTime st = track.getStartTime();
158 startTimes.add(st);
159 }
160 if (startTimes.size() > 0) {
161 wayToStartDatesHashMap.put(way, startTimes);
162 }
163 }
164
165 }
166 return wayToStartDatesHashMap;
167 }
168
169 /**
170 * _more_
171 *
172 * @return _more_
173 */
174 public StormTrack getObsTrack() {
175 List tracks = getTrackList(Way.OBSERVATION);
176 if ((tracks == null) || (tracks.size() == 0)) {
177 return null;
178 }
179 return (StormTrack) tracks.get(0);
180 }
181
182 /**
183 * _more_
184 *
185 *
186 * @param way
187 * _more_
188 */
189 public void setObsTrack(Way way) {
190 // first remove the obs track
191 List<StormTrack> obtracks = wayToTracksHashMap.get(Way.OBSERVATION);
192 StormTrack obtrack = obtracks.get(0);
193 StormInfo sInfo = obtrack.getStormInfo();
194 List<StormParam> obParams = obtrack.getParams();
195 int size = obParams.size();
196 StormParam[] obParam = new StormParam[size];
197 int i = 0;
198 for (StormParam sp : obParams) {
199 obParam[i] = sp;
200 i++;
201 }
202 wayToTracksHashMap.remove(Way.OBSERVATION);
203
204 // now construct the obs track
205 List<StormTrackPoint> newObsPoints = new ArrayList();
206 List<StormTrack> tracks = getTrackList(way);
207
208 for (StormTrack stk : tracks) {
209 List<StormTrackPoint> stkPoints = stk.getTrackPoints();
210 newObsPoints.add(stkPoints.get(0));
211 }
212
213 StormTrack stk = new StormTrack(sInfo, Way.OBSERVATION, newObsPoints,
214 obParam);
215
216 addTrack(stk);
217 }
218
219 }