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