001/*
002 * This file is part of McIDAS-V
003 *
004 * Copyright 2007-2015
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
029package edu.wisc.ssec.mcidasv.data.hydra;
030
031import java.rmi.RemoteException;
032import java.util.HashMap;
033
034import visad.FlatField;
035import visad.FunctionType;
036import visad.Gridded3DSet;
037import visad.RealTupleType;
038import visad.RealType;
039import visad.SetType;
040import visad.VisADException;
041import visad.Set;
042
043public class TrackAdapter extends MultiDimensionAdapter {
044   RealTupleType domainType;
045   ArrayAdapter rngAdapter;
046   TrackDomain trackDomain;
047
048   int listIndex = 0;
049
050   String adapterName = null;
051
052   public TrackAdapter() {
053   }
054
055   public TrackAdapter(TrackDomain trackDomain, ArrayAdapter rangeAdapter) throws VisADException {
056     this.trackDomain = trackDomain;
057     this.rngAdapter = rangeAdapter;
058   }
059
060   public Set makeDomain(Object subset) throws Exception {
061     throw new Exception("Unimplemented");
062   } 
063
064   public FlatField getData(Object subset) throws VisADException, RemoteException {
065     
066     float[] rngValues = null;
067
068     Set set = trackDomain.makeDomain(subset);
069
070     domainType = ((SetType)set.getType()).getDomain();
071
072     try {
073       rngValues = (rngAdapter.getData(subset).getFloats())[0];
074     }
075     catch (Exception e) {
076       e.printStackTrace();
077       return null;
078     }
079
080     FlatField field = new FlatField(new FunctionType(domainType, rngAdapter.getMathType().getRange()), set);
081     field.setSamples(new float[][] {rngValues}, false);
082
083     return field;
084   }
085
086   public void setName(String name) {
087     adapterName = name;
088   }
089
090   public String getArrayName() {
091     if (adapterName != null) {
092       return adapterName;
093     }
094     else {
095       return rngAdapter.getArrayName();
096     }
097   }
098
099   void setListIndex(int idx) {
100     listIndex = idx;
101   }
102
103   public HashMap getDefaultSubset() {
104     HashMap subset = rngAdapter.getDefaultSubset();
105     if (subset.containsKey("VertDim")) {
106       double[] coords = (double[]) ((HashMap)subset).get("VertDim");
107       if (coords != null) {
108         coords[0] = listIndex;
109         coords[1] = listIndex;
110         coords[2] = 1;
111       }
112     }
113     return subset;
114   }
115
116   public HashMap getSubsetFromLonLatRect(double minLat, double maxLat,
117                                          double minLon, double maxLon) {
118      return trackDomain.getSubsetFromLonLatRect(getDefaultSubset(), minLat, maxLat, minLon, maxLon);
119   }
120
121   public HashMap getSubsetFromLonLatRect(double minLat, double maxLat,
122                                          double minLon, double maxLon,
123                                          int xStride, int yStride, int zStride) {
124      return trackDomain.getSubsetFromLonLatRect(getDefaultSubset(), minLat, maxLat, minLon, maxLon,
125                                                 xStride, yStride, zStride);
126   }
127
128}