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    }