Ticket #4274: WriteSlicesToHDF_5.java

File WriteSlicesToHDF_5.java, 9.6 KB (added by Janik Zikovsky, 9 years ago)
Line 
1/*
2 * File: WriteSlicesToHDF_5.java
3 *
4 * Copyright (C) 2011, Dennis Mikkelson
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA.
19 *
20 * Contact : Dennis Mikkelson <mikkelsond@uwstout.edu>
21 *           Department of Mathematics, Statistics and Computer Science
22 *           University of Wisconsin-Stout
23 *           Menomonie, WI 54751, USA
24 *
25 * This work was supported by the Spallation Neutron Source Division
26 * of Oak Ridge National Laboratory, Oak Ridge, TN, USA.
27 *
28 *  Last Modified:
29 *
30 *  $Author: eu7 $
31 *  $Date: 2011-10-13 22:06:21 -0500 (Thu, 13 Oct 2011) $           
32 *  $Revision: 21314 $
33 */
34
35
36package EventTools.ShowEventsApp.DataHandlers;
37
38
39import ncsa.hdf.object.*;     // the common object package
40import ncsa.hdf.object.h5.*;  // the HDF5 implementation
41
42import ncsa.hdf.hdf5lib.HDF5Constants;
43
44import gov.anl.ipns.MathTools.Geometry.*;
45
46/**
47 *  This class handles writing slices of reciprocal space to an HDF 5 file
48 *  in the form required by the ZODS program.
49 */
50public class WriteSlicesToHDF_5
51{
52
53  public static H5File OpenH5_File( String filename ) throws Exception
54  { 
55    FileFormat file_format = 
56                   FileFormat.getFileFormat(FileFormat.FILE_TYPE_HDF5);
57
58    if (file_format == null)
59      throw new IllegalArgumentException("Couldn't get HDF5 FileFormat");
60
61    H5File file = (H5File)file_format.createFile(filename, 
62                                                 FileFormat.FILE_CREATE_DELETE);
63
64    if ( file == null )
65      throw new IllegalArgumentException("Could not create file " + filename );
66
67    return file;
68  }
69
70
71  private static void AddVectorAttribute( Group    group, 
72                                          Datatype type,
73                                          String   name,
74                                          Vector3D vec ) throws Exception
75  {
76    long[]    dims  = {3};
77    Attribute attr  = new Attribute( name, type, dims );
78    double[] coords = new double[3];
79    coords[0] = vec.getX();
80    coords[1] = vec.getY();
81    coords[2] = vec.getZ();
82    attr.setValue( coords );
83    group.writeMetadata( attr );
84  }
85
86
87  private static void AddMatrixAttribute( Group     group,
88                                          Datatype  type,
89                                          String    name,
90                                          float[][] matrix ) throws Exception
91  {
92    long[]    dims   = {3,3};
93    Attribute attr   = new Attribute( name, type, dims );
94    double[][] d_mat = new double[3][3];
95   
96    for ( int row = 0; row < 3; row++ )
97      for ( int col = 0; col < 3; col++ )
98        d_mat[row][col] = matrix[row][col]; 
99
100    attr.setValue( d_mat );
101    group.writeMetadata( attr );
102  }
103
104
105  private static void AddSizeAttribute( Group    group,
106                                        Datatype type,
107                                        String   name,
108                                        int[]    sizes ) throws Exception
109  {
110    long[]    dims  = { 3 };
111    Attribute attr  = new Attribute( name, type, dims );
112    attr.setValue( sizes );
113    group.writeMetadata( attr );
114  }
115
116
117  private static void AddUintAttribute( Group    group,
118                                        Datatype type,
119                                        String   name,
120                                        int      value ) throws Exception
121  {
122    long[] attrDims  = { 1 };   
123    int[]  attrValue = { value }; 
124
125    Attribute attr = new Attribute( name, type, attrDims );
126    attr.setValue( attrValue ); 
127
128    group.writeMetadata( attr );
129  }
130
131
132  /**
133   * Write all of the "pages" of the specified 3D array to the specified
134   * file in HDF 5 format.  The file will be overwritten if it already
135   * exists.
136   */
137  public static void WriteFile( String       filename,
138                                boolean      in_HKL,
139                                float[][]    orientation_matrix,
140                                Vector3D     origin,
141                                Vector3D     dir_1_scaled,
142                                Vector3D     dir_2_scaled,
143                                Vector3D     dir_3_scaled,
144                                float[][][]  data
145                              ) throws Exception
146  {
147    H5File out_file = OpenH5_File( filename );
148    out_file.open();
149
150    Datatype le_double_type = out_file.createDatatype( Datatype.CLASS_FLOAT,
151                                                       8,
152                                                       Datatype.ORDER_LE,
153                                                       -1 );
154
155    Datatype le_uint_type   = out_file.createDatatype( Datatype.CLASS_INTEGER,
156                                                       4,
157                                                       Datatype.ORDER_LE,
158                                                       Datatype.SIGN_NONE );
159
160    Group root = (Group)
161          ((javax.swing.tree.DefaultMutableTreeNode)out_file.getRootNode())
162          .getUserObject();
163
164    // create groups at the root
165    Group coord_group =  out_file.createGroup("CoordinateSystem", root);
166   
167    if ( in_HKL )
168      AddUintAttribute( coord_group, le_uint_type, "isLocal", 1 );
169    else
170      AddUintAttribute( coord_group, le_uint_type, "isLocal", 0 );
171
172    if ( orientation_matrix != null )
173      AddMatrixAttribute( coord_group, 
174                          le_double_type, 
175                          "orientation_matrix",
176                          orientation_matrix );
177
178    int    gzip_level = 0;
179
180    Group data_group = out_file.createGroup("Data", root); 
181
182    int n_pages = data.length;
183    int n_rows  = data[0].length;
184    int n_cols  = data[0][0].length;
185
186    Vector3D slice_origin = new Vector3D( origin );
187    for ( int page = 0; page < n_pages; page++ )
188    {
189      Group p_group = out_file.createGroup("Data_"+page, data_group);
190      AddVectorAttribute( p_group, le_double_type, "origin", slice_origin );
191
192      int[] sizes = { 1, n_rows, n_cols };
193      AddSizeAttribute( p_group, le_uint_type, "size", sizes );
194
195      AddVectorAttribute( p_group, le_double_type,"direction_1", dir_1_scaled );
196      AddVectorAttribute( p_group, le_double_type,"direction_2", dir_2_scaled );
197      AddVectorAttribute( p_group, le_double_type,"direction_3", dir_3_scaled );
198
199      /* Code to write as 1D array
200     
201      int      data_size = n_rows * n_cols;
202      long[]   data_dims = { data_size };
203      double[] data_1D   = new double[n_rows * n_cols];
204
205      int index = 0;
206      for ( int row = 0; row < n_rows; row++ )
207        for ( int col = 0; col < n_cols; col++ )
208        {
209          data_1D[index] = data[page][row][col];
210          index++;
211        }
212
213      Dataset dataset = out_file.createScalarDS ("Data",
214                                                 p_group,
215                                                 le_double_type,
216                                                 data_dims, null, null,
217                                                 gzip_level,
218                                                 data_1D );
219      */
220      /* End 1D array code */
221
222      /* Code to write as 2D array, so it can be viewed as an image in hdfview
223      */
224      long[] two_D_dims  = { n_rows, n_cols };
225      double[][] data_2D = new double[n_rows][n_cols];
226      for ( int row = 0; row < n_rows; row++ )
227        for ( int col = 0; col < n_cols; col++ )
228          data_2D[row][col] = data[page][row][col];
229
230      out_file.createScalarDS ("Data_2D",
231                                p_group,
232                                le_double_type,
233                                two_D_dims, null, null,
234                                gzip_level,
235                                data_2D );
236      /* End 2D array code */
237
238      slice_origin.add( dir_1_scaled );   // update origin for next slice
239    }
240
241    out_file.close();
242  }
243
244
245  /**
246   *  This main program provides a simple unit test for writing a sequence
247   *  of slices in the ZODS hdf5 file format.
248   */
249  public static void main( String args[] ) throws Exception
250  {
251    if ( args.length < 1 )
252    {
253      System.out.println("Enter the name of the file to write on command line");
254      System.exit(1);
255    }
256
257    String filename = args[0];
258    boolean in_HKL  = true;
259    Vector3D origin = new Vector3D( -1.6f, -1.6f, 0 );
260    Vector3D dir_1_scaled = new Vector3D( 0.04f, 0, 0 );
261    Vector3D dir_2_scaled = new Vector3D( 0, 0.04f, 0 );
262    Vector3D dir_3_scaled = new Vector3D( 0, 0, 0.004f );
263
264    float[][] orientation_mat = { {1, 0, 3}, {0, 1, 2}, {0, 0, 1} };
265
266    int n_pages = 10;
267    int n_rows  = 9;
268    int n_cols  = 9;
269    float[][][] data = new float[n_pages][n_rows][n_cols];
270    int index   = 0;
271    for ( int page = 0; page < n_pages; page++ )
272     for ( int row = 0; row < n_rows; row++ )
273       for ( int col = 0; col < n_cols; col++ )
274       {
275         data[page][row][col] = index;
276         index++; 
277       }
278
279    WriteFile( filename, 
280               in_HKL,
281               orientation_mat,
282               origin,
283               dir_1_scaled,
284               dir_2_scaled,
285               dir_3_scaled,
286               data
287             );
288  }
289
290
291}