/** * Show attributes attached to the current Nexus entry * * @param nxfileID The Nexus entry * @param indentStr Indent spaces do display nexus entries as a tree * */ void LoadHelper::dumpNexusAttributes(NXhandle nxfileID, std::string& indentStr) { // Attributes NXname pName; int iLength, iType; int nbuff = 127; boost::shared_array<char> buff(new char[nbuff + 1]); while (NXgetnextattr(nxfileID, pName, &iLength, &iType) != NX_EOD) { g_log.debug() << indentStr << '@' << pName << " = "; switch (iType) { case NX_CHAR: { if (iLength > nbuff + 1) { nbuff = iLength; buff.reset(new char[nbuff + 1]); } int nz = iLength + 1; NXgetattr(nxfileID, pName, buff.get(), &nz, &iType); g_log.debug() << indentStr << buff.get() << '\n'; break; } case NX_INT16: { short int value; NXgetattr(nxfileID, pName, &value, &iLength, &iType); g_log.debug() << indentStr << value << '\n'; break; } case NX_INT32: { int value; NXgetattr(nxfileID, pName, &value, &iLength, &iType); g_log.debug() << indentStr << value << '\n'; break; } case NX_UINT16: { short unsigned int value; NXgetattr(nxfileID, pName, &value, &iLength, &iType); g_log.debug() << indentStr << value << '\n'; break; } } // switch } // while }
/* Checks for attributes and outputs their values */ void PrintAttributes(NXhandle fileId) { int status, attrLen, attrType; NXname attrName; void *attrBuffer; do { status = NXgetnextattr(fileId, attrName, &attrLen, &attrType); if (status == NX_ERROR) return; if (status == NX_OK) { attrLen++; /* Add space for string termination */ if (NXmalloc ((void **)&attrBuffer, 1, &attrLen, attrType) != NX_OK) return; if (NXgetattr (fileId, attrName, attrBuffer, &attrLen, &attrType) != NX_OK) return; printf(" %s = ", attrName); PrintData(attrBuffer, attrType, attrLen); printf("\n"); if (NXfree((void **)&attrBuffer) != NX_OK) return; } } while (status != NX_EOD); return; }
/** Copy the attributes from input to output */ int SaveToSNSHistogramNexus::WriteAttributes(int is_definition) { (void)is_definition; int status, i, attrLen, attrType; NXname attrName; void *attrBuffer; i = 0; do { status = NXgetnextattr(inId, attrName, &attrLen, &attrType); if (status == NX_ERROR) return NX_ERROR; if (status == NX_OK) { if (strcmp(attrName, "NeXus_version") && strcmp(attrName, "XML_version") && strcmp(attrName, "HDF_version") && strcmp(attrName, "HDF5_Version") && strcmp(attrName, "file_name") && strcmp(attrName, "file_time")) { attrLen++; /* Add space for string termination */ if (NXmalloc(&attrBuffer, 1, &attrLen, attrType) != NX_OK) return NX_ERROR; if (NXgetattr(inId, attrName, attrBuffer, &attrLen, &attrType) != NX_OK) return NX_ERROR; if (NXputattr(outId, attrName, attrBuffer, attrLen, attrType) != NX_OK) return NX_ERROR; if (NXfree(&attrBuffer) != NX_OK) return NX_ERROR; } i++; } } while (status != NX_EOD); return NX_OK; }
/*-------------------------------------------------------------------*/ void *nx_getattr(void *handle, char *name, int type, int length){ NXhandle hfil; int status, tp, ll, dim[1]; pNXDS data = NULL; hfil = (NXhandle)handle; /* prepare dataset */ dim[0] = length+1; data = createNXDataset32(1,type,dim); if(data == NULL){ return NULL; } /* finally read the real data */ ll = length; tp = type; status = NXgetattr(hfil,name,data->u.ptr,&ll,&tp); if(status != NX_OK){ dropNXDataset(data); return NULL; } return data; }
int main (int argc, char *argv[]) { int i, j, k, n, NXrank, NXdims[32], NXtype, NXlen, entry_status, attr_status; float r; void *data_buffer; unsigned char i1_array[4] = {1, 2, 3, 4}; short int i2_array[4] = {1000, 2000, 3000, 4000}; int i4_array[4] = {1000000, 2000000, 3000000, 4000000}; float r4_array[5][4] = {{1., 2., 3., 4.}, {5., 6., 7., 8.}, {9., 10., 11., 12.}, {13., 14., 15., 16.}, {17., 18., 19., 20.}}; double r8_array[5][4] = {{1., 2., 3., 4.}, {5., 6., 7., 8.}, {9., 10., 11., 12.}, {13., 14., 15., 16.}, {17., 18., 19., 20.}}; int array_dims[2] = {5, 4}; int unlimited_dims[1] = {NX_UNLIMITED}; int chunk_size[2]={5,4}; int slab_start[2], slab_size[2]; char name[64], char_class[64], char_buffer[128]; char group_name[64], class_name[64]; char c1_array[5][4] = {{'a', 'b', 'c' ,'d'}, {'e', 'f', 'g' ,'h'}, {'i', 'j', 'k', 'l'}, {'m', 'n', 'o', 'p'}, {'q', 'r', 's' , 't'}}; int unlimited_cdims[2] = {NX_UNLIMITED, 4}; NXhandle fileid, clone_fileid; NXlink glink, dlink, blink; int comp_array[100][20]; int dims[2]; int cdims[2]; int nx_creation_code; char nxFile[80]; char filename[256]; int64_t grossezahl[4]; const char* ch_test_data = "NeXus ><}&{'\\&\" Data"; char path[512]; grossezahl[0] = 12; grossezahl[2] = 23; #if HAVE_LONG_LONG_INT grossezahl[1] = (int64_t)555555555555LL; grossezahl[3] = (int64_t)777777777777LL; #else grossezahl[1] = (int64_t)555555555555; grossezahl[3] = (int64_t)777777777777; #endif /* HAVE_LONG_LONG_INT */ if(strstr(argv[0],"napi_test-hdf5") != NULL){ nx_creation_code = NXACC_CREATE5; strcpy(nxFile,"NXtest.h5"); }else if(strstr(argv[0],"napi_test-xml-table") != NULL){ nx_creation_code = NXACC_CREATEXML | NXACC_TABLE; strcpy(nxFile,"NXtest-table.xml"); }else if(strstr(argv[0],"napi_test-xml") != NULL){ nx_creation_code = NXACC_CREATEXML; strcpy(nxFile,"NXtest.xml"); } else { nx_creation_code = NXACC_CREATE; strcpy(nxFile,"NXtest.hdf"); } /* create file */ if (NXopen (nxFile, nx_creation_code, &fileid) != NX_OK) return 1; if (nx_creation_code == NXACC_CREATE5) { if (NXreopen (fileid, &clone_fileid) != NX_OK) return 1; } NXsetnumberformat(fileid,NX_FLOAT32,"%9.3f"); if (NXmakegroup (fileid, "entry", "NXentry") != NX_OK) return 1; if (NXopengroup (fileid, "entry", "NXentry") != NX_OK) return 1; if(NXputattr(fileid,"hugo","namenlos",strlen("namenlos"), NX_CHAR) != NX_OK) return 1; if(NXputattr(fileid,"cucumber","passion",strlen("passion"), NX_CHAR) != NX_OK) return 1; NXlen = strlen(ch_test_data); if (NXmakedata (fileid, "ch_data", NX_CHAR, 1, &NXlen) != NX_OK) return 1; if (NXopendata (fileid, "ch_data") != NX_OK) return 1; if (NXputdata (fileid, ch_test_data) != NX_OK) return 1; if (NXclosedata (fileid) != NX_OK) return 1; if (NXmakedata (fileid, "c1_data", NX_CHAR, 2, array_dims) != NX_OK) return 1; if (NXopendata (fileid, "c1_data") != NX_OK) return 1; if (NXputdata (fileid, c1_array) != NX_OK) return 1; if (NXclosedata (fileid) != NX_OK) return 1; if (NXmakedata (fileid, "i1_data", NX_INT8, 1, &array_dims[1]) != NX_OK) return 1; if (NXopendata (fileid, "i1_data") != NX_OK) return 1; if (NXputdata (fileid, i1_array) != NX_OK) return 1; if (NXclosedata (fileid) != NX_OK) return 1; if (NXmakedata (fileid, "i2_data", NX_INT16, 1, &array_dims[1]) != NX_OK) return 1; if (NXopendata (fileid, "i2_data") != NX_OK) return 1; if (NXputdata (fileid, i2_array) != NX_OK) return 1; if (NXclosedata (fileid) != NX_OK) return 1; if (NXmakedata (fileid, "i4_data", NX_INT32, 1, &array_dims[1]) != NX_OK) return 1; if (NXopendata (fileid, "i4_data") != NX_OK) return 1; if (NXputdata (fileid, i4_array) != NX_OK) return 1; if (NXclosedata (fileid) != NX_OK) return 1; if (NXcompmakedata (fileid, "r4_data", NX_FLOAT32, 2, array_dims,NX_COMP_LZW,chunk_size) != NX_OK) return 1; if (NXopendata (fileid, "r4_data") != NX_OK) return 1; if (NXputdata (fileid, r4_array) != NX_OK) return 1; if (NXclosedata (fileid) != NX_OK) return 1; if (NXmakedata (fileid, "r8_data", NX_FLOAT64, 2, array_dims) != NX_OK) return 1; if (NXopendata (fileid, "r8_data") != NX_OK) return 1; slab_start[0] = 4; slab_start[1] = 0; slab_size[0] = 1; slab_size[1] = 4; if (NXputslab (fileid, (double*)r8_array + 16, slab_start, slab_size) != NX_OK) return 1; slab_start[0] = 0; slab_start[1] = 0; slab_size[0] = 4; slab_size[1] = 4; if (NXputslab (fileid, r8_array, slab_start, slab_size) != NX_OK) return 1; if (NXputattr (fileid, "ch_attribute", ch_test_data, strlen (ch_test_data), NX_CHAR) != NX_OK) return 1; i = 42; if (NXputattr (fileid, "i4_attribute", &i, 1, NX_INT32) != NX_OK) return 1; r = 3.14159265; if (NXputattr (fileid, "r4_attribute", &r, 1, NX_FLOAT32) != NX_OK) return 1; if (NXgetdataID (fileid, &dlink) != NX_OK) return 1; if (NXclosedata (fileid) != NX_OK) return 1; dims[0] = 4; if (nx_creation_code != NXACC_CREATE) { if (NXmakedata (fileid, "grosse_zahl", NX_INT64, 1,dims) == NX_OK) { if (NXopendata (fileid, "grosse_zahl") != NX_OK) return 1; if (NXputdata (fileid, grossezahl) != NX_OK) return 1; if (NXclosedata (fileid) != NX_OK) return 1; } } if (NXmakegroup (fileid, "data", "NXdata") != NX_OK) return 1; if (NXopengroup (fileid, "data", "NXdata") != NX_OK) return 1; if (NXmakelink (fileid, &dlink) != NX_OK) return 1; dims[0] = 100; dims[1] = 20; for(i = 0; i < 100; i++) { for(j = 0; j < 20; j++) { comp_array[i][j] = i; } } cdims[0] = 20; cdims[1] = 20; if (NXcompmakedata (fileid, "comp_data", NX_INT32, 2, dims, NX_COMP_LZW, cdims) != NX_OK) return 1; if (NXopendata (fileid, "comp_data") != NX_OK) return 1; if (NXputdata (fileid, comp_array) != NX_OK) return 1; if (NXclosedata (fileid) != NX_OK) return 1; if (NXflush (&fileid) != NX_OK) return 1; if (NXmakedata (fileid, "flush_data", NX_INT32, 1, unlimited_dims) != NX_OK) return 1; slab_size[0] = 1; for (i = 0; i < 7; i++) { slab_start[0] = i; if (NXopendata (fileid, "flush_data") != NX_OK) return 1; if (NXputslab (fileid, &i, slab_start, slab_size) != NX_OK) return 1; if (NXflush (&fileid) != NX_OK) return 1; } if (NXclosegroup (fileid) != NX_OK) return 1; if (NXmakegroup (fileid, "sample", "NXsample") != NX_OK) return 1; if (NXopengroup (fileid, "sample", "NXsample") != NX_OK) return 1; NXlen = 12; if (NXmakedata (fileid, "ch_data", NX_CHAR, 1, &NXlen) != NX_OK) return 1; if (NXopendata (fileid, "ch_data") != NX_OK) return 1; if (NXputdata (fileid, "NeXus sample") != NX_OK) return 1; if (NXclosedata (fileid) != NX_OK) return 1; if (NXgetgroupID (fileid, &glink) != NX_OK) return 1; if (( nx_creation_code & NXACC_CREATEXML) == 0 ) { if (NXmakedata (fileid, "cdata_unlimited", NX_CHAR, 2, unlimited_cdims) != NX_OK) return 1; if (NXopendata (fileid, "cdata_unlimited") != NX_OK) return 1; slab_size[0] = 1; slab_size[1] = 4; slab_start[1] = 0; for (i = 0; i < 5; i++) { slab_start[0] = i; if (NXputslab (fileid, &(c1_array[i][0]), slab_start, slab_size) != NX_OK) return 1; } if (NXclosedata (fileid) != NX_OK) return 1; } if (NXclosegroup (fileid) != NX_OK) return 1; if (NXclosegroup (fileid) != NX_OK) return 1; if (NXmakegroup (fileid, "link", "NXentry") != NX_OK) return 1; if (NXopengroup (fileid, "link", "NXentry") != NX_OK) return 1; if (NXmakelink (fileid, &glink) != NX_OK) return 1; if (NXmakenamedlink (fileid,"renLinkGroup", &glink) != NX_OK) return 1; if (NXmakenamedlink (fileid, "renLinkData", &dlink) != NX_OK) return 1; if (NXclosegroup (fileid) != NX_OK) return 1; if (NXclose (&fileid) != NX_OK) return 1; if ( (argc >= 2) && !strcmp(argv[1], "-q") ) { return 0; /* create only */ } /* read test */ if (NXopen (nxFile, NXACC_RDWR,&fileid) != NX_OK) return 1; if(NXinquirefile(fileid,filename,256) != NX_OK){ return 1; } printf("NXinquirefile found: %s\n", relativePathOf(filename)); NXgetattrinfo (fileid, &i); if (i > 0) { printf ("Number of global attributes: %d\n", i); } do { attr_status = NXgetnextattr (fileid, name, NXdims, &NXtype); if (attr_status == NX_ERROR) return 1; if (attr_status == NX_OK) { switch (NXtype) { case NX_CHAR: NXlen = sizeof (char_buffer); if (NXgetattr (fileid, name, char_buffer, &NXlen, &NXtype) != NX_OK) return 1; if ( strcmp(name, "file_time") && strcmp(name, "HDF_version") && strcmp(name, "HDF5_Version") && strcmp(name, "XML_version") ) { printf (" %s = %s\n", name, char_buffer); } break; } } } while (attr_status == NX_OK); if (NXopengroup (fileid, "entry", "NXentry") != NX_OK) return 1; NXgetattrinfo(fileid,&i); printf("Number of group attributes: %d\n", i); if(NXgetpath(fileid,path,512) != NX_OK)return 1; printf("NXentry path %s\n", path); do { attr_status = NXgetnextattr (fileid, name, NXdims, &NXtype); if (attr_status == NX_ERROR) return 1; if (attr_status == NX_OK) { switch (NXtype) { case NX_CHAR: NXlen = sizeof (char_buffer); if (NXgetattr (fileid, name, char_buffer, &NXlen, &NXtype) != NX_OK) return 1; printf (" %s = %s\n", name, char_buffer); } } } while (attr_status == NX_OK); if (NXgetgroupinfo (fileid, &i, group_name, class_name) != NX_OK) return 1; printf ("Group: %s(%s) contains %d items\n", group_name, class_name, i); do { entry_status = NXgetnextentry (fileid, name, char_class, &NXtype); if (entry_status == NX_ERROR) return 1; if (strcmp(char_class,"SDS") != 0) { if (entry_status != NX_EOD) { printf (" Subgroup: %s(%s)\n", name, char_class); entry_status = NX_OK; } } else { if (entry_status == NX_OK) { if (NXopendata (fileid, name) != NX_OK) return 1; if(NXgetpath(fileid,path,512) != NX_OK)return 1; printf("Data path %s\n", path); if (NXgetinfo (fileid, &NXrank, NXdims, &NXtype) != NX_OK) return 1; printf (" %s(%d)", name, NXtype); if (NXmalloc ((void **) &data_buffer, NXrank, NXdims, NXtype) != NX_OK) return 1; n = 1; for(k=0; k<NXrank; k++) { n *= NXdims[k]; } if (NXtype == NX_CHAR) { if (NXgetdata (fileid, data_buffer) != NX_OK) return 1; print_data (" = ", data_buffer, NXtype, n); } else if (NXtype != NX_FLOAT32 && NXtype != NX_FLOAT64) { if (NXgetdata (fileid, data_buffer) != NX_OK) return 1; print_data (" = ", data_buffer, NXtype, n); } else { slab_start[0] = 0; slab_start[1] = 0; slab_size[0] = 1; slab_size[1] = 4; if (NXgetslab (fileid, data_buffer, slab_start, slab_size) != NX_OK) return 1; print_data ("\n ", data_buffer, NXtype, 4); slab_start[0] = 1; if (NXgetslab (fileid, data_buffer, slab_start, slab_size) != NX_OK) return 1; print_data (" ", data_buffer, NXtype, 4); slab_start[0] = 2; if (NXgetslab (fileid, data_buffer, slab_start, slab_size) != NX_OK) return 1; print_data (" ", data_buffer, NXtype, 4); slab_start[0] = 3; if (NXgetslab (fileid, data_buffer, slab_start, slab_size) != NX_OK) return 1; print_data (" ", data_buffer, NXtype, 4); slab_start[0] = 4; if (NXgetslab (fileid, data_buffer, slab_start, slab_size) != NX_OK) return 1; print_data (" ", data_buffer, NXtype, 4); if (NXgetattrinfo (fileid, &i) != NX_OK) return 1; if (i > 0) { printf (" Number of attributes : %d\n", i); } do { attr_status = NXgetnextattr (fileid, name, NXdims, &NXtype); if (attr_status == NX_ERROR) return 1; if (attr_status == NX_OK) { switch (NXtype) { case NX_INT32: NXlen = 1; if (NXgetattr (fileid, name, &i, &NXlen, &NXtype) != NX_OK) return 1; printf (" %s : %d\n", name, i); break; case NX_FLOAT32: NXlen = 1; if (NXgetattr (fileid, name, &r, &NXlen, &NXtype) != NX_OK) return 1; printf (" %s : %f\n", name, r); break; case NX_CHAR: NXlen = sizeof (char_buffer); if (NXgetattr (fileid, name, char_buffer, &NXlen, &NXtype) != NX_OK) return 1; printf (" %s : %s\n", name, char_buffer); break; } } } while (attr_status == NX_OK); } if (NXclosedata (fileid) != NX_OK) return 1; if (NXfree ((void **) &data_buffer) != NX_OK) return 1; } } } while (entry_status == NX_OK); if (NXclosegroup (fileid) != NX_OK) return 1; /* * check links */ if (NXopengroup (fileid, "entry", "NXentry") != NX_OK) return 1; if (NXopengroup (fileid, "sample", "NXsample") != NX_OK) return 1; if (NXgetgroupID (fileid, &glink) != NX_OK) return 1; if (NXclosegroup (fileid) != NX_OK) return 1; if (NXopengroup (fileid, "data", "NXdata") != NX_OK) return 1; if (NXopendata (fileid, "r8_data") != NX_OK) return 1; if (NXgetdataID (fileid, &dlink) != NX_OK) return 1; if (NXclosedata (fileid) != NX_OK) return 1; if (NXclosegroup (fileid) != NX_OK) return 1; if (NXopendata (fileid, "r8_data") != NX_OK) return 1; if (NXgetdataID (fileid, &blink) != NX_OK) return 1; if (NXclosedata (fileid) != NX_OK) return 1; if (NXsameID(fileid, &dlink, &blink) != NX_OK) { printf ("Link check FAILED (r8_data)\n"); printf ("original data\n"); NXIprintlink(fileid, &dlink); printf ("linked data\n"); NXIprintlink(fileid, &blink); return 1; } if (NXclosegroup (fileid) != NX_OK) return 1; if (NXopengroup (fileid, "link", "NXentry") != NX_OK) return 1; if (NXopengroup (fileid, "sample", "NXsample") != NX_OK) return 1; if(NXgetpath(fileid,path,512) != NX_OK)return 1; printf("Group path %s\n", path); if (NXgetgroupID (fileid, &blink) != NX_OK) return 1; if (NXsameID(fileid, &glink, &blink) != NX_OK) { printf ("Link check FAILED (sample)\n"); printf ("original group\n"); NXIprintlink(fileid, &glink); printf ("linked group\n"); NXIprintlink(fileid, &blink); return 1; } if (NXclosegroup (fileid) != NX_OK) return 1; if (NXopengroup (fileid, "renLinkGroup", "NXsample") != NX_OK) return 1; if (NXgetgroupID (fileid, &blink) != NX_OK) return 1; if (NXsameID(fileid, &glink, &blink) != NX_OK) { printf ("Link check FAILED (renLinkGroup)\n"); printf ("original group\n"); NXIprintlink(fileid, &glink); printf ("linked group\n"); NXIprintlink(fileid, &blink); return 1; } if (NXclosegroup (fileid) != NX_OK) return 1; if(NXopendata(fileid,"renLinkData") != NX_OK) return 1; if(NXgetdataID(fileid,&blink) != NX_OK) return 1; if (NXsameID(fileid, &dlink, &blink) != NX_OK) { printf ("Link check FAILED (renLinkData)\n"); printf ("original group\n"); NXIprintlink(fileid, &glink); printf ("linked group\n"); NXIprintlink(fileid, &blink); return 1; } if(NXclosedata(fileid) != NX_OK) return 1; if (NXclosegroup (fileid) != NX_OK) return 1; printf ("Link check OK\n"); /* tests for NXopenpath */ if(NXopenpath(fileid,"/entry/data/comp_data") != NX_OK){ printf("Failure on NXopenpath\n"); return 0; } if(NXopenpath(fileid,"/entry/data/comp_data") != NX_OK){ printf("Failure on NXopenpath\n"); return 0; } if(NXopenpath(fileid,"../r8_data") != NX_OK){ printf("Failure on NXopenpath\n"); return 0; } if(NXopengrouppath(fileid,"/entry/data/comp_data") != NX_OK){ printf("Failure on NXopengrouppath\n"); return 0; } if(NXopenpath(fileid,"/entry/data/r8_data") != NX_OK){ printf("Failure on NXopenpath\n"); return 0; } printf("NXopenpath checks OK\n"); if (NXclose (&fileid) != NX_OK) return 1; printf("before load path tests\n"); if(testLoadPath() != 0) return 1; printf("before external link tests\n"); if(testExternal(argv[0]) != 0) { return 1; } printf("all ok - done\n"); return 0; }
/** * Recursively add properties from a nexus file to * the workspace run. * * @param nxfileID :: Nexus file handle to be parsed, just after an NXopengroup * @param runDetails :: where to add properties * @param parent_name :: nexus caller name * @param parent_class :: nexus caller class * @param level :: current level in nexus tree * */ void LoadHelper::recurseAndAddNexusFieldsToWsRun(NXhandle nxfileID, API::Run& runDetails, std::string& parent_name, std::string& parent_class, int level) { std::string indent_str(level * 2, ' '); // Two space by indent level // Link ? // Attributes ? // Classes NXstatus getnextentry_status; ///< return status int datatype; ///< NX data type if a dataset, e.g. NX_CHAR, NX_FLOAT32, see napi.h char nxname[NX_MAXNAMELEN], nxclass[NX_MAXNAMELEN]; nxname[0] = '0'; nxclass[0] = '0'; bool has_entry = true; // follows getnextentry_status while (has_entry) { getnextentry_status = NXgetnextentry(nxfileID, nxname, nxclass, &datatype); if (getnextentry_status == NX_OK) { g_log.debug() << indent_str << parent_name << "." << nxname << " ; " << nxclass << std::endl; NXstatus opengroup_status; NXstatus opendata_status; if ((opengroup_status = NXopengroup(nxfileID, nxname, nxclass)) == NX_OK) { // Go down to one level std::string p_nxname(nxname); //current names can be useful for next level std::string p_nxclass(nxclass); recurseAndAddNexusFieldsToWsRun(nxfileID, runDetails, p_nxname, p_nxclass, level + 1); NXclosegroup(nxfileID); } // if(NXopengroup else if ((opendata_status = NXopendata(nxfileID, nxname)) == NX_OK) { //dump_attributes(nxfileID, indent_str); g_log.debug() << indent_str << nxname << " opened." << std::endl; if (parent_class == "NXData" || parent_class == "NXMonitor" || std::string(nxname) == "data") { g_log.debug() << indent_str << "skipping " << parent_class << " (" << nxname << ")" << std::endl; /* nothing */ } else { // create a property int rank; int dims[4]; int type; dims[0] = dims[1] = dims[2] = dims[3] = 0; std::string property_name = (parent_name.empty() ? nxname : parent_name + "." + nxname); g_log.debug() << indent_str << "considering property " << property_name << std::endl; // Get the value NXgetinfo(nxfileID, &rank, dims, &type); // Note, we choose to only build properties on small float arrays // filter logic is below bool build_small_float_array = false; // default if ((type == NX_FLOAT32) || (type == NX_FLOAT64)) { if ((rank == 1) && (dims[0] <= 9)) { build_small_float_array = true; } else { g_log.debug() << indent_str << "ignored multi dimension float data on " << property_name << std::endl; } } else if (type != NX_CHAR) { if ((rank != 1) || (dims[0] != 1) || (dims[1] != 1) || (dims[2] != 1) || (dims[3] != 1)) { g_log.debug() << indent_str << "ignored multi dimension data on " << property_name << std::endl; } } void *dataBuffer; NXmalloc(&dataBuffer, rank, dims, type); if (NXgetdata(nxfileID, dataBuffer) != NX_OK) { NXfree(&dataBuffer); throw std::runtime_error("Cannot read data from NeXus file"); } if (type == NX_CHAR) { std::string property_value((const char *) dataBuffer); if (boost::algorithm::ends_with(property_name, "_time")) { // That's a time value! Convert to Mantid standard property_value = dateTimeInIsoFormat(property_value); } runDetails.addProperty(property_name, property_value); } else if ((type == NX_FLOAT32) || (type == NX_FLOAT64) || (type == NX_INT16) || (type == NX_INT32) || (type == NX_UINT16)) { // Look for "units" NXstatus units_status; char units_sbuf[NX_MAXNAMELEN]; int units_len = NX_MAXNAMELEN; int units_type = NX_CHAR; units_status = NXgetattr(nxfileID, const_cast<char*>("units"), (void *) units_sbuf, &units_len, &units_type); if (units_status != NX_ERROR) { g_log.debug() << indent_str << "[ " << property_name << " has unit " << units_sbuf << " ]" << std::endl; } if ((type == NX_FLOAT32) || (type == NX_FLOAT64)) { // Mantid numerical properties are double only. double property_double_value = 0.0; // Simple case, one value if (dims[0] == 1) { if (type == NX_FLOAT32) { property_double_value = *((float*) dataBuffer); } else if (type == NX_FLOAT64) { property_double_value = *((double*) dataBuffer); } if (units_status != NX_ERROR) runDetails.addProperty(property_name, property_double_value, std::string(units_sbuf)); else runDetails.addProperty(property_name, property_double_value); } else if (build_small_float_array) { // An array, converted to "name_index", with index < 10 (see test above) for (int dim_index = 0; dim_index < dims[0]; dim_index++) { if (type == NX_FLOAT32) { property_double_value = ((float*) dataBuffer)[dim_index]; } else if (type == NX_FLOAT64) { property_double_value = ((double*) dataBuffer)[dim_index]; } std::string indexed_property_name = property_name + std::string("_") + boost::lexical_cast<std::string>(dim_index); if (units_status != NX_ERROR) runDetails.addProperty(indexed_property_name, property_double_value, std::string(units_sbuf)); else runDetails.addProperty(indexed_property_name, property_double_value); } } } else { // int case int property_int_value = 0; if (type == NX_INT16) { property_int_value = *((short int*) dataBuffer); } else if (type == NX_INT32) { property_int_value = *((int*) dataBuffer); } else if (type == NX_UINT16) { property_int_value = *((short unsigned int*) dataBuffer); } if (units_status != NX_ERROR) runDetails.addProperty(property_name, property_int_value, std::string(units_sbuf)); else runDetails.addProperty(property_name, property_int_value); } // if (type==... } else { g_log.debug() << indent_str << "unexpected data on " << property_name << std::endl; } // test on nxdata type NXfree(&dataBuffer); dataBuffer = NULL; } // if (parent_class == "NXData" || parent_class == "NXMonitor") else NXclosedata(nxfileID); } else { g_log.debug() << indent_str << "unexpected status (" << opendata_status << ") on " << nxname << std::endl; } } else if (getnextentry_status == NX_EOD) { g_log.debug() << indent_str << "End of Dir" << std::endl; has_entry = false; // end of loop } else { g_log.debug() << indent_str << "unexpected status (" << getnextentry_status << ")" << std::endl; has_entry = false; // end of loop } } // while } // recurseAndAddNexusFieldsToWsRun
int NexusFileIO::getWorkspaceSize( int& numberOfSpectra, int& numberOfChannels, int& numberOfXpoints , bool& uniformBounds, std::string& axesUnits, std::string& yUnits ) const { NXstatus status; //open workspace group status=NXopengroup(fileID,"workspace","NXdata"); if(status==NX_ERROR) return(1); // open "values" data which is identified by attribute "signal", if it exists std::string entry; if(checkEntryAtLevelByAttribute("signal", entry)) status=NXopendata(fileID, entry.c_str()); else { status=NXclosegroup(fileID); return(2); } if(status==NX_ERROR) { status=NXclosegroup(fileID); return(2); } // read workspace data size int rank,dim[2],type; status=NXgetinfo(fileID, &rank, dim, &type); if(status==NX_ERROR) return(3); numberOfSpectra=dim[0]; numberOfChannels=dim[1]; // get axes attribute char sbuf[NX_MAXNAMELEN]; int len=NX_MAXNAMELEN; type=NX_CHAR; if(checkAttributeName("units")) { status=NXgetattr(fileID,const_cast<char*>("units"),(void *)sbuf,&len,&type); if(status!=NX_ERROR) yUnits=sbuf; NXclosedata(fileID); } // // read axis1 size status=NXopendata(fileID,"axis1"); if(status==NX_ERROR) return(4); len=NX_MAXNAMELEN; type=NX_CHAR; NXgetattr(fileID,const_cast<char*>("units"),(void *)sbuf,&len,&type); axesUnits = std::string(sbuf,len); NXgetinfo(fileID, &rank, dim, &type); // non-uniform X has 2D axis1 data if(rank==1) { numberOfXpoints=dim[0]; uniformBounds=true; } else { numberOfXpoints=dim[1]; uniformBounds=false; } NXclosedata(fileID); NXopendata(fileID,"axis2"); len=NX_MAXNAMELEN; type=NX_CHAR; NXgetattr(fileID,const_cast<char*>("units"),(void *)sbuf,&len,&type); axesUnits += std::string(":") + std::string(sbuf,len); NXclosedata(fileID); NXclosegroup(fileID); return(0); }