diff options
Diffstat (limited to 'libcrystfel/src')
-rw-r--r-- | libcrystfel/src/datatemplate.c | 49 | ||||
-rw-r--r-- | libcrystfel/src/datatemplate.h | 19 | ||||
-rw-r--r-- | libcrystfel/src/image.c | 38 | ||||
-rw-r--r-- | libcrystfel/src/predict-refine.c | 53 | ||||
-rw-r--r-- | libcrystfel/src/stream.c | 280 | ||||
-rw-r--r-- | libcrystfel/src/stream.h | 12 |
6 files changed, 132 insertions, 319 deletions
diff --git a/libcrystfel/src/datatemplate.c b/libcrystfel/src/datatemplate.c index 60c36358..6cc57d2d 100644 --- a/libcrystfel/src/datatemplate.c +++ b/libcrystfel/src/datatemplate.c @@ -3,11 +3,11 @@ * * Data template structure * - * Copyright © 2019 Deutsches Elektronen-Synchrotron DESY, - * a research centre of the Helmholtz Association. + * Copyright © 2019-2020 Deutsches Elektronen-Synchrotron DESY, + * a research centre of the Helmholtz Association. * * Authors: - * 2019 Thomas White <taw@physics.org> + * 2019-2020 Thomas White <taw@physics.org> * * This file is part of CrystFEL. * @@ -1242,8 +1242,8 @@ void data_template_free(DataTemplate *dt) } -signed int data_template_find_panel(const DataTemplate *dt, - int fs, int ss) +static int data_template_find_panel(const DataTemplate *dt, + int fs, int ss, int *ppn) { int p; @@ -1251,24 +1251,47 @@ signed int data_template_find_panel(const DataTemplate *dt, if ( (fs >= dt->panels[p].orig_min_fs) && (fs < dt->panels[p].orig_max_fs+1) && (ss >= dt->panels[p].orig_min_ss) - && (ss < dt->panels[p].orig_max_ss+1) ) return p; + && (ss < dt->panels[p].orig_max_ss+1) ) { + *ppn = p; + return 0; + } } - return -1; + return 1; } -void data_template_file_to_panel_coords(const DataTemplate *dt, - float *pfs, float *pss) +int data_template_file_to_panel_coords(const DataTemplate *dt, + float *pfs, float *pss, + int *ppn) { - signed int pn = data_template_find_panel(dt, *pfs, *pss); - if ( pn == -1 ) { - ERROR("Can't convert coordinates - no panel found\n"); - return; + int pn; + + if ( data_template_find_panel(dt, *pfs, *pss, &pn) ) { + return 1; } + *ppn = pn; *pfs = *pfs - dt->panels[pn].orig_min_fs; *pss = *pss - dt->panels[pn].orig_min_ss; + return 0; +} + + +int data_template_panel_to_file_coords(const DataTemplate *dt, + int pn, float *pfs, float *pss) +{ + if ( pn >= dt->n_panels ) return 1; + *pfs = *pfs + dt->panels[pn].orig_min_fs; + *pss = *pss + dt->panels[pn].orig_min_ss; + return 0; +} + + +const char *data_template_panel_name(const DataTemplate *dt, int pn) +{ + if ( pn >= dt->n_panels ) return NULL; + return dt->panels[pn].name; } diff --git a/libcrystfel/src/datatemplate.h b/libcrystfel/src/datatemplate.h index ac76c578..fd99d5f0 100644 --- a/libcrystfel/src/datatemplate.h +++ b/libcrystfel/src/datatemplate.h @@ -3,11 +3,11 @@ * * Template for loading data * - * Copyright © 2019 Deutsches Elektronen-Synchrotron DESY, - * a research centre of the Helmholtz Association. + * Copyright © 2019-2020 Deutsches Elektronen-Synchrotron DESY, + * a research centre of the Helmholtz Association. * * Authors: - * 2019 Thomas White <taw@physics.org> + * 2019-2020 Thomas White <taw@physics.org> * * This file is part of CrystFEL. * @@ -53,11 +53,16 @@ extern "C" { extern DataTemplate *data_template_new_from_file(const char *filename); extern void data_template_free(DataTemplate *dt); -extern signed int data_template_find_panel(const DataTemplate *dt, - int fs, int ss); +extern const char *data_template_panel_name(const DataTemplate *dt, + int pn); -extern void data_template_file_to_panel_coords(const DataTemplate *dt, - float *pfs, float *pss); +extern int data_template_file_to_panel_coords(const DataTemplate *dt, + float *pfs, float *pss, + int *pn); + +extern int data_template_panel_to_file_coords(const DataTemplate *dt, + int pn, + float *pfs, float *pss); extern void data_template_add_copy_header(DataTemplate *dt, const char *header); diff --git a/libcrystfel/src/image.c b/libcrystfel/src/image.c index 8cfe3473..9474d266 100644 --- a/libcrystfel/src/image.c +++ b/libcrystfel/src/image.c @@ -1882,18 +1882,17 @@ ImageFeatureList *get_peaks_cxi_dtempl(const DataTemplate *dtempl, ss = buf_y[pk] + peak_offset; val = buf_i[pk]; - pn = data_template_find_panel(dtempl, fs, ss); - if ( pn < -1 ) { - ERROR("Peak not in panel!\n"); - continue; + if ( data_template_file_to_panel_coords(dtempl, + &fs, &ss, + &pn) ) + { + ERROR("Failed to convert %i,%i to " + "panel-relative coordinates\n", fs, ss); + } else { + image_add_feature(features, fs, ss, pn, + NULL, val, NULL); } - /* Convert coordinates to panel-relative */ - data_template_file_to_panel_coords(dtempl, &fs, &ss); - - image_add_feature(features, fs, ss, pn, - NULL, val, NULL); - } return features; @@ -2022,18 +2021,17 @@ ImageFeatureList *get_peaks_hdf5_dtempl(const DataTemplate *dtempl, ss = buf[tw*i+1] + peak_offset; val = buf[tw*i+2]; - pn = data_template_find_panel(dtempl, fs, ss); - if ( pn < -1 ) { - ERROR("Peak not in panel!\n"); - continue; + if ( data_template_file_to_panel_coords(dtempl, + &fs, &ss, + &pn) ) + { + ERROR("Failed to convert %i,%i to " + "panel-relative coordinates\n", fs, ss); + } else { + image_add_feature(features, fs, ss, pn, + NULL, val, NULL); } - /* Convert coordinates to panel-relative */ - data_template_file_to_panel_coords(dtempl, &fs, &ss); - - image_add_feature(features, fs, ss, pn, - NULL, val, NULL); - } free(buf); diff --git a/libcrystfel/src/predict-refine.c b/libcrystfel/src/predict-refine.c index bb8c5c35..a3841e8c 100644 --- a/libcrystfel/src/predict-refine.c +++ b/libcrystfel/src/predict-refine.c @@ -73,8 +73,8 @@ struct reflpeak { Reflection *refl; struct imagefeature *peak; double Ih; /* normalised */ - struct panel *panel; /* panel the reflection appears on - * (we assume this never changes) */ + struct detgeom_panel *panel; /* panel the reflection appears on + * (we assume this never changes) */ }; @@ -122,50 +122,6 @@ static double y_dev(struct reflpeak *rp, struct detector *det) } -static void UNUSED write_pairs(const char *filename, struct reflpeak *rps, - int n, struct detector *det) -{ - int i; - FILE *fh; - - fh = fopen(filename, "w"); - if ( fh == NULL ) { - ERROR("Failed to open '%s'\n", filename); - return; - } - - for ( i=0; i<n; i++ ) { - - double write_fs, write_ss; - double fs, ss; - struct panel *p; - signed int h, k, l; - - fs = rps[i].peak->fs; - ss = rps[i].peak->ss; - p = rps[i].panel; - get_indices(rps[i].refl, &h, &k, &l); - - write_fs = fs + p->orig_min_fs; - write_ss = ss + p->orig_min_ss; - - fprintf(fh, "%7.2f %7.2f dev r,x,y: %9f %9f %9f %9f\n", - write_fs, write_ss, - r_dev(&rps[i])/1e9, fabs(r_dev(&rps[i])/1e9), - x_dev(&rps[i], det), - y_dev(&rps[i], det)); - - //fprintf(fh, "%4i %4i %4i 0.0 - 0.0 1 %7.2f %7.2f %s\n", - // h, k, l, write_fs, write_ss, p->name); - - } - - fclose(fh); - - STATUS("Wrote %i pairs to %s\n", n, filename); -} - - static int cmpd2(const void *av, const void *bv) { struct reflpeak *a, *b; @@ -186,7 +142,6 @@ static int check_outlier_transition(struct reflpeak *rps, int n, if ( n < 3 ) return n; qsort(rps, n, sizeof(struct reflpeak), cmpd2); - //write_pairs("pairs-before-outlier.lst", rps, n, det); for ( i=1; i<n-1; i++ ) { @@ -267,11 +222,11 @@ static int pair_peaks(struct image *image, Crystal *cr, * in how far away it is from the peak location. * The predicted position and excitation errors will be * filled in by update_predictions(). */ - set_panel(refl, &image->det->panels[f->pn]); + set_panel_number(refl, f->pn); rps[n].refl = refl; rps[n].peak = f; - rps[n].panel = &image->det->panels[f->pn]; + rps[n].panel = &image->detgeom->panels[f->pn]; n++; } diff --git a/libcrystfel/src/stream.c b/libcrystfel/src/stream.c index 419acd36..3343750c 100644 --- a/libcrystfel/src/stream.c +++ b/libcrystfel/src/stream.c @@ -51,6 +51,7 @@ #include "stream.h" #include "reflist.h" #include "reflist-utils.h" +#include "datatemplate.h" /** \file stream.h */ @@ -301,7 +302,8 @@ static int write_peaks_2_3(struct image *image, FILE *ofh) } -static RefList *read_stream_reflections_2_3(Stream *st, struct detector *det) +static RefList *read_stream_reflections_2_3(Stream *st, + const DataTemplate *dtempl) { char *rval = NULL; int first = 1; @@ -342,24 +344,19 @@ static RefList *read_stream_reflections_2_3(Stream *st, struct detector *det) if ( r == 10 ) { - struct panel *p; - refl = add_refl(out, h, k, l); if ( refl == NULL ) { ERROR("Failed to add reflection\n"); return NULL; } set_intensity(refl, intensity); - if ( det != NULL ) { - double write_fs, write_ss; - p = find_panel_by_name(det,pn); - if ( p == NULL ) { - ERROR("Couldn't find panel '%s'\n", pn); + if ( dtempl != NULL ) { + int pn; + if ( data_template_file_to_panel_coords(dtempl, &fs, &ss, &pn) ) { + ERROR("Failed to convert\n"); } else { - write_fs = fs - p->orig_min_fs; - write_ss = ss - p->orig_min_ss; - set_detector_pos(refl, write_fs, write_ss); - set_panel(refl, p); + set_detector_pos(refl, fs, ss); + set_panel_number(refl, pn); } } set_esd_intensity(refl, sigma); @@ -376,7 +373,8 @@ static RefList *read_stream_reflections_2_3(Stream *st, struct detector *det) } -static RefList *read_stream_reflections_2_1(Stream *st, struct detector *det) +static RefList *read_stream_reflections_2_1(Stream *st, + const DataTemplate *dtempl) { char *rval = NULL; int first = 1; @@ -426,19 +424,14 @@ static RefList *read_stream_reflections_2_1(Stream *st, struct detector *det) } set_intensity(refl, intensity); - if ( det != NULL ) { + if ( dtempl != NULL ) { - double write_fs, write_ss; - struct panel *p; - - p = find_orig_panel(det, fs, ss); - if ( p == NULL ) { - ERROR("No panel at %.2f,%.2f\n", - fs, ss); + int pn; + if ( data_template_file_to_panel_coords(dtempl, &fs, &ss, &pn) ) { + ERROR("Failed to convert\n"); } else { - write_fs = fs - p->orig_min_fs; - write_ss = ss - p->orig_min_ss; - set_detector_pos(refl, write_fs, write_ss); + set_detector_pos(refl, fs, ss); + set_panel_number(refl, pn); } } else { @@ -462,7 +455,8 @@ static RefList *read_stream_reflections_2_1(Stream *st, struct detector *det) } -static RefList *read_stream_reflections_2_2(Stream *st, struct detector *det) +static RefList *read_stream_reflections_2_2(Stream *st, + const DataTemplate *dtempl) { char *rval = NULL; int first = 1; @@ -502,19 +496,17 @@ static RefList *read_stream_reflections_2_2(Stream *st, struct detector *det) } set_intensity(refl, intensity); - if ( det != NULL ) { + if ( dtempl != NULL ) { - double write_fs, write_ss; - struct panel *p; + int pn; - p = find_orig_panel(det, fs, ss); - if ( p == NULL ) { - ERROR("No panel at %.2f,%.2f\n", - fs, ss); + if ( data_template_file_to_panel_coords(dtempl, &fs, &ss, &pn) ) { + ERROR("Failed to convert to " + "panel-relative coordinates: " + "%i,%i\n", fs, ss); } else { - write_fs = fs - p->orig_min_fs; - write_ss = ss - p->orig_min_ss; - set_detector_pos(refl, write_fs, write_ss); + set_detector_pos(refl, fs, ss); + set_panel_number(refl, pn); } } else { @@ -538,139 +530,8 @@ static RefList *read_stream_reflections_2_2(Stream *st, struct detector *det) } -static int write_stream_reflections_2_1(FILE *fh, RefList *list, - struct image *image) -{ - Reflection *refl; - RefListIterator *iter; - - fprintf(fh, " h k l I phase sigma(I) " - " counts fs/px ss/px\n"); - - for ( refl = first_refl(list, &iter); - refl != NULL; - refl = next_refl(refl, iter) ) - { - - signed int h, k, l; - double intensity, esd_i, ph; - int red; - double fs, ss; - char phs[16]; - int have_phase; - - get_indices(refl, &h, &k, &l); - get_detector_pos(refl, &fs, &ss); - intensity = get_intensity(refl); - esd_i = get_esd_intensity(refl); - red = get_redundancy(refl); - ph = get_phase(refl, &have_phase); - - /* Reflections with redundancy = 0 are not written */ - if ( red == 0 ) continue; - - if ( have_phase ) { - snprintf(phs, 16, "%8.2f", rad2deg(ph)); - } else { - strncpy(phs, " -", 15); - } - - if ( image->det != NULL ) { - - struct panel *p; - double write_fs, write_ss; - - p = find_orig_panel(image->det, fs, ss); - if ( p == NULL ) { - ERROR("Panel not found\n"); - return 1; - } - - /* Convert coordinates to match arrangement of panels - * in HDF5 file */ - write_fs = fs + p->orig_min_fs; - write_ss = ss + p->orig_min_ss; - - fprintf(fh, "%3i %3i %3i %10.2f %s %10.2f %7i " - "%6.1f %6.1f\n", - h, k, l, intensity, phs, esd_i, red, - write_fs, write_ss); - - } else { - - fprintf(fh, "%3i %3i %3i %10.2f %s %10.2f %7i " - "%6.1f %6.1f\n", - h, k, l, intensity, phs, esd_i, red, - fs, ss); - - } - } - return 0; -} - - -static int write_stream_reflections_2_2(FILE *fh, RefList *list, - struct image *image) -{ - Reflection *refl; - RefListIterator *iter; - - fprintf(fh, " h k l I sigma(I) " - "peak background fs/px ss/px\n"); - - for ( refl = first_refl(list, &iter); - refl != NULL; - refl = next_refl(refl, iter) ) - { - - signed int h, k, l; - double intensity, esd_i, bg, pk; - double fs, ss; - - get_indices(refl, &h, &k, &l); - get_detector_pos(refl, &fs, &ss); - intensity = get_intensity(refl); - esd_i = get_esd_intensity(refl); - pk = get_peak(refl); - bg = get_mean_bg(refl); - - /* Reflections with redundancy = 0 are not written */ - if ( get_redundancy(refl) == 0 ) continue; - - if ( image->det != NULL ) { - - struct panel *p; - double write_fs, write_ss; - - p = find_orig_panel(image->det, fs, ss); - if ( p == NULL ) { - ERROR("Panel not found\n"); - return 1; - } - - /* Convert coordinates to match arrangement of panels in HDF5 - * file */ - write_fs = fs + p->orig_min_fs; - write_ss = ss + p->orig_min_ss; - - fprintf(fh, "%4i %4i %4i %10.2f %10.2f %10.2f %10.2f" - " %6.1f %6.1f\n", - h, k, l, intensity, esd_i, pk, bg, write_fs, - write_ss); - - } else { - - fprintf(fh, "%4i %4i %4i %10.2f %10.2f %10.2f %10.2f" - " %6.1f %6.1f\n", - h, k, l, intensity, esd_i, pk, bg, fs, ss); - } - } - return 0; -} - - -static int write_stream_reflections_2_3(FILE *fh, RefList *list, - struct image *image) +static int write_stream_reflections(FILE *fh, RefList *list, + const DataTemplate *dtempl) { Reflection *refl; RefListIterator *iter; @@ -685,13 +546,14 @@ static int write_stream_reflections_2_3(FILE *fh, RefList *list, signed int h, k, l; double intensity, esd_i, pk, bg; - double fs, ss; - double write_fs, write_ss; - struct panel *p; + double dfs, dss; + float fs, ss; + int pn; get_indices(refl, &h, &k, &l); - get_detector_pos(refl, &fs, &ss); - p = get_panel(refl); + get_detector_pos(refl, &dfs, &dss); + fs = dfs; ss = dss; + pn = get_panel_number(refl); intensity = get_intensity(refl); esd_i = get_esd_intensity(refl); pk = get_peak(refl); @@ -700,14 +562,13 @@ static int write_stream_reflections_2_3(FILE *fh, RefList *list, /* Reflections with redundancy = 0 are not written */ if ( get_redundancy(refl) == 0 ) continue; - write_fs = fs+p->orig_min_fs; - write_ss = ss+p->orig_min_ss; + data_template_panel_to_file_coords(dtempl, pn, + &fs, &ss); - fprintf(fh, - "%4i %4i %4i %10.2f %10.2f %10.2f %10.2f " - "%6.1f %6.1f %s\n", - h, k, l, intensity, esd_i, pk, bg, - write_fs, write_ss, p->name); + fprintf(fh, "%4i %4i %4i %10.2f %10.2f %10.2f %10.2f " + "%6.1f %6.1f %s\n", + h, k, l, intensity, esd_i, pk, bg, + fs, ss, data_template_panel_name(dtempl, pn)); } return 0; @@ -731,7 +592,9 @@ static int num_integrated_reflections(RefList *list) } -static int write_crystal(Stream *st, Crystal *cr, int include_reflections) +static int write_crystal(Stream *st, Crystal *cr, + const DataTemplate *dtempl, + int include_reflections) { UnitCell *cell; RefList *reflist; @@ -802,26 +665,9 @@ static int write_crystal(Stream *st, Crystal *cr, int include_reflections) if ( reflist != NULL ) { - struct image *image; - - image = crystal_get_image(cr); - fprintf(st->fh, REFLECTION_START_MARKER"\n"); - if ( AT_LEAST_VERSION(st, 2, 3) ) { - ret = write_stream_reflections_2_3(st->fh, - reflist, - image); - } else if ( AT_LEAST_VERSION(st, 2, 2) ) { - ret = write_stream_reflections_2_2(st->fh, - reflist, - image); - } else { - /* This function writes like a normal reflection - * list was written in stream 2.1 */ - ret = write_stream_reflections_2_1(st->fh, - reflist, - image); - } + ret = write_stream_reflections(st->fh, reflist, + dtempl); fprintf(st->fh, REFLECTION_END_MARKER"\n"); } else { @@ -848,6 +694,7 @@ static int write_crystal(Stream *st, Crystal *cr, int include_reflections) * \returns non-zero on error. */ int write_chunk(Stream *st, struct image *i, + const DataTemplate *dtempl, int include_peaks, int include_reflections) { int j; @@ -903,7 +750,7 @@ int write_chunk(Stream *st, struct image *i, for ( j=0; j<i->n_crystals; j++ ) { if ( crystal_get_user_flag(i->crystals[j]) == 0 ) { - ret = write_crystal(st, i->crystals[j], + ret = write_crystal(st, i->crystals[j], dtempl, include_reflections); } } @@ -945,7 +792,8 @@ static int find_start_of_chunk(Stream *st) } -static void read_crystal(Stream *st, struct image *image, StreamReadFlags srf) +static void read_crystal(Stream *st, struct image *image, + const DataTemplate *dtempl, StreamReadFlags srf) { char line[1024]; char *rval = NULL; @@ -1073,13 +921,13 @@ static void read_crystal(Stream *st, struct image *image, StreamReadFlags srf) * after 2.2 */ if ( AT_LEAST_VERSION(st, 2, 3) ) { reflist = read_stream_reflections_2_3(st, - image->det); + dtempl); } else if ( AT_LEAST_VERSION(st, 2, 2) ) { reflist = read_stream_reflections_2_2(st, - image->det); + dtempl); } else { reflist = read_stream_reflections_2_1(st, - image->det); + dtempl); } if ( reflist == NULL ) { ERROR("Failed while reading reflections\n"); @@ -1147,7 +995,8 @@ static void read_crystal(Stream *st, struct image *image, StreamReadFlags srf) /** * Read the next chunk from a stream and fill in 'image' */ -int read_chunk_2(Stream *st, struct image *image, StreamReadFlags srf) +int read_chunk(Stream *st, struct image *image, + const DataTemplate *dtempl, StreamReadFlags srf) { char line[1024]; char *rval = NULL; @@ -1260,7 +1109,7 @@ int read_chunk_2(Stream *st, struct image *image, StreamReadFlags srf) if ( (srf & STREAM_READ_CRYSTALS) && (strcmp(line, CRYSTAL_START_MARKER) == 0) ) { - read_crystal(st, image, srf); + read_crystal(st, image, dtempl, srf); } /* A chunk must have at least a filename and a wavelength, @@ -1282,23 +1131,6 @@ int read_chunk_2(Stream *st, struct image *image, StreamReadFlags srf) } - -/** - * \param st A \ref Stream - * \param image An \ref image structure to be filled - * - * Reads a chunk from \p st, placing the information in \p image. - * - * \returns non-zero on error. - */ -int read_chunk(Stream *st, struct image *image) -{ - return read_chunk_2(st, image, STREAM_READ_UNITCELL - | STREAM_READ_REFLECTIONS - | STREAM_READ_PEAKS); -} - - void write_stream_header(FILE *ofh, int argc, char *argv[]) { int i; diff --git a/libcrystfel/src/stream.h b/libcrystfel/src/stream.h index 18a983c9..0a726bfb 100644 --- a/libcrystfel/src/stream.h +++ b/libcrystfel/src/stream.h @@ -41,9 +41,8 @@ */ struct image; -struct hdfile; -struct event; -struct imagefile; + +#include "datatemplate.h" #include "cell.h" #define GEOM_START_MARKER "----- Begin geometry file -----" @@ -116,12 +115,13 @@ extern void close_stream(Stream *st); extern void free_stuff_from_stream(struct stuff_from_stream *sfs); -extern int read_chunk(Stream *st, struct image *image); -extern int read_chunk_2(Stream *st, struct image *image, - StreamReadFlags srf); +extern int read_chunk(Stream *st, struct image *image, + const DataTemplate *dtempl, + StreamReadFlags srf); extern int stream_has_old_indexers(Stream *st); extern int write_chunk(Stream *st, struct image *image, + const DataTemplate *dtempl, int include_peaks, int include_reflections); extern void write_command(Stream *st, int argc, char *argv[]); |