aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2012-12-14 11:51:57 +0100
committerThomas White <taw@physics.org>2012-12-14 11:59:23 +0100
commitb22b9de18152c917d4e9f733c41402d9935ae93d (patch)
treece3019e93ef0c40e5d6988956bb1f1b894540847 /src
parente745af481e176834e804b2eec59b7170e260ce81 (diff)
Beam and detector geometry don't need to be copied
The did when this was all done with threads, but with separate processes each worker has its own copy of the structure already. It can be updated after every image and freed at the end.
Diffstat (limited to 'src')
-rw-r--r--src/im-sandbox.c59
-rw-r--r--src/pattern_sim.c10
2 files changed, 22 insertions, 47 deletions
diff --git a/src/im-sandbox.c b/src/im-sandbox.c
index d1696969..32bcba15 100644
--- a/src/im-sandbox.c
+++ b/src/im-sandbox.c
@@ -174,7 +174,6 @@ static void process_image(const struct index_args *iargs,
int config_noisefilter = iargs->config_noisefilter;
int config_verbose = iargs->config_verbose;
IndexingMethod *indm = iargs->indm;
- struct beam_params *beam = iargs->beam;
int check;
struct hdfile *hdfile;
struct image image;
@@ -183,13 +182,13 @@ static void process_image(const struct index_args *iargs,
image.data = NULL;
image.flags = NULL;
image.indexed_cell = NULL;
- image.det = copy_geom(iargs->det);
image.copyme = iargs->copyme;
image.reflections = NULL;
image.n_saturated = 0;
image.id = cookie;
image.filename = pargs->filename;
- image.beam = beam;
+ image.beam = iargs->beam;
+ image.det = iargs->det;
hdfile = hdfile_open(image.filename);
if ( hdfile == NULL ) return;
@@ -231,48 +230,23 @@ static void process_image(const struct index_args *iargs,
image.width, image.height,
image.det->max_fs + 1, image.det->max_ss + 1);
hdfile_close(hdfile);
- free_detector_geometry(image.det);
return;
}
- if (beam->photon_energy == 0) { // read from existing hdf5
- fill_in_beamParam(beam, hdfile);
- }
- image.lambda = ph_en_to_lambda(eV_to_J(beam->photon_energy));
+ fill_in_values(image.det, hdfile);
+ fill_in_beam_parameters(image.beam, hdfile);
- if ( image.lambda < 0.0 ) {
- if ( beam != NULL ) {
- ERROR("Using nominal photon energy of %.2f eV\n",
- beam->photon_energy);
- image.lambda = ph_en_to_lambda(
- eV_to_J(beam->photon_energy));
- } else {
- ERROR("No wavelength in file, so you need to give "
- "a beam parameters file with -b.\n");
- hdfile_close(hdfile);
- free_detector_geometry(image.det);
- return;
- }
- }
+ image.lambda = ph_en_to_lambda(eV_to_J(image.beam->photon_energy));
- if ( image.lambda > 1000 ) {
- if ( beam != NULL ) {
- ERROR("Nonsensical wavelength in HDF5."
- "Using nominal photon energy of %.2f eV\n",
- beam->photon_energy);
- image.lambda = ph_en_to_lambda(
- eV_to_J(beam->photon_energy));
- } else {
- ERROR("Nonsensical wavelength in file, so you need to "
- "give a beam parameters file with -b.\n");
- hdfile_close(hdfile);
- free_detector_geometry(image.det);
- return;
- }
+ if ( (image.beam->photon_energy < 0.0) || (image.lambda > 1000) ) {
+ /* Error message covers a silly value in the beam file or in
+ * the HDF5 file. */
+ ERROR("Nonsensical wavelength (%e m or %e eV) value for %s.\n",
+ image.lambda, image.beam->photon_energy, image.filename);
+ hdfile_close(hdfile);
+ return;
}
- fill_in_values(image.det, hdfile);
-
if ( config_cmfilter ) {
filter_cm(&image);
}
@@ -318,9 +292,9 @@ static void process_image(const struct index_args *iargs,
image.data = data_for_measurement;
/* Calculate orientation matrix (by magic) */
- image.div = beam->divergence;
- image.bw = beam->bandwidth;
- image.profile_radius = beam->profile_radius;
+ image.div = image.beam->divergence;
+ image.bw = image.beam->bandwidth;
+ image.profile_radius = image.beam->profile_radius;
index_pattern(&image, cell, indm, iargs->cellr,
config_verbose, iargs->ipriv,
@@ -356,7 +330,6 @@ static void process_image(const struct index_args *iargs,
if ( image.flags != NULL ) free(image.flags);
image_feature_list_free(image.features);
hdfile_close(hdfile);
- free_detector_geometry(image.det);
}
@@ -428,7 +401,7 @@ static void run_work(const struct index_args *iargs,
free(iargs->indm);
free(iargs->ipriv);
free_detector_geometry(iargs->det);
- free(iargs->beam);
+ free_beam_parameters(iargs->beam);
free(iargs->element);
free(iargs->hdf5_peak_path);
free_copy_hdf5_field_list(iargs->copyme);
diff --git a/src/pattern_sim.c b/src/pattern_sim.c
index 17aa8030..89413a07 100644
--- a/src/pattern_sim.c
+++ b/src/pattern_sim.c
@@ -493,19 +493,21 @@ int main(int argc, char *argv[])
ERROR("Failed to read beam parameters from '%s'\n", beamfile);
return 1;
}
- free(beamfile);
/* Define image parameters */
image.width = image.det->max_fs + 1;
image.height = image.det->max_ss + 1;
- if (image.beam->photon_energy == 0) {
- ERROR("Invalid photon_energy format in beam file\n")
+ if ( image.beam->photon_energy_from != NULL ) {
+ ERROR("Photon energy must be specified, not taken from the"
+ " HDF5 file. Please alter %s accordingly.\n", beamfile)
return 1;
} else {
- image.lambda = ph_en_to_lambda(eV_to_J(image.beam->photon_energy));
+ double wl = ph_en_to_lambda(eV_to_J(image.beam->photon_energy));
+ image.lambda = wl;
}
image.bw = image.beam->bandwidth;
image.div = image.beam->divergence;
+ free(beamfile);
/* Load unit cell */
input_cell = load_cell_from_pdb(filename);