~ubuntu-branches/ubuntu/oneiric/gpp4/oneiric

« back to all changes in this revision

Viewing changes to src/cmtzlib.c

  • Committer: Bazaar Package Importer
  • Author(s): Morten Kjeldgaard
  • Date: 2011-01-11 13:47:36 UTC
  • mfrom: (1.1.4 upstream)
  • Revision ID: james.westby@ubuntu.com-20110111134736-2blfcoz9uoknpic7
Tags: 1.3.0-0ubuntu1
* New upstream release 1.3.0
* debian/control: Add ${misc:Depends}, bump standards-version
* Patched to address various compiler warnings.

Show diffs side-by-side

added added

removed removed

Lines of Context:
64
64
#define  CMTZERR_BadBatchHeader    22
65
65
#define  CMTZERR_DifferentVersion  23
66
66
#define  CMTZERR_ColTypeMismatch   24
 
67
#define  CMTZERR_ColGroupError     25
 
68
#define  CMTZERR_ColSourceError    26
 
69
 
67
70
 
68
71
MTZ *MtzGet(const char *logname, int read_refs)
69
72
 
80
83
  char crysin[MXTALS][65],projin[MXTALS][65],crystal[65],project[65];
81
84
  double cellin[MXTALS][6],cell[6];
82
85
  int jxtalin[MSETS];
83
 
  char mkey[4], keyarg[76], hdrrec[MTZRECORDLENGTH+1], label[30], type[3];
 
86
  char mkey[4], keyarg[76], hdrrec[MTZRECORDLENGTH+1], label[31], type[3];
84
87
  int i, j, hdrst, ntotcol, nref, ntotset=0, nbat, nhist=0, icolin;
85
88
  int ixtal, jxtal, iset, iiset, icset, nxtal=0, nset[MXTALS]={0}, isym=0;
86
89
  int indhigh[3],indlow[3],isort[5],ind_xtal,ind_set,ind_col[3],debug=0;
87
90
  float min,max,totcell[6],minres,maxres;
88
91
  float *refldata;
89
92
  double coefhkl[6];
 
93
  int k; long xmllen;
90
94
 
91
95
  jxtal = 0;
92
96
  nbat = 0;
107
111
  float *fltbuf = buf + NBATCHINTEGERS;
108
112
  MTZBAT *batch = NULL;
109
113
 
 
114
  /* known headers */
 
115
  char known_headers[][5] =
 
116
    { "PROJ","DATA","DCEL","DRES","DWAV","VERS","TITL","CELL",
 
117
      "SORT","SYMI","SYMM","COLU","VALM","RESO","COLS","COLG",
 
118
      "NCOL","NDIF","CRYS","MTZH","MTZB","BH" };
 
119
  int n_known_headers = sizeof(known_headers)/sizeof(known_headers[0]);
 
120
 
110
121
  if (debug) 
111
122
    printf(" Entering MtzGet \n");
112
123
 
183
194
  /* set reading integers */
184
195
  ccp4_file_setmode(filein,6);
185
196
  istat = ccp4_file_read(filein, (uint8 *) &hdrst, 1);
186
 
  if (debug) printf(" hdrst read as %d \n",hdrst);
 
197
  if (debug) printf(" istat=%d, hdrst read as %d \n",istat,hdrst);
 
198
 
 
199
  if (istat == EOF) {
 
200
    ccp4_signal(CCP4_ERRLEVEL(3) | CMTZ_ERRNO(CMTZERR_ReadFail),"MtzGet",NULL);
 
201
    ccp4_parse_end(parser);
 
202
    ccp4_file_close(filein);
 
203
    free(filename);
 
204
    return NULL;
 
205
  }
187
206
 
188
207
  /* 1st Pass: Read ntotcol, nref, nbat and dataset info.  
189
208
     nxtal and nset are used to assign memory for MTZ structure.
554
573
      mtz->mtzsymm.spcgrp = (int) token[4].value;
555
574
      strcpy(mtz->mtzsymm.spcgrpname,token[5].fullstring);
556
575
      strcpy(mtz->mtzsymm.pgname,token[6].fullstring);
557
 
       }
 
576
      if (ntok > 7) {
 
577
        mtz->mtzsymm.spg_confidence = token[7].fullstring[0];
 
578
      } else {
 
579
        mtz->mtzsymm.spg_confidence = 'X';
 
580
      }
 
581
    }
558
582
    else if (strncmp (mkey, "SYMM",4) == 0) {
559
583
      symop_to_mat4(hdrrec+4,hdrrec+MTZRECORDLENGTH,mtz->mtzsymm.sym[isym++][0]);
560
584
       }
646
670
    ntok = ccp4_parser(hdrrec, MTZRECORDLENGTH, parser, iprint);
647
671
  }
648
672
 
 
673
  /* 4th Pass: Column group and source extensions and unknown keywords */
 
674
  /* 4th Pass: Position at top of header */
 
675
  ccp4_file_setmode(filein,6);
 
676
  ccp4_file_seek(filein, hdrst-1, SEEK_SET);
 
677
  ccp4_file_setmode(filein,0);
 
678
  istat = ccp4_file_readchar(filein, (uint8 *) hdrrec, MTZRECORDLENGTH);
 
679
  hdrrec[MTZRECORDLENGTH] = '\0';
 
680
  ntok = ccp4_parser(hdrrec, MTZRECORDLENGTH, parser, iprint);
 
681
  while (strncmp((strncpy(mkey,hdrrec,4)),"END",3) != 0) {
 
682
    if (strncmp (mkey, "COLS",4) == 0 ) {
 
683
      strcpy(label,token[1].fullstring);
 
684
      /* Special trap for M/ISYM */
 
685
      if (strncmp (label,"M/ISYM",6) == 0)
 
686
        strcpy(label,"M_ISYM");
 
687
      icset = (int) token[3].value;
 
688
      newcol = NULL;
 
689
      for (i = 0; i < mtz->nxtal; ++i) {
 
690
        for (j = 0; j < mtz->xtal[i]->nset; ++j) {
 
691
          if (mtz->xtal[i]->set[j]->setid == icset) {
 
692
            for ( k = 0; k < mtz->xtal[i]->set[j]->ncol; k++ ) {
 
693
              if (strcmp(mtz->xtal[i]->set[j]->col[k]->label,label) == 0) {
 
694
                newcol = mtz->xtal[i]->set[j]->col[k];
 
695
                break;
 
696
              }
 
697
            }
 
698
          }
 
699
        }
 
700
      }
 
701
      if ( newcol == NULL ) {
 
702
        ccp4_signal(CCP4_ERRLEVEL(3) | CMTZ_ERRNO(CMTZERR_ColSourceError),
 
703
                    "MtzGet", NULL);
 
704
        ccp4_parse_end(parser);
 
705
        ccp4_file_close(filein);
 
706
        free(filename);
 
707
        return(NULL);
 
708
      }
 
709
      strncpy( newcol->colsource, token[2].fullstring, 36 );
 
710
      newcol->colsource[36] = '\0';
 
711
    } else if (strncmp (mkey, "COLG",4) == 0 ) {
 
712
      strcpy(label,token[1].fullstring);
 
713
      /* Special trap for M/ISYM */
 
714
      if (strncmp (label,"M/ISYM",6) == 0)
 
715
        strcpy(label,"M_ISYM");
 
716
      icset = (int) token[5].value;
 
717
      newcol = NULL;
 
718
      for (i = 0; i < mtz->nxtal; ++i) {
 
719
        for (j = 0; j < mtz->xtal[i]->nset; ++j) {
 
720
          if (mtz->xtal[i]->set[j]->setid == icset) {
 
721
            for ( k = 0; k < mtz->xtal[i]->set[j]->ncol; k++ ) {
 
722
              if (strcmp(mtz->xtal[i]->set[j]->col[k]->label,label) == 0) {
 
723
                newcol = mtz->xtal[i]->set[j]->col[k];
 
724
                break;
 
725
              }
 
726
            }
 
727
          }
 
728
        }
 
729
      }
 
730
      if ( newcol == NULL ) {
 
731
        ccp4_signal(CCP4_ERRLEVEL(3) | CMTZ_ERRNO(CMTZERR_ColGroupError),
 
732
                    "MtzGet", NULL);
 
733
        ccp4_parse_end(parser);
 
734
        ccp4_file_close(filein);
 
735
        free(filename);
 
736
        return(NULL);
 
737
      }
 
738
      strncpy( newcol->grpname, token[2].fullstring, 30 );
 
739
      newcol->grpname[30] = '\0';
 
740
      strncpy( newcol->grptype, token[3].fullstring, 4 );
 
741
      newcol->grptype[4] = '\0';
 
742
      newcol->grpposn = (int) token[4].value;
 
743
    }
 
744
    istat = ccp4_file_readchar(filein, (uint8 *) hdrrec, MTZRECORDLENGTH);
 
745
    hdrrec[MTZRECORDLENGTH] = '\0';
 
746
    ntok = ccp4_parser(hdrrec, MTZRECORDLENGTH, parser, iprint);
 
747
  }
 
748
 
 
749
  /* 5th Pass: Deal with unknown headers */
 
750
  /* 5th Pass: Position at top of header */
 
751
  ccp4_file_setmode(filein,6);
 
752
  ccp4_file_seek(filein, hdrst-1, SEEK_SET);
 
753
  ccp4_file_setmode(filein,0);
 
754
  istat = ccp4_file_readchar(filein, (uint8 *) hdrrec, MTZRECORDLENGTH);
 
755
  hdrrec[MTZRECORDLENGTH] = '\0';
 
756
  ntok = ccp4_parser(hdrrec, MTZRECORDLENGTH, parser, iprint);
 
757
  while (strncmp((strncpy(mkey,hdrrec,4)),"END",3) != 0) {
 
758
    for ( i = 0; i < n_known_headers; ++i )
 
759
      if (strncmp (mkey,known_headers[i],4) == 0 )
 
760
        break;
 
761
    if ( i == n_known_headers ) {
 
762
      mtz->unknown_headers = ccp4_utils_realloc( mtz->unknown_headers, mtz->n_unknown_headers*MTZRECORDLENGTH+MTZRECORDLENGTH );  // if null, malloc
 
763
      memcpy( mtz->unknown_headers+mtz->n_unknown_headers*MTZRECORDLENGTH, hdrrec, MTZRECORDLENGTH );
 
764
      mtz->n_unknown_headers++;
 
765
    }
 
766
    istat = ccp4_file_readchar(filein, (uint8 *) hdrrec, MTZRECORDLENGTH);
 
767
    hdrrec[MTZRECORDLENGTH] = '\0';
 
768
    ntok = ccp4_parser(hdrrec, MTZRECORDLENGTH, parser, iprint);
 
769
  }
 
770
 
649
771
  /* copy sort order */
650
772
  for (i = 0; i < 5; ++i) {
651
773
    if (isort[i] > 0) 
738
860
  if (debug) 
739
861
    printf(" MtzGet: end of batch pass \n");
740
862
 
 
863
  /* Read XML datablock */
 
864
  xmllen = ccp4_file_length(filein) - ccp4_file_tell(filein);
 
865
  if ( xmllen > 0 ) {
 
866
    mtz->xml = (char *)ccp4_utils_malloc( xmllen+1 );
 
867
    if ( mtz->xml != NULL ) {
 
868
      istat = ccp4_file_readchar(filein, (uint8 *) mtz->xml, xmllen);
 
869
      mtz->xml[xmllen] = '\0';
 
870
    }
 
871
  }
 
872
 
741
873
  /* Position at start of reflections */
742
874
  ccp4_file_setmode(filein,6);
743
875
  ccp4_file_seek(filein, SIZE1, SEEK_SET);
777
909
 
778
910
  free(filename); 
779
911
 
780
 
  return(mtz);}
 
912
  return(mtz);
 
913
}
781
914
 
782
915
int MtzArrayToBatch(const int *intbuf, const float *fltbuf, MTZBAT *batch)
783
916
 
1100
1233
    for (j = 0; j < mtz->xtal[i]->nset; ++j) {
1101
1234
 /* Loop over columns for each dataset */
1102
1235
     for (k = 0; k < mtz->xtal[i]->set[j]->ncol; ++k) {
1103
 
       if ((colin = mtz->xtal[i]->set[j]->col[k]->source)) {
 
1236
      if (colin = mtz->xtal[i]->set[j]->col[k]->source) {
1104
1237
       if (strcmp(mtz->xtal[i]->set[j]->col[k]->type,"Y") == 0 && 
1105
1238
           strcmp(mtz->xtal[i]->set[j]->col[k]->label,"M_ISYM") == 0) {
1106
1239
         strcpy(clabs[colin - 1],"M/ISYM");
1145
1278
 
1146
1279
int ccp4_lrsymi(const MTZ *mtz, int *nsympx, char *ltypex, int *nspgrx, 
1147
1280
       char *spgrnx, char *pgnamx) {
 
1281
  char spgconf_temp[2];
 
1282
 
 
1283
  return ccp4_lrsymi_c(mtz,nsympx,ltypex,nspgrx,spgrnx,pgnamx,spgconf_temp);
 
1284
}
 
1285
 
 
1286
int ccp4_lrsymi_c(const MTZ *mtz, int *nsympx, char *ltypex, int *nspgrx, 
 
1287
       char *spgrnx, char *pgnamx, char *spgconf) {
1148
1288
 
1149
1289
  *nsympx = mtz->mtzsymm.nsymp;
1150
1290
  *nspgrx = mtz->mtzsymm.spcgrp;
1152
1292
  ltypex[1] = '\0';
1153
1293
  strcpy(spgrnx,mtz->mtzsymm.spcgrpname);
1154
1294
  strcpy(pgnamx,mtz->mtzsymm.pgname);
 
1295
  spgconf[0] = mtz->mtzsymm.spg_confidence;
 
1296
  spgconf[1] = '\0';
1155
1297
 
1156
1298
  return *nspgrx;
1157
1299
}
1381
1523
  for (i = 0; i < mtz->nxtal; ++i) {
1382
1524
    for (j = 0; j < mtz->xtal[i]->nset; ++j) {
1383
1525
     for (k = 0; k < mtz->xtal[i]->set[j]->ncol; ++k) {
1384
 
       if ((colin = mtz->xtal[i]->set[j]->col[k]->source)) {
 
1526
       if (colin = mtz->xtal[i]->set[j]->col[k]->source) {
1385
1527
         if (mtz->refs_in_memory) {
1386
1528
           adata[colin - 1] = mtz->xtal[i]->set[j]->col[k]->ref[iref-1];
1387
1529
         } else {
1455
1597
        adata[icol] = lookup[icol]->ref[iref-1];
1456
1598
        logmss[icol] = ccp4_ismnf(mtz, adata[icol]);
1457
1599
      } else {
1458
 
        if ((colin = lookup[icol]->source)) {
 
1600
         if (colin = lookup[icol]->source) {
1459
1601
           adata[icol] = refldata[colin - 1];
1460
1602
           logmss[icol] = ccp4_ismnf(mtz, adata[icol]);
1461
1603
         } else {
1523
1665
  printf(" * Title:\n\n");
1524
1666
  printf(" %s\n\n",mtz->title);
1525
1667
 
1526
 
  if ((baseset = MtzSetLookup(mtz,"HKL_base/HKL_base"))) {
 
1668
  if (baseset = MtzSetLookup(mtz,"HKL_base/HKL_base")) {
1527
1669
    if ( MtzNumActiveColsInSet(baseset) ||
1528
1670
         MtzNbatchesInSet(mtz,baseset) ) {
1529
1671
      printf(" * Base dataset:\n\n");
1632
1774
 
1633
1775
  /* Loop over crystals/datasets/columns */
1634
1776
  for (i = 0; i < mtz->nxtal; ++i) {
1635
 
    for (j = 0; j < mtz->xtal[i]->nset; ++j) {
1636
 
      for (k = 0; k < mtz->xtal[i]->set[j]->ncol; ++k) {
1637
 
        if (mtz->xtal[i]->set[j]->col[k]->active) {
1638
 
          if (strcmp(mtz->xtal[i]->set[j]->col[k]->type,"Y") == 0 &&
1639
 
              strcmp(mtz->xtal[i]->set[j]->col[k]->label,"M_ISYM") == 0) {
1640
 
            printf(" M/ISYM                         %2s %19.4f %19.4f %8d \n",
1641
 
                   mtz->xtal[i]->set[j]->col[k]->type,
1642
 
                   mtz->xtal[i]->set[j]->col[k]->min,
1643
 
                   mtz->xtal[i]->set[j]->col[k]->max,
1644
 
                   mtz->xtal[i]->set[j]->setid);
1645
 
          } else {
1646
 
            printf(" %-30s %2s %19.4f %19.4f %8d \n",
1647
 
                   mtz->xtal[i]->set[j]->col[k]->label,
1648
 
                   mtz->xtal[i]->set[j]->col[k]->type,
1649
 
                   mtz->xtal[i]->set[j]->col[k]->min,
1650
 
                   mtz->xtal[i]->set[j]->col[k]->max,
1651
 
                   mtz->xtal[i]->set[j]->setid);
1652
 
          }
1653
 
        }
 
1777
   for (j = 0; j < mtz->xtal[i]->nset; ++j) {
 
1778
    for (k = 0; k < mtz->xtal[i]->set[j]->ncol; ++k) {
 
1779
     if (mtz->xtal[i]->set[j]->col[k]->active) 
 
1780
      if (strcmp(mtz->xtal[i]->set[j]->col[k]->type,"Y") == 0 && 
 
1781
         strcmp(mtz->xtal[i]->set[j]->col[k]->label,"M_ISYM") == 0) {
 
1782
       printf(" M/ISYM                         %2s %19.4f %19.4f %8d \n",
 
1783
         mtz->xtal[i]->set[j]->col[k]->type,
 
1784
         mtz->xtal[i]->set[j]->col[k]->min,mtz->xtal[i]->set[j]->col[k]->max,
 
1785
         mtz->xtal[i]->set[j]->setid);
 
1786
      } else {
 
1787
       printf(" %-30s %2s %19.4f %19.4f %8d \n",
 
1788
         mtz->xtal[i]->set[j]->col[k]->label,mtz->xtal[i]->set[j]->col[k]->type,
 
1789
         mtz->xtal[i]->set[j]->col[k]->min,mtz->xtal[i]->set[j]->col[k]->max,
 
1790
         mtz->xtal[i]->set[j]->setid);
1654
1791
      }
1655
1792
    }
 
1793
   }
1656
1794
  }
1657
1795
 
1658
1796
  }
1712
1850
           mtz->mtzsymm.sym[i][j][1],mtz->mtzsymm.sym[i][j][2],
1713
1851
               mtz->mtzsymm.sym[i][j][3]);
1714
1852
    }
 
1853
    printf("\n");
1715
1854
 
1716
1855
  } else {
1717
1856
    printf(" * Space group = \'%s\' (number     %d)\n\n",mtz->mtzsymm.spcgrpname,
1718
1857
       mtz->mtzsymm.spcgrp);
1719
1858
  }
1720
1859
 
 
1860
  if (mtz->mtzsymm.spg_confidence == 'L') {
 
1861
    printf("  (only Bravais lattice is fixed so far)\n\n");
 
1862
  } else if (mtz->mtzsymm.spg_confidence == 'P') {
 
1863
    printf("  (only pointgroup is fixed so far)\n\n");
 
1864
  } else if (mtz->mtzsymm.spg_confidence == 'E') {
 
1865
    printf("  (one of pair of enantiomorphic spacegroups)\n\n");
 
1866
  } else if (mtz->mtzsymm.spg_confidence == 'S') {
 
1867
    printf("  (spacegroup is known)\n\n");
 
1868
  }
 
1869
 
1721
1870
  return 1;
1722
1871
}
1723
1872
 
1870
2019
         batch->phixyz[1][0],batch->phixyz[1][1],batch->phixyz[1][2]);
1871
2020
  }
1872
2021
  printf("   %s%s%s   %s\n",
1873
 
         "Reciprocal axis nearest ",batch->gonlab[0],"..",axes);
 
2022
         "Reciprocal axis nearest ",batch->gonlab[batch->ngonax-1],"..",axes);
1874
2023
  if (!batch->lcrflg) {
1875
2024
    printf("   %s %6.3f \n",
1876
2025
           "Mosaicity ........................",batch->crydat[0]);
2114
2263
  return 1;
2115
2264
}
2116
2265
 
 
2266
int ccp4_lwsymconf(MTZ *mtz, char spgconf[])
 
2267
{
 
2268
  if (spgconf[0] != ' ' && spgconf[0] != '\0') mtz->mtzsymm.spg_confidence = spgconf[0];
 
2269
 
 
2270
  return 1;
 
2271
}
 
2272
 
2117
2273
int ccp4_lwsymm(MTZ *mtz, int nsymx, int nsympx, float rsymx[192][4][4], 
2118
2274
   char ltypex[], int nspgrx, char spgrnx[], char pgnamx[])
2119
2275
{
 
2276
  /* Could set this to "X" but beware of legacy programs where lwsymm
 
2277
     still used. Don't want to overwrite flag in newer file. */
 
2278
  char spgconf_temp[2]="";
 
2279
 
 
2280
  return ccp4_lwsymm_c(mtz, nsymx, nsympx, rsymx, ltypex, nspgrx, spgrnx,
 
2281
                     pgnamx, spgconf_temp);
 
2282
}
 
2283
 
 
2284
int ccp4_lwsymm_c(MTZ *mtz, int nsymx, int nsympx, float rsymx[192][4][4], 
 
2285
                  char ltypex[], int nspgrx, char spgrnx[], char pgnamx[], 
 
2286
                  char spgconf[])
 
2287
{
2120
2288
  int i,j,k,length;
2121
2289
 
2122
2290
  if (nsymx > 0) {
2132
2300
  }
2133
2301
  if (ltypex[0] != ' ' && ltypex[0] != '\0') mtz->mtzsymm.symtyp = ltypex[0];
2134
2302
  if (nspgrx != 0) mtz->mtzsymm.spcgrp = nspgrx;
 
2303
  if (spgconf[0] != ' ' && spgconf[0] != '\0') mtz->mtzsymm.spg_confidence = spgconf[0];
2135
2304
 
2136
2305
  if (strcmp(spgrnx,"")) {
2137
2306
    length = ( strlen(spgrnx) < MAXSPGNAMELENGTH ) ? strlen(spgrnx) : MAXSPGNAMELENGTH;
2422
2591
 float *fltbuf = buf + NBATCHINTEGERS;
2423
2592
 MTZBAT *batch, *lastoldbatch = NULL;
2424
2593
 MTZXTAL *xtl;
 
2594
 char colsource[37], *taskenv;
 
2595
 int date3[3], time3[3];
2425
2596
 
2426
2597
 if (debug) 
2427
2598
   printf(" MtzPut: entering \n");
2428
2599
 
 
2600
 /* get data to fill out column source information */
 
2601
 taskenv = getenv( "CCP4_TASK_ID" );
 
2602
 if ( taskenv != NULL ) {
 
2603
   strncpy( colsource, taskenv, 36 );
 
2604
   colsource[36] = '\0';
 
2605
 } else {
 
2606
   ccp4_utils_idate( date3 );
 
2607
   ccp4_utils_itime( time3 );
 
2608
   sprintf( colsource, "CREATED_%02d/%02d/%04d_%02d:%02d:%02d",
 
2609
            date3[0],date3[1],date3[2],time3[0],time3[1],time3[2] );
 
2610
 }
 
2611
 for ( i = 0; i < strlen(colsource); i++ )
 
2612
   if ( colsource[i] == ' ' ) colsource[i] = '_';
 
2613
 for (i = 0; i < mtz->nxtal; ++i)
 
2614
   for (j = 0; j < mtz->xtal[i]->nset; ++j)
 
2615
     for (k = 0; k < mtz->xtal[i]->set[j]->ncol; ++k)
 
2616
       if ( mtz->xtal[i]->set[j]->col[k]->source == 0 )
 
2617
         strncpy(mtz->xtal[i]->set[j]->col[k]->colsource,colsource,36);
 
2618
 
2429
2619
 if (!mtz->fileout) {
2430
2620
 
2431
2621
   if ( !(fileout = MtzOpenForWrite(logname)) ) return 0;
2491
2681
           mtz->xtal[i]->cell[1],mtz->xtal[i]->cell[2],mtz->xtal[i]->cell[3],
2492
2682
           mtz->xtal[i]->cell[4],mtz->xtal[i]->cell[5]);
2493
2683
     MtzWhdrLine(fileout,65,hdrrec);
2494
 
     if ((xtl = MtzXtalLookup(mtz,"HKL_base")))
 
2684
     if (xtl = MtzXtalLookup(mtz,"HKL_base"))
2495
2685
       for (j = 0; j < 6; ++j)
2496
2686
         xtl->cell[j] = mtz->xtal[i]->cell[j];
2497
2687
     glob_cell_written=1;
2500
2690
 }
2501
2691
 /* if no suitable cell found, then try HKL_base cell */
2502
2692
 if (!glob_cell_written) {
2503
 
   if ((xtl = MtzXtalLookup(mtz,"HKL_base"))) {
 
2693
   if (xtl = MtzXtalLookup(mtz,"HKL_base")) {
2504
2694
     sprintf(hdrrec,"CELL  %9.4f %9.4f %9.4f %9.4f %9.4f %9.4f",xtl->cell[0],
2505
2695
           xtl->cell[1],xtl->cell[2],xtl->cell[3],xtl->cell[4],xtl->cell[5]);
2506
2696
     MtzWhdrLine(fileout,65,hdrrec);
2521
2711
 strncpy(spgname+1,mtz->mtzsymm.spcgrpname,length+1);
2522
2712
 spgname[length+2] = '\'';
2523
2713
 spgname[length+3] = '\0';
2524
 
 sprintf(hdrrec,"SYMINF %3d %2d %c %5d %22s %5s",mtz->mtzsymm.nsym,mtz->mtzsymm.nsymp,
2525
 
      mtz->mtzsymm.symtyp,mtz->mtzsymm.spcgrp,spgname,mtz->mtzsymm.pgname);
2526
 
 MtzWhdrLine(fileout,50,hdrrec);
 
2714
 sprintf(hdrrec,"SYMINF %3d %2d %c %5d %22s %5s %c",mtz->mtzsymm.nsym,
 
2715
         mtz->mtzsymm.nsymp,mtz->mtzsymm.symtyp,mtz->mtzsymm.spcgrp,spgname,
 
2716
         mtz->mtzsymm.pgname,mtz->mtzsymm.spg_confidence);
 
2717
 MtzWhdrLine(fileout,52,hdrrec);
2527
2718
 if (debug) printf(" MtzPut: SYMINF just written \n");
2528
2719
 
2529
2720
 for (i = 0; i < mtz->mtzsymm.nsym; ++i) {
2607
2798
                   mtz->xtal[i]->set[j]->col[k]->max,
2608
2799
                   mtz->xtal[i]->set[j]->setid);
2609
2800
       MtzWhdrLine(fileout,MTZRECORDLENGTH,hdrrec);
 
2801
 
 
2802
       if ( mtz->xtal[i]->set[j]->col[k]->colsource[0] != '\0' ) {
 
2803
         if (strcmp(mtz->xtal[i]->set[j]->col[k]->type,"Y") == 0 && 
 
2804
           strcmp(mtz->xtal[i]->set[j]->col[k]->label,"M_ISYM") == 0) {
 
2805
           sprintf(hdrrec,"COLSRC %-30s %-36s  %4d","M/ISYM",mtz->xtal[i]->set[j]->col[k]->colsource,mtz->xtal[i]->set[j]->setid);
 
2806
         } else {
 
2807
           sprintf(hdrrec,"COLSRC %-30s %-36s  %4d",mtz->xtal[i]->set[j]->col[k]->label,mtz->xtal[i]->set[j]->col[k]->colsource,mtz->xtal[i]->set[j]->setid);
 
2808
         }
 
2809
         MtzWhdrLine(fileout,MTZRECORDLENGTH,hdrrec);
 
2810
       }
 
2811
 
 
2812
       if ( mtz->xtal[i]->set[j]->col[k]->grpname[0] != '\0' &&
 
2813
            mtz->xtal[i]->set[j]->col[k]->grptype[0] != '\0' &&
 
2814
            mtz->xtal[i]->set[j]->col[k]->grpposn    >=   0  ) {
 
2815
         if (strcmp(mtz->xtal[i]->set[j]->col[k]->type,"Y") == 0 && 
 
2816
           strcmp(mtz->xtal[i]->set[j]->col[k]->label,"M_ISYM") == 0) {
 
2817
           sprintf(hdrrec,"COLGRP %-30s %-30s %-4s %1X %4d","M/ISYM",mtz->xtal[i]->set[j]->col[k]->grpname,mtz->xtal[i]->set[j]->col[k]->grptype,mtz->xtal[i]->set[j]->col[k]->grpposn,mtz->xtal[i]->set[j]->setid);
 
2818
         } else {
 
2819
           sprintf(hdrrec,"COLGRP %-30s %-30s %-4s %1X %4d",mtz->xtal[i]->set[j]->col[k]->label,mtz->xtal[i]->set[j]->col[k]->grpname,mtz->xtal[i]->set[j]->col[k]->grptype,mtz->xtal[i]->set[j]->col[k]->grpposn,mtz->xtal[i]->set[j]->setid);
 
2820
         }
 
2821
         MtzWhdrLine(fileout,MTZRECORDLENGTH,hdrrec);
 
2822
       }
2610
2823
     }
2611
2824
   }
2612
2825
  }
2685
2898
   }
2686
2899
 }
2687
2900
 
 
2901
 /* write out unrecognized headers */
 
2902
 if ( mtz->unknown_headers )
 
2903
   for (i = 0; i < mtz->n_unknown_headers; ++i)
 
2904
     MtzWhdrLine(fileout,MTZRECORDLENGTH,mtz->unknown_headers+i*MTZRECORDLENGTH);
 
2905
 
2688
2906
 sprintf(hdrrec,"END ");
2689
2907
 MtzWhdrLine(fileout,4,hdrrec);
2690
2908
 
2737
2955
 sprintf(hdrrec,"MTZENDOFHEADERS ");
2738
2956
 MtzWhdrLine(fileout,16,hdrrec);
2739
2957
 
 
2958
 /* write XML data block */
 
2959
 if ( mtz->xml != NULL ) {
 
2960
   ccp4_file_setmode(fileout,0);
 
2961
   ccp4_file_writechar(fileout,(const uint8 *)mtz->xml,strlen(mtz->xml));
 
2962
 }
 
2963
 
2740
2964
 /* go back and correct hdrst */
2741
2965
 ccp4_file_setmode(fileout,0);
2742
2966
 ccp4_file_seek(fileout, 4, SEEK_SET); 
3075
3299
  mtz->mtzsymm.nsymp = 0;
3076
3300
  mtz->mtzsymm.symtyp = '\0';
3077
3301
  mtz->mtzsymm.pgname[0] = '\0';
 
3302
  mtz->mtzsymm.spg_confidence = '\0';
3078
3303
  mtz->batch = NULL;
3079
3304
  for (i = 0; i < 5; ++i) {
3080
3305
    mtz->order[i] = NULL;
3081
3306
  }
 
3307
  mtz->xml = NULL;
 
3308
  mtz->unknown_headers = NULL;
 
3309
  mtz->n_unknown_headers = 0;
3082
3310
 
3083
3311
  return(mtz);
3084
3312
}
3123
3351
  if (mtz->hist != NULL) 
3124
3352
    MtzFreeHist(mtz->hist);
3125
3353
 
 
3354
  if (mtz->xml != NULL)
 
3355
    free(mtz->xml);
 
3356
 
 
3357
  if (mtz->unknown_headers != NULL)
 
3358
    free(mtz->unknown_headers);
 
3359
 
3126
3360
  free((void *) mtz);
3127
3361
  return 1;
3128
3362
}
3323
3557
  col->source = 0;
3324
3558
  col->min = 1.e06;
3325
3559
  col->max = -1.e06;
 
3560
  col->colsource[0] = '\0';
 
3561
  col->grpname[0] = '\0';
 
3562
  col->grptype[0] = '\0';
 
3563
  col->grpposn = -1;
3326
3564
  /* add pointer to set */
3327
3565
  if ( ++set->ncol > ccp4array_size(set->col))
3328
3566
    ccp4array_resize(set->col, set->ncol + 9);
3684
3922
  }
3685
3923
  return NULL;
3686
3924
}
 
3925