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    }