diff options
Diffstat (limited to 'libcrystfel/src/mosflm.c')
-rw-r--r-- | libcrystfel/src/mosflm.c | 71 |
1 files changed, 54 insertions, 17 deletions
diff --git a/libcrystfel/src/mosflm.c b/libcrystfel/src/mosflm.c index 0f530244..886fbd56 100644 --- a/libcrystfel/src/mosflm.c +++ b/libcrystfel/src/mosflm.c @@ -150,13 +150,38 @@ static int read_newmat(const char *filename, struct image *image) } +/* Need to sort mosflm peaks by intensity... */ +struct sptline { + double x; /* x coordinate of peak */ + double y; /* y coordinate of peak */ + double h; /* height of peak */ + double s; /* sigma of peak */ +}; + + +static int compare_vals(const void *ap, const void *bp) +{ + const struct sptline a = *(struct sptline *)ap; + const struct sptline b = *(struct sptline *)bp; + + if ( a.h < b.h ) return 1; + if ( a.h > b.h ) return -1; + return 0; +} + + /* Write .spt file for mosflm */ static void write_spt(struct image *image, const char *filename) { FILE *fh; - int i, nPeaks; - const double fclen = 100.0e-3; /* Fake camera length in m */ - const double fpix = 7.5e-6; /* Fake pixel size in m */ + int i; + double fclen = 67.8; /* fake camera length in mm */ + double fpix = 0.075; /* fake pixel size in mm */ + double pix; + double height = 100.0; + double sigma = 1.0; + int nPeaks = image_feature_count(image->features); + struct sptline *sptlines; fh = fopen(filename, "w"); if ( !fh ) { @@ -164,17 +189,17 @@ static void write_spt(struct image *image, const char *filename) return; } - fprintf(fh, "%10d %10d %10.8f %10.6f %10.6f\n", - 1, 1, fpix*1e3, 1.0, 0.0); + fprintf(fh, "%10d %10d %10.8f %10.6f %10.6f\n", 1, 1, fpix, 1.0, 0.0); fprintf(fh, "%10d %10d\n", 1, 1); fprintf(fh, "%10.5f %10.5f\n", 0.0, 0.0); - nPeaks = image_feature_count(image->features); + sptlines = malloc(sizeof(struct sptline)*nPeaks); + for ( i=0; i<nPeaks; i++ ) { struct imagefeature *f; struct panel *p; - double xs, ys, rx, ry, x, y; + double xs, ys, rx, ry; f = image_get_feature(image->features, i); if ( f == NULL ) continue; @@ -182,21 +207,33 @@ static void write_spt(struct image *image, const char *filename) p = find_panel(image->det, f->fs, f->ss); if ( p == NULL ) continue; - xs = (f->fs-(double)p->min_fs)*p->fsx - + (f->ss-(double)p->min_ss)*p->ssx; - ys = (f->fs-(double)p->min_fs)*p->fsy - + (f->ss-(double)p->min_ss)*p->ssy; - rx = (xs + p->cnx) / p->res; - ry = (ys + p->cny) / p->res; + pix = 1000.0/p->res; /* pixel size in mm */ + height = f->intensity; + + xs = (f->fs-p->min_fs)*p->fsx + (f->ss-p->min_ss)*p->ssx; + ys = (f->fs-p->min_fs)*p->fsy + (f->ss-p->min_ss)*p->ssy; + rx = xs + p->cnx; + ry = ys + p->cny; - x = rx*fclen/(fpix*p->clen); - y = ry*fclen/(fpix*p->clen); + sptlines[i].x = ry*pix*fclen/p->clen/1000.0; + sptlines[i].y = -rx*pix*fclen/p->clen/1000.0; + sptlines[i].h = height; + sptlines[i].s = sigma/1000.0; + + } + + qsort(sptlines, nPeaks, sizeof(struct sptline), compare_vals); + + for ( i=0; i<nPeaks; i++ ) { fprintf(fh, "%10.2f %10.2f %10.2f %10.2f %10.2f %10.2f\n", - x, y, 0.0, 0.0, 100.0, 1.0); + sptlines[i].x, sptlines[i].y, 0.0, 0.0, + sptlines[i].h, sptlines[i].s); } + free(sptlines); + fprintf(fh,"%10.2f %10.2f %10.2f %10.2f %10.2f %10.2f\n", -999.0,-999.0,-999.0,-999.0,-999.0,-999.0); fclose(fh); @@ -306,7 +343,7 @@ static void mosflm_send_next(struct image *image, struct mosflm_data *mosflm) break; case 4 : - mosflm_sendline("DISTANCE 100.0\n", mosflm); + mosflm_sendline("DISTANCE 67.8\n", mosflm); break; case 5 : |