From 117779c5fd9321b4a262f144798f081321a65a38 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Tue, 30 Apr 2019 14:43:06 +0200 Subject: Avoid duplication of beam and detector parameters for pinkIndexer --- libcrystfel/src/detector.c | 14 ++++++++++++++ libcrystfel/src/image.h | 2 ++ libcrystfel/src/index.c | 12 ++++++++---- libcrystfel/src/index.h | 3 ++- libcrystfel/src/pinkindexer.c | 30 +++++++++++++++--------------- libcrystfel/src/pinkindexer.h | 11 +++-------- 6 files changed, 44 insertions(+), 28 deletions(-) (limited to 'libcrystfel') diff --git a/libcrystfel/src/detector.c b/libcrystfel/src/detector.c index 201b9041..aab72341 100644 --- a/libcrystfel/src/detector.c +++ b/libcrystfel/src/detector.c @@ -1070,6 +1070,19 @@ static void parse_toplevel(struct detector *det, struct beam_params *beam, } } + } else if ( strcmp(key, "photon_energy_bandwidth") == 0 ) { + if ( beam != NULL ) { + double v; + char *end; + v = strtod(val, &end); + if ( (val[0] != '\0') && (end[0] == '\0') ) { + beam->bandwidth = v; + } else { + ERROR("Invalid value for " + "photon_energy_bandwidth\n"); + } + } + } else if ( strcmp(key, "photon_energy_scale") == 0 ) { if ( beam != NULL ) { beam->photon_energy_scale = atof(val); @@ -1202,6 +1215,7 @@ struct detector *get_detector_geometry_from_string(const char *string, beam->photon_energy = 0.0; beam->photon_energy_from = NULL; beam->photon_energy_scale = 1.0; + beam->bandwidth = 0.0; } det->n_panels = 0; diff --git a/libcrystfel/src/image.h b/libcrystfel/src/image.h index 706b06b1..04fb18a0 100644 --- a/libcrystfel/src/image.h +++ b/libcrystfel/src/image.h @@ -110,6 +110,8 @@ struct beam_params char *photon_energy_from; /**< HDF5 dataset name */ double photon_energy_scale; /**< Scale factor for photon energy, if it * comes from an image header */ + double bandwidth; /**< FWHM bandwidth as a fraction of + * wavelength */ }; diff --git a/libcrystfel/src/index.c b/libcrystfel/src/index.c index 80a773ab..d48a6634 100644 --- a/libcrystfel/src/index.c +++ b/libcrystfel/src/index.c @@ -238,6 +238,7 @@ static char *friendly_indexer_name(IndexingMethod m) static void *prepare_method(IndexingMethod *m, UnitCell *cell, + struct detector *det, struct beam_params *beam, struct xgandalf_options *xgandalf_opts, struct pinkIndexer_options* pinkIndexer_opts, struct felix_options *felix_opts) @@ -285,7 +286,8 @@ static void *prepare_method(IndexingMethod *m, UnitCell *cell, break; case INDEXING_PINKINDEXER : - priv = pinkIndexer_prepare(m, cell, pinkIndexer_opts); + priv = pinkIndexer_prepare(m, cell, pinkIndexer_opts, + det, beam); break; default : @@ -316,8 +318,8 @@ static void *prepare_method(IndexingMethod *m, UnitCell *cell, IndexingPrivate *setup_indexing(const char *method_list, UnitCell *cell, - struct detector *det, float *tols, - IndexingFlags flags, + struct detector *det, struct beam_params *beam, + float *tols, IndexingFlags flags, struct taketwo_options *ttopts, struct xgandalf_options *xgandalf_opts, struct pinkIndexer_options *pinkIndexer_opts, @@ -415,7 +417,9 @@ IndexingPrivate *setup_indexing(const char *method_list, UnitCell *cell, int j; ipriv->engine_private[i] = prepare_method(&methods[i], cell, - xgandalf_opts, pinkIndexer_opts, + det, beam, + xgandalf_opts, + pinkIndexer_opts, felix_opts); if ( ipriv->engine_private[i] == NULL ) return NULL; diff --git a/libcrystfel/src/index.h b/libcrystfel/src/index.h index ab38016f..883df4a3 100644 --- a/libcrystfel/src/index.h +++ b/libcrystfel/src/index.h @@ -153,7 +153,8 @@ extern IndexingMethod get_indm_from_string_2(const char *method, int *err); #include "felix.h" extern IndexingPrivate *setup_indexing(const char *methods, UnitCell *cell, - struct detector *det, float *ltl, + struct detector *det, + struct beam_params *beam, float *ltl, IndexingFlags flags, struct taketwo_options *ttopts, struct xgandalf_options *xgandalf_opts, diff --git a/libcrystfel/src/pinkindexer.c b/libcrystfel/src/pinkindexer.c index fe3b1625..eb8ec05e 100644 --- a/libcrystfel/src/pinkindexer.c +++ b/libcrystfel/src/pinkindexer.c @@ -154,26 +154,19 @@ int run_pinkIndexer(struct image *image, void *ipriv) } void *pinkIndexer_prepare(IndexingMethod *indm, UnitCell *cell, - struct pinkIndexer_options *pinkIndexer_opts) + struct pinkIndexer_options *pinkIndexer_opts, + struct detector *det, struct beam_params *beam) { - if (pinkIndexer_opts->beamEnergy == 0.0) { + if ( beam->photon_energy_from != NULL ) { ERROR("For pinkIndexer, the photon_energy must be defined as a " "constant in the geometry file\n"); return NULL; } - if (pinkIndexer_opts->beamBandwidth == 0.0) { - STATUS("Using default bandwidth of 0.01 for pinkIndexer\n"); - pinkIndexer_opts->beamBandwidth = 0.01; - } - if (pinkIndexer_opts->detectorDistance == 0.0 && pinkIndexer_opts->refinement_type == + if ( (det->panels[0].clen_from != NULL) && pinkIndexer_opts->refinement_type == REFINEMENT_TYPE_firstFixedThenVariableLatticeParametersCenterAdjustmentMultiSeed) { ERROR("Using center refinement makes it necessary to have the detector distance fixed in the geometry file!"); } - if(pinkIndexer_opts->detectorDistance <= 0.0){ - pinkIndexer_opts->detectorDistance = 0.25; //fake value - } - struct pinkIndexer_private_data* pinkIndexer_private_data = malloc(sizeof(struct pinkIndexer_private_data)); allocReciprocalPeaks(&(pinkIndexer_private_data->reciprocalPeaks_1_per_A)); pinkIndexer_private_data->intensities = malloc(MAX_PEAK_COUNT_FOR_INDEXER * sizeof(float)); @@ -199,9 +192,15 @@ void *pinkIndexer_prepare(IndexingMethod *indm, UnitCell *cell, .bx = bsz * 1e-10, .by = bsx * 1e-10, .bz = bsy * 1e-10, .cx = csz * 1e-10, .cy = csx * 1e-10, .cz = csy * 1e-10 }; - float detectorDistance_m = pinkIndexer_opts->detectorDistance; - float beamEenergy_eV = pinkIndexer_opts->beamEnergy; - float nonMonochromaticity = pinkIndexer_opts->beamBandwidth; + float detectorDistance_m; + if ( det->panels[0].clen_from != NULL ) { + detectorDistance_m = 0.25; /* fake value */ + } else { + detectorDistance_m = det->panels[0].clen + det->panels[0].coffset; + } + + float beamEenergy_eV = beam->photon_energy; + float nonMonochromaticity = beam->bandwidth; float reflectionRadius_1_per_A; if (pinkIndexer_opts->reflectionRadius < 0) { reflectionRadius_1_per_A = 0.02 @@ -350,7 +349,8 @@ int run_pinkIndexer(struct image *image, void *ipriv) } extern void *pinkIndexer_prepare(IndexingMethod *indm, UnitCell *cell, - struct pinkIndexer_options *pinkIndexer_opts) + struct pinkIndexer_options *pinkIndexer_opts, + struct detector *det, struct beam_params *beam) { ERROR("This copy of CrystFEL was compiled without PINKINDEXER support.\n"); ERROR("To use PINKINDEXER indexing, recompile with PINKINDEXER.\n"); diff --git a/libcrystfel/src/pinkindexer.h b/libcrystfel/src/pinkindexer.h index 5be2c1e7..1fcb3711 100644 --- a/libcrystfel/src/pinkindexer.h +++ b/libcrystfel/src/pinkindexer.h @@ -42,14 +42,8 @@ struct pinkIndexer_options { int multi; int thread_count; int min_peaks; - int no_check_indexed; - - float beamEnergy; //in eV - float beamBandwidth; //(delta lambda)/lambda - float detectorDistance; //in m - - float reflectionRadius; //in 1/A + float reflectionRadius; /* In m^-1 */ }; #include @@ -58,7 +52,8 @@ struct pinkIndexer_options { extern int run_pinkIndexer(struct image *image, void *ipriv); extern void *pinkIndexer_prepare(IndexingMethod *indm, UnitCell *cell, - struct pinkIndexer_options *pinkIndexer_opts); + struct pinkIndexer_options *pinkIndexer_opts, + struct detector *det, struct beam_params *beam); extern void pinkIndexer_cleanup(void *pp); -- cgit v1.2.3