marcif.c

Go to the documentation of this file.
00001 /**********************************************************************
00002  *
00003  * marcif.c
00004  *
00005  * Version:     1.0
00006  * Date:        30/10/2000
00007  *
00008  * Version      Date            Description
00009  * 1.0          30/10/2000      Added CBF/imgCIF support
00010  *
00011  ***********************************************************************/
00012 
00013 /*
00014  * System includes
00015  */
00016 
00017 #include <stdio.h>
00018 #include <string.h>
00019 #include <stdlib.h>
00020 #include <unistd.h>
00021 #include <ctype.h>
00022 #include <sys/types.h>
00023 #include <sys/stat.h>
00024 #include <math.h>
00025 
00026 /*
00027  * Local includes
00028  */
00029 
00030 #include "marcif_header.h"
00031 #include "mar345_header.h"
00032 
00033 #include <cbf.h>
00034 #include <img.h>
00035 
00036 #define printe(x)       printf("%s: %s: %s\n",prg,f,x)
00037 #undef cbf_failnez
00038 #define cbf_failnez(x) \
00039 {       int err; \
00040         cif_error = 0; \
00041         err = (x); \
00042         if (err) { \
00043                 if ( verbose > 1 ) \
00044                 fprintf(stdout,"CBFlib error %d\n",err); \
00045                 cif_error=err; \
00046         } \
00047 }
00048 
00049 
00050 /*
00051  * External variables 
00052  */
00053 
00054 extern int                      verbose;
00055 
00056 /*
00057  * Local variables
00058  */
00059 static char                     PRINT_AXIS      = 0;
00060 static char                     PRINT_CHEMICAL  = 0;
00061 
00062 static int                      cif_error       = 0;
00063 static CIF_HEADER               hcif;
00064 
00065 cbf_handle              cif                     = NULL;
00066 static size_t           cif_read                = 0;
00067 static int              cif_id                  = 0;
00068 static int              cif_element_signed      = 0;
00069 static int              cif_element_unsigned    = 0;
00070 static int              cif_minelement          = 0;
00071 static int              cif_maxelement          = 0;
00072 static unsigned int     cif_compression         = 0;
00073 static size_t           cif_nelements           = 0;
00074 static size_t           cif_element_size        = 0;
00075 
00076 /*
00077  * External functions
00078  */
00079 
00080 /*
00081  * Local functions
00082  */
00083 int                     GetCIFHeader    (char *, char *, FILE *);
00084 int                     GetCIFData      (char *, char *, FILE *, unsigned int *);
00085 int                     PutCIFData      (char *, char *, char  , unsigned int *);
00086 int                     PutCIFHeader    (char *, char *);
00087 MAR345_HEADER           CIF2mar345Header(char *);
00088 void                    mar3452CIFHeader(char *, char *, MAR345_HEADER );
00089 
00090 /******************************************************************
00091  * Function: GetCIFHeader
00092  ******************************************************************/
00093 int GetCIFHeader( char *prg, char *f, FILE *fp)
00094 {
00095 const char      *sval;
00096 float           fval;
00097 double          dval;
00098 int             ival;
00099 int             i;
00100 char            str[64];
00101 char            *axis_name[]    = {"phi",               "omega", 
00102                                    "chi",               "2-theta",
00103                                    "distance",          "z-axis", 
00104                                    "slit_1_hor",        "slit_1_ver",
00105                                    "slit_2_hor",        "slit_2_ver",
00106                                    "trans_hor",         "trans_ver",
00107                                    "rot_hor",           "rot_ver",
00108                                    "beamstop" };
00109 char            axis[16]        = {""};
00110 
00111         rewind( fp );
00112 
00113         /* Initialize CIF Header */
00114         memset( (char *)&hcif, 0, sizeof(CIF_HEADER) );
00115 
00116         cbf_failnez (cbf_make_handle            (&cif))
00117         if ( cif_error ) {
00118                 printe("Cannot create handle for CIF input");
00119                 return 0;
00120         }
00121         cbf_failnez (cbf_read_file              (cif, fp, MSG_DIGEST))
00122         cbf_failnez (cbf_rewind_datablock       (cif))
00123 
00124         /************************************************************ 
00125          * Category MARIP
00126          ************************************************************/
00127         cbf_failnez (cbf_find_category          (cif, "diffrn_detector_mar"))
00128         if ( cif_error ) {
00129                 printe("Cannot find category: diffrn_detector_mar");
00130                 goto CIF_MARIP_GAPS;
00131         }
00132         cbf_failnez (cbf_find_column            (cif, "id"))
00133         if ( !cif_error ) {
00134                 cbf_failnez (cbf_get_value      (cif, &sval))
00135                 strcpy( hcif.mar_id,            sval);
00136         }
00137 
00138         /************************************************************ 
00139          * Category MARIP_GAPS
00140          ************************************************************/
00141 CIF_MARIP_GAPS:
00142         cbf_failnez (cbf_rewind_datablock       (cif))
00143         cbf_failnez (cbf_find_category          (cif, "diffrn_detector_mar_gaps"))
00144         if ( !cif_error ) {
00145             for (i=0;i<8;i++) {
00146                 sprintf(str, "gap[%d]",i+1);
00147                 cbf_failnez (cbf_find_column     (cif, str))
00148                 if ( !cif_error ) {
00149                         cbf_failnez (cbf_get_integervalue  (cif, &ival))
00150                         hcif.diffrn_detector_mar_gaps.gap[i] = ival;
00151                 }
00152                 cbf_failnez (cbf_rewind_row             (cif))
00153             }
00154         }
00155 
00156         /************************************************************ 
00157          * Category MARIP_EXPOSURE
00158          ************************************************************/
00159 CIF_MARIP_EXPOSURE:
00160         cbf_failnez (cbf_rewind_datablock       (cif))
00161         cbf_failnez (cbf_find_category          (cif, "diffrn_detector_mar_exposure"))
00162         if ( cif_error ) goto CIF_MARIP_AXIS;
00163 
00164         cbf_failnez (cbf_find_column            (cif, "type"))
00165         if ( !cif_error ) {
00166                 cbf_failnez (cbf_get_value        (cif, &sval))
00167                 strcpy( hcif.diffrn_detector_mar_exposure.type, sval);
00168         }
00169 
00170         cbf_failnez (cbf_rewind_row             (cif))
00171         cbf_failnez (cbf_find_column            (cif, "time"))
00172         if ( !cif_error ) {
00173                 cbf_failnez (cbf_get_doublevalue  (cif, &dval))
00174                 hcif.diffrn_detector_mar_exposure.time  = (float)dval;
00175         }
00176 
00177         cbf_failnez (cbf_rewind_row             (cif))
00178         cbf_failnez (cbf_find_column            (cif, "dose"))
00179         if ( !cif_error ) {
00180                 cbf_failnez (cbf_get_doublevalue  (cif, &dval))
00181                 hcif.diffrn_detector_mar_exposure.dose  = (float)dval;
00182         }
00183 
00184         /************************************************************ 
00185          * Category MARIP_AXIS
00186          ************************************************************/
00187 CIF_MARIP_AXIS:
00188         cbf_failnez (cbf_rewind_datablock       (cif))
00189         cbf_failnez (cbf_find_category          (cif, "diffrn_detector_mar_axis"))
00190         if ( cif_error ) goto CIF_MARIP_EXPOSURE_DOSE;
00191 
00192         cbf_failnez (cbf_find_column            (cif, "mar_id"))
00193         if ( !cif_error ) {
00194                 cbf_failnez (cbf_get_value        (cif, &sval))
00195                 strcpy( hcif.mar_id, sval);
00196         }
00197 
00198         for ( i=0; i<=AXIS_DISTANCE; i++ ) {    
00199           while (cbf_find_nextrow (cif, hcif.mar_id) == 0) {
00200             cbf_failnez (cbf_find_column        (cif, "axis_id"))
00201             if ( cif_error ) break;
00202             cbf_failnez (cbf_get_value          (cif, &sval))
00203             strcpy( axis, axis_name[i] );
00204             if ( !strcmp( sval, axis ) ) {
00205                 cbf_failnez (cbf_find_column    (cif, "angle_start"))
00206                 if ( !cif_error ) {
00207                         cbf_failnez (cbf_get_doublevalue (cif, &dval))
00208                         hcif.diffrn_detector_mar_axis[i].angle_start=(float)dval;
00209                 }
00210                 cbf_failnez (cbf_find_column  (cif, "angle_end"))
00211                 if ( !cif_error ) {
00212                         cbf_failnez (cbf_get_doublevalue (cif, &dval))
00213                         hcif.diffrn_detector_mar_axis[i].angle_end=(float)dval;
00214                 }
00215                 cbf_failnez (cbf_find_column  (cif, "angle_increment"))
00216                 if ( !cif_error ) {
00217                         cbf_failnez (cbf_get_doublevalue (cif, &dval))
00218                         hcif.diffrn_detector_mar_axis[i].angle_increment=(float)dval;
00219                 }
00220                 cbf_failnez (cbf_find_column  (cif, "oscillations"))
00221                 if ( !cif_error ) {
00222                         cbf_failnez (cbf_get_integervalue (cif, &ival))
00223                         hcif.diffrn_detector_mar_axis[i].oscillations = ival;
00224                 }
00225                 cbf_failnez (cbf_find_column  (cif, "displacement"))
00226                 if ( !cif_error ) {
00227                         cbf_failnez (cbf_get_doublevalue (cif, &dval))
00228                         hcif.diffrn_detector_mar_axis[i].displacement=(float)dval;
00229                 }
00230             }
00231             cbf_failnez (cbf_find_column        (cif, "mar_id"))
00232           }
00233           cbf_failnez (cbf_rewind_row           (cif))
00234         }
00235 
00236         /************************************************************ 
00237          * Category MARIP_EXPOSURE_DOSE
00238          ************************************************************/
00239 
00240 CIF_MARIP_EXPOSURE_DOSE:
00241         cbf_failnez (cbf_rewind_datablock       (cif))
00242         cbf_failnez (cbf_find_category          (cif, "diffrn_detector_mar_exposure_dose"))
00243         if ( cif_error ) goto CIF_MARIP_SCAN;
00244         cbf_failnez (cbf_find_column            (cif, "start"))
00245         if ( !cif_error ) {
00246                 cbf_failnez (cbf_get_doublevalue  (cif, &dval))
00247                 hcif.diffrn_detector_mar_exposure_dose.start = (float)dval;
00248         }
00249 
00250         cbf_failnez (cbf_rewind_row             (cif))
00251         cbf_failnez (cbf_find_column            (cif, "end"))
00252         if ( !cif_error ) {
00253                 cbf_failnez (cbf_get_doublevalue(cif, &dval))
00254                 hcif.diffrn_detector_mar_exposure_dose.end = (float)dval;
00255         }
00256 
00257         cbf_failnez (cbf_rewind_row             (cif))
00258         cbf_failnez (cbf_find_column            (cif, "min"))
00259         if ( !cif_error ) {
00260                 cbf_failnez (cbf_get_doublevalue(cif, &dval))
00261                 hcif.diffrn_detector_mar_exposure_dose.min = (float)dval;
00262         }
00263 
00264         cbf_failnez (cbf_rewind_row             (cif))
00265         cbf_failnez (cbf_find_column            (cif, "max"))
00266         if ( !cif_error ) {
00267                 cbf_failnez (cbf_get_doublevalue(cif, &dval))
00268                 hcif.diffrn_detector_mar_exposure_dose.max= (float)dval;
00269         }
00270 
00271         cbf_failnez (cbf_rewind_row             (cif))
00272         cbf_failnez (cbf_find_column            (cif, "avg"))
00273         if ( !cif_error ) {
00274                 cbf_failnez (cbf_get_doublevalue(cif, &dval))
00275                 hcif.diffrn_detector_mar_exposure_dose.avg = (float)dval;
00276         }
00277 
00278         cbf_failnez (cbf_rewind_row             (cif))
00279         cbf_failnez (cbf_find_column            (cif, "esd"))
00280         if ( !cif_error ) {
00281                 cbf_failnez (cbf_get_doublevalue(cif, &dval))
00282                 hcif.diffrn_detector_mar_exposure_dose.esd = (float)dval;
00283         }
00284 
00285         cbf_failnez (cbf_rewind_row             (cif))
00286         cbf_failnez (cbf_find_column            (cif, "measurements"))
00287         if ( !cif_error ) {
00288                 cbf_failnez (cbf_get_integervalue (cif, &ival))
00289                 hcif.diffrn_detector_mar_exposure_dose.measurements = ival;
00290         }
00291 
00292         /************************************************************ 
00293          * Category MARIP_EXPOSURE_SCAN
00294          ************************************************************/
00295 CIF_MARIP_SCAN:
00296         cbf_failnez (cbf_rewind_datablock       (cif))
00297         if ( cif_error ) goto CIF_MARIP_ADC;
00298         cbf_failnez (cbf_find_category          (cif, "diffrn_detector_mar_scan"))
00299         cbf_failnez (cbf_find_column            (cif, "scanmode"))
00300         if ( !cif_error ) {
00301                 cbf_failnez (cbf_get_integervalue (cif, &ival))
00302                 hcif.diffrn_detector_mar_scan.scanmode  = ival;
00303         }
00304 
00305         cbf_failnez (cbf_rewind_row             (cif))
00306         cbf_failnez (cbf_find_column            (cif, "number_of_pixels"))
00307         if ( !cif_error ) {
00308                 cbf_failnez (cbf_get_integervalue (cif, &ival))
00309                 hcif.diffrn_detector_mar_scan.number_of_pixels = ival;
00310         }
00311 
00312         cbf_failnez (cbf_rewind_row             (cif))
00313         cbf_failnez (cbf_find_column            (cif, "number_of_pixels_larger_16_bit"))
00314         if ( !cif_error ) {
00315                 cbf_failnez (cbf_get_integervalue (cif, &ival))
00316                 hcif.diffrn_detector_mar_scan.number_of_pixels_larger_16_bit  = ival;
00317         }
00318 
00319         cbf_failnez (cbf_rewind_row             (cif))
00320         cbf_failnez (cbf_find_column            (cif, "pixel_height"))
00321         if ( !cif_error ) {
00322                 cbf_failnez (cbf_get_doublevalue (cif, &dval))
00323                 hcif.diffrn_detector_mar_scan.pixel_height      = (float)dval;
00324         }
00325 
00326         cbf_failnez (cbf_rewind_row             (cif))
00327         cbf_failnez (cbf_find_column            (cif, "pixel_length"))
00328         if ( !cif_error ) {
00329                 cbf_failnez (cbf_get_doublevalue (cif, &dval))
00330                 hcif.diffrn_detector_mar_scan.pixel_length      = (float)dval;
00331         }
00332 
00333         cbf_failnez (cbf_rewind_row             (cif))
00334         cbf_failnez (cbf_find_column            (cif, "radial_offset"))
00335         if ( !cif_error ) {
00336                 cbf_failnez (cbf_get_doublevalue (cif, &dval))
00337                 hcif.diffrn_detector_mar_scan.radial_offset     = (float)dval;
00338         }
00339 
00340         cbf_failnez (cbf_rewind_row             (cif))
00341         cbf_failnez (cbf_find_column            (cif, "tangential_offset"))
00342         if ( !cif_error ) {
00343                 cbf_failnez (cbf_get_doublevalue (cif, &dval))
00344                 hcif.diffrn_detector_mar_scan.tangential_offset= (float)dval;
00345         }
00346 
00347         /************************************************************ 
00348          * Category MARIP_ADC
00349          ************************************************************/
00350 CIF_MARIP_ADC:
00351         cbf_failnez (cbf_rewind_datablock       (cif))
00352         cbf_failnez (cbf_find_category          (cif, "diffrn_detector_mar_adc"))
00353         if ( cif_error ) goto CIF_MARIP_DATA;
00354         cbf_failnez (cbf_find_column            (cif, "channel_a"))
00355         if ( !cif_error ) {
00356                 cbf_failnez (cbf_get_integervalue (cif, &ival))
00357                 hcif.diffrn_detector_mar_adc.channel_a  = ival;
00358         }
00359 
00360         cbf_failnez (cbf_rewind_row             (cif))
00361         cbf_failnez (cbf_find_column            (cif, "channel_b"))
00362         if ( !cif_error ) {
00363                 cbf_failnez (cbf_get_integervalue (cif, &ival))
00364                 hcif.diffrn_detector_mar_adc.channel_b  = ival;
00365         }
00366 
00367         cbf_failnez (cbf_rewind_row             (cif))
00368         cbf_failnez (cbf_find_column            (cif, "add_channel_a"))
00369         if ( !cif_error ) {
00370                 cbf_failnez (cbf_get_integervalue (cif, &ival))
00371                 hcif.diffrn_detector_mar_adc.add_channel_a      = ival;
00372         }
00373 
00374         cbf_failnez (cbf_rewind_row             (cif))
00375         cbf_failnez (cbf_find_column            (cif, "add_channel_b"))
00376         if ( !cif_error ) {
00377                 cbf_failnez (cbf_get_integervalue (cif, &ival))
00378                 hcif.diffrn_detector_mar_adc.add_channel_b      = ival;
00379         }
00380 
00381         cbf_failnez (cbf_rewind_row             (cif))
00382         cbf_failnez (cbf_find_column            (cif, "oversampling"))
00383         if ( !cif_error ) {
00384                 cbf_failnez (cbf_get_integervalue (cif, &ival))
00385                 hcif.diffrn_detector_mar_adc.oversampling       = ival;
00386         }
00387 
00388         cbf_failnez (cbf_rewind_row             (cif))
00389         cbf_failnez (cbf_find_column            (cif, "multiplier"))
00390         if ( !cif_error ) {
00391                 cbf_failnez (cbf_get_doublevalue (cif, &dval))
00392                 hcif.diffrn_detector_mar_adc.multiplier         = (float)dval;
00393         }
00394 
00395         cbf_failnez (cbf_rewind_row             (cif))
00396         cbf_failnez (cbf_find_column            (cif, "gain"))
00397         if ( !cif_error ) {
00398                 cbf_failnez (cbf_get_doublevalue (cif, &dval))
00399                 hcif.diffrn_detector_mar_adc.gain               = (float)dval;
00400         }
00401 
00402         /************************************************************ 
00403          * Category MARIP_DATA
00404          ************************************************************/
00405 CIF_MARIP_DATA:
00406         cbf_failnez (cbf_rewind_datablock       (cif))
00407         cbf_failnez (cbf_find_category          (cif, "diffrn_detector_mar_data"))
00408         if ( cif_error ) goto CIF_DIFFRN_FRAME_DATA;
00409         cbf_failnez (cbf_find_column            (cif, "intensity_avg"))
00410         if ( !cif_error ) {
00411                 cbf_failnez (cbf_get_doublevalue (cif, &dval))
00412                 hcif.diffrn_detector_mar_data.intensity_avg = (float)dval;
00413         }
00414 
00415         cbf_failnez (cbf_rewind_row             (cif))
00416         cbf_failnez (cbf_find_column            (cif, "intensity_esd"))
00417         if ( !cif_error ) {
00418                 cbf_failnez (cbf_get_doublevalue (cif, &dval))
00419                 hcif.diffrn_detector_mar_data.intensity_esd = (float)dval;
00420         }
00421 
00422         cbf_failnez (cbf_rewind_row             (cif))
00423         cbf_failnez (cbf_find_column            (cif, "intensity_min"))
00424         if ( !cif_error ) {
00425                 cbf_failnez (cbf_get_integervalue (cif, &ival))
00426                 hcif.diffrn_detector_mar_data.intensity_min = ival;
00427         }
00428 
00429         cbf_failnez (cbf_rewind_row             (cif))
00430         cbf_failnez (cbf_find_column            (cif, "intensity_max"))
00431         if ( !cif_error ) {
00432                 cbf_failnez (cbf_get_integervalue (cif, &ival))
00433                 hcif.diffrn_detector_mar_data.intensity_max = ival;
00434         }
00435 
00436         cbf_failnez (cbf_rewind_row             (cif))
00437         cbf_failnez (cbf_find_column            (cif, "histogram_start"))
00438         if ( !cif_error ) {
00439                 cbf_failnez (cbf_get_integervalue (cif, &ival))
00440                 hcif.diffrn_detector_mar_data.histogram_start = ival;
00441         }
00442 
00443         cbf_failnez (cbf_rewind_row             (cif))
00444         cbf_failnez (cbf_find_column            (cif, "histogram_end"))
00445         if ( !cif_error ) {
00446                 cbf_failnez (cbf_get_integervalue (cif, &ival))
00447                 hcif.diffrn_detector_mar_data.histogram_end = ival;
00448         }
00449 
00450         cbf_failnez (cbf_rewind_row             (cif))
00451         cbf_failnez (cbf_find_column            (cif, "histogram_max"))
00452         if ( !cif_error ) {
00453                 cbf_failnez (cbf_get_integervalue (cif, &ival))
00454                 hcif.diffrn_detector_mar_data.histogram_max = ival;
00455         }
00456 
00457         /************************************************************ 
00458          * Category DIFFRN_FRAME_DATA 
00459          ************************************************************/
00460 CIF_DIFFRN_FRAME_DATA:
00461         cbf_failnez (cbf_rewind_datablock       (cif))
00462         cbf_failnez (cbf_find_category          (cif, "diffrn_frame_data"))
00463         if ( cif_error ) {
00464                 printe("Cannot find category: diffrn_frame_data ");
00465                 goto CIF_DIFFRN_DETECTOR_ELEMENT;
00466         }
00467         cbf_failnez (cbf_find_column            (cif, "array_id"))
00468         if ( !cif_error ) {
00469                 cbf_failnez (cbf_get_value      (cif, &sval))
00470                 strcpy( hcif.array_id,          sval);
00471         }
00472 
00473         cbf_failnez (cbf_rewind_row             (cif))
00474         cbf_failnez (cbf_find_column            (cif, "id"))
00475         if ( !cif_error ) {
00476                 cbf_failnez (cbf_get_value      (cif, &sval))
00477                 strcpy( hcif.data_id,           sval);
00478         }
00479 
00480         cbf_failnez (cbf_rewind_row             (cif))
00481         cbf_failnez (cbf_find_column            (cif, "detector_element_id"))
00482         if ( !cif_error ) {
00483                 cbf_failnez (cbf_get_value     (cif, &sval))
00484                 strcpy( hcif.element_id,        sval);
00485         }
00486 
00487         cbf_failnez (cbf_rewind_row             (cif))
00488         cbf_failnez (cbf_find_column            (cif, "binary_id"))
00489         if ( !cif_error ) {
00490                 cbf_failnez (cbf_get_integervalue (cif, &hcif.binary_id))
00491         }
00492 
00493         /************************************************************ 
00494          * Category DIFFRN_DETECTOR_ELEMENT
00495          ************************************************************/
00496 CIF_DIFFRN_DETECTOR_ELEMENT:
00497         cbf_failnez (cbf_rewind_datablock       (cif))
00498         cbf_failnez (cbf_find_category          (cif, "diffrn_detector_element"))
00499         if ( cif_error )goto CIF_ARRAY_STRUCTURE_LIST;
00500                 
00501         cbf_failnez (cbf_find_column            (cif, "center[1]"))
00502         if ( !cif_error ) {
00503             cbf_failnez (cbf_get_doublevalue    (cif, &dval))
00504             hcif.diffrn_detector_element.center_x       = (float)dval;
00505         }
00506 
00507         cbf_failnez (cbf_rewind_row             (cif))
00508         cbf_failnez (cbf_find_column            (cif, "center[2]"))
00509         if ( !cif_error ) {
00510             cbf_failnez (cbf_get_doublevalue    (cif, &dval))
00511             hcif.diffrn_detector_element.center_y       = (float)dval;
00512         }
00513 
00514         /************************************************************ 
00515          * Category ARRAY_STRUCTURE_LIST
00516          ************************************************************/
00517 CIF_ARRAY_STRUCTURE_LIST:
00518         /* Get the image dimensions (2nd = fast, 1st = slow) */
00519         cbf_failnez (cbf_rewind_datablock       (cif))
00520         cbf_failnez (cbf_find_category          (cif, "array_structure_list"))
00521         if ( cif_error ) goto CIF_ARRAY_ELEMENT_SIZE;
00522         cbf_failnez (cbf_rewind_row             (cif))
00523         cbf_failnez (cbf_find_column            (cif, "array_id"))
00524 
00525         i=0;    
00526         while (cbf_find_nextrow (cif, hcif.array_id) == 0) {
00527             cbf_failnez (cbf_find_column        (cif, "precedence"))
00528             cbf_failnez (cbf_get_integervalue   (cif, &hcif.array_structure_list[i].precedence))
00529 
00530             if ( hcif.array_structure_list[i].precedence >= 1 && 
00531                  hcif.array_structure_list[i].precedence <= 2) {
00532                 cbf_failnez (cbf_find_column    (cif, "dimension"))
00533                 cbf_failnez (cbf_get_integervalue (cif, 
00534                         &hcif.array_structure_list[2-hcif.array_structure_list[i].precedence].dimension))
00535             }
00536             else {
00537                 printe("Cannot find CIF dimensions");
00538                 return 0;
00539             }
00540 
00541             i++;
00542             if ( i == 2 ) break;
00543             cbf_failnez (cbf_find_column        (cif, "array_id"))
00544         }
00545 
00546         if ( hcif.array_structure_list[0].dimension*hcif.array_structure_list[1].dimension == 0 ) {
00547                 printe("Something wrong with CIF dimensions");
00548                 return 0;
00549         }
00550 
00551         /************************************************************ 
00552          * Category ARRAY_ELEMENT_SIZE
00553          ************************************************************/
00554 CIF_ARRAY_ELEMENT_SIZE:
00555         cbf_failnez (cbf_rewind_datablock(cif))
00556         cbf_failnez (cbf_find_category          (cif, "array_element_size"))
00557         
00558         if ( cif_error ) {
00559                 printe("Cannot find category: array_element_size");
00560                 goto CIF_DIFFRN_RADIATION;
00561         }
00562         cbf_failnez (cbf_rewind_row             (cif))
00563         cbf_failnez (cbf_find_column            (cif, "array_id"))
00564 
00565         i = 0;  
00566         while (cbf_find_nextrow (cif, hcif.array_id) == 0) {
00567             cbf_failnez (cbf_find_column        (cif, "size"))
00568             cbf_failnez (cbf_get_doublevalue    (cif, &dval))
00569             if ( !cif_error ) 
00570                     hcif.array_element_size.pixelsize[i] = (float)dval;
00571             cbf_failnez (cbf_find_column (cif, "array_id"))
00572             i++;
00573             if ( i == 2 ) break;
00574         }
00575 
00576         /************************************************************ 
00577          * Category DIFFRN_RADIATION
00578          ************************************************************/
00579 CIF_DIFFRN_RADIATION:   
00580         cbf_failnez (cbf_rewind_datablock(cif))
00581         cbf_failnez (cbf_find_category          (cif, "diffrn_radiation"))
00582         if ( cif_error ) goto CIF_DIFFRN_RADIATION_WAVELENGTH;
00583 
00584         cbf_failnez (cbf_find_column            (cif, "monochromator"))
00585         if ( !cif_error ) {
00586                 cbf_failnez (cbf_get_value     (cif, &sval))
00587                 strcpy( hcif.diffrn_radiation.monochromator, sval);
00588         }
00589 
00590         cbf_failnez (cbf_rewind_row             (cif))
00591         cbf_failnez (cbf_find_column            (cif, "wavelength"))
00592         if ( !cif_error ) {
00593                 cbf_failnez (cbf_get_doublevalue (cif, &dval))
00594                 hcif.diffrn_radiation_wavelength.wavelength = (float)dval;
00595         }
00596 
00597         /************************************************************ 
00598          * Category DIFFRN_RADIATION_WAVELENGTH
00599          ************************************************************/
00600 CIF_DIFFRN_RADIATION_WAVELENGTH:        
00601         cbf_failnez (cbf_rewind_datablock(cif))
00602         cbf_failnez (cbf_find_category          (cif, "diffrn_radiation_wavelength"))
00603         if ( cif_error ) goto CIF_DIFFRN_MEASUREMENT;
00604         cbf_failnez (cbf_find_column            (cif, "wavelength"))
00605         if ( cif_error ) {
00606                         printe("Cannot find data item: wavelength");
00607                         goto CIF_DIFFRN_MEASUREMENT;
00608         } 
00609         else {
00610                 cbf_failnez (cbf_get_doublevalue (cif, &dval))
00611                 hcif.diffrn_radiation_wavelength.wavelength = (float)dval;
00612         }
00613 
00614         cbf_failnez (cbf_rewind_row             (cif))
00615         cbf_failnez (cbf_find_column            (cif, "polarisn_ratio"))
00616         if ( !cif_error ) {
00617                 hcif.diffrn_radiation_wavelength.polarisn_ratio = (float)dval;
00618         }
00619 
00620         /************************************************************ 
00621          * Category DIFFRN_MEASUREMENT
00622          ************************************************************/
00623 CIF_DIFFRN_MEASUREMENT:
00624         cbf_failnez (cbf_rewind_datablock(cif))
00625         cbf_failnez (cbf_find_category          (cif, "diffrn_measurement"))
00626         if ( cif_error ) {
00627                 printe("Cannot find category: diffrn_measurement");
00628                 goto CIF_DIFFRN_SOURCE;
00629         }
00630         cbf_failnez (cbf_find_column            (cif, "sample_detector_distance"))
00631         if ( cif_error == 0 ) {
00632                 cbf_failnez (cbf_get_doublevalue (cif, &dval))
00633                 hcif.diffrn_measurement.sample_detector_distance = (float)dval;
00634         }
00635 
00636         /************************************************************ 
00637          * Category DIFFRN_SOURCE
00638          ************************************************************/
00639 CIF_DIFFRN_SOURCE:
00640         cbf_failnez (cbf_rewind_datablock(cif))
00641         cbf_failnez (cbf_find_category          (cif, "diffrn_source"))
00642         if ( cif_error ) goto CIF_DIFFRN_SCAN_FRAME_AXIS;
00643         cbf_failnez (cbf_find_column            (cif, "source"))
00644         if ( !cif_error ) {
00645                 cbf_failnez (cbf_get_value      (cif, &sval))
00646                 strcpy( hcif.diffrn_source.source, sval);
00647         }
00648 
00649         cbf_failnez (cbf_rewind_row             (cif))
00650         cbf_failnez (cbf_find_column            (cif, "type"))
00651         if ( !cif_error ) {
00652                 cbf_failnez (cbf_get_value      (cif, &sval))
00653                 strcpy( hcif.diffrn_source.type, sval);
00654         }
00655 
00656         cbf_failnez (cbf_rewind_row             (cif))
00657         cbf_failnez (cbf_find_column            (cif, "current"))
00658         if ( !cif_error ) {
00659                 cbf_failnez (cbf_get_doublevalue (cif, &dval))
00660                 hcif.diffrn_source.current      = (float)dval;
00661         }
00662 
00663         cbf_failnez (cbf_rewind_row             (cif))
00664         cbf_failnez (cbf_find_column            (cif, "voltage"))
00665         if ( !cif_error ) {
00666                 cbf_failnez (cbf_get_doublevalue (cif, &dval))
00667                 hcif.diffrn_source.voltage      = (float)dval;
00668         }
00669 
00670         cbf_failnez (cbf_rewind_row             (cif))
00671         cbf_failnez (cbf_find_column            (cif, "power"))
00672         if ( !cif_error ) {
00673                 cbf_failnez (cbf_get_doublevalue (cif, &dval))
00674                 hcif.diffrn_source.power        = (float)dval;
00675         }
00676 
00677         /************************************************************ 
00678          * Category DIFFRN_SCAN_FRAME_AXIS
00679          ************************************************************/
00680 CIF_DIFFRN_SCAN_FRAME_AXIS:
00681         cbf_failnez (cbf_rewind_datablock(cif))
00682         cbf_failnez (cbf_find_category          (cif, "diffrn_scan_frame_axis"))
00683         if ( cif_error ) {
00684                 printe("Cannot find category: diffrn_scan_frame_axis");
00685                 goto CIF_DIFFRN_SCAN;
00686         }
00687         cbf_failnez (cbf_rewind_row             (cif))
00688         cbf_failnez (cbf_find_column            (cif, "scan_id"))
00689         if ( !cif_error ) {
00690                 cbf_failnez (cbf_get_value      (cif, &sval))
00691                 strcpy( hcif.scan_id,           sval);
00692         }
00693 
00694         for ( i=0; i<N_SCAN_FRAME_AXES; i++ ) { 
00695           while (cbf_find_nextrow (cif, hcif.scan_id) == 0) {
00696             cbf_failnez (cbf_find_column        (cif, "axis_id"))
00697             if ( cif_error ) break;
00698             cbf_failnez (cbf_get_value          (cif, &sval))
00699             strcpy( axis, axis_name[i] );
00700             if ( !strcmp( sval, axis ) ) {
00701                 cbf_failnez (cbf_find_column    (cif, "angle"))
00702                 if ( !cif_error ) {
00703                         cbf_failnez (cbf_get_doublevalue (cif, &dval))
00704                         hcif.diffrn_scan_frame_axis[i].angle=(float)dval;
00705                 }
00706                 cbf_failnez (cbf_find_column  (cif, "displacement"))
00707                 if ( !cif_error ) {
00708                         cbf_failnez (cbf_get_doublevalue (cif, &dval))
00709                         hcif.diffrn_scan_frame_axis[i].displacement=(float)dval; 
00710                 }
00711             }
00712             cbf_failnez (cbf_find_column        (cif, "scan_id"))
00713           }
00714           cbf_failnez (cbf_rewind_row           (cif))
00715         }
00716 
00717         /************************************************************ 
00718          * Category DIFFRN_SCAN + DIFFRN+SCAN_AXIS
00719          ************************************************************/
00720 CIF_DIFFRN_SCAN:
00721         cbf_failnez (cbf_rewind_datablock(cif))
00722         cbf_failnez (cbf_find_category          (cif, "diffrn_scan_axis"))
00723         if ( cif_error ) {
00724                 printe("Cannot find category: diffrn_scan_axis");
00725                 goto CIF_CAT4;
00726         }
00727         cbf_failnez (cbf_rewind_row             (cif))
00728         cbf_failnez (cbf_find_column            (cif, "scan_id"))
00729         if ( !cif_error ) {
00730                 cbf_failnez (cbf_get_value              (cif, &sval))
00731                 strcpy( hcif.scan_id, sval);
00732         }
00733 
00734         for ( i=0; i<N_SCAN_AXES; i++ ) {       
00735           while (cbf_find_nextrow (cif, hcif.scan_id) == 0) {
00736             cbf_failnez (cbf_find_column        (cif, "axis_id"))
00737             if ( cif_error ) break;
00738             cbf_failnez (cbf_get_value          (cif, &sval))
00739             strcpy( axis, axis_name[i] );
00740             if ( !strcmp( sval, axis ) ) {
00741                 cbf_failnez (cbf_find_column    (cif, "angle_start"))
00742                 if ( !cif_error ) {
00743                         cbf_failnez (cbf_get_doublevalue (cif, &dval))
00744                         hcif.diffrn_scan_axis[i].angle_start=(float)dval;
00745                 }
00746                 cbf_failnez (cbf_find_column    (cif, "angle_increment"))
00747                 if ( !cif_error ) {
00748                         cbf_failnez (cbf_get_doublevalue (cif, &dval))
00749                         hcif.diffrn_scan_axis[i].angle_increment=(float)dval; 
00750                 }
00751             }
00752             cbf_failnez (cbf_find_column        (cif, "scan_id"))
00753           }
00754           cbf_failnez (cbf_rewind_row           (cif))
00755         }
00756 
00757         /************************************************************ 
00758          * Category ARRAY_DATA
00759          ************************************************************/
00760 CIF_CAT4:
00761 
00762 CIF_END:
00763 
00764         if ( verbose > 1 ) {
00765             printf("%s: CIF-Header values:\n",prg);
00766             printf("         Pixels       :\t %d x %d\n",hcif.array_structure_list[0].dimension,hcif.array_structure_list[1].dimension);
00767             printf("         Pixelsize    :\t %11.6f  [m]\n",hcif.array_element_size.pixelsize[0]);
00768 
00769             if ( strlen( hcif.mar_id ) ) {
00770                 printf("         Distance     :\t %11.3f  [mm ]\n",hcif.diffrn_detector_mar_axis[AXIS_DISTANCE].displacement);
00771                 printf("         PHI-start    :\t %11.3f  [deg]\n",hcif.diffrn_detector_mar_axis[AXIS_PHI].angle_start);
00772                 printf("         Delta-PHI    :\t %11.3f  [deg]\n",hcif.diffrn_detector_mar_axis[AXIS_PHI].angle_increment);
00773             }
00774             else {
00775                 printf("         Distance     :\t %11.6f  [m]\n",hcif.diffrn_scan_frame_axis[AXIS_DISTANCE].displacement);
00776                 printf("         Wavelength   :\t %11.6f  [Ang]\n",hcif.diffrn_radiation_wavelength.wavelength);
00777                 printf("         PHI-start    :\t %11.3f  [deg]\n",hcif.diffrn_scan_axis[AXIS_PHI].angle_start);
00778                 printf("         Delta-PHI    :\t %11.3f  [deg]\n",hcif.diffrn_scan_axis[AXIS_PHI].angle_increment);
00779             }
00780             printf("         Wavelength   :\t %11.6f  [Ang]\n",hcif.diffrn_radiation_wavelength.wavelength);
00781         }
00782 
00783         return 1;
00784 }
00785 
00786         
00787 
00788 /******************************************************************
00789  * Function: CIF2mar345Header
00790  ******************************************************************/
00791 MAR345_HEADER CIF2mar345Header(char *prg)
00792 {
00793 char            *c,*d, *sval;
00794 int             i,j,k;
00795 MAR345_HEADER   h345;
00796 
00797         /* Defaults ... */
00798         memset( (char *)&h345, 0, sizeof(MAR345_HEADER) );
00799 
00800         h345.wave       = hcif.diffrn_radiation_wavelength.wavelength;
00801         h345.byteorder  = 1234;
00802         h345.format     = 1;
00803 
00804         /* Center of detector ... */
00805         h345.xcen       = hcif.diffrn_detector_element.center_x;
00806         h345.ycen       = hcif.diffrn_detector_element.center_y;
00807 
00808         /* Serial number may be stored in element_id ... */
00809         if ( (sval=strchr( hcif.element_id, '_' )) != NULL ) {
00810                 i=sscanf( sval+1, "%d", &k);
00811                 if ( i==1 )
00812                         h345.scanner = k;
00813         }
00814 
00815         /* Has this CBF been created by mar software ? ... */
00816         if ( strlen( hcif.mar_id ) ) {
00817                 /* Axis setting */
00818                 h345.phibeg     = hcif.diffrn_detector_mar_axis[AXIS_PHI].angle_start;
00819                 h345.phiend     = hcif.diffrn_detector_mar_axis[AXIS_PHI].angle_end;
00820                 h345.phiosc     = hcif.diffrn_detector_mar_axis[AXIS_PHI].oscillations;
00821 
00822                 h345.omebeg     = hcif.diffrn_detector_mar_axis[AXIS_OMEGA].angle_start;
00823                 h345.omeend     = hcif.diffrn_detector_mar_axis[AXIS_OMEGA].angle_end;
00824                 h345.omeosc     = hcif.diffrn_detector_mar_axis[AXIS_OMEGA].oscillations;
00825 
00826                 h345.dist       = hcif.diffrn_detector_mar_axis[AXIS_DISTANCE].displacement;
00827                 h345.theta      = hcif.diffrn_detector_mar_axis[AXIS_THETA].angle_end;
00828                 h345.chi        = hcif.diffrn_detector_mar_axis[AXIS_CHI].angle_end;
00829 
00830                 h345.time       = hcif.diffrn_detector_mar_exposure.time;
00831 
00832                 /* Internals ... */
00833                 h345.multiplier = hcif.diffrn_detector_mar_adc.multiplier;
00834                 h345.gain       = hcif.diffrn_detector_mar_adc.gain;
00835                 h345.adc_A      = hcif.diffrn_detector_mar_adc.channel_a;
00836                 h345.adc_B      = hcif.diffrn_detector_mar_adc.channel_b;
00837                 h345.add_A      = hcif.diffrn_detector_mar_adc.add_channel_a;
00838                 h345.add_B      = hcif.diffrn_detector_mar_adc.add_channel_b;
00839 
00840                 h345.roff       = hcif.diffrn_detector_mar_scan.radial_offset;
00841                 h345.toff       = hcif.diffrn_detector_mar_scan.tangential_offset;
00842 
00843                 /* Image descriptors */
00844                 h345.pixel_height = hcif.diffrn_detector_mar_scan.pixel_height;
00845                 h345.pixel_length = hcif.diffrn_detector_mar_scan.pixel_length;
00846 
00847                 h345.size       = hcif.diffrn_detector_mar_scan.scanmode;
00848                 h345.pixels     = hcif.diffrn_detector_mar_scan.number_of_pixels;
00849                 h345.high       = hcif.diffrn_detector_mar_scan.number_of_pixels_larger_16_bit;
00850 
00851                 /* Exposure dose statistics  */
00852                 h345.dosebeg    = hcif.diffrn_detector_mar_exposure_dose.start;
00853                 h345.doseend    = hcif.diffrn_detector_mar_exposure_dose.end;
00854                 h345.dosemin    = hcif.diffrn_detector_mar_exposure_dose.min;
00855                 h345.dosemax    = hcif.diffrn_detector_mar_exposure_dose.max;
00856                 h345.doseavg    = hcif.diffrn_detector_mar_exposure_dose.avg;
00857                 h345.dosesig    = hcif.diffrn_detector_mar_exposure_dose.esd;
00858                 h345.dosen      = hcif.diffrn_detector_mar_exposure_dose.measurements;
00859 
00860                 /* Image statistics  */
00861                 h345.valmin     = hcif.diffrn_detector_mar_data.intensity_min;
00862                 h345.valmax     = hcif.diffrn_detector_mar_data.intensity_max;
00863                 h345.valavg     = hcif.diffrn_detector_mar_data.intensity_avg;
00864                 h345.valsig     = hcif.diffrn_detector_mar_data.intensity_esd;
00865                 h345.histbeg    = hcif.diffrn_detector_mar_data.histogram_start;
00866                 h345.histend    = hcif.diffrn_detector_mar_data.histogram_end;
00867                 h345.histmax    = hcif.diffrn_detector_mar_data.histogram_max;
00868 
00869                 /* Gaps */
00870                 for (i=0;i<8;i++) {
00871                         h345.gap[i] = hcif.diffrn_detector_mar_gaps.gap[i];
00872                 }
00873 
00874                 /* Type of exposure: DOSE or TIME */    
00875                 if ( strstr( hcif.diffrn_detector_mar_exposure.type, "dose" ) ) 
00876                         h345.mode = 0;
00877                 else
00878                         h345.mode = 1;
00879 
00880                 /* Serial number is stored in diffrn_detector_mar_id ... */
00881                 if ( (sval=strchr( hcif.mar_id, '_' )) != NULL ) {
00882                         i=sscanf( sval+1, "%d", &k);
00883                         if ( i==1 )
00884                                 h345.scanner = k;
00885                 }
00886 
00887         }
00888 
00889         /* So this CBF has not been created by mar software ... */
00890         /* Some parameters may have been guessed ...*/
00891         else {
00892                 /* Axis setting */
00893                 h345.phibeg     = hcif.diffrn_scan_axis[AXIS_PHI].angle_start;
00894                 h345.phiend     = h345.phibeg + hcif.diffrn_scan_axis[AXIS_PHI].angle_increment;
00895                 h345.phiosc     = 1;
00896 
00897                 h345.omebeg     = hcif.diffrn_scan_axis[AXIS_OMEGA].angle_start;
00898                 h345.omeend     = h345.omebeg + hcif.diffrn_scan_axis[AXIS_OMEGA].angle_increment;
00899                 h345.omeosc     = 0;
00900 
00901                 /* Distance is in m, so divide by 1000 to get mm */
00902                 h345.dist       = hcif.diffrn_scan_frame_axis[AXIS_DISTANCE].displacement;
00903                 h345.theta      = hcif.diffrn_scan_frame_axis[AXIS_THETA].angle;
00904                 h345.chi        = hcif.diffrn_scan_frame_axis[AXIS_CHI].angle;
00905                 
00906                 /* Image descriptors */
00907                 h345.pixel_height = hcif.array_element_size.pixelsize[0];
00908                 h345.pixel_length = hcif.array_element_size.pixelsize[1];
00909 
00910                 h345.size       = hcif.array_structure_list[0].dimension;
00911                 h345.pixels     = h345.size*h345.size;
00912                 h345.multiplier = hcif.array_intensities.scaling;
00913                 h345.gain       = hcif.array_intensities.gain;
00914                 h345.mode       = 1;    /* Time mode = default */
00915 
00916                 /* Serial number is stored in element_id ... */
00917                 if ( (sval=strchr( hcif.element_id, '_' )) != NULL ) {
00918                         i=sscanf( sval+1, "%d", &k);
00919                         if ( i==1 )
00920                                 h345.scanner = k;
00921                 }
00922 
00923         }
00924 
00925         /* Make sure pixesize is in microm */
00926         i=0;
00927         while (h345.pixel_height < 1.f) {       /* Pixelsize in micron */
00928                 h345.pixel_height *= 1000.;
00929                 h345.pixel_length *= 1000.;
00930                 i++;
00931                 if  (i==6) break;
00932         }
00933 
00934         /* Convert distance from m to mm */
00935         if ( h345.dist < 0.1 ) h345.dist *= 1000.;
00936 
00937         /* Convert IP-center from mm to pixels */
00938         if ( h345.pixel_height > 0.01 ) {
00939                 h345.xcen /= ( h345.pixel_height/1000. ); 
00940                 h345.ycen /= ( h345.pixel_height/1000. ); 
00941         }
00942 
00943         /* Generator setup */
00944         strcpy( h345.source,    hcif.diffrn_source.source);
00945         h345.kV                 = hcif.diffrn_source.voltage;
00946         h345.mA                 = hcif.diffrn_source.current;
00947 
00948         /* Beam setup */
00949         strcpy( h345.filter,    hcif.diffrn_radiation.monochromator);
00950         h345.polar              = hcif.diffrn_radiation_wavelength.polarisn_ratio;
00951 
00952         strcpy( h345.date,      hcif.audit.creation_date);
00953 
00954         return h345;    
00955 }
00956 
00957 /******************************************************************
00958  * Function: PutCIFHeader
00959  ******************************************************************/
00960 int PutCIFHeader( char *prg, char *f)
00961 {
00962 const char      *sval;
00963 float           fval;
00964 double          dval;
00965 int             ival;
00966 int             i;
00967 
00968 
00969         cbf_failnez (cbf_make_handle (&cif))
00970         
00971         /* Make a new data block */
00972         cbf_failnez (cbf_new_datablock (cif, "image_1"))
00973 
00974         /********************************************************************
00975          * AUDIT
00976          ********************************************************************/
00977 
00978         cbf_failnez (cbf_force_new_category (cif, "audit"))
00979         cbf_failnez (cbf_new_column   (cif, "creation_date"))
00980         cbf_failnez (cbf_set_value    (cif, hcif.audit.creation_date))
00981         cbf_failnez (cbf_new_column   (cif, "creation_method"))
00982         cbf_failnez (cbf_set_value    (cif, hcif.audit.creation_method))
00983 
00984         /********************************************************************
00985          * ENTRY, EXPTL_CRYSTAL & CHEMICAL
00986          ********************************************************************/
00987 
00988         cbf_failnez (cbf_force_new_category (cif, "entry_id"))
00989         cbf_failnez (cbf_new_column   (cif, "id"))
00990         cbf_failnez (cbf_set_value    (cif, "img1"))
00991 
00992         cbf_failnez (cbf_force_new_category (cif, "exptl_crystal"))
00993         cbf_failnez (cbf_new_column   (cif, "id"))
00994         cbf_failnez (cbf_set_value    (cif, hcif.crystal_id))
00995 
00996         if ( PRINT_CHEMICAL ) {
00997                 cbf_failnez (cbf_force_new_category (cif, "chemical"))
00998                 cbf_failnez (cbf_new_column   (cif, "entry_id"))
00999                 cbf_failnez (cbf_set_value    (cif, "img1"))
01000         }
01001 
01002         /********************************************************************
01003          * DIFFRN
01004          ********************************************************************/
01005 
01006         cbf_failnez (cbf_force_new_category (cif, "diffrn"))
01007         cbf_failnez (cbf_new_column   (cif, "id"))
01008         cbf_failnez (cbf_set_value    (cif, hcif.diffrn_id ))
01009         cbf_failnez (cbf_new_column   (cif, "crystal_id"))
01010         cbf_failnez (cbf_set_value    (cif, hcif.crystal_id))
01011 
01012         /********************************************************************
01013          * DIFFRN_SOURCE
01014          ********************************************************************/
01015 
01016         cbf_failnez (cbf_force_new_category (cif, "diffrn_source"))
01017         cbf_failnez (cbf_new_column   (cif, "diffrn_id"))
01018         cbf_failnez (cbf_set_value    (cif, hcif.diffrn_id ))
01019         cbf_failnez (cbf_new_column   (cif, "source"))
01020         cbf_failnez (cbf_set_value    (cif, hcif.diffrn_source.source))
01021         cbf_failnez (cbf_new_column   (cif, "type"))
01022         cbf_failnez (cbf_set_value    (cif, hcif.diffrn_source.type))
01023         cbf_failnez (cbf_new_column   (cif, "current"))
01024         cbf_failnez (cbf_set_doublevalue (cif, "%.1f", hcif.diffrn_source.current))
01025         cbf_failnez (cbf_new_column   (cif, "voltage"))
01026         cbf_failnez (cbf_set_doublevalue (cif, "%.1f", hcif.diffrn_source.voltage))
01027 
01028         /********************************************************************
01029          * DIFFRN_MEASUREMENT
01030          ********************************************************************/
01031 
01032         cbf_failnez (cbf_force_new_category (cif, "diffrn_measurement"))
01033         cbf_failnez (cbf_new_column   (cif, "diffrn_id"))
01034         cbf_failnez (cbf_set_value    (cif, hcif.diffrn_id ))
01035         cbf_failnez (cbf_new_column   (cif, "method"))
01036         cbf_failnez (cbf_set_value    (cif, hcif.diffrn_measurement.method))
01037         cbf_failnez (cbf_new_column   (cif, "device"))
01038         cbf_failnez (cbf_set_value    (cif, hcif.diffrn_measurement.device))
01039         cbf_failnez (cbf_new_column   (cif, "device_type"))
01040         cbf_failnez (cbf_set_value    (cif, hcif.diffrn_measurement.device_type))
01041         cbf_failnez (cbf_new_column   (cif, "sample_detector_distance"))
01042         cbf_failnez (cbf_set_doublevalue (cif, "%.6f", hcif.diffrn_measurement.sample_detector_distance))
01043 
01044         /********************************************************************
01045          * DIFFRN_RADIATION
01046          ********************************************************************/
01047 
01048         cbf_failnez (cbf_force_new_category (cif, "diffrn_radiation"))
01049         cbf_failnez (cbf_new_column   (cif, "diffrn_id"))
01050         cbf_failnez (cbf_set_value    (cif, hcif.diffrn_id ))
01051         cbf_failnez (cbf_new_column   (cif, "detector"))
01052         cbf_failnez (cbf_set_value    (cif, hcif.diffrn_radiation.detector))
01053         cbf_failnez (cbf_new_column   (cif, "collimation"))
01054         cbf_failnez (cbf_set_value    (cif, hcif.diffrn_radiation.collimation))
01055         cbf_failnez (cbf_new_column   (cif, "monochromator"))
01056         cbf_failnez (cbf_set_value    (cif, hcif.diffrn_radiation.monochromator))
01057 
01058         /********************************************************************
01059          * DIFFRN_RADIATION_WAVELENGTH
01060          ********************************************************************/
01061 
01062         cbf_failnez (cbf_force_new_category (cif, "diffrn_radiation_wavelength"))
01063         cbf_failnez (cbf_new_column   (cif, "id"))
01064         cbf_failnez (cbf_set_value    (cif, "WL1"))
01065         cbf_failnez (cbf_new_column   (cif, "wavelength"))
01066         cbf_failnez (cbf_set_doublevalue (cif, "%.6f", hcif.diffrn_radiation_wavelength.wavelength))
01067         cbf_failnez (cbf_new_column   (cif, "wavelength_wt"))
01068         cbf_failnez (cbf_set_doublevalue (cif, "%.3f", hcif.diffrn_radiation_wavelength.wavelength_wt))
01069         cbf_failnez (cbf_new_column   (cif, "polarisn_ratio"))
01070         cbf_failnez (cbf_set_doublevalue (cif, "%.3f", hcif.diffrn_radiation_wavelength.polarisn_ratio))
01071         cbf_failnez (cbf_new_column   (cif, "polarisn_norm"))
01072         cbf_failnez (cbf_set_doublevalue (cif, "%.3f", hcif.diffrn_radiation_wavelength.polarisn_norm))
01073 
01074 
01075         /********************************************************************
01076          * DIFFRN_DETECTOR 
01077          ********************************************************************/
01078 
01079         cbf_failnez (cbf_force_new_category (cif, "diffrn_detector"))
01080         cbf_failnez (cbf_new_column   (cif, "id"))
01081         cbf_failnez (cbf_set_value    (cif, hcif.detector_id ))
01082         cbf_failnez (cbf_new_column   (cif, "diffrn_id"))
01083         cbf_failnez (cbf_set_value    (cif, hcif.diffrn_id ))
01084         cbf_failnez (cbf_new_column   (cif, "detector"))
01085         cbf_failnez (cbf_set_value    (cif, hcif.diffrn_detector.detector))
01086         cbf_failnez (cbf_new_column   (cif, "type"))
01087         cbf_failnez (cbf_set_value    (cif, hcif.diffrn_detector.type))
01088 
01089         /********************************************************************
01090          * DIFFRN_DETECTOR_ELEMENT
01091          ********************************************************************/
01092 
01093         cbf_failnez (cbf_force_new_category (cif, "diffrn_detector_element"))
01094         cbf_failnez (cbf_new_column   (cif, "id"))
01095         cbf_failnez (cbf_set_value    (cif, hcif.element_id ))
01096         cbf_failnez (cbf_new_column   (cif, "detector_id"))
01097         cbf_failnez (cbf_set_value    (cif, hcif.detector_id ))
01098         cbf_failnez (cbf_new_column   (cif, "center[1]"))
01099         cbf_failnez (cbf_set_doublevalue (cif, "%.3f", hcif.diffrn_detector_element.center_x))
01100         cbf_failnez (cbf_new_column   (cif, "center[2]"))
01101         cbf_failnez (cbf_set_doublevalue (cif, "%.3f", hcif.diffrn_detector_element.center_y))
01102 
01103         /********************************************************************
01104          * MARIP
01105          ********************************************************************/
01106 
01107         cbf_failnez (cbf_force_new_category (cif, "diffrn_detector_mar"))
01108         cbf_failnez (cbf_new_column   (cif, "id"))
01109         cbf_failnez (cbf_set_value    (cif, hcif.mar_id ))
01110         cbf_failnez (cbf_new_column   (cif, "detector_id"))
01111         cbf_failnez (cbf_set_value    (cif, hcif.detector_id ))
01112 
01113         /********************************************************************
01114          * MARIP_ADC
01115          ********************************************************************/
01116 
01117         cbf_failnez (cbf_force_new_category (cif, "diffrn_detector_mar_adc"))
01118         cbf_failnez (cbf_new_column   (cif, "mar_id"))
01119         cbf_failnez (cbf_set_value    (cif, hcif.mar_id ))
01120         cbf_failnez (cbf_new_column   (cif, "channel_a"))
01121         cbf_failnez (cbf_set_integervalue (cif, hcif.diffrn_detector_mar_adc.channel_a))
01122         cbf_failnez (cbf_new_column   (cif, "channel_b"))
01123         cbf_failnez (cbf_set_integervalue (cif, hcif.diffrn_detector_mar_adc.channel_b))
01124         cbf_failnez (cbf_new_column   (cif, "add_channel_a"))
01125         cbf_failnez (cbf_set_integervalue (cif, hcif.diffrn_detector_mar_adc.add_channel_a))
01126         cbf_failnez (cbf_new_column   (cif, "add_channel_b"))
01127         cbf_failnez (cbf_set_integervalue (cif, hcif.diffrn_detector_mar_adc.add_channel_b))
01128         cbf_failnez (cbf_new_column   (cif, "oversampling"))
01129         cbf_failnez (cbf_set_integervalue (cif, hcif.diffrn_detector_mar_adc.oversampling))
01130         cbf_failnez (cbf_new_column   (cif, "multiplier"))
01131         cbf_failnez (cbf_set_doublevalue (cif, "%.3f", hcif.diffrn_detector_mar_adc.multiplier))
01132         cbf_failnez (cbf_new_column   (cif, "gain"))
01133         cbf_failnez (cbf_set_doublevalue (cif, "%.3f", hcif.diffrn_detector_mar_adc.gain))
01134 
01135         /********************************************************************
01136          * MARIP_GAPS
01137          ********************************************************************/
01138 
01139         cbf_failnez (cbf_force_new_category (cif, "diffrn_detector_mar_gaps"))
01140         cbf_failnez (cbf_new_column   (cif, "mar_id"))
01141         cbf_failnez (cbf_set_value    (cif, hcif.mar_id ))
01142         cbf_failnez (cbf_new_column   (cif, "gap[1]"))
01143         cbf_failnez (cbf_set_integervalue    (cif, hcif.diffrn_detector_mar_gaps.gap[0]))
01144         cbf_failnez (cbf_new_column   (cif, "gap[2]"))
01145         cbf_failnez (cbf_set_integervalue    (cif, hcif.diffrn_detector_mar_gaps.gap[1]))
01146         cbf_failnez (cbf_new_column   (cif, "gap[3]"))
01147         cbf_failnez (cbf_set_integervalue    (cif, hcif.diffrn_detector_mar_gaps.gap[2]))
01148         cbf_failnez (cbf_new_column   (cif, "gap[4]"))
01149         cbf_failnez (cbf_set_integervalue    (cif, hcif.diffrn_detector_mar_gaps.gap[3]))
01150         cbf_failnez (cbf_new_column   (cif, "gap[5]"))
01151         cbf_failnez (cbf_set_integervalue    (cif, hcif.diffrn_detector_mar_gaps.gap[4]))
01152         cbf_failnez (cbf_new_column   (cif, "gap[6]"))
01153         cbf_failnez (cbf_set_integervalue    (cif, hcif.diffrn_detector_mar_gaps.gap[5]))
01154         cbf_failnez (cbf_new_column   (cif, "gap[7]"))
01155         cbf_failnez (cbf_set_integervalue    (cif, hcif.diffrn_detector_mar_gaps.gap[6]))
01156         cbf_failnez (cbf_new_column   (cif, "gap[8]"))
01157         cbf_failnez (cbf_set_integervalue    (cif, hcif.diffrn_detector_mar_gaps.gap[7]))
01158 
01159         /********************************************************************
01160          * MARIP_SCAN
01161          ********************************************************************/
01162 
01163         cbf_failnez (cbf_force_new_category (cif, "diffrn_detector_mar_scan"))
01164         cbf_failnez (cbf_new_column   (cif, "mar_id"))
01165         cbf_failnez (cbf_set_value    (cif, hcif.mar_id ))
01166         cbf_failnez (cbf_new_column   (cif, "scanmode"))
01167         cbf_failnez (cbf_set_integervalue (cif, hcif.diffrn_detector_mar_scan.scanmode))
01168         cbf_failnez (cbf_new_column   (cif, "number_of_pixels"))
01169         cbf_failnez (cbf_set_integervalue (cif, hcif.diffrn_detector_mar_scan.number_of_pixels))
01170         cbf_failnez (cbf_new_column   (cif, "number_of_pixels_larger_16_bit"))
01171         cbf_failnez (cbf_set_integervalue (cif, hcif.diffrn_detector_mar_scan.number_of_pixels_larger_16_bit))
01172         cbf_failnez (cbf_new_column   (cif, "radial_offset"))
01173         cbf_failnez (cbf_set_doublevalue (cif, "%1.3f", hcif.diffrn_detector_mar_scan.radial_offset))
01174         cbf_failnez (cbf_new_column   (cif, "tangential_offset"))
01175         cbf_failnez (cbf_set_doublevalue (cif, "%1.3f", hcif.diffrn_detector_mar_scan.tangential_offset))
01176         cbf_failnez (cbf_new_column   (cif, "pixel_height"))
01177         cbf_failnez (cbf_set_doublevalue (cif, "%1.3f", hcif.diffrn_detector_mar_scan.pixel_height))
01178         cbf_failnez (cbf_new_column   (cif, "pixel_length"))
01179         cbf_failnez (cbf_set_doublevalue (cif, "%1.3f", hcif.diffrn_detector_mar_scan.pixel_length))
01180 
01181         /********************************************************************
01182          * MARIP_EXPOSURE
01183          ********************************************************************/
01184 
01185         cbf_failnez (cbf_force_new_category (cif, "diffrn_detector_mar_exposure"))
01186         cbf_failnez (cbf_new_column   (cif, "mar_id"))
01187         cbf_failnez (cbf_set_value    (cif, hcif.mar_id ))
01188         cbf_failnez (cbf_new_column   (cif, "type"))
01189         cbf_failnez (cbf_set_value    (cif, hcif.diffrn_detector_mar_exposure.type))
01190         cbf_failnez (cbf_new_column   (cif, "time"))
01191         cbf_failnez (cbf_set_doublevalue (cif, "%1.2f", hcif.diffrn_detector_mar_exposure.time))
01192         cbf_failnez (cbf_new_column   (cif, "dose"))
01193         cbf_failnez (cbf_set_doublevalue (cif, "%1.2f", hcif.diffrn_detector_mar_exposure.dose))
01194 
01195         /********************************************************************
01196          * MARIP_EXPOSURE_DOSE
01197          ********************************************************************/
01198 
01199         cbf_failnez (cbf_force_new_category (cif, "diffrn_detector_mar_exposure_dose"))
01200         cbf_failnez (cbf_new_column   (cif, "mar_id"))
01201         cbf_failnez (cbf_set_value    (cif, hcif.mar_id ))
01202         cbf_failnez (cbf_new_column   (cif, "dose"))
01203         cbf_failnez (cbf_set_doublevalue (cif, "%1.2f", hcif.diffrn_detector_mar_exposure.dose))
01204         cbf_failnez (cbf_new_column   (cif, "avg"))
01205         cbf_failnez (cbf_set_doublevalue (cif, "%1.2f", hcif.diffrn_detector_mar_exposure_dose.avg))
01206         cbf_failnez (cbf_new_column   (cif, "esd"))
01207         cbf_failnez (cbf_set_doublevalue (cif, "%1.2f", hcif.diffrn_detector_mar_exposure_dose.esd))
01208         cbf_failnez (cbf_new_column   (cif, "min"))
01209         cbf_failnez (cbf_set_doublevalue (cif, "%1.2f", hcif.diffrn_detector_mar_exposure_dose.min))
01210         cbf_failnez (cbf_new_column   (cif, "max"))
01211         cbf_failnez (cbf_set_doublevalue (cif, "%1.2f", hcif.diffrn_detector_mar_exposure_dose.max))
01212         cbf_failnez (cbf_new_column   (cif, "start"))
01213         cbf_failnez (cbf_set_doublevalue (cif, "%1.2f", hcif.diffrn_detector_mar_exposure_dose.start))
01214         cbf_failnez (cbf_new_column   (cif, "end"))
01215         cbf_failnez (cbf_set_doublevalue (cif, "%1.2f", hcif.diffrn_detector_mar_exposure_dose.end))
01216         cbf_failnez (cbf_new_column   (cif, "measurements"))
01217         cbf_failnez (cbf_set_integervalue (cif, hcif.diffrn_detector_mar_exposure_dose.measurements))
01218 
01219         /********************************************************************
01220          * MARIP_DATA
01221          ********************************************************************/
01222 
01223         cbf_failnez (cbf_force_new_category (cif, "diffrn_detector_mar_data"))
01224         cbf_failnez (cbf_new_column   (cif, "mar_id"))
01225         cbf_failnez (cbf_set_value    (cif, hcif.mar_id ))
01226         cbf_failnez (cbf_new_column   (cif, "intensity_avg"))
01227         cbf_failnez (cbf_set_doublevalue (cif, "%1.3f", hcif.diffrn_detector_mar_data.intensity_avg))
01228         cbf_failnez (cbf_new_column   (cif, "intensity_esd"))
01229         cbf_failnez (cbf_set_doublevalue (cif, "%1.3f", hcif.diffrn_detector_mar_data.intensity_esd))
01230         cbf_failnez (cbf_new_column   (cif, "intensity_min"))
01231         cbf_failnez (cbf_set_integervalue (cif, hcif.diffrn_detector_mar_data.intensity_min))
01232         cbf_failnez (cbf_new_column   (cif, "intensity_max"))
01233         cbf_failnez (cbf_set_integervalue (cif, hcif.diffrn_detector_mar_data.intensity_max))
01234         cbf_failnez (cbf_new_column   (cif, "histogram_start"))
01235         cbf_failnez (cbf_set_integervalue (cif, hcif.diffrn_detector_mar_data.histogram_start))
01236         cbf_failnez (cbf_new_column   (cif, "histogram_end"))
01237         cbf_failnez (cbf_set_integervalue (cif, hcif.diffrn_detector_mar_data.histogram_end))
01238         cbf_failnez (cbf_new_column   (cif, "histogram_max"))
01239         cbf_failnez (cbf_set_integervalue (cif, hcif.diffrn_detector_mar_data.histogram_max))
01240 
01241         /********************************************************************
01242          * MARIP_AXIS
01243          ********************************************************************/
01244 
01245         cbf_failnez (cbf_force_new_category (cif, "diffrn_detector_mar_axis"))
01246         cbf_failnez (cbf_new_column   (cif, "mar_id"))
01247 
01248         for ( i=0; i<=AXIS_DISTANCE; i++ ) {
01249                 cbf_failnez (cbf_set_value    (cif, hcif.mar_id ))
01250                 if ( i==AXIS_DISTANCE ) break;
01251                 cbf_failnez (cbf_new_row      (cif))
01252         }
01253 
01254         cbf_failnez (cbf_new_column   (cif, "axis_id"))
01255         cbf_failnez (cbf_rewind_row   (cif))
01256         for ( i=0; i<=AXIS_DISTANCE; i++ ) {
01257                 cbf_failnez (cbf_set_value    (cif, hcif.diffrn_detector_mar_axis[i].axis_id))
01258                 if ( i==AXIS_DISTANCE ) break;
01259                 cbf_failnez (cbf_next_row     (cif))
01260         }
01261 
01262         cbf_failnez (cbf_new_column   (cif, "angle_start"))
01263         cbf_failnez (cbf_rewind_row   (cif))
01264         for ( i=0; i<=AXIS_DISTANCE; i++ ) {
01265                 cbf_failnez (cbf_set_doublevalue (cif, "%.3f", hcif.diffrn_detector_mar_axis[i].angle_start))
01266                 if ( i==AXIS_DISTANCE ) break;
01267                 cbf_failnez (cbf_next_row     (cif))
01268         }
01269 
01270         cbf_failnez (cbf_new_column   (cif, "angle_end"))
01271         cbf_failnez (cbf_rewind_row   (cif))
01272         for ( i=0; i<=AXIS_DISTANCE; i++ ) {
01273                 cbf_failnez (cbf_set_doublevalue (cif, "%.3f", hcif.diffrn_detector_mar_axis[i].angle_end))
01274                 if ( i==AXIS_DISTANCE ) break;
01275                 cbf_failnez (cbf_next_row     (cif))
01276         }
01277 
01278         cbf_failnez (cbf_new_column   (cif, "angle_increment"))
01279         cbf_failnez (cbf_rewind_row   (cif))
01280         for ( i=0; i<=AXIS_DISTANCE; i++ ) {
01281                 cbf_failnez (cbf_set_doublevalue (cif, "%.3f", hcif.diffrn_detector_mar_axis[i].angle_increment))
01282                 if ( i==AXIS_DISTANCE ) break;
01283                 cbf_failnez (cbf_next_row     (cif))
01284         }
01285 
01286         cbf_failnez (cbf_new_column   (cif, "oscillations"))
01287         cbf_failnez (cbf_rewind_row   (cif))
01288         for ( i=0; i<=AXIS_DISTANCE; i++ ) {
01289                 cbf_failnez (cbf_set_integervalue (cif, hcif.diffrn_detector_mar_axis[i].oscillations))
01290                 if ( i==AXIS_DISTANCE ) break;
01291                 cbf_failnez (cbf_next_row     (cif))
01292         }
01293 
01294         cbf_failnez (cbf_new_column   (cif, "displacement"))
01295         cbf_failnez (cbf_rewind_row   (cif))
01296         for ( i=0; i<=AXIS_DISTANCE; i++ ) {
01297                 cbf_failnez (cbf_set_doublevalue (cif, "%.3f", hcif.diffrn_detector_mar_axis[i].displacement))
01298                 if ( i==AXIS_DISTANCE ) break;
01299                 cbf_failnez (cbf_next_row     (cif))
01300         }
01301 
01302         /********************************************************************
01303          * DIFFRN_FRAME_DATA
01304          ********************************************************************/
01305 
01306         cbf_failnez (cbf_force_new_category (cif, "diffrn_frame_data"))
01307         cbf_failnez (cbf_new_column   (cif, "id"))
01308         cbf_failnez (cbf_set_value    (cif, hcif.frame_id ))
01309         cbf_failnez (cbf_new_column   (cif, "detector_element_id"))
01310         cbf_failnez (cbf_set_value    (cif, hcif.element_id ))
01311         cbf_failnez (cbf_new_column   (cif, "array_id"))
01312         cbf_failnez (cbf_set_value    (cif, hcif.array_id ))
01313         cbf_failnez (cbf_new_column   (cif, "binary_id"))
01314         cbf_failnez (cbf_set_integervalue (cif, hcif.binary_id))
01315 
01316         /********************************************************************
01317          * DIFFRN_SCAN
01318          ********************************************************************/
01319 
01320         cbf_failnez (cbf_force_new_category (cif, "diffrn_scan"))
01321         cbf_failnez (cbf_new_column   (cif, "scan_id"))
01322         cbf_failnez (cbf_set_value    (cif, hcif.scan_id ))
01323         cbf_failnez (cbf_new_column   (cif, "frame_id_start"))
01324         cbf_failnez (cbf_set_value    (cif, hcif.diffrn_scan.frame_id_start))
01325         cbf_failnez (cbf_new_column   (cif, "frame_id_end"))
01326         cbf_failnez (cbf_set_value    (cif, hcif.diffrn_scan.frame_id_end))
01327         cbf_failnez (cbf_new_column   (cif, "frames"))
01328         cbf_failnez (cbf_set_integervalue (cif, hcif.diffrn_scan.frames))
01329 
01330         /********************************************************************
01331          * AXIS
01332          ********************************************************************/
01333 
01334         if ( !PRINT_AXIS ) goto CIF_DIFFRN_SCAN_AXIS;
01335 
01336         cbf_failnez (cbf_force_new_category (cif, "axis"))
01337 
01338         cbf_failnez (cbf_new_column   (cif, "id"))
01339         cbf_failnez (cbf_set_value    (cif, "phi" ))
01340         cbf_failnez (cbf_new_row      (cif))
01341         cbf_failnez (cbf_set_value    (cif, "chi" ))
01342         cbf_failnez (cbf_new_row      (cif))
01343         cbf_failnez (cbf_set_value    (cif, "omega" ))
01344         cbf_failnez (cbf_new_row      (cif))
01345         cbf_failnez (cbf_set_value    (cif, "twotheta" ))
01346         cbf_failnez (cbf_new_row      (cif))
01347         cbf_failnez (cbf_set_value    (cif, "distance" ))
01348 
01349         cbf_failnez (cbf_new_column   (cif, "type"))
01350         cbf_failnez (cbf_rewind_row   (cif))
01351         cbf_failnez (cbf_set_value    (cif, "rotation" ))
01352         cbf_failnez (cbf_next_row     (cif))
01353         cbf_failnez (cbf_set_value    (cif, "rotation" ))
01354         cbf_failnez (cbf_next_row     (cif))
01355         cbf_failnez (cbf_set_value    (cif, "rotation" ))
01356         cbf_failnez (cbf_next_row     (cif))
01357         cbf_failnez (cbf_set_value    (cif, "rotation" ))
01358         cbf_failnez (cbf_next_row     (cif))
01359         cbf_failnez (cbf_set_value    (cif, "translation" ))
01360 
01361         cbf_failnez (cbf_new_column   (cif, "equipment"))
01362         cbf_failnez (cbf_rewind_row   (cif))
01363         cbf_failnez (cbf_set_value    (cif, "detector" ))
01364         cbf_failnez (cbf_next_row     (cif))
01365         cbf_failnez (cbf_set_value    (cif, "detector" ))
01366         cbf_failnez (cbf_next_row     (cif))
01367         cbf_failnez (cbf_set_value    (cif, "detector" ))
01368         cbf_failnez (cbf_next_row     (cif))
01369         cbf_failnez (cbf_set_value    (cif, "detector" ))
01370         cbf_failnez (cbf_next_row     (cif))
01371         cbf_failnez (cbf_set_value    (cif, "detector" ))
01372 
01373         cbf_failnez (cbf_new_column   (cif, "vector[1]"))
01374         cbf_failnez (cbf_rewind_row   (cif))
01375         cbf_failnez (cbf_set_doublevalue (cif, "%.0f", 1.0))
01376         cbf_failnez (cbf_next_row   (cif))
01377         cbf_failnez (cbf_set_doublevalue (cif, "%.0f", 0.0))
01378         cbf_failnez (cbf_next_row   (cif))
01379         cbf_failnez (cbf_set_doublevalue (cif, "%.0f", 0.0))
01380         cbf_failnez (cbf_next_row   (cif))
01381         cbf_failnez (cbf_set_doublevalue (cif, "%.0f", 1.0))
01382         cbf_failnez (cbf_next_row   (cif))
01383         cbf_failnez (cbf_set_doublevalue (cif, "%.0f", 0.0))
01384 
01385         cbf_failnez (cbf_new_column   (cif, "vector[2]"))
01386         cbf_failnez (cbf_rewind_row   (cif))
01387         cbf_failnez (cbf_set_doublevalue (cif, "%.0f", 0.0))
01388         cbf_failnez (cbf_next_row   (cif))
01389         cbf_failnez (cbf_set_doublevalue (cif, "%.0f", 1.0))
01390         cbf_failnez (cbf_next_row   (cif))
01391         cbf_failnez (cbf_set_doublevalue (cif, "%.0f", 0.0))
01392         cbf_failnez (cbf_next_row   (cif))
01393         cbf_failnez (cbf_set_doublevalue (cif, "%.0f", 0.0))
01394         cbf_failnez (cbf_next_row   (cif))
01395         cbf_failnez (cbf_set_doublevalue (cif, "%.0f", 0.0))
01396 
01397         cbf_failnez (cbf_new_column   (cif, "vector[3]"))
01398         cbf_failnez (cbf_rewind_row   (cif))
01399         cbf_failnez (cbf_set_doublevalue (cif, "%.0f", 0.0))
01400         cbf_failnez (cbf_next_row   (cif))
01401         cbf_failnez (cbf_set_doublevalue (cif, "%.0f", 0.0))
01402         cbf_failnez (cbf_next_row   (cif))
01403         cbf_failnez (cbf_set_doublevalue (cif, "%.0f", 1.0))
01404         cbf_failnez (cbf_next_row   (cif))
01405         cbf_failnez (cbf_set_doublevalue (cif, "%.0f", 0.0))
01406         cbf_failnez (cbf_next_row   (cif))
01407         cbf_failnez (cbf_set_doublevalue (cif, "%.0f", -1.0))
01408 
01409         cbf_failnez (cbf_new_column   (cif, "offset[1]"))
01410         cbf_failnez (cbf_rewind_row   (cif))
01411         for (i=0;i<=AXIS_DISTANCE;i++) {
01412                 cbf_failnez (cbf_set_doublevalue (cif, "%.0f", 0.0))
01413                 if ( i==AXIS_DISTANCE ) break;
01414                 cbf_failnez (cbf_next_row   (cif))
01415         }
01416 
01417         cbf_failnez (cbf_new_column   (cif, "offset[2]"))
01418         cbf_failnez (cbf_rewind_row   (cif))
01419         for (i=0;i<=AXIS_DISTANCE;i++) {
01420                 cbf_failnez (cbf_set_doublevalue (cif, "%.0f", 0.0))
01421                 if ( i==AXIS_DISTANCE ) break;
01422                 cbf_failnez (cbf_next_row   (cif))
01423         }
01424 
01425         cbf_failnez (cbf_new_column   (cif, "offset[3]"))
01426         cbf_failnez (cbf_rewind_row   (cif))
01427         for (i=0;i<=AXIS_DISTANCE;i++) {
01428                 cbf_failnez (cbf_set_doublevalue (cif, "%.0f", 0.0))
01429                 if ( i==AXIS_DISTANCE ) break;
01430                 cbf_failnez (cbf_next_row   (cif))
01431         }
01432 
01433         /********************************************************************
01434          * DIFFRN_SCAN_AXIS
01435          ********************************************************************/
01436 CIF_DIFFRN_SCAN_AXIS:
01437         cbf_failnez (cbf_force_new_category (cif, "diffrn_scan_axis"))
01438         cbf_failnez (cbf_new_column   (cif, "scan_id"))
01439         cbf_failnez (cbf_set_value    (cif, hcif.scan_id ))
01440         cbf_failnez (cbf_new_column   (cif, "axis_id"))
01441         cbf_failnez (cbf_set_value    (cif, hcif.diffrn_scan_axis[AXIS_PHI].axis_id))
01442         cbf_failnez (cbf_new_column   (cif, "angle_start"))
01443         cbf_failnez (cbf_set_doublevalue (cif, "%.3f", hcif.diffrn_scan_axis[AXIS_PHI].angle_start))
01444         cbf_failnez (cbf_new_column   (cif, "angle_increment"))
01445         cbf_failnez (cbf_set_doublevalue (cif, "%.3f", hcif.diffrn_scan_axis[AXIS_PHI].angle_increment))
01446 
01447         /********************************************************************
01448          * DIFFRN_SCAN_FRAME
01449          ********************************************************************/
01450 
01451         cbf_failnez (cbf_force_new_category (cif, "diffrn_scan_frame"))
01452         cbf_failnez (cbf_new_column   (cif, "scan_id"))
01453         cbf_failnez (cbf_set_value    (cif, hcif.scan_id ))
01454         cbf_failnez (cbf_new_column   (cif, "frame_id"))
01455         cbf_failnez (cbf_set_value    (cif, hcif.frame_id ))
01456 
01457         /********************************************************************
01458          * DIFFRN_SCAN_FRAME_AXIS
01459          ********************************************************************/
01460 
01461         cbf_failnez (cbf_force_new_category (cif, "diffrn_scan_frame_axis"))
01462 
01463         cbf_failnez (cbf_new_column   (cif, "frame_id"))
01464         for ( i=0; i<=AXIS_DISTANCE; i++ ) {
01465                 cbf_failnez (cbf_set_value    (cif, hcif.frame_id ))
01466                 if ( i==AXIS_DISTANCE ) break;
01467                 cbf_failnez (cbf_new_row      (cif))
01468         }
01469 
01470         cbf_failnez (cbf_new_column   (cif, "axis_id"))
01471         cbf_failnez (cbf_rewind_row   (cif))
01472         for ( i=0; i<=AXIS_DISTANCE; i++ ) {
01473                 cbf_failnez (cbf_set_value    (cif, hcif.diffrn_scan_frame_axis[i].axis_id))
01474                 if ( i==AXIS_DISTANCE ) break;
01475                 cbf_failnez (cbf_next_row     (cif))
01476         }
01477 
01478         cbf_failnez (cbf_new_column   (cif, "angle"))
01479         cbf_failnez (cbf_rewind_row   (cif))
01480         for ( i=0; i<=AXIS_DISTANCE; i++ ) {
01481                 cbf_failnez (cbf_set_doublevalue (cif, "%.3f", hcif.diffrn_scan_frame_axis[i].angle))
01482                 if ( i==AXIS_DISTANCE ) break;
01483                 cbf_failnez (cbf_next_row     (cif))
01484         }
01485 
01486         cbf_failnez (cbf_new_column   (cif, "displacement"))
01487         cbf_failnez (cbf_rewind_row   (cif))
01488         for ( i=0; i<=AXIS_DISTANCE; i++ ) {
01489                 cbf_failnez (cbf_set_doublevalue (cif, "%.3f", hcif.diffrn_scan_frame_axis[i].displacement))
01490                 if ( i==AXIS_DISTANCE ) break;
01491                 cbf_failnez (cbf_next_row     (cif))
01492         }
01493 
01494         /********************************************************************
01495          * ARRAY_STRUCTURE
01496          ********************************************************************/
01497 
01498         cbf_failnez (cbf_force_new_category (cif, "array_structure"))
01499         cbf_failnez (cbf_new_column   (cif, "array_id"))
01500         cbf_failnez (cbf_set_value    (cif, hcif.array_id ))
01501 
01502         /********************************************************************
01503          * ARRAY_INTENSITIES
01504          ********************************************************************/
01505 
01506         cbf_failnez (cbf_force_new_category (cif, "array_intensities"))
01507         cbf_failnez (cbf_new_column   (cif, "array_id"))
01508         cbf_failnez (cbf_set_value    (cif, hcif.array_id ))
01509         cbf_failnez (cbf_new_column   (cif, "binary_id"))
01510         cbf_failnez (cbf_set_integervalue (cif, hcif.binary_id))
01511         cbf_failnez (cbf_new_column   (cif, "linearity"))
01512         cbf_failnez (cbf_set_value    (cif, hcif.array_intensities.linearity))
01513         cbf_failnez (cbf_new_column   (cif, "undefined_value"))
01514         cbf_failnez (cbf_set_doublevalue (cif, "%.0f", hcif.array_intensities.undefined_value))
01515         cbf_failnez (cbf_new_column   (cif, "overload"))
01516         cbf_failnez (cbf_set_doublevalue (cif, "%.0f", hcif.array_intensities.overload))
01517         cbf_failnez (cbf_new_column   (cif, "scaling"))
01518         cbf_failnez (cbf_set_doublevalue (cif, "%.3f", hcif.array_intensities.scaling))
01519         cbf_failnez (cbf_new_column   (cif, "gain"))
01520         cbf_failnez (cbf_set_doublevalue (cif, "%.3f", hcif.array_intensities.gain))
01521 
01522         /********************************************************************
01523          * ARRAY_STRUCTURE_LIST
01524          ********************************************************************/
01525 
01526         cbf_failnez (cbf_force_new_category (cif, "array_structure_list"))
01527 
01528         cbf_failnez (cbf_new_column   (cif, "array_id"))
01529         for ( i=0; i<2; i++ ) {
01530                 cbf_failnez (cbf_set_value    (cif, hcif.array_id ))
01531                 if ( i==1) break;
01532                 cbf_failnez (cbf_new_row      (cif))
01533         }
01534 
01535         cbf_failnez (cbf_new_column   (cif, "index"))
01536         cbf_failnez (cbf_rewind_row   (cif))
01537         for ( i=0; i<2; i++ ) {
01538                 cbf_failnez (cbf_set_integervalue (cif, hcif.array_structure_list[i].index))
01539                 if ( i==1) break;
01540                 cbf_failnez (cbf_next_row     (cif))
01541         }
01542 
01543         cbf_failnez (cbf_new_column   (cif, "dimension"))
01544         cbf_failnez (cbf_rewind_row   (cif))
01545         for ( i=0; i<2; i++ ) {
01546                 cbf_failnez (cbf_set_integervalue (cif, hcif.array_structure_list[i].dimension))
01547                 if ( i==1) break;
01548                 cbf_failnez (cbf_next_row     (cif))
01549         }
01550 
01551         cbf_failnez (cbf_new_column   (cif, "precedence"))
01552         cbf_failnez (cbf_rewind_row   (cif))
01553         for ( i=0; i<2; i++ ) {
01554                 cbf_failnez (cbf_set_integervalue (cif, hcif.array_structure_list[i].precedence))
01555                 if ( i==1) break;
01556                 cbf_failnez (cbf_next_row     (cif))
01557         }
01558 
01559         cbf_failnez (cbf_new_column   (cif, "direction"))
01560         cbf_failnez (cbf_rewind_row   (cif))
01561         for ( i=0; i<2; i++ ) {
01562                 cbf_failnez (cbf_set_value (cif, hcif.array_structure_list[i].direction))
01563                 if ( i==1) break;
01564                 cbf_failnez (cbf_next_row     (cif))
01565         }
01566 
01567         /********************************************************************
01568          * ARRAY_ELEMENT_SIZE
01569          ********************************************************************/
01570 
01571         cbf_failnez (cbf_force_new_category (cif, "array_element_size"))
01572 
01573         cbf_failnez (cbf_new_column   (cif, "array_id"))
01574         for ( i=0; i<2; i++ ) {
01575                 cbf_failnez (cbf_set_value    (cif, hcif.array_id ))
01576                 if ( i==1) break;
01577                 cbf_failnez (cbf_new_row      (cif))
01578         }
01579 
01580         cbf_failnez (cbf_new_column   (cif, "index"))
01581         cbf_failnez (cbf_rewind_row   (cif))
01582         for ( i=0; i<2; i++ ) {
01583                 cbf_failnez (cbf_set_integervalue (cif, hcif.array_element_size.index[i]))
01584                 if ( i==1) break;
01585                 cbf_failnez (cbf_next_row     (cif))
01586         }
01587 
01588         cbf_failnez (cbf_new_column   (cif, "size"))
01589         cbf_failnez (cbf_rewind_row   (cif))
01590         for ( i=0; i<2; i++ ) {
01591                 cbf_failnez (cbf_set_doublevalue (cif, "%1.4e", hcif.array_element_size.pixelsize[i]))
01592                 if ( i==1) break;
01593                 cbf_failnez (cbf_next_row     (cif))
01594         }
01595 
01596         /********************************************************************
01597          * ARRAY_DATA
01598          ********************************************************************/
01599 
01600         cbf_failnez (cbf_force_new_category     (cif, "array_data"))
01601         cbf_failnez (cbf_new_column       (cif, "array_id"))
01602         cbf_failnez (cbf_set_value        (cif, "image_1"))
01603         cbf_failnez (cbf_new_column       (cif, "binary_id"))
01604         cbf_failnez (cbf_set_integervalue (cif, hcif.binary_id))
01605         cbf_failnez (cbf_new_column       (cif, "data"))
01606 
01607         return 1;
01608 }
01609 
01610 /******************************************************************
01611  * Function: mar3452CIFHeader
01612  ******************************************************************/
01613 void mar3452CIFHeader(char *prg, char *f, MAR345_HEADER h345)
01614 {
01615 char    *c,str[64],num[16];
01616 int     i;
01617 float   pixelsize;
01618 time_t  now;
01619 
01620         time( &now );
01621 
01622         /* Initialize CIF Header */
01623         memset( (char *)&hcif, 0, sizeof(CIF_HEADER) );
01624 
01625         pixelsize = h345.pixel_height;
01626         if ( pixelsize > 1.0 ) pixelsize /= 1000.;
01627 
01628         hcif.binary_id                                  = 1;
01629 
01630         strcpy(hcif.entry_id,                           "img1");
01631         strcpy(hcif.scan_id,                            "scan1");
01632         strcpy(hcif.array_id,                           "img1");
01633         strcpy(hcif.crystal_id,                         "xtal1");
01634         sprintf(str, "SN_%03d",h345.scanner);
01635         strcpy(hcif.element_id,                         str);
01636         strcpy(hcif.mar_id,                             str);
01637         strcpy(hcif.diffrn_id,                          "diffrn1");
01638         strcpy(hcif.data_id,                            "data1");
01639         strcpy(hcif.detector_id,                        "mar345");
01640         strcpy(hcif.frame_id,                           "frm1");
01641 
01642         sprintf(str, "%s",(char *)ctime( &now ) );
01643         str[ strlen( str ) -1 ] = '\0';
01644         if ( strlen( h345.date ) > 5 ) 
01645         strcpy(hcif.audit.creation_date,                h345.date);
01646         else
01647         strcpy(hcif.audit.creation_date,                str);
01648         
01649         sprintf(str, "Created by %s",                   prg);
01650         strcpy(hcif.audit.creation_method,              str);
01651 
01652         strcpy(hcif.diffrn_radiation.detector,          "Image Plate");
01653         strcpy(hcif.diffrn_radiation.collimation,       "double slits");
01654         strcpy(hcif.diffrn_radiation.monochromator,     h345.filter);
01655         hcif.diffrn_radiation_wavelength.polarisn_ratio = h345.polar;
01656         hcif.diffrn_radiation_wavelength.polarisn_norm  = 0.0;
01657         hcif.diffrn_radiation_wavelength.wavelength     = h345.wave;
01658         hcif.diffrn_radiation_wavelength.wavelength_wt  = 1.0;
01659 
01660         if ( strlen( h345.source ) )    
01661         strcpy(hcif.diffrn_source.source,               h345.source);
01662         else
01663         strcpy(hcif.diffrn_source.source,               "unknown");
01664         strcpy(hcif.diffrn_source.type,                 "unknown");
01665         hcif.diffrn_source.current                      = h345.mA;
01666         hcif.diffrn_source.voltage                      = h345.kV;
01667         hcif.diffrn_source.power                        = h345.kV*h345.mA;
01668 
01669         strcpy(hcif.array_structure.compression_type,   "x-CBF_PACKED");
01670         strcpy(hcif.array_structure.encoding_type,      "unsigned 32-bit integer");
01671         strcpy(hcif.array_structure.byte_order,         "little_endian");
01672 
01673         hcif.array_structure_list[0].dimension          = h345.size;
01674         hcif.array_structure_list[1].dimension          = h345.size;
01675         hcif.array_structure_list[0].index              = 1;
01676         hcif.array_structure_list[1].index              = 2;
01677         hcif.array_structure_list[0].precedence         = 2;
01678         hcif.array_structure_list[1].precedence         = 1;
01679         strcpy(hcif.array_structure_list[0].direction,  "increasing");
01680         strcpy(hcif.array_structure_list[1].direction,  "increasing");
01681 
01682         hcif.array_element_size.pixelsize[0]            = pixelsize/1000.;
01683         hcif.array_element_size.pixelsize[1]            = pixelsize/1000.;
01684         hcif.array_element_size.index[0]                = 1;
01685         hcif.array_element_size.index[1]                = 2;
01686 
01687         hcif.array_intensities.gain                     = h345.gain;
01688         hcif.array_intensities.overload                 = 250000;
01689         hcif.array_intensities.undefined_value          = 999999;
01690         strcpy(hcif.array_intensities.linearity,        "linear");
01691         hcif.array_intensities.offset                   = 0;
01692         hcif.array_intensities.scaling                  = h345.multiplier;
01693 
01694         strcpy(hcif.axis[AXIS_PHI].id,                  "phi" );
01695         strcpy(hcif.axis[AXIS_PHI].type,                "rotation" );
01696         strcpy(hcif.axis[AXIS_PHI].equipment,           "detector" );
01697         strcpy(hcif.axis[AXIS_PHI].depends_on,          "." );
01698         hcif.axis[AXIS_PHI].vector[0]                   = 1.0;
01699         hcif.axis[AXIS_PHI].vector[1]                   = 0.0;
01700         hcif.axis[AXIS_PHI].vector[2]                   = 0.0;
01701 
01702         strcpy(hcif.axis[AXIS_OMEGA].id,                "omega" );
01703         strcpy(hcif.axis[AXIS_OMEGA].type,              "rotation" );
01704         strcpy(hcif.axis[AXIS_OMEGA].equipment,         "detector" );
01705         strcpy(hcif.axis[AXIS_OMEGA].depends_on,        "." );
01706         hcif.axis[AXIS_OMEGA].vector[0]                 = 0.0;
01707         hcif.axis[AXIS_OMEGA].vector[1]                 = 1.0;
01708         hcif.axis[AXIS_OMEGA].vector[2]                 = 0.0;
01709 
01710         strcpy(hcif.axis[AXIS_CHI].id,                  "chi" );
01711         strcpy(hcif.axis[AXIS_CHI].type,                "rotation" );
01712         strcpy(hcif.axis[AXIS_CHI].equipment,           "detector" );
01713         strcpy(hcif.axis[AXIS_CHI].depends_on,          "." );
01714         hcif.axis[AXIS_CHI].vector[0]                   = 0.0;
01715         hcif.axis[AXIS_CHI].vector[1]                   = 0.0;
01716         hcif.axis[AXIS_CHI].vector[2]                   = 1.0;
01717 
01718         strcpy(hcif.axis[AXIS_THETA].id,                "twotheta" );
01719         strcpy(hcif.axis[AXIS_THETA].type,              "rotation" );
01720         strcpy(hcif.axis[AXIS_THETA].equipment,         "detector" );
01721         strcpy(hcif.axis[AXIS_THETA].depends_on,        "." );
01722         hcif.axis[AXIS_THETA].vector[0]                 = 1.0;
01723         hcif.axis[AXIS_THETA].vector[1]                 = 0.0;
01724         hcif.axis[AXIS_THETA].vector[2]                 = 0.0;
01725 
01726         strcpy(hcif.axis[AXIS_DISTANCE].id,             "distance" );
01727         strcpy(hcif.axis[AXIS_DISTANCE].type,           "translation" );
01728         strcpy(hcif.axis[AXIS_DISTANCE].equipment,      "detector" );
01729         strcpy(hcif.axis[AXIS_DISTANCE].depends_on,     "." );
01730         hcif.axis[AXIS_DISTANCE].vector[0]              = 0.0;
01731         hcif.axis[AXIS_DISTANCE].vector[1]              = 0.0;
01732         hcif.axis[AXIS_DISTANCE].vector[2]              = -1.0;
01733 
01734         strcpy(hcif.diffrn_detector.detector,           "Image Plate" );
01735         strcpy(hcif.diffrn_detector.type,               "mar345 IP system" );
01736 
01737         hcif.diffrn_detector_element.center_x           = h345.xcen*pixelsize;
01738         hcif.diffrn_detector_element.center_y           = h345.ycen*pixelsize;
01739 
01740         /* marresearch extensions */
01741         if ( h345.mode == 0 )
01742                 strcpy(hcif.diffrn_detector_mar_exposure.type,  "dose");
01743         else
01744                 strcpy(hcif.diffrn_detector_mar_exposure.type,  "time");
01745         hcif.diffrn_detector_mar_exposure.time                          = h345.time;
01746         hcif.diffrn_detector_mar_exposure.dose                          = h345.doseavg;
01747 
01748         for (i=0; i<=AXIS_DISTANCE; i++ ) {
01749                 hcif.diffrn_detector_mar_axis[i].angle_start    = 
01750                 hcif.diffrn_detector_mar_axis[i].angle_end      = 
01751                 hcif.diffrn_detector_mar_axis[i].angle_increment= 
01752                 hcif.diffrn_detector_mar_axis[i].displacement   = 0.0; 
01753         }
01754 
01755         hcif.diffrn_detector_mar_axis[AXIS_PHI].angle_start             = h345.phibeg;
01756         hcif.diffrn_detector_mar_axis[AXIS_PHI].angle_end               = h345.phiend;
01757         hcif.diffrn_detector_mar_axis[AXIS_OMEGA].angle_start           = h345.omebeg;
01758         hcif.diffrn_detector_mar_axis[AXIS_OMEGA].angle_end             = h345.omeend;
01759         hcif.diffrn_detector_mar_axis[AXIS_CHI].angle_start             = h345.chi;
01760         hcif.diffrn_detector_mar_axis[AXIS_CHI].angle_end               = h345.chi;
01761         hcif.diffrn_detector_mar_axis[AXIS_THETA].angle_end             = h345.theta;
01762         hcif.diffrn_detector_mar_axis[AXIS_THETA].angle_start           = h345.theta;
01763         hcif.diffrn_detector_mar_axis[AXIS_OMEGA].oscillations          = h345.omeosc;
01764         hcif.diffrn_detector_mar_axis[AXIS_PHI  ].oscillations          = h345.phiosc;
01765 
01766         hcif.diffrn_detector_mar_axis[AXIS_DISTANCE].angle_start        = 0.0;
01767         hcif.diffrn_detector_mar_axis[AXIS_DISTANCE].angle_end          = 0.0;
01768         hcif.diffrn_detector_mar_axis[AXIS_DISTANCE].displacement       = h345.dist;
01769 
01770         for (i=0; i<=AXIS_DISTANCE; i++ ) {
01771                 strcpy( hcif.diffrn_detector_mar_axis[i].axis_id,       hcif.axis[i].id);
01772                 hcif.diffrn_detector_mar_axis[i].angle_increment        = hcif.diffrn_detector_mar_axis[i].angle_end -
01773                                                                           hcif.diffrn_detector_mar_axis[i].angle_start;\
01774         }
01775 
01776         hcif.diffrn_detector_mar_exposure_dose.start                    = h345.dosebeg;
01777         hcif.diffrn_detector_mar_exposure_dose.end                      = h345.doseend;
01778         hcif.diffrn_detector_mar_exposure_dose.min                      = h345.dosemin;
01779         hcif.diffrn_detector_mar_exposure_dose.max                      = h345.dosemax;
01780         hcif.diffrn_detector_mar_exposure_dose.avg                      = h345.doseavg;
01781         hcif.diffrn_detector_mar_exposure_dose.esd                      = h345.dosesig;
01782         hcif.diffrn_detector_mar_exposure_dose.measurements             = h345.dosen;
01783 
01784         hcif.diffrn_detector_mar_adc.channel_a                          = h345.adc_A;
01785         hcif.diffrn_detector_mar_adc.channel_b                          = h345.adc_B;
01786         hcif.diffrn_detector_mar_adc.add_channel_a                      = h345.add_A;
01787         hcif.diffrn_detector_mar_adc.add_channel_b                      = h345.add_B;
01788         hcif.diffrn_detector_mar_adc.gain                               = h345.gain;
01789         hcif.diffrn_detector_mar_adc.multiplier                         = h345.multiplier;
01790         if ( h345.pixel_height == 100.f || h345.pixel_height == 0.1f )
01791                 hcif.diffrn_detector_mar_adc.oversampling               = 1;
01792         else
01793                 hcif.diffrn_detector_mar_adc.oversampling               = 2;
01794 
01795         hcif.diffrn_detector_mar_scan.scanmode                          = h345.size;
01796         hcif.diffrn_detector_mar_scan.number_of_pixels                  = h345.pixels;
01797         hcif.diffrn_detector_mar_scan.number_of_pixels_larger_16_bit    = h345.high;
01798         hcif.diffrn_detector_mar_scan.radial_offset                     = h345.roff;
01799         hcif.diffrn_detector_mar_scan.tangential_offset                 = h345.toff;
01800         hcif.diffrn_detector_mar_scan.pixel_height                      = h345.pixel_height;
01801         hcif.diffrn_detector_mar_scan.pixel_length                      = h345.pixel_length;
01802 
01803         hcif.diffrn_detector_mar_data.intensity_min                     = h345.valmin;
01804         hcif.diffrn_detector_mar_data.intensity_max                     = h345.valmax;
01805         hcif.diffrn_detector_mar_data.intensity_avg                     = h345.valavg;
01806         hcif.diffrn_detector_mar_data.intensity_esd                     = h345.valsig;
01807         hcif.diffrn_detector_mar_data.histogram_start                   = h345.histbeg;
01808         hcif.diffrn_detector_mar_data.histogram_end                     = h345.histend;
01809         hcif.diffrn_detector_mar_data.histogram_max                     = h345.histmax;
01810 
01811         for ( i=0; i<8; i++ )
01812                 hcif.diffrn_detector_mar_gaps.gap[i]                    = h345.gap[i];
01813 
01814         /* From the entire file name path, cut off directory */
01815         c = strrchr( f, '/' );
01816         if ( c == NULL ) 
01817                 c = f;
01818         else    
01819                 c++;
01820 
01821         /* From the remaining filename root + extension, cut off extension */
01822         strcpy( str, c);
01823         c = strrchr ( str, '.' );
01824         if ( c!=NULL ) {
01825                 i=strlen( c );
01826                 str[ strlen(str) - i ] = '\0';
01827         }
01828         strcpy( hcif.diffrn_scan.frame_id_start,        str);
01829         strcpy( hcif.diffrn_scan.frame_id_end,          str);
01830 
01831         for (i=strlen(str)-1;i>=0; i--) {
01832                 if ( str[i] == '_' ) {
01833                         str[i] = '\0';
01834                         break;
01835                 }
01836         }
01837         strcpy(hcif.crystal_id,                         str);
01838         hcif.diffrn_scan.frames                         = 1;
01839 
01840         strcpy(hcif.diffrn_measurement.device,          "oscillation camera");
01841         strcpy(hcif.diffrn_measurement.device_type,     "mar detector");
01842         strcpy(hcif.diffrn_measurement.method,          "phi scan");
01843         hcif.diffrn_measurement.sample_detector_distance = h345.dist;
01844         hcif.diffrn_measurement.number_of_axes          = 1;
01845 
01846         strcpy(hcif.diffrn_scan_axis[AXIS_PHI].axis_id, "phi" );
01847         hcif.diffrn_scan_axis[AXIS_PHI].angle_start     = h345.phibeg;
01848         hcif.diffrn_scan_axis[AXIS_PHI].angle_range     = h345.phiend-h345.phibeg;
01849         hcif.diffrn_scan_axis[AXIS_PHI].angle_increment = h345.phiend-h345.phibeg;
01850 
01851         strcpy(hcif.diffrn_scan_axis[AXIS_OMEGA].axis_id,"omega" );
01852         hcif.diffrn_scan_axis[AXIS_OMEGA].angle_start   = h345.omebeg;
01853         hcif.diffrn_scan_axis[AXIS_OMEGA].angle_range   = h345.omeend-h345.omebeg;
01854         hcif.diffrn_scan_axis[AXIS_OMEGA].angle_increment= h345.omeend-h345.omebeg;
01855 
01856         strcpy(hcif.diffrn_scan_frame_axis[AXIS_PHI].axis_id,   "phi" );
01857         hcif.diffrn_scan_frame_axis[AXIS_PHI].angle             = h345.phiend;
01858         hcif.diffrn_scan_frame_axis[AXIS_PHI].displacement      = 0.0;
01859 
01860         strcpy(hcif.diffrn_scan_frame_axis[AXIS_OMEGA].axis_id, "omega" );
01861         hcif.diffrn_scan_frame_axis[AXIS_OMEGA].angle           = h345.omeend;
01862         hcif.diffrn_scan_frame_axis[AXIS_OMEGA].displacement    = 0.0;
01863 
01864         strcpy(hcif.diffrn_scan_frame_axis[AXIS_CHI].axis_id,   "chi" );
01865         hcif.diffrn_scan_frame_axis[AXIS_CHI].angle             = h345.chi;
01866         hcif.diffrn_scan_frame_axis[AXIS_CHI].displacement      = 0.0;
01867 
01868         strcpy(hcif.diffrn_scan_frame_axis[AXIS_THETA].axis_id, "twotheta" );
01869         hcif.diffrn_scan_frame_axis[AXIS_THETA].angle           = h345.theta;
01870         hcif.diffrn_scan_frame_axis[AXIS_THETA].displacement    = 0.0;
01871 
01872         strcpy(hcif.diffrn_scan_frame_axis[AXIS_DISTANCE].axis_id,"distance" );
01873         hcif.diffrn_scan_frame_axis[AXIS_DISTANCE].angle        = 0.0;
01874         hcif.diffrn_scan_frame_axis[AXIS_DISTANCE].displacement = h345.dist;
01875 }
01876 
01877 /******************************************************************
01878  * Function: GetCIFData
01879  ******************************************************************/
01880 int GetCIFData  (char *prg, char *f, FILE *fp, unsigned int *i4_img)
01881 {
01882         cif_read = 0;
01883         cbf_failnez (cbf_rewind_datablock(cif))
01884         cbf_failnez (cbf_find_category          (cif, "array_data"))
01885         if ( cif_error ) {
01886                 printe("Cannot find category: array_data");
01887                 goto CIF_END;
01888         }
01889         cbf_failnez (cbf_find_column            (cif, "array_id"))
01890         cbf_failnez (cbf_find_row               (cif, hcif.array_id))
01891         cbf_failnez (cbf_find_column            (cif, "data"))
01892         cbf_failnez (cbf_get_integerarrayparameters(
01893                                 cif,
01894                                 &cif_compression,
01895                                 &cif_id,
01896                                 &cif_element_size,
01897                                 &cif_element_signed,
01898                                 &cif_element_unsigned,
01899                                 &cif_nelements,
01900                                 &cif_minelement,
01901                                 &cif_maxelement))
01902         if ( cif_error ) { 
01903                 printe("Cannot get data array parameters");
01904                 goto CIF_END;
01905         }
01906 
01907         cbf_failnez (cbf_get_integerarray (
01908                         cif, 
01909                         &cif_id, 
01910                         (void *)i4_img,
01911                         cif_element_size,
01912                         cif_element_signed,
01913                         cif_nelements,
01914                         &cif_read))
01915         if ( cif_error ) { 
01916                 printe("Cannot read data array");
01917                 goto CIF_END;
01918         }
01919 
01920 CIF_END:
01921         if ( verbose > 1 ) {
01922                 printf("\n");
01923                 printf("         Identifier   :\t %11d\n",cif_id);
01924                 printf("         Compression  :\t %11d\n",cif_compression);
01925                 printf("         Elements:    :\t %11d\n",cif_nelements);
01926                 printf("         Min. element :\t %11d\n",cif_minelement);
01927                 printf("         Max. element :\t %11d\n",cif_maxelement);
01928                 printf("         Element size :\t %11d\n",cif_element_size);
01929                 printf("         Signed       :\t %11d\n",cif_element_signed);
01930                 printf("         Unsigned     :\t %11d\n",cif_element_unsigned);
01931                 printf("         Elements read:\t %11d\n",cif_read);
01932         }
01933 
01934         /* Free the cbf */
01935         cbf_failnez (cbf_free_handle (cif))
01936 
01937         /* Input file has been closed my cbf_free_handle! */
01938         fp = NULL;
01939 
01940         return cif_read;
01941 }
01942 
01943 /******************************************************************
01944  * Function: PutCIFData
01945  ******************************************************************/
01946 int PutCIFData  (char *prg, char *op, char op_cbf, unsigned int *i4_img)
01947 {
01948 FILE    *fp             = NULL;
01949 int     success         = 0;
01950 int     mime            = MIME_HEADERS;
01951 int     digest          = MSG_DIGEST;
01952 int     encoding        = ENC_NONE;
01953 int     bytedir         = 0;
01954 int     cbforcif        = CBF;
01955 int     term            = ENC_CRTERM | ENC_LFTERM;
01956 
01957         if ( op_cbf == 1 ) {
01958                 cbforcif        = CBF;
01959                 encoding        = ENC_NONE;
01960                 term            = ENC_CRTERM | ENC_LFTERM;
01961         }
01962         else {
01963                 cbforcif        = CIF;
01964                 encoding        = ENC_BASE64;
01965                 term            = ENC_LFTERM;
01966         }
01967 
01968         cif_compression         = CBF_PACKED;
01969         cif_id                  = hcif.binary_id;
01970         cif_element_size        = sizeof(int);
01971         cif_element_signed      = 0;
01972         cif_nelements           = hcif.array_structure_list[0].dimension *
01973                                   hcif.array_structure_list[1].dimension;
01974 
01975         /* Save the binary data */
01976         cbf_failnez (cbf_set_integerarray (
01977                         cif, 
01978                         cif_compression, 
01979                         cif_id, 
01980                         (void *)i4_img,
01981                         cif_element_size,
01982                         cif_element_signed,
01983                         cif_nelements))
01984 
01985         fp = fopen (op, "w+b");
01986         if ( fp == NULL ) return 0;
01987 
01988         cbf_failnez (cbf_write_file (
01989                         cif, 
01990                         fp,
01991                         1,
01992                         cbforcif,
01993                         mime | digest,
01994                         encoding | bytedir | term))
01995         if ( !cif_error ) success = 1;
01996 
01997         /* Free the cbf */
01998         cbf_failnez (cbf_free_handle (cif))
01999 
02000         if ( verbose > 1 ) {
02001                 printf("\n");
02002                 printf("%s: CIF-Header values:\n",prg);
02003                 printf("         Pixels       :\t %d x %d\n",hcif.array_structure_list[0].dimension,hcif.array_structure_list[1].dimension);
02004                 printf("         Identifier   :\t %11d\n",cif_id);
02005                 printf("         Compression  :\t %11d\n",cif_compression);
02006                 printf("         Elements:    :\t %11d\n",cif_nelements);
02007                 printf("         Element size :\t %11d\n",cif_element_size);
02008                 printf("         Signed       :\t %11d\n",cif_element_signed);
02009         }
02010 
02011 
02012         return success;
02013 }