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.hydra;
030    
031    import visad.Data;
032    import visad.FlatField;
033    import visad.VisADException;
034    import visad.CoordinateSystem;
035    import visad.RealType;
036    import visad.Real;
037    import visad.MathType;
038    import visad.IntegerNDSet;
039    import visad.GriddedSet;
040    import visad.LinearNDSet;
041    import visad.LinearSet;
042    import visad.Linear1DSet;
043    import visad.Linear2DSet;
044    import visad.Linear3DSet;
045    import visad.RealTupleType;
046    import visad.SetType;
047    import visad.FunctionType;
048    import visad.Set;
049    import java.rmi.RemoteException;
050    import java.util.HashMap;
051    import java.util.Iterator;
052    
053    
054    public class ArrayAdapter extends MultiDimensionAdapter {
055    
056       RealTupleType domainType;
057       FunctionType ftype;
058       GriddedSet domain;
059       RealType[] realTypes;
060    
061       public ArrayAdapter() {
062       }
063    
064       public ArrayAdapter(MultiDimensionReader reader, HashMap metadata) {
065         super(reader, metadata);
066         init();
067       }
068    
069       private void init() {
070         try {
071         realTypes = new RealType[array_rank];
072         int[] lengths = new int[array_rank];
073         for (int i=0; i<array_rank; i++) {
074           realTypes[i] = RealType.getRealType(array_dim_names[i]);
075           lengths[i] = array_dim_lengths[i];
076         }
077    
078         domainType = new RealTupleType(realTypes);
079    
080         String rangeName = null;
081         if (metadata.get("range_name") != null) {
082            rangeName = (String)metadata.get("range_name");
083         } 
084         else {
085            rangeName = (String)metadata.get("array_name");
086         }
087         rangeType = RealType.getRealType(rangeName);
088         ftype = new FunctionType(domainType, rangeType);
089         domain = IntegerNDSet.create(domainType, lengths);
090         }
091         catch (Exception e) {
092           e.printStackTrace();
093         }
094       }
095    
096       public GriddedSet getDomain() {
097         return domain;
098       }
099    
100       public FunctionType getMathType() {
101         return ftype;
102       }
103    
104       public GriddedSet makeDomain(Object subset) throws Exception {
105         if (subset == null) {
106            subset = getDefaultSubset();
107         }
108    
109         double[] first = new double[array_rank];
110         double[] last = new double[array_rank];
111         int[] length = new int[array_rank];
112    
113         for (int kk=0; kk<array_rank; kk++) {
114           RealType rtype = realTypes[kk];
115           double[] coords = (double[]) ((HashMap)subset).get(dimNameMap.get(rtype.getName()));
116           if (array_dim_lengths[kk] == 1) {
117             coords[0] = 0;
118             coords[1] = 0;
119             coords[2] = 1;
120           }
121           first[kk] = coords[0];
122           last[kk] = coords[1];
123           length[kk] = (int) ((last[kk] - first[kk])/coords[2] + 1);
124         }
125    
126         LinearSet lin_set = LinearNDSet.create(domainType, first, last, length);
127         GriddedSet new_domain = null;
128    
129         if (array_rank == 1) {
130              new_domain = (Linear1DSet) lin_set;
131         } else if (array_rank == 2) {
132              new_domain = (Linear2DSet) lin_set;
133         } else if (array_rank == 3) {
134              new_domain = (Linear3DSet) lin_set;
135         } else {
136              new_domain = (LinearNDSet) lin_set;
137         } 
138    
139         return new_domain;
140       }
141    
142       public HashMap getDefaultSubset() {
143         HashMap map = getEmptySubset();
144         for (int i=0; i<array_rank; i++) {
145           double[] coords = (double[]) map.get(dimNameMap.get(array_dim_names[i]));
146           coords[0] = 0;
147           coords[1] = array_dim_lengths[i] - 1;
148           coords[2] = 1;
149         }
150         return map;
151       }
152    
153       public HashMap getEmptySubset() {
154         HashMap<String, double[]> subset = new HashMap<String, double[]>();
155         for (int i=0; i<array_rank; i++) {
156           subset.put(dimNameMap.get(array_dim_names[i]), new double[3]);
157         }
158         return subset;
159       }
160    
161    }