This file is indexed.

/usr/bin/h5toascii is in python-sardana 1.2.0-2.

This file is owned by root:root, with mode 0o755.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#! /usr/bin/python

##############################################################################
##
## This file is part of Sardana
##
## http://www.tango-controls.org/static/sardana/latest/doc/html/index.html
##
## Copyright 2011 CELLS / ALBA Synchrotron, Bellaterra, Spain
## 
## Sardana is free software: you can redistribute it and/or modify
## it under the terms of the GNU Lesser General Public License as published by
## the Free Software Foundation, either version 3 of the License, or
## (at your option) any later version.
## 
## Sardana is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU Lesser General Public License for more details.
## 
## You should have received a copy of the GNU Lesser General Public License
## along with Sardana.  If not, see <http://www.gnu.org/licenses/>.
##
##############################################################################

'''
Script for extracting "scan tables" from Sardana NeXus files into an tab-separated ASCII tables.
When data from multiple entries are extracted from a file, each table is stored in a different file.
The output files for a given input file are stored in a directory whose name matches the input file name (minus extension)

Usage:
python h52ascii.py <nexusfilename> [<entryname1> [<entryname2>] ...] 

If no entry names are provided, all entries from the given nexus file name will be extracted.

Note: only scalar values are extracted   
'''

import nxs
import sys,os
import numpy


def measurement2ascii(fd, entryname, ofname):
    #check if there is a measurement datagroup
    tmp = "/%s/measurement"%entryname
    try:
        fd.openpath(tmp)
    except:
        print 'Cannot open hdf5 path "%s". Skipping.'%tmp
        return False 
        
    #read the point number data 
    ptnb_names = ('Pt_No','point_nb','#Pt No') #possible ways of storing the point number (along different versions)
    for i,ptnb_name in enumerate(ptnb_names):
        try: 
            fd.opendata(ptnb_name)
            break
        except:
            print  'cannot open %s'%ptnb_name
            if i == len(ptnb_names)-1: #if this was not the last choice
                print 'I give up!'
                return False 
    ptnb = fd.getdata()
    fd.closedata()
    #prepare a list with column names and a table made of data "columns" 
    namelist=[ptnb_name]
    table = [ptnb.copy().flatten()]
    for name,nxclass in fd.entries():
        if name == ptnb_name: continue
        if nxclass != 'SDS': continue #not a dataset
        dshape,dtype = fd.getinfo()
        if tuple(dshape) != ptnb.shape: continue #not a scalar (incompatible shape)
        table.append(fd.getdata().flatten())
        namelist.append(name)
    #write the table to a file
    try:
        datfile = open(ofname,'w')
    except:
        print 'Cannot create file "%s". Skipping.'%ofname
        return False
    datfile.write("\t".join(namelist)) #write a header of column names
    datfile.write("\n")
    numpy.savetxt(datfile, numpy.vstack(table).transpose(), delimiter='\t') #write the data table
    datfile.close()
    return True


def main():
    if len(sys.argv) > 1:
        fname = sys.argv[1]
    else:
        print "Usage:\nh5toascii <nexusfilename> [<entryname1> [<entryname2>] ...] "
        sys.exit(1)
        
    entrynames = sys.argv[2:] 
    
    fd = nxs.open(fname,'r')
    
    if len(entrynames)==0:
        entrynames = [n for n,c in fd.entries() if c=='NXentry']
    
    dirname,ext = os.path.splitext(fname)
    try:
        os.makedirs(dirname)
    except:
        print 'Cannot create dir "%s". Skipping.'%dirname
    
    for ename in entrynames:
        ofname = os.path.join(dirname,"%s.dat"%ename)
        print "Extracting %s:%s to %s"%(fname,ename,ofname)
        measurement2ascii(fd, ename, ofname)
    
    fd.close()


if __name__ == "__main__":
    main()