diff options
Diffstat (limited to 'libcrystfel')
-rw-r--r-- | libcrystfel/src/cell-utils.c | 4 | ||||
-rw-r--r-- | libcrystfel/src/crystfel-mille.c | 30 | ||||
-rw-r--r-- | libcrystfel/src/detgeom.c | 1 | ||||
-rw-r--r-- | libcrystfel/src/index.c | 7 | ||||
-rw-r--r-- | libcrystfel/src/indexers/pinkindexer.c | 1 | ||||
-rw-r--r-- | libcrystfel/src/integration.c | 5 | ||||
-rw-r--r-- | libcrystfel/src/predict-refine.c | 31 | ||||
-rw-r--r-- | libcrystfel/src/utils.c | 26 | ||||
-rw-r--r-- | libcrystfel/src/utils.h | 1 |
9 files changed, 73 insertions, 33 deletions
diff --git a/libcrystfel/src/cell-utils.c b/libcrystfel/src/cell-utils.c index 80cdd955..a25accbc 100644 --- a/libcrystfel/src/cell-utils.c +++ b/libcrystfel/src/cell-utils.c @@ -2245,9 +2245,9 @@ static IntegerMatrix *check_permutations(UnitCell *cell_reduced, UnitCell *refer best_diff = diff; n_best = 0; - } + best_m[n_best++] = intmat_copy(m); - if ( diff < 1.001*best_diff ) { + } else if ( diff < 1.001*best_diff ) { /* If the new solution is the same as the * previous one, add it to the list */ diff --git a/libcrystfel/src/crystfel-mille.c b/libcrystfel/src/crystfel-mille.c index 72f89425..c2fe2a57 100644 --- a/libcrystfel/src/crystfel-mille.c +++ b/libcrystfel/src/crystfel-mille.c @@ -72,6 +72,10 @@ struct mille int *int_arr; int max_entries; int n; + + int *have_local; + int n_local; + FILE *fh; }; @@ -115,6 +119,17 @@ static void mille_add_measurement(Mille *m, m->max_entries = new_max_entries; } + if ( NLC > m->n_local ) { + int i; + int *new_have_local = cfrealloc(m->have_local, NLC*sizeof(int)); + if ( new_have_local == NULL ) return; + m->have_local = new_have_local; + for ( i=m->n_local; i<NLC; i++ ) { + m->have_local[i] = 0; + } + m->n_local = NLC; + } + /* The measurement */ m->float_arr[m->n] = rMeas; m->int_arr[m->n] = 0; @@ -126,6 +141,7 @@ static void mille_add_measurement(Mille *m, m->float_arr[m->n] = derLc[i]; m->int_arr[m->n] = i+1; m->n++; + m->have_local[i] = 1; } } @@ -292,6 +308,8 @@ Mille *crystfel_mille_new(const char *outFileName) m->n = 0; m->float_arr = NULL; m->int_arr = NULL; + m->have_local = NULL; + m->n_local = 0; m->fh = fopen(outFileName, "wb"); if ( m->fh == NULL ) { @@ -318,11 +336,15 @@ void crystfel_mille_free(Mille *m) void crystfel_mille_delete_last_record(Mille *m) { m->n = 0; + cffree(m->have_local); + m->have_local = NULL; + m->n_local = 0; } void crystfel_mille_write_record(Mille *m) { + int i; float nf = 0.0; int ni = 0; int nw = (m->n * 2)+2; @@ -330,6 +352,14 @@ void crystfel_mille_write_record(Mille *m) /* Don't write empty records */ if ( m->n == 0 ) return; + /* Don't write records with incomplete local gradients */ + for ( i=0; i<m->n_local; i++ ) { + if ( !m->have_local[i] ) { + crystfel_mille_delete_last_record(m); + return; + } + } + fwrite(&nw, sizeof(int), 1, m->fh); fwrite(&nf, sizeof(float), 1, m->fh); diff --git a/libcrystfel/src/detgeom.c b/libcrystfel/src/detgeom.c index 39b00663..2b38664c 100644 --- a/libcrystfel/src/detgeom.c +++ b/libcrystfel/src/detgeom.c @@ -269,6 +269,7 @@ gsl_matrix **make_panel_minvs(struct detgeom *dg) gsl_matrix_set(M, 2, 2, p->pixel_pitch*p->ssz); Minvs[i] = matrix_invert(M); + gsl_matrix_free(M); if ( Minvs[i] == NULL ) { ERROR("Failed to calculate inverse panel matrix for %s\n", p->name); diff --git a/libcrystfel/src/index.c b/libcrystfel/src/index.c index 12cd9190..5b0f742f 100644 --- a/libcrystfel/src/index.c +++ b/libcrystfel/src/index.c @@ -50,6 +50,7 @@ #include "cell-utils.h" #include "predict-refine.h" #include "profile.h" +#include "crystfel-mille.h" #include "indexers/dirax.h" #include "indexers/asdf.h" #include "indexers/mosflm.h" @@ -774,6 +775,12 @@ static int try_indexer(struct image *image, IndexingMethod indm, } profile_end("cell-compare-to-others"); + if ( (mille != NULL) && !crystal_get_user_flag(cr) ) { + profile_start("mille-write"); + crystfel_mille_write_record(mille); + profile_end("mille-write"); + } + } n_bad = remove_flagged_crystals(image); diff --git a/libcrystfel/src/indexers/pinkindexer.c b/libcrystfel/src/indexers/pinkindexer.c index 180246c2..14e18548 100644 --- a/libcrystfel/src/indexers/pinkindexer.c +++ b/libcrystfel/src/indexers/pinkindexer.c @@ -33,7 +33,6 @@ #include <stdlib.h> -#include <sys/errno.h> #include <argp.h> #include "utils.h" diff --git a/libcrystfel/src/integration.c b/libcrystfel/src/integration.c index d2c06db7..6d37116b 100644 --- a/libcrystfel/src/integration.c +++ b/libcrystfel/src/integration.c @@ -1467,11 +1467,6 @@ int integrate_rings_once(Reflection *refl, * appropriate size */ if ( intensity < -aduph ) { sig2_poisson = -aduph*intensity; - } else if ( intensity < 0.0 ) { - /* If the intensity is negative (by less than one - * photon), assume the reflection is very weak and - * therefore has a Poisson error of one photon. */ - sig2_poisson = aduph; } sigma = sqrt(sig2_poisson + bx->m*sig2_bg); diff --git a/libcrystfel/src/predict-refine.c b/libcrystfel/src/predict-refine.c index 6da0d3d1..083d86c5 100644 --- a/libcrystfel/src/predict-refine.c +++ b/libcrystfel/src/predict-refine.c @@ -142,15 +142,15 @@ double r_gradient(int param, Reflection *refl, UnitCell *cell, double wavelength /* Spot position gradients for diffraction physics (anything that changes the * diffracted ray direction) */ int fs_ss_gradient_physics(int param, Reflection *refl, UnitCell *cell, - struct detgeom_panel *p, gsl_matrix *Minv, - double fs, double ss, double mu, - float *fsg, float *ssg) + struct detgeom_panel *p, gsl_matrix *Minv, + double fs, double ss, double mu, + float *fsg, float *ssg) { signed int h, k, l; gsl_vector *dRdp; gsl_vector *v; - get_indices(refl, &h, &k, &l); + get_symmetric_indices(refl, &h, &k, &l); dRdp = gsl_vector_calloc(3); @@ -302,7 +302,7 @@ int fs_ss_gradient(int param, Reflection *refl, UnitCell *cell, double mu; double fs, ss; - get_indices(refl, &h, &k, &l); + get_symmetric_indices(refl, &h, &k, &l); kpred = get_kpred(refl); cell_get_reciprocal(cell, &asx, &asy, &asz, &bsx, &bsy, &bsz, @@ -811,7 +811,7 @@ int refine_prediction(struct image *image, Crystal *cr, reflist = reflist_new(); n = pair_peaks(image, cr, reflist, rps); - if ( n < 10 ) { + if ( n < 3 ) { cffree(rps); reflist_free(reflist); return 1; @@ -871,7 +871,8 @@ int refine_prediction(struct image *image, Crystal *cr, total_shifts[0], total_shifts[1], total_shifts[2]); crystal_add_notes(cr, tmp); - if ( mille != NULL ) { + if ( (mille != NULL) && (n>4) ) { + crystfel_mille_delete_last_record(mille); profile_start("mille-calc"); write_mille(mille, n, crystal_get_cell(cr), rps, image, max_mille_level, Minvs); @@ -887,18 +888,10 @@ int refine_prediction(struct image *image, Crystal *cr, n = pair_peaks(image, cr, NULL, rps); free_rps_noreflist(rps, n); - if ( n < 10 ) { - if ( mille != NULL ) { - crystfel_mille_delete_last_record(mille); - } - return 1; - } - if ( mille != NULL ) { - profile_start("mille-write"); - crystfel_mille_write_record(mille); - profile_end("mille-write"); + if ( n < 3 ) { + return 1; + } else { + return 0; } - - return 0; } diff --git a/libcrystfel/src/utils.c b/libcrystfel/src/utils.c index 7bfac487..a35ba272 100644 --- a/libcrystfel/src/utils.c +++ b/libcrystfel/src/utils.c @@ -135,39 +135,53 @@ gsl_matrix *matrix_invert(gsl_matrix *m) perm = gsl_permutation_alloc(m->size1); if ( perm == NULL ) { ERROR("Couldn't allocate permutation\n"); - gsl_matrix_free(m); return NULL; } inv = gsl_matrix_alloc(m->size1, m->size2); if ( inv == NULL ) { ERROR("Couldn't allocate inverse\n"); - gsl_matrix_free(m); gsl_permutation_free(perm); return NULL; } if ( gsl_linalg_LU_decomp(m, perm, &s) ) { ERROR("Couldn't decompose matrix\n"); - gsl_matrix_free(m); gsl_permutation_free(perm); return NULL; } if ( gsl_linalg_LU_invert(m, perm, inv) ) { - ERROR("Couldn't invert cell matrix:\n"); - gsl_matrix_free(m); + ERROR("Couldn't invert matrix:\n"); gsl_permutation_free(perm); return NULL; } gsl_permutation_free(perm); - gsl_matrix_free(m); return inv; } +gsl_vector *solve_inv(gsl_vector *v, gsl_matrix *M) +{ + gsl_matrix *Minv; + gsl_vector *s; + int n; + + n = v->size; + if ( v->size != M->size1 ) return NULL; + if ( v->size != M->size2 ) return NULL; + + Minv = matrix_invert(M); + if ( Minv == NULL ) return NULL; + + s = gsl_vector_calloc(n); + gsl_blas_dgemv(CblasNoTrans, 1.0, M, v, 0.0, s); + return s; +} + + static int check_eigen(gsl_vector *e_val, int verbose) { int i; diff --git a/libcrystfel/src/utils.h b/libcrystfel/src/utils.h index 30a7c4ef..08e059a7 100644 --- a/libcrystfel/src/utils.h +++ b/libcrystfel/src/utils.h @@ -75,6 +75,7 @@ extern "C" { extern void show_matrix_eqn(gsl_matrix *M, gsl_vector *v); extern void show_matrix(gsl_matrix *M); extern void show_vector(gsl_vector *M); +extern gsl_vector *solve_inv(gsl_vector *v, gsl_matrix *M); extern gsl_vector *solve_svd(gsl_vector *v, gsl_matrix *M, int *n_filt, int verbose); extern gsl_matrix *matrix_mult2(gsl_matrix *A, gsl_matrix *B); |