diff --git a/CMakeLists.txt b/CMakeLists.txt index a97eed3837d6d84850f1c9b2697f4287e433d1c0..508c6fab630652cd4a6d4abcc2d67e64fbdd9899 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,7 @@ FIND_PACKAGE(PkgConfig REQUIRED) PKG_CHECK_MODULES(FFTW fftw3 REQUIRED) INCLUDE_DIRECTORIES(${FFTW_INCLUDE_DIRS}) -FIND_PACKAGE(Boost 1.54 REQUIRED) +FIND_PACKAGE(Boost 1.43 REQUIRED) INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) FIND_PACKAGE(OpenMP) diff --git a/bioem.cpp b/bioem.cpp index c5eeca600f63beb20ae1aa618e5e7a7637183347..70124a39d57552618b5d7c2432922d5f4c1bf768 100644 --- a/bioem.cpp +++ b/bioem.cpp @@ -59,6 +59,8 @@ int bioem::configure(int ac, char* av[]) param.writeAngles=false; RefMap.dumpMap = false; RefMap.loadMap = false; + RefMap.readMRC = false; + RefMap.readMultMRC = false; /*************************************************************************************/ cout << " ++++++++++++ FROM COMMAND LINE +++++++++++\n\n"; @@ -73,6 +75,8 @@ int bioem::configure(int ac, char* av[]) ("Modelfile", po::value< std::string>() , "Name of model file") ("Particlesfile", po::value< std::string>(), "Name of paricles file") ("ReadPDB", "(Optional) If reading model file in PDB format") + ("ReadMRC", "(Optional) If reading particle file in MRC format") + ("ReadMultipleMRC", "(Optional) If reading Multiple MRCs") ("DumpMaps", "(Optional) Dump maps after they were red from maps file") ("LoadMapDump", "(Optional) Read Maps from dump instead of maps file") ("help", "(Optional) Produce help message") @@ -83,6 +87,8 @@ int bioem::configure(int ac, char* av[]) p.add("Modelfile", -1); p.add("Particlesfile", -1); p.add("ReadPDB", -1); + p.add("ReadMRC", -1); + p.add("ReadMultipleMRC", -1); p.add("DumpMaps", -1); p.add("LoadMapDump", -1); @@ -119,6 +125,17 @@ int bioem::configure(int ac, char* av[]) cout << "Reading model file in PDB format.\n"; Model.readPDB=true; } + if (vm.count("ReadMRC")) + { + cout << "Reading particle file in MRC format.\n"; + RefMap.readMRC=true; + } + + if (vm.count("ReadMultipleMRC")) + { + cout << "Reading Multiple MRCs.\n"; + RefMap.readMultMRC=true; + } if (vm.count("DumpMaps")) { diff --git a/include/map.h b/include/map.h index f801d166810c446ab17e83ffb543c58be699abc1..5af0d9883aad073188362b172b7cc632e8881b4e 100644 --- a/include/map.h +++ b/include/map.h @@ -22,7 +22,13 @@ public: } int readRefMaps(bioem_param& param); int PreCalculateMapsFFT(bioem_param& param); - + int read_int(int *currlong, FILE *fin, int swap); + int read_float(float *currfloat, FILE *fin, int swap); + int read_float_empty (FILE *fin); + int read_char_float (float *currfloat, FILE *fin) ; + int test_mrc (const char *vol_file, int swap); + int read_MRC(const char* filename,bioem_param& param); + mycomplex_t* RefMapsFFT; const char* filemap; @@ -32,7 +38,7 @@ public: myfloat_t sumsquare_RefMap[BIOEM_MAX_MAPS]; myfloat_t ForLogProbfromRef[BIOEM_MAX_MAPS]; - bool dumpMap, loadMap; + bool dumpMap, loadMap, readMRC,readMultMRC; __host__ __device__ inline myfloat_t get(int map, int x, int y) const {return(Ref[map].points[x][y]);} __host__ __device__ inline const myfloat_t* getp(int map, int x, int y) const {return(&Ref[map].points[x][y]);} diff --git a/main.cpp b/main.cpp index cf8b518803b09de0c2ce9e5d8c0cc058cd34e471..587dac6ee7fcf2f4a64b6f01519c19c7ca54c5d7 100644 --- a/main.cpp +++ b/main.cpp @@ -27,7 +27,7 @@ int main(int argc, char* argv[]) #pragma omp parallel { - _MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON); //Flush denormals to zero in all OpenMP threads +//_MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON); //Flush denormals to zero in all OpenMP threads } HighResTimer timer; diff --git a/map.cpp b/map.cpp index 7e1039751327323b1441c4c9aa531dd896f9f286..4ede0bd687392ab57d811deae913d4fe22ec4bf4 100644 --- a/map.cpp +++ b/map.cpp @@ -13,160 +13,483 @@ using namespace std; int bioem_RefMap::readRefMaps(bioem_param& param) { - /**************************************************************************************/ - /***********************Reading reference Particle Maps************************/ - /**************************************************************************************/ - if (loadMap) + /**************************************************************************************/ + /***********************Reading reference Particle Maps************************/ + /**************************************************************************************/ + if (loadMap) + { + FILE* fp = fopen("maps.dump", "rb"); + if (fp == NULL) { - FILE* fp = fopen("maps.dump", "rb"); - if (fp == NULL) - { - cout << "Error opening dump file\n"; - exit(1); - } - fread(&ntotRefMap, sizeof(ntotRefMap), 1, fp); - if (ntotRefMap > BIOEM_MAX_MAPS) - { - cout << "BIOEM_MAX_MAPS too small, some maps dropped\n"; - ntotRefMap = BIOEM_MAX_MAPS; - } - fread(&Ref[0], sizeof(Ref[0]), ntotRefMap, fp); - fclose(fp); - - cout << "Particle Maps read from Map Dump \nTotal Number of particles: " << ntotRefMap ; - cout << "\n+++++++++++++++++++++++++++++++++++++++++ \n"; + cout << "Error opening dump file\n"; + exit(1); } - else + fread(&ntotRefMap, sizeof(ntotRefMap), 1, fp); + if (ntotRefMap > BIOEM_MAX_MAPS) { - int nummap=-1; - int lasti=0; - int lastj=0; - ifstream input(filemap); - if (!input.good()) - { - cout << "Particle Maps Failed to open file" << endl ; - exit(1); - } + cout << "BIOEM_MAX_MAPS too small, some maps dropped\n"; + ntotRefMap = BIOEM_MAX_MAPS; + } + fread(&Ref[0], sizeof(Ref[0]), ntotRefMap, fp); + fclose(fp); - char line[512] = {' '}; - char tmpLine[512] = {' '}; - - while (!input.eof()) - { - input.getline(line,512); - - strncpy(tmpLine,line,strlen(line)); - char *token = strtok(tmpLine," "); - - if (strcmp(token,"PARTICLE")==0) // to count the number of maps - { - nummap++; - if (nummap % 128 == 0) - { - cout << "..." << nummap << "\n"; - } - if (nummap == BIOEM_MAX_MAPS) - { - cout << "BIOEM_MAX_MAPS too small\n"; - exit(1); - } - if(lasti!=param.param_device.NumberPixels && lastj!=param.param_device.NumberPixels && nummap>0) - { - cout << "PROBLEM INCONSISTENT NUMBER OF PIXELS IN MAPS AND INPUTFILE ( " << param.param_device.NumberPixels << ", i " << lasti << ", j " << lastj << ")" << "\n"; - exit(1); - } - } - else - { - int i,j; - float z; - - char tmpVals[36] = {' '}; - - strncpy (tmpVals,line,8); - sscanf (tmpVals,"%d",&i); - - strncpy (tmpVals,line+8,8); - sscanf (tmpVals,"%d",&j); - - strncpy (tmpVals,line+16,12); - sscanf (tmpVals,"%f",&z); - //checking for Map limits - if(i>0 && i-1 <BIOEM_MAP_SIZE_X&& j>0 && j-1<BIOEM_MAP_SIZE_Y && nummap < BIOEM_MAX_MAPS) - { - Ref[nummap].points[i-1][j-1] = (myfloat_t) z; - lasti=i; - lastj=j; - } - else - { - cout << "PROBLEM READING MAP (Map number " << nummap << ", i " << i << ", j " << j << ")" << "\n"; - exit(1); - } - } - } - cout << "."; - ntotRefMap=nummap+1; - cout << "Particle Maps read from Standard File \nTotal Number of particles: " << ntotRefMap ; - cout << "\n+++++++++++++++++++++++++++++++++++++++++ \n"; - - if (dumpMap) - { - FILE* fp = fopen("maps.dump", "w+b"); - if (fp == NULL) - { - cout << "Error opening dump file\n"; - exit(1); - } - fwrite(&ntotRefMap, sizeof(ntotRefMap), 1, fp); - fwrite(&Ref[0], sizeof(Ref[0]), ntotRefMap, fp); - fclose(fp); + cout << "Particle Maps read from Map Dump \nTotal Number of particles: " << ntotRefMap ; + cout << "\n+++++++++++++++++++++++++++++++++++++++++ \n"; + } + else + { + + if(readMRC){ + + ntotRefMap=0; + + if(readMultMRC) + { + + ifstream input(filemap); + + if (!input.good()) + { + cout << "Failed to open file contaning MRC names: " << filemap << "\n"; + exit(0); + } + + char line[512] = {0}; + char mapname[100]; + char tmpm[10] = {0}; + const char* indifile; + + while (!input.eof()) + { + input.getline(line,512); + char tmpVals[100] = {' '}; + + strncpy (tmpVals,line,100); + sscanf (tmpVals,"%99c",mapname); + + // Check for last line + strncpy (tmpm,mapname,3); + if(strcmp(tmpm,"XXX")!=0){ + indifile = mapname; + //Reading Multiple MRC + read_MRC(indifile,param); + } + for(int i=0;i<3;i++)mapname[i] = 'X'; + for(int i=3;i<100;i++)mapname[i] = {0}; + + } + cout << "Particle Maps read from MULTIPLE MRC Files in: " << filemap << "\n" ; + + } else { + + read_MRC(filemap,param); + cout << "Particle Maps read from ONE MRC File: " << filemap << "\n" ; + + } + + } + else { + + int nummap=-1; + int lasti=0; + int lastj=0; + ifstream input(filemap); + if (!input.good()) + { + cout << "Particle Maps Failed to open file" << endl ; + exit(1); + } + + char line[512] = {' '}; + char tmpLine[512] = {' '}; + + while (!input.eof()) + { + input.getline(line,512); + + strncpy(tmpLine,line,strlen(line)); + char *token = strtok(tmpLine," "); + + if (strcmp(token,"PARTICLE")==0) // to count the number of maps + { + nummap++; + if (nummap % 128 == 0) + { + cout << "..." << nummap << "\n"; + } + if (nummap == BIOEM_MAX_MAPS) + { + cout << "BIOEM_MAX_MAPS too small\n"; + exit(1); + } + if(lasti!=param.param_device.NumberPixels && lastj!=param.param_device.NumberPixels && nummap>0) + { + cout << "PROBLEM INCONSISTENT NUMBER OF PIXELS IN MAPS AND INPUTFILE ( " << param.param_device.NumberPixels << ", i " << lasti << ", j " << lastj << ")" << "\n"; + exit(1); + } + } + else + { + int i,j; + float z; + + char tmpVals[36] = {' '}; + + strncpy (tmpVals,line,8); + sscanf (tmpVals,"%d",&i); + + strncpy (tmpVals,line+8,8); + sscanf (tmpVals,"%d",&j); + + strncpy (tmpVals,line+16,12); + sscanf (tmpVals,"%f",&z); + //checking for Map limits + if(i>0 && i-1 <BIOEM_MAP_SIZE_X&& j>0 && j-1<BIOEM_MAP_SIZE_Y && nummap < BIOEM_MAX_MAPS) + { + Ref[nummap].points[i-1][j-1] = (myfloat_t) z; + lasti=i; + lastj=j; + } + else + { + cout << "PROBLEM READING MAP (Map number " << nummap << ", i " << i << ", j " << j << ")" << "\n"; + exit(1); + } + } + } + cout << "."; + ntotRefMap=nummap+1; + cout << "Particle Maps read from Standard File\n" ; + } + cout << "Total Number of particles: " << ntotRefMap ; + cout << "\n+++++++++++++++++++++++++++++++++++++++++++ \n"; + + if (dumpMap) + { + FILE* fp = fopen("maps.dump", "w+b"); + if (fp == NULL) + { + cout << "Error opening dump file\n"; + exit(1); + } + fwrite(&ntotRefMap, sizeof(ntotRefMap), 1, fp); + fwrite(&Ref[0], sizeof(Ref[0]), ntotRefMap, fp); + fclose(fp); } + } - return(0); + return(0); } int bioem_RefMap::PreCalculateMapsFFT(bioem_param& param) { - /**************************************************************************************/ - /********** Routine that pre-calculates Kernels for Convolution **********************/ - /************************************************************************************/ + /**************************************************************************************/ + /********** Routine that pre-calculates Kernels for Convolution **********************/ + /************************************************************************************/ - myfloat_t* localMap; + myfloat_t* localMap; - localMap= (myfloat_t *) myfftw_malloc(sizeof(myfloat_t) * param.param_device.NumberPixels * param.param_device.NumberPixels); + localMap= (myfloat_t *) myfftw_malloc(sizeof(myfloat_t) * param.param_device.NumberPixels * param.param_device.NumberPixels); - RefMapsFFT = new mycomplex_t[ntotRefMap * param.RefMapSize]; + RefMapsFFT = new mycomplex_t[ntotRefMap * param.RefMapSize]; - mycomplex_t* localout; - localout= (mycomplex_t *) myfftw_malloc(sizeof(mycomplex_t) * param.param_device.NumberPixels * param.param_device.NumberFFTPixels1D); + mycomplex_t* localout; + localout= (mycomplex_t *) myfftw_malloc(sizeof(mycomplex_t) * param.param_device.NumberPixels * param.param_device.NumberFFTPixels1D); - for (int iRefMap = 0; iRefMap < ntotRefMap ; iRefMap++) + for (int iRefMap = 0; iRefMap < ntotRefMap ; iRefMap++) + { + //Assigning localMap values to padded Map + for(int i=0; i< param.param_device.NumberPixels; i++) { - //Assigning localMap values to padded Map - for(int i=0; i< param.param_device.NumberPixels; i++) - { - for(int j=0; j< param.param_device.NumberPixels; j++) - { - localMap[i*param.param_device.NumberPixels+j]=Ref[iRefMap].points[i][j]; - } - } + for(int j=0; j< param.param_device.NumberPixels; j++) + { + localMap[i*param.param_device.NumberPixels+j]=Ref[iRefMap].points[i][j]; + } + } - //Calling FFT_Forward - myfftw_execute_dft_r2c(param.fft_plan_r2c_forward,localMap,localout); + //Calling FFT_Forward + myfftw_execute_dft_r2c(param.fft_plan_r2c_forward,localMap,localout); - // Normalizing and saving the Reference CTFs - mycomplex_t* RefMap = &RefMapsFFT[iRefMap * param.RefMapSize]; - for(int i=0; i < param.param_device.NumberPixels * param.param_device.NumberFFTPixels1D ; i++ ) - { - RefMap[i][0]=localout[i][0]; - RefMap[i][1]=localout[i][1]; - } + // Normalizing and saving the Reference CTFs + mycomplex_t* RefMap = &RefMapsFFT[iRefMap * param.RefMapSize]; + for(int i=0; i < param.param_device.NumberPixels * param.param_device.NumberFFTPixels1D ; i++ ) + { + RefMap[i][0]=localout[i][0]; + RefMap[i][1]=localout[i][1]; } + } - myfftw_free(localMap); - myfftw_free(localout); + myfftw_free(localMap); + myfftw_free(localout); + + return(0); +} + +int bioem_RefMap::read_MRC(const char* filename,bioem_param& param) + { + myfloat_t st,st2; + unsigned long count; + FILE *fin; + float currfloat; + int nc, nr, ns, swap, header_ok = 1; + float xlen, ylen, zlen; + int mode, ncstart, nrstart, nsstart, ispg, nsymbt, lskflg; + float a_tmp, b_tmp, g_tmp; + int mx, my, mz,mapc, mapr, maps; + float dmin, dmax, dmean; + int n_range_viol0, n_range_viol1; + + fin = fopen(filename, "rb"); + if( fin == NULL ) { + cout << "ERROR opening MRC: " << filename; + exit(1); + } + n_range_viol0 = test_mrc(filename,0); + n_range_viol1 = test_mrc(filename,1); + + if (n_range_viol0 < n_range_viol1) { /* guess endianism */ + swap = 0; + if (n_range_viol0 > 0) { + printf(" Warning: %i header field range violations detected in file %s \n", n_range_viol0,filename); + } + } else { + swap = 1; + if (n_range_viol1 > 0) { + printf("Warning: %i header field range violations detected in file %s \n", n_range_viol1,filename); + } + } + printf("++++++++++++++++++++++++++++++++++++++++++++++\n"); + printf("Reading Information from MRC: %s \n", filename); + header_ok *= read_int(&nc,fin,swap); + header_ok *= read_int(&nr,fin,swap); + header_ok *= read_int(&ns,fin,swap); + header_ok *= read_int(&mode,fin,swap); + header_ok *= read_int(&ncstart,fin,swap); + header_ok *= read_int(&nrstart,fin,swap); + header_ok *= read_int(&nsstart,fin,swap); + header_ok *= read_int(&mx,fin,swap); + header_ok *= read_int(&my,fin,swap); + header_ok *= read_int(&mz,fin,swap); + header_ok *= read_float(&xlen,fin,swap); + header_ok *= read_float(&ylen,fin,swap); + header_ok *= read_float(&zlen,fin,swap); + header_ok *= read_float(&a_tmp,fin,swap); + header_ok *= read_float(&b_tmp,fin,swap); + header_ok *= read_float(&g_tmp,fin,swap); + header_ok *= read_int(&mapc,fin,swap); + header_ok *= read_int(&mapr,fin,swap); + header_ok *= read_int(&maps,fin,swap); + header_ok *= read_float(&dmin,fin,swap); + header_ok *= read_float(&dmax,fin,swap); + header_ok *= read_float(&dmean,fin,swap); + header_ok *= read_int(&ispg,fin,swap); + header_ok *= read_int(&nsymbt,fin,swap); + header_ok *= read_int(&lskflg,fin,swap); + + printf("Number Columns = %8d \n",nc); + printf("Number Rows = %8d \n",nr); + printf("Number Sections = %8d \n",ns); + printf("MODE = %8d (only data type mode 2: 32-bit)\n",mode); + printf("NSYMBT = %8d (# bytes symmetry operators)\n",nsymbt); + + /* printf(" NCSTART = %8d (index of first column, counting from 0)\n",ncstart); + printf("> NRSTART = %8d (index of first row, counting from 0)\n",nrstart); + printf(" NSSTART = %8d (index of first section, counting from 0)\n",nsstart); + printf(" MX = %8d (# of X intervals in unit cell)\n",mx); + printf(" MY = %8d (# of Y intervals in unit cell)\n",my); + printf(" MZ = %8d (# of Z intervals in unit cell)\n",mz); + printf(" X length = %8.3f (unit cell dimension)\n",xlen); + printf(" Y length = %8.3f (unit cell dimension)\n",ylen); + printf(" Z length = %8.3f (unit cell dimension)\n",zlen); + printf(" Alpha = %8.3f (unit cell angle)\n",a_tmp); + printf(" Beta = %8.3f (unit cell angle)\n",b_tmp); + printf(" Gamma = %8.3f (unit cell angle)\n",g_tmp); + printf(" MAPC = %8d (columns axis: 1=X,2=Y,3=Z)\n",mapc); + printf(" MAPR = %8d (rows axis: 1=X,2=Y,3=Z)\n",mapr); + printf(" MAPS = %8d (sections axis: 1=X,2=Y,3=Z)\n",maps); + printf(" DMIN = %8.3f (minimum density value - ignored)\n",dmin); + printf(" DMAX = %8.3f (maximum density value - ignored)\n",dmax); + printf(" DMEAN = %8.3f (mean density value - ignored)\n",dmean); + printf(" ISPG = %8d (space group number - ignored)\n",ispg); + printf(" NSYMBT = %8d (# bytes storing symmetry operators)\n",nsymbt); + printf(" LSKFLG = %8d (skew matrix flag: 0:none, 1:follows)\n",lskflg);*/ + + if (header_ok == 0) { + cout << "ERROR reading MRC header: " << filename; + exit(1); + } + + if(nr!=param.param_device.NumberPixels || nc!=param.param_device.NumberPixels ) + { + cout << "PROBLEM INCONSISTENT NUMBER OF PIXELS IN MAPS AND INPUTFILE ( " << param.param_device.NumberPixels << ", i " << nc << ", j " << nr << ")" << "\n"; + exit(1); + } + + + if(mode!=2) + { + cout << "ERROR with MRC mode " << mode << "\n"; + cout << "Currently mode 2 is the only one allowed" << "\n"; + exit(1); + + } else + { + rewind (fin); + for (count=0; count<256; ++count) if (read_float_empty(fin)==0) { + cout << "ERROR Converting Data: " << filename; + exit(1); + } + + for (count=0; count<(unsigned long)nsymbt; ++count) if (read_char_float(&currfloat,fin)==0) { + cout << "ERROR Converting Data: " << filename; + exit(1); + } + + for ( int nmap = 0 ; nmap < ns ; nmap ++ ) + { + + st=0.0; + st2=0.0; + for ( int j = 0 ; j < nr ; j ++ ) + for ( int i = 0 ; i < nc ; i ++ ) + { + if (read_float(&currfloat,fin,swap)==0) { + cout << "ERROR Converting Data: " << filename; + exit(1); + } else { + Ref[nmap+ntotRefMap].points[i][j] = currfloat; + st += currfloat; + st2 += currfloat*currfloat; + + } + } + + //Normaling maps to zero mean and unit standard deviation + st /= float(nr*nc); + st2 = sqrt(st2/float(nr*nc)-st*st); + for ( int j = 0 ; j < nr ; j ++ ) for ( int i = 0 ; i < nc ; i ++ ){ + Ref[nmap+ntotRefMap].points[i][j] = Ref[nmap+ntotRefMap].points[i][j]/st2 - st/st2; + // if(nmap+ntotRefMap==300)cout << i << " " << j << " " << nmap+ntotRefMap << " " << Ref[nmap+ntotRefMap].points[i][j] << "\n"; + } + } + ntotRefMap += ns ; + // cout << ntotRefMap << "\n"; + } + fclose (fin); + return(0); + } + +int bioem_RefMap::read_float(float *currfloat, FILE *fin, int swap) { + unsigned char *cptr, tmp; + + if (fread(currfloat,4,1,fin)!=1) return 0; + if (swap == 1) { + cptr = (unsigned char *)currfloat; + tmp = cptr[0]; + cptr[0]=cptr[3]; + cptr[3]=tmp; + tmp = cptr[1]; + cptr[1]=cptr[2]; + cptr[2]=tmp; + } + return 1; } + +int bioem_RefMap::read_int(int *currlong, FILE *fin, int swap) { + unsigned char *cptr, tmp; + + if (fread(currlong,4,1,fin)!=1) return 0; + if (swap == 1) { + cptr = (unsigned char *)currlong; + tmp = cptr[0]; + cptr[0]=cptr[3]; + cptr[3]=tmp; + tmp = cptr[1]; + cptr[1]=cptr[2]; + cptr[2]=tmp; + } + return 1; +} +int bioem_RefMap::read_float_empty (FILE *fin) { + float currfloat; + + if (fread(&currfloat,4,1,fin)!=1) return 0; + return 1; +} + +int bioem_RefMap::read_char_float (float *currfloat, FILE *fin) { + char currchar; + + if (fread(&currchar,1,1,fin)!=1) return 0; + *currfloat=(float)currchar; + return 1; +} + +int bioem_RefMap::test_mrc (const char *vol_file, int swap) { + FILE *fin; + int nc, nr, ns, mx, my, mz; + int mode, ncstart, nrstart, nsstart; + float xlen, ylen, zlen; + int i, header_ok = 1, n_range_viols = 0; + int mapc, mapr, maps; + float alpha, beta, gamma; + float dmin, dmax, dmean, dummy, xorigin, yorigin, zorigin; + + fin = fopen(vol_file, "rb"); + if( fin == NULL ) { + cout << "ERROR opening MRC: " << vol_file; + exit(1); + } + + /* read header info */ + header_ok *= read_int(&nc,fin,swap); + header_ok *= read_int(&nr,fin,swap); + header_ok *= read_int(&ns,fin,swap); + header_ok *= read_int(&mode,fin,swap); + header_ok *= read_int(&ncstart,fin,swap); + header_ok *= read_int(&nrstart,fin,swap); + header_ok *= read_int(&nsstart,fin,swap); + header_ok *= read_int(&mx,fin,swap); + header_ok *= read_int(&my,fin,swap); + header_ok *= read_int(&mz,fin,swap); + header_ok *= read_float(&xlen,fin,swap); + header_ok *= read_float(&ylen,fin,swap); + header_ok *= read_float(&zlen,fin,swap); + header_ok *= read_float(&alpha,fin,swap); + header_ok *= read_float(&beta,fin,swap); + header_ok *= read_float(&gamma,fin,swap); + header_ok *= read_int(&mapc,fin,swap); + header_ok *= read_int(&mapr,fin,swap); + header_ok *= read_int(&maps,fin,swap); + header_ok *= read_float(&dmin,fin,swap); + header_ok *= read_float(&dmax,fin,swap); + header_ok *= read_float(&dmean,fin,swap); + for (i=23; i<50; ++i) header_ok *= read_float(&dummy,fin,swap); + header_ok *= read_float(&xorigin,fin,swap); + header_ok *= read_float(&yorigin,fin,swap); + header_ok *= read_float(&zorigin,fin,swap); + fclose (fin); + if (header_ok == 0) { + cout << "ERROR reading MRC header: " << vol_file; + exit(1); + } + + n_range_viols += (nc>5000); n_range_viols += (nc<0); + n_range_viols += (nr>5000); n_range_viols += (nr<0); + n_range_viols += (ns>5000); n_range_viols += (ns<0); + n_range_viols += (ncstart>5000); n_range_viols += (ncstart<-5000); + n_range_viols += (nrstart>5000); n_range_viols += (nrstart<-5000); + n_range_viols += (nsstart>5000); n_range_viols += (nsstart<-5000); + n_range_viols += (mx>5000); n_range_viols += (mx<0); + n_range_viols += (my>5000); n_range_viols += (my<0); + n_range_viols += (mz>5000); n_range_viols += (mz<0); + n_range_viols += (alpha>360.0f); n_range_viols += (alpha<-360.0f); + n_range_viols += (beta>360.0f); n_range_viols += (beta<-360.0f); + n_range_viols += (gamma>360.0f); n_range_viols += (gamma<-360.0f); + + return n_range_viols; +} + diff --git a/param.cpp b/param.cpp index ae189ab9f12efb560e185feb97cb74f0192b469d..34e0ebf124c645c2ce0cdaa9b1b35db571c75e2d 100644 --- a/param.cpp +++ b/param.cpp @@ -37,9 +37,9 @@ bioem_param::bioem_param() int bioem_param::readParameters() { - /**************************************************************************************/ - /***************************** Reading Input Parameters ******************************/ - /**************************************************************************************/ + //************************************************************************************** + //***************************** Reading Input Parameters ****************************** + //************************************************************************************** ifstream input(fileinput); if (!input.good())