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 }