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