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;
107
111
float *fltbuf = buf + NBATCHINTEGERS;
108
112
MTZBAT *batch = NULL;
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]);
111
122
printf(" Entering MtzGet \n");
646
670
ntok = ccp4_parser(hdrrec, MTZRECORDLENGTH, parser, iprint);
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;
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];
701
if ( newcol == NULL ) {
702
ccp4_signal(CCP4_ERRLEVEL(3) | CMTZ_ERRNO(CMTZERR_ColSourceError),
704
ccp4_parse_end(parser);
705
ccp4_file_close(filein);
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;
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];
730
if ( newcol == NULL ) {
731
ccp4_signal(CCP4_ERRLEVEL(3) | CMTZ_ERRNO(CMTZERR_ColGroupError),
733
ccp4_parse_end(parser);
734
ccp4_file_close(filein);
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;
744
istat = ccp4_file_readchar(filein, (uint8 *) hdrrec, MTZRECORDLENGTH);
745
hdrrec[MTZRECORDLENGTH] = '\0';
746
ntok = ccp4_parser(hdrrec, MTZRECORDLENGTH, parser, iprint);
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 )
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++;
766
istat = ccp4_file_readchar(filein, (uint8 *) hdrrec, MTZRECORDLENGTH);
767
hdrrec[MTZRECORDLENGTH] = '\0';
768
ntok = ccp4_parser(hdrrec, MTZRECORDLENGTH, parser, iprint);
649
771
/* copy sort order */
650
772
for (i = 0; i < 5; ++i) {
651
773
if (isort[i] > 0)
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);
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);
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);
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);
2266
int ccp4_lwsymconf(MTZ *mtz, char spgconf[])
2268
if (spgconf[0] != ' ' && spgconf[0] != '\0') mtz->mtzsymm.spg_confidence = spgconf[0];
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[])
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]="";
2280
return ccp4_lwsymm_c(mtz, nsymx, nsympx, rsymx, ltypex, nspgrx, spgrnx,
2281
pgnamx, spgconf_temp);
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[],
2120
2288
int i,j,k,length;
2122
2290
if (nsymx > 0) {
2422
2591
float *fltbuf = buf + NBATCHINTEGERS;
2423
2592
MTZBAT *batch, *lastoldbatch = NULL;
2594
char colsource[37], *taskenv;
2595
int date3[3], time3[3];
2427
2598
printf(" MtzPut: entering \n");
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';
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] );
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);
2429
2619
if (!mtz->fileout) {
2431
2621
if ( !(fileout = MtzOpenForWrite(logname)) ) return 0;
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");
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);
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);
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);
2809
MtzWhdrLine(fileout,MTZRECORDLENGTH,hdrrec);
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);
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);
2821
MtzWhdrLine(fileout,MTZRECORDLENGTH,hdrrec);