Commit 47c12f7a authored by David Rohr's avatar David Rohr
Browse files

Merge FFT Algorithm into BioEM version in git repository, cleanup, ensure...

Merge FFT Algorithm into BioEM version in git repository, cleanup, ensure consistent indentation style
parent 73b7953e
......@@ -31,13 +31,13 @@ using namespace std;
template<class T>
ostream& operator<<(ostream& os, const vector<T>& v)
{
copy(v.begin(), v.end(), ostream_iterator<T>(os, " "));
return os;
copy(v.begin(), v.end(), ostream_iterator<T>(os, " "));
return os;
}
bioem::bioem()
{
FFTAlgo = getenv("FFTALGO") == NULL ? 0 : atoi(getenv("FFTALGO"));
}
bioem::~bioem()
......@@ -47,122 +47,122 @@ bioem::~bioem()
int bioem::configure(int ac, char* av[])
{
/**************************************************************************************/
/**** Configuration Routine using boost for extracting parameters, models and maps ****/
/**************************************************************************************/
/****** And Precalculating necessary grids, map crosscorrelations and kernels ********/
/*************************************************************************************/
/*** Inizialzing default variables ***/
std::string infile,modelfile,mapfile;
Model.readPDB=false;
param.writeAngles=false;
/**************************************************************************************/
/**** Configuration Routine using boost for extracting parameters, models and maps ****/
/**************************************************************************************/
/****** And Precalculating necessary grids, map crosscorrelations and kernels ********/
/*************************************************************************************/
/*** Inizialzing default variables ***/
std::string infile,modelfile,mapfile;
Model.readPDB=false;
param.writeAngles=false;
RefMap.dumpMap = false;
RefMap.loadMap = false;
/*************************************************************************************/
cout << " ++++++++++++ FROM COMMAND LINE +++++++++++\n\n";
/*************************************************************************************/
/*************************************************************************************/
cout << " ++++++++++++ FROM COMMAND LINE +++++++++++\n\n";
/*************************************************************************************/
/********************* Command line reading input with BOOST ************************/
/********************* Command line reading input with BOOST ************************/
try {
po::options_description desc("Command line inputs");
desc.add_options()
("Inputfile", po::value<std::string>(), "Name of input parameter file")
("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")
try {
po::options_description desc("Command line inputs");
desc.add_options()
("Inputfile", po::value<std::string>(), "Name of input parameter file")
("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")
("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")
;
po::positional_options_description p;
p.add("Inputfile", -1);
p.add("Modelfile", -1);
p.add("Particlesfile", -1);
p.add("ReadPDB", -1);
("help", "(Optional) Produce help message")
;
po::positional_options_description p;
p.add("Inputfile", -1);
p.add("Modelfile", -1);
p.add("Particlesfile", -1);
p.add("ReadPDB", -1);
p.add("DumpMaps", -1);
p.add("LoadMapDump", -1);
po::variables_map vm;
po::store(po::command_line_parser(ac, av).
options(desc).positional(p).run(), vm);
po::notify(vm);
if((ac < 6)) {
std::cout << desc << std::endl;
return 0;
}
if (vm.count("help")) {
cout << "Usage: options_description [options]\n";
cout << desc;
return 0;
}
if (vm.count("Inputfile"))
{
cout << "Input file is: ";
cout << vm["Inputfile"].as< std::string >()<< "\n";
infile=vm["Inputfile"].as< std::string >();
}
if (vm.count("Modelfile"))
{
cout << "Model file is: "
<< vm["Modelfile"].as< std::string >() << "\n";
modelfile=vm["Modelfile"].as< std::string >();
}
if (vm.count("ReadPDB"))
{
cout << "Reading model file in PDB format.\n";
Model.readPDB=true;
}
if (vm.count("DumpMaps"))
{
cout << "Dumping Maps after reading from file.\n";
RefMap.dumpMap = true;
}
if (vm.count("LoadMapDump"))
{
cout << "Loading Map dump.\n";
RefMap.loadMap = true;
}
if (vm.count("Particlesfile"))
{
cout << "Paricle file is: "
<< vm["Particlesfile"].as< std::string >() << "\n";
mapfile=vm["Particlesfile"].as< std::string >();
}
}
catch(std::exception& e)
{
cout << e.what() << "\n";
return 1;
}
/********************* Reading Parameter Input ***************************/
// copying inputfile to param class
param.fileinput = infile.c_str();
param.readParameters();
/********************* Reading Model Input ******************************/
// copying modelfile to model class
Model.filemodel = modelfile.c_str();
Model.readModel();
/********************* Reading Particle Maps Input **********************/
/********* HERE: PROBLEM if maps dont fit on the memory!! ***************/
// copying mapfile to ref map class
RefMap.filemap = mapfile.c_str();
RefMap.readRefMaps();
/****************** Precalculating Necessary Stuff *********************/
precalculate();
po::variables_map vm;
po::store(po::command_line_parser(ac, av).
options(desc).positional(p).run(), vm);
po::notify(vm);
if((ac < 6)) {
std::cout << desc << std::endl;
return 0;
}
if (vm.count("help")) {
cout << "Usage: options_description [options]\n";
cout << desc;
return 0;
}
if (vm.count("Inputfile"))
{
cout << "Input file is: ";
cout << vm["Inputfile"].as< std::string >()<< "\n";
infile=vm["Inputfile"].as< std::string >();
}
if (vm.count("Modelfile"))
{
cout << "Model file is: "
<< vm["Modelfile"].as< std::string >() << "\n";
modelfile=vm["Modelfile"].as< std::string >();
}
if (vm.count("ReadPDB"))
{
cout << "Reading model file in PDB format.\n";
Model.readPDB=true;
}
if (vm.count("DumpMaps"))
{
cout << "Dumping Maps after reading from file.\n";
RefMap.dumpMap = true;
}
if (vm.count("LoadMapDump"))
{
cout << "Loading Map dump.\n";
RefMap.loadMap = true;
}
if (vm.count("Particlesfile"))
{
cout << "Paricle file is: "
<< vm["Particlesfile"].as< std::string >() << "\n";
mapfile=vm["Particlesfile"].as< std::string >();
}
}
catch(std::exception& e)
{
cout << e.what() << "\n";
return 1;
}
/********************* Reading Parameter Input ***************************/
// copying inputfile to param class
param.fileinput = infile.c_str();
param.readParameters();
/********************* Reading Model Input ******************************/
// copying modelfile to model class
Model.filemodel = modelfile.c_str();
Model.readModel();
/********************* Reading Particle Maps Input **********************/
/********* HERE: PROBLEM if maps dont fit on the memory!! ***************/
// copying mapfile to ref map class
RefMap.filemap = mapfile.c_str();
RefMap.readRefMaps(param);
/****************** Precalculating Necessary Stuff *********************/
precalculate();
param.nTotGridAngles = 10;
param.nTotCTFs = 10;
......@@ -170,364 +170,570 @@ int bioem::configure(int ac, char* av[])
deviceInit();
return(0);
return(0);
}
int bioem::precalculate()
{
/**************************************************************************************/
/* Precalculating Routine of Orientation grids, Map crosscorrelations and CTF Kernels */
/**************************************************************************************/
/**************************************************************************************/
/* Precalculating Routine of Orientation grids, Map crosscorrelations and CTF Kernels */
/**************************************************************************************/
// Generating Grids of orientations
param.CalculateGridsParam();
// Generating Grids of orientations
param.CalculateGridsParam();
//Inizialzing crosscorrelations of Maps
memset(RefMap.sum_RefMap, 0, BIOEM_MAX_MAPS * sizeof(*RefMap.sum_RefMap));
memset(RefMap.sumsquare_RefMap, 0, BIOEM_MAX_MAPS * sizeof(*RefMap.sum_RefMap));
//Inizialzing crosscorrelations of Maps
memset(RefMap.sum_RefMap, 0, BIOEM_MAX_MAPS * sizeof(*RefMap.sum_RefMap));
memset(RefMap.sumsquare_RefMap, 0, BIOEM_MAX_MAPS * sizeof(*RefMap.sum_RefMap));
myfloat_t sum,sumsquare;
myfloat_t sum,sumsquare;
//Precalculating cross-correlations of maps
for (int iRefMap = 0; iRefMap < RefMap.ntotRefMap ; iRefMap++)
{
calcross_cor(RefMap.Ref[iRefMap],sum,sumsquare);
//Storing Crosscorrelations in Map class
RefMap.sum_RefMap[iRefMap]=sum;
RefMap.sumsquare_RefMap[iRefMap]=sumsquare;
}
//Precalculating cross-correlations of maps
for (int iRefMap = 0; iRefMap < RefMap.ntotRefMap ; iRefMap++)
{
calcross_cor(RefMap.Ref[iRefMap],sum,sumsquare);
//Storing Crosscorrelations in Map class
RefMap.sum_RefMap[iRefMap]=sum;
RefMap.sumsquare_RefMap[iRefMap]=sumsquare;
}
// Precalculating CTF Kernels stored in class Param
param.CalculateRefCTF();
// Precalculating CTF Kernels stored in class Param
param.CalculateRefCTF();
// Precalculating Maps in Fourier space
RefMap.PreCalculateMapsFFT(param);
return(0);
return(0);
}
int bioem::run()
{
/**************************************************************************************/
/**** Main BioEM routine, projects, convolutes and compares with Map using OpenMP ****/
/**************************************************************************************/
/**** If we want to control the number of threads -> omp_set_num_threads(XX); ******/
/****************** Declarying class of Probability Pointer *************************/
pProb = new bioem_Probability[RefMap.ntotRefMap];
printf("\tInitializing\n");
// Inizialzing Probabilites to zero and constant to -Infinity
for (int iRefMap = 0; iRefMap < RefMap.ntotRefMap; iRefMap ++)
{
pProb[iRefMap].Total=0.0;
pProb[iRefMap].Constoadd=-9999999;
pProb[iRefMap].max_prob=-9999999;
for (int iOrient = 0; iOrient < param.nTotGridAngles; iOrient ++)
/**************************************************************************************/
/**** Main BioEM routine, projects, convolutes and compares with Map using OpenMP ****/
/**************************************************************************************/
/**** If we want to control the number of threads -> omp_set_num_threads(XX); ******/
/****************** Declarying class of Probability Pointer *************************/
pProb = new bioem_Probability[RefMap.ntotRefMap];
crossCor = new bioem_crossCor[RefMap.ntotRefMap];
printf("\tInitializing\n");
// Inizialzing Probabilites to zero and constant to -Infinity
for (int iRefMap = 0; iRefMap < RefMap.ntotRefMap; iRefMap ++)
{
pProb[iRefMap].Total=0.0;
pProb[iRefMap].Constoadd=-9999999;
pProb[iRefMap].max_prob=-9999999;
for (int iOrient = 0; iOrient < param.nTotGridAngles; iOrient ++)
{
pProb[iRefMap].forAngles[iOrient]=0.0;
pProb[iRefMap].ConstAngle[iOrient]=-99999999;
}
}
/**************************************************************************************/
pProb[iRefMap].forAngles[iOrient]=0.0;
pProb[iRefMap].ConstAngle[iOrient]=-99999999;
}
}
/**************************************************************************************/
deviceStartRun();
/******************************** MAIN CYCLE ******************************************/
/******************************** MAIN CYCLE ******************************************/
/*** Declaring Private variables for each thread *****/
mycomplex_t* proj_mapFFT;
bioem_map conv_map;
/*** Declaring Private variables for each thread *****/
mycomplex_t* proj_mapFFT;
bioem_map conv_map;
mycomplex_t* conv_mapFFT;
myfloat_t sumCONV,sumsquareCONV;
//allocating fftw_complex vector
proj_mapFFT= (mycomplex_t *) fftw_malloc(sizeof(mycomplex_t) *4*param.param_device.NumberPixels*param.param_device.NumberPixels);
proj_mapFFT= (mycomplex_t *) myfftw_malloc(sizeof(mycomplex_t) *param.param_device.NumberPixels*param.param_device.NumberPixels);
conv_mapFFT= (mycomplex_t *) myfftw_malloc(sizeof(mycomplex_t)*param.param_device.NumberPixels*param.param_device.NumberPixels);
HighResTimer timer;
printf("\tMain Loop (GridAngles %d, CTFs %d, RefMaps %d, Shifts (%d/%d)²), Pixels %d²\n", param.nTotGridAngles, param.nTotCTFs, RefMap.ntotRefMap, 2 * param.param_device.maxDisplaceCenter + param.param_device.GridSpaceCenter, param.param_device.GridSpaceCenter, param.param_device.NumberPixels);
printf("\tInner Loop Count (%d %d %d) %lld\n", param.param_device.maxDisplaceCenter, param.param_device.GridSpaceCenter, param.param_device.NumberPixels, (long long int) (param.param_device.NumberPixels * param.param_device.NumberPixels * (2 * param.param_device.maxDisplaceCenter / param.param_device.GridSpaceCenter + 1) * (2 * param.param_device.maxDisplaceCenter / param.param_device.GridSpaceCenter + 1)));
//#pragma omp parallel for
for (int iProjectionOut = 0; iProjectionOut < param.nTotGridAngles; iProjectionOut++)
{
/***************************************************************************************/
/***** Creating Projection for given orientation and transforming to Fourier space *****/
//#pragma omp parallel for
for (int iProjectionOut = 0; iProjectionOut < param.nTotGridAngles; iProjectionOut++)
{
/***************************************************************************************/
/***** Creating Projection for given orientation and transforming to Fourier space *****/
timer.ResetStart();
createProjection(iProjectionOut, proj_mapFFT);
createProjection(iProjectionOut, proj_mapFFT);
printf("Time Projection %d: %f\n", iProjectionOut, timer.GetCurrentElapsedTime());
/***************************************************************************************/
/***** **** Internal Loop over convolutions **** *****/
for (int iConv = 0; iConv < param.nTotCTFs; iConv++)
{
/***************************************************************************************/
/***** **** Internal Loop over convolutions **** *****/
for (int iConv = 0; iConv < param.nTotCTFs; iConv++)
{
printf("\t\tConvolution %d %d\n", iProjectionOut, iConv);
/*** Calculating convolutions of projection map and crosscorrelations ***/
/*** Calculating convolutions of projection map and crosscorrelations ***/
memset(conv_mapFFT,0,param.param_device.NumberPixels*param.param_device.NumberPixels*sizeof(*conv_mapFFT));
timer.ResetStart();
createConvolutedProjectionMap(iProjectionOut,iConv,proj_mapFFT,conv_map);
createConvolutedProjectionMap(iProjectionOut,iConv,proj_mapFFT,conv_map,conv_mapFFT,sumCONV,sumsquareCONV);
printf("Time Convolution %d %d: %f\n", iProjectionOut, iConv, timer.GetCurrentElapsedTime());
/***************************************************************************************/
/*** Comparing each calculated convoluted map with all experimental maps ***/
/***************************************************************************************/
/*** Comparing each calculated convoluted map with all experimental maps ***/
timer.ResetStart();
compareRefMaps(iProjectionOut, iConv, conv_map);
if (FFTAlgo == 0)
{
compareRefMaps(iProjectionOut, iConv, conv_map);
}
else
{
compareRefMaps2(iProjectionOut, iConv,conv_mapFFT,sumCONV,sumsquareCONV);
}
const double compTime = timer.GetCurrentElapsedTime();
const int nShifts = 2 * param.param_device.maxDisplaceCenter / param.param_device.GridSpaceCenter + 1;
const double nFlops = (double) RefMap.ntotRefMap * (double) nShifts * (double) nShifts *
(((double) param.param_device.NumberPixels - (double) param.param_device.maxDisplaceCenter / 2.) * ((double) param.param_device.NumberPixels - (double) param.param_device.maxDisplaceCenter / 2.) * 5. + 25.) / compTime;
(((double) param.param_device.NumberPixels - (double) param.param_device.maxDisplaceCenter / 2.) * ((double) param.param_device.NumberPixels - (double) param.param_device.maxDisplaceCenter / 2.) * 5. + 25.) / compTime;
const double nGBs = (double) RefMap.ntotRefMap * (double) nShifts * (double) nShifts *
(((double) param.param_device.NumberPixels - (double) param.param_device.maxDisplaceCenter / 2.) * ((double) param.param_device.NumberPixels - (double) param.param_device.maxDisplaceCenter / 2.) * 2. + 8.) * (double) sizeof(myfloat_t) / compTime;
(((double) param.param_device.NumberPixels - (double) param.param_device.maxDisplaceCenter / 2.) * ((double) param.param_device.NumberPixels - (double) param.param_device.maxDisplaceCenter / 2.) * 2. + 8.) * (double) sizeof(myfloat_t) / compTime;
const double nGBs2 = (double) RefMap.ntotRefMap * ((double) param.param_device.NumberPixels * (double) param.param_device.NumberPixels + 8.) * (double) sizeof(myfloat_t) / compTime;
printf("Time Comparison %d %d: %f sec (%f GFlops, %f GB/s (cached), %f GB/s)\n", iProjectionOut, iConv, compTime, nFlops / 1000000000., nGBs / 1000000000., nGBs2 / 1000000000.);
}
}
}
//deallocating fftw_complex vector
fftw_free(proj_mapFFT);
}
//deallocating fftw_complex vector
myfftw_free(proj_mapFFT);
myfftw_free(conv_mapFFT);
deviceFinishRun();
/************* Writing Out Probabilities ***************/
/************* Writing Out Probabilities ***************/
/*** Angular Probability ***/
/*** Angular Probability ***/
// if(param.writeAngles){
ofstream angProbfile;
angProbfile.open ("ANG_PROB_iRefMap");
// }
// if(param.writeAngles){
ofstream angProbfile;
angProbfile.open ("ANG_PROB_iRefMap");
// }
ofstream outputProbFile;
outputProbFile.open ("Output_Probabilities");
ofstream outputProbFile;
outputProbFile.open ("Output_Probabilities");
for (int iRefMap = 0; iRefMap < RefMap.ntotRefMap; iRefMap ++)
{
/**** Total Probability ***/
outputProbFile << "RefMap " << iRefMap << " Probability " << log(pProb[iRefMap].Total)+pProb[iRefMap].Constoadd+0.5*log(M_PI)+(1-param.param_device.Ntotpi*0.5)*(log(2*M_PI)+1)+log(param.param_device.volu) << " Constant " << pProb[iRefMap].Constoadd << "\n";
outputProbFile << "RefMap " << iRefMap << " Maximizing Param: ";
/*** Param that maximize probability****/
outputProbFile << (pProb[iRefMap].max_prob + 0.5 * log(M_PI) + (1 - param.param_device.Ntotpi * 0.5) * (log(2 * M_PI) + 1) + log(param.param_device.volu)) << " ";
outputProbFile << param.angles[pProb[iRefMap].max_prob_orient].pos[0] << " ";
outputProbFile << param.angles[pProb[iRefMap].max_prob_orient].pos[1] << " ";
outputProbFile << param.angles[pProb[iRefMap].max_prob_orient].pos[2] << " ";
outputProbFile << param.CtfParam[pProb[iRefMap].max_prob_conv].pos[0] << " ";
outputProbFile << param.CtfParam[pProb[iRefMap].max_prob_conv].pos[1] << " ";
outputProbFile << param.CtfParam[pProb[iRefMap].max_prob_conv].pos[2] << " ";
for (int iRefMap = 0; iRefMap < RefMap.ntotRefMap; iRefMap ++)
{
/**** Total Probability ***/
outputProbFile << "RefMap " << iRefMap << " Probability " << log(pProb[iRefMap].Total)+pProb[iRefMap].Constoadd+0.5*log(M_PI)+(1-param.param_device.Ntotpi*0.5)*(log(2*M_PI)+1)+log(param.param_device.volu) << " Constant " << pProb[iRefMap].Constoadd << "\n";
outputProbFile << "RefMap " << iRefMap << " Maximizing Param: ";
/*** Param that maximize probability****/
outputProbFile << (pProb[iRefMap].max_prob + 0.5 * log(M_PI) + (1 - param.param_device.Ntotpi * 0.5) * (log(2 * M_PI) + 1) + log(param.param_device.volu)) << " ";
outputProbFile << param.angles[pProb[iRefMap].max_prob_orient].pos[0] << " ";
outputProbFile << param.angles[pProb[iRefMap].max_prob_orient].pos[1] << " ";
outputProbFile << param.angles[pProb[iRefMap].max_prob_orient].pos[2] << " ";
outputProbFile << param.CtfParam[pProb[iRefMap].max_prob_conv].pos[0] << " ";
outputProbFile << param.CtfParam[pProb[iRefMap].max_prob_conv].pos[1] << " ";
outputProbFile << param.CtfParam[pProb[iRefMap].max_prob_conv].pos[2] << " ";
outputProbFile << pProb[iRefMap].max_prob_cent_x << " ";
outputProbFile << pProb[iRefMap].max_prob_cent_y;
outputProbFile << "\n";
outputProbFile << "\n";
/*** For individual files***/ //angProbfile.open ("ANG_PROB_"iRefMap);
/*** For individual files***/ //angProbfile.open ("ANG_PROB_"iRefMap);
if(param.writeAngles)
if(param.writeAngles)
{
for (int iProjectionOut = 0; iProjectionOut < param.nTotGridAngles; iProjectionOut++)
{
angProbfile << " " << iRefMap << " " << param.angles[iProjectionOut].pos[0] << " " << param.angles[iProjectionOut].pos[1] << " " << param.angles[iProjectionOut].pos[2] << " " << log(pProb[iRefMap].forAngles[iProjectionOut])+pProb[iRefMap].ConstAngle[iProjectionOut]+0.5*log(M_PI)+(1-param.param_device.Ntotpi*0.5)*(log(2*M_PI)+1)+log(param.param_device.volu) << " " << log(param.param_device.volu) << "\n";
for (int iProjectionOut = 0; iProjectionOut < param.nTotGridAngles; iProjectionOut++)
{
angProbfile << " " << iRefMap << " " << param.angles[iProjectionOut].pos[0] << " " << param.angles[iProjectionOut].pos[1] << " " << param.angles[iProjectionOut].pos[2] << " " << log(pProb[iRefMap].forAngles[iProjectionOut])+pProb[iRefMap].ConstAngle[iProjectionOut]+0.5*log(M_PI)+(1-param.param_device.Ntotpi*0.5)*(log(2*M_PI)+1)+log(param.param_device.volu) << " " << log(param.param_device.volu) << "\n";
}
}
}
}
}
}
angProbfile.close();
outputProbFile.close();
angProbfile.close();
outputProbFile.close();
//Deleting allocated pointers
//Deleting allocated pointers
if (pProb)
{
delete[] pProb;
pProb = NULL;
}
if (pProb)
{
delete[] pProb;
pProb = NULL;
}
if (param.refCTF)
{
delete[] param.refCTF;
param.refCTF =NULL;
}
if (param.refCTF)
{
delete[] param.refCTF;
param.refCTF =NULL;
}
if (crossCor)
{
delete[] crossCor;
crossCor = NULL;
}
return(0);
if(RefMap.RefMapFFT)
{
delete[] RefMap.RefMapFFT;
RefMap.RefMapFFT = NULL;
}
return(0);
}
int bioem::compareRefMaps(int iProjectionOut, int iConv, const bioem_map& conv_map, const int startMap)
{
#pragma omp parallel for
for (int iRefMap = startMap; iRefMap < RefMap.ntotRefMap; iRefMap ++)
{
compareRefMapShifted<-1>(iRefMap,iProjectionOut,iConv,conv_map, pProb, param.param_device, RefMap);
}
return(0);
#pragma omp parallel for
for (int iRefMap = startMap; iRefMap < RefMap.ntotRefMap; iRefMap ++)
{
compareRefMapShifted<-1>(iRefMap,iProjectionOut,iConv,conv_map, pProb, param.param_device, RefMap);
}
return(0);
}
int bioem::createProjection(int iMap,mycomplex_t* mapFFT)
int bioem::compareRefMaps2(int iOrient, int iConv, mycomplex_t* localConvFFT,myfloat_t sumC,myfloat_t sumsquareC)
{
#pragma omp parallel for
for (int iRefMap = 0; iRefMap < RefMap.ntotRefMap; iRefMap ++)
{
mycomplex_t* localCCT;
localCCT= (mycomplex_t *) myfftw_malloc(sizeof(mycomplex_t) *param.param_device.NumberPixels*param.param_device.NumberPixels);
mycomplex_t* lCC;