void SaveISISNexus::dae() { NXmakegroup(handle, "dae", "IXdae"); NXopengroup(handle, "dae", "IXdae"); saveString("detector_table_file", " "); saveString("spectra_table_file", " "); saveString("wiring_table_file", " "); saveIntOpen("period_index", m_isisRaw->t_pmap, nper); NXgetdataID(handle, &period_index_link); close(); NXmakegroup(handle, "time_channels_1", "IXtime_channels"); NXopengroup(handle, "time_channels_1", "IXtime_channels"); boost::scoped_array<float> timeChannels(new float[ntc + 1]); m_isisRaw->getTimeChannels(timeChannels.get(), ntc + 1); saveFloatOpen("time_of_flight", timeChannels.get(), ntc + 1); putAttr("axis", 1); putAttr("primary", 1); putAttr("units", "microseconds"); NXgetdataID(handle, &time_of_flight_link); close(); saveIntOpen("time_of_flight_raw", m_isisRaw->t_tcb1, ntc + 1); putAttr("units", "pulses"); putAttr("frequency", "32 MHz"); NXgetdataID(handle, &time_of_flight_raw_link); close(); NXclosegroup(handle); // time_channels_1 NXclosegroup(handle); // dae }
/*----------------------------------------------------------------------*/ void *nx_getdataID(void *handle){ NXhandle hfil; int status; NXlink *linki; linki = (NXlink *)malloc(sizeof(NXlink)); if(linki == NULL){ return NULL; } hfil = (NXhandle)handle; status = NXgetdataID(hfil,linki); if(status == NX_OK){ return linki; } else { free(linki); return NULL; } }
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; }
void SaveISISNexus::detector_1() { NXmakegroup(handle, "detector_1", "NXdata"); NXopengroup(handle, "detector_1", "NXdata"); for (int i = 0; i < nmon; ++i) { int si = int(std::distance( m_isisRaw->spec, std::find(m_isisRaw->spec, m_isisRaw->spec + nsp, m_isisRaw->mdet[i]))); monitor_index[si] = i; } // write counts int dim[3]; dim[0] = nper; dim[1] = nsp - nmon; dim[2] = ntc; NXmakedata(handle, "counts", NX_INT32, 3, dim); NXopendata(handle, "counts"); putAttr("units", "counts"); putAttr("signal", 1); putAttr("axes", "period_index,spectrum_index,time_of_flight"); int size[] = {1, 1, ntc}; int index = 0; for (int p = 0; p < nper; ++p) { int ispec = 0; m_isisRaw->skipData(rawFile, index++); for (int si = 0; si < nsp; ++si) { if (monitor_index.find(si) != monitor_index.end()) { m_isisRaw->readData(rawFile, index); monitorData.insert(monitorData.end(), m_isisRaw->dat1 + 1, m_isisRaw->dat1 + ntc + 1); } else { m_isisRaw->readData(rawFile, index); int start[] = {p, ispec, 0}; NXputslab(handle, m_isisRaw->dat1 + 1, start, size); ++ispec; } ++index; } } NXgetdataID(handle, &counts_link); NXclosedata(handle); NXmakelink(handle, &period_index_link); std::vector<int> spec_minus_monitors(nsp - nmon); std::generate(spec_minus_monitors.begin(), spec_minus_monitors.end(), getWithoutMonitors<int>(this, m_isisRaw->spec)); saveIntOpen("spectrum_index", &spec_minus_monitors[0], nsp - nmon); NXgetdataID(handle, &spectrum_index_link); close(); NXmakelink(handle, &time_of_flight_link); NXmakelink(handle, &time_of_flight_raw_link); std::vector<float> float_vec(ndet - nmon); std::generate(float_vec.begin(), float_vec.end(), getWithoutMonitors<float>(this, m_isisRaw->delt)); saveFloat("delt", &float_vec[0], ndet - nmon); saveFloat("source_detector_distance", &m_isisRaw->ivpb.i_sddist, 1); // using the same float_vec, size unchanged ndet-nmon std::generate(float_vec.begin(), float_vec.end(), getWithoutMonitors<float>(this, m_isisRaw->len2)); saveFloatOpen("distance", &float_vec[0], ndet - nmon); putAttr("units", "metre"); close(); // using the same float_vec, size unchanged ndet-nmon std::generate(float_vec.begin(), float_vec.end(), getWithoutMonitors<float>(this, m_isisRaw->tthe)); saveFloatOpen("polar_angle", &float_vec[0], ndet - nmon); putAttr("units", "degree"); close(); NXclosegroup(handle); }
/** Prints the contents of each group as XML tags and values */ int SaveToSNSHistogramNexus::WriteGroup(int is_definition) { int status, dataType, dataRank, dataDimensions[NX_MAXRANK]; NXname name, theClass; void *dataBuffer; NXlink link; do { status = NXgetnextentry(inId, name, theClass, &dataType); // std::cout << name << "(" << theClass << ")\n"; if (status == NX_ERROR) return NX_ERROR; if (status == NX_OK) { if (!strncmp(theClass, "NX", 2)) { if (NXopengroup(inId, name, theClass) != NX_OK) return NX_ERROR; add_path(name); if (NXgetgroupID(inId, &link) != NX_OK) return NX_ERROR; if (!strcmp(current_path, link.targetPath)) { // Create a copy of the group if (NXmakegroup(outId, name, theClass) != NX_OK) return NX_ERROR; if (NXopengroup(outId, name, theClass) != NX_OK) return NX_ERROR; if (WriteAttributes(is_definition) != NX_OK) return NX_ERROR; if (WriteGroup(is_definition) != NX_OK) return NX_ERROR; remove_path(name); } else { remove_path(name); strcpy(links_to_make[links_count].from, current_path); strcpy(links_to_make[links_count].to, link.targetPath); strcpy(links_to_make[links_count].name, name); links_count++; if (NXclosegroup(inId) != NX_OK) return NX_ERROR; } } else if (!strncmp(theClass, "SDS", 3)) { add_path(name); if (NXopendata(inId, name) != NX_OK) return NX_ERROR; if (NXgetdataID(inId, &link) != NX_OK) return NX_ERROR; std::string data_label(name); if (!strcmp(current_path, link.targetPath)) { // Look for the bank name std::string path(current_path); std::string bank; size_t a = path.rfind('/'); if (a != std::string::npos && a > 0) { size_t b = path.rfind('/', a - 1); if (b != std::string::npos && (b < a) && (a - b - 1) > 0) { bank = path.substr(b + 1, a - b - 1); // std::cout << current_path << ":bank " << bank << "\n"; } } //--------------------------------------------------------------------------------------- if (data_label == "data" && (bank != "")) { if (this->WriteDataGroup(bank, is_definition) != NX_OK) return NX_ERROR; ; } //--------------------------------------------------------------------------------------- else if (data_label == "time_of_flight" && (bank != "")) { // Get the original info if (NXgetinfo(inId, &dataRank, dataDimensions, &dataType) != NX_OK) return NX_ERROR; // Get the X bins const MantidVec &X = inputWorkspace->readX(0); // 1 dimension, with that number of bin boundaries dataDimensions[0] = static_cast<int>(X.size()); // The output TOF axis will be whatever size in the workspace. boost::scoped_array<float> tof_data(new float[dataDimensions[0]]); // And fill it with the X data for (size_t i = 0; i < X.size(); i++) tof_data[i] = float(X[i]); if (NXcompmakedata(outId, name, dataType, dataRank, dataDimensions, NX_COMP_LZW, dataDimensions) != NX_OK) return NX_ERROR; if (NXopendata(outId, name) != NX_OK) return NX_ERROR; if (WriteAttributes(is_definition) != NX_OK) return NX_ERROR; if (NXputdata(outId, tof_data.get()) != NX_OK) return NX_ERROR; if (NXclosedata(outId) != NX_OK) return NX_ERROR; } //--------------------------------------------------------------------------------------- else { // Everything else gets copies if (NXgetinfo(inId, &dataRank, dataDimensions, &dataType) != NX_OK) return NX_ERROR; if (NXmalloc(&dataBuffer, dataRank, dataDimensions, dataType) != NX_OK) return NX_ERROR; if (NXgetdata(inId, dataBuffer) != NX_OK) return NX_ERROR; if (NXcompmakedata(outId, name, dataType, dataRank, dataDimensions, NX_COMP_LZW, dataDimensions) != NX_OK) return NX_ERROR; if (NXopendata(outId, name) != NX_OK) return NX_ERROR; if (WriteAttributes(is_definition) != NX_OK) return NX_ERROR; if (NXputdata(outId, dataBuffer) != NX_OK) return NX_ERROR; if (NXfree(&dataBuffer) != NX_OK) return NX_ERROR; if (NXclosedata(outId) != NX_OK) return NX_ERROR; } remove_path(name); } else { // Make a link remove_path(name); strcpy(links_to_make[links_count].from, current_path); strcpy(links_to_make[links_count].to, link.targetPath); strcpy(links_to_make[links_count].name, name); links_count++; } if (NXclosedata(inId) != NX_OK) return NX_ERROR; } } else if (status == NX_EOD) { if (NXclosegroup(inId) != NX_OK) return NX_ERROR; if (NXclosegroup(outId) != NX_OK) return NX_ERROR; return NX_OK; } } while (status == NX_OK); return NX_OK; }
/** Performs the copying from the input to the output file, * while modifying the data and time_of_flight fields. */ int SaveToSNSHistogramNexus::copy_file(const char *inFile, int nx_read_access, const char *outFile, int nx_write_access) { int nx_is_definition = 0; links_count = 0; current_path[0] = '\0'; NXlink link; /* Open NeXus input file and NeXus output file */ if (NXopen(inFile, nx_read_access, &inId) != NX_OK) { printf("NX_ERROR: Can't open %s\n", inFile); return NX_ERROR; } if (NXopen(outFile, nx_write_access, &outId) != NX_OK) { printf("NX_ERROR: Can't open %s\n", outFile); return NX_ERROR; } /* Output global attributes */ if (WriteAttributes(nx_is_definition) != NX_OK) { return NX_ERROR; } /* Recursively cycle through the groups printing the contents */ if (WriteGroup(nx_is_definition) != NX_OK) { return NX_ERROR; } /* close input */ if (NXclose(&inId) != NX_OK) { return NX_ERROR; } // HDF5 only { /* now create any required links */ for (int i = 0; i < links_count; i++) { if (NXopenpath(outId, links_to_make[i].to) != NX_OK) return NX_ERROR; if (NXgetdataID(outId, &link) == NX_OK || NXgetgroupID(outId, &link) == NX_OK) { if (NXopenpath(outId, links_to_make[i].from) != NX_OK) return NX_ERROR; char *tstr = strrchr(links_to_make[i].to, '/'); if (!strcmp(links_to_make[i].name, tstr + 1)) { if (NXmakelink(outId, &link) != NX_OK) return NX_ERROR; } else { if (NXmakenamedlink(outId, links_to_make[i].name, &link) != NX_OK) return NX_ERROR; } } else { return NX_ERROR; } } } /* Close the input and output files */ if (NXclose(&outId) != NX_OK) { return NX_ERROR; } return NX_OK; }