Rosetta
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
density_tools.cc
Go to the documentation of this file.
1 // -*- mode:c++;tab-width:2;indent-tabs-mode:t;show-trailing-whitespace:t;rm-trailing-spaces:t -*-
2 // vi: set ts=2 noet:
3 //
4 // (c) Copyright Rosetta Commons Member Institutions.
5 // (c) This file is part of the Rosetta software suite and is made available under license.
6 // (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
7 // (c) For more information, see http://www.rosettacommons.org. Questions about this can be
8 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
9 
10 /// @file
11 /// @brief
12 
13 #include <protocols/viewer/viewers.hh>
14 
15 #include <protocols/moves/MonteCarlo.hh>
16 #include <protocols/moves/Mover.hh>
17 
18 #include <core/types.hh>
19 
20 #include <core/chemical/AA.hh>
21 #include <core/chemical/ChemicalManager.hh>
22 #include <core/chemical/ResidueTypeSet.fwd.hh>
23 #include <core/scoring/ScoreFunction.hh>
24 #include <core/scoring/ScoreFunctionFactory.hh>
25 #include <core/pose/Pose.hh>
26 #include <core/pose/PDBInfo.hh>
27 #include <core/scoring/electron_density/ElectronDensity.hh>
28 #include <core/import_pose/import_pose.hh>
29 #include <protocols/electron_density/util.hh>
30 #include <protocols/electron_density/SetupForDensityScoringMover.hh>
31 
32 #include <basic/options/util.hh>
33 #include <devel/init.hh>
34 
35 
36 #include <utility/vector1.hh>
37 
38 #include <numeric/xyzVector.hh>
39 #include <numeric/random/random.hh>
40 #include <numeric/constants.hh>
41 
43 #include <core/kinematics/Jump.hh>
44 
45 #include <basic/options/option.hh>
50 
51 // C++ headers
52 #include <iostream>
53 #include <fstream>
54 #include <string>
55 
56 
57 using namespace core;
58 using namespace basic;
59 using namespace utility;
60 using namespace protocols;
61 
62 
63 OPT_1GRP_KEY(File, edensity, alt_mapfile)
64 OPT_1GRP_KEY(Integer, denstools, nresbins)
65 OPT_1GRP_KEY(Integer, denstools, rscc_wdw)
66 OPT_1GRP_KEY(Real, denstools, lowres)
67 OPT_1GRP_KEY(Real, denstools, hires)
68 OPT_1GRP_KEY(Real, denstools, truncate_lowres)
69 OPT_1GRP_KEY(Real, denstools, truncate_hires)
70 OPT_1GRP_KEY(Boolean, denstools, truncate_map)
71 OPT_1GRP_KEY(Boolean, denstools, verbose)
72 OPT_1GRP_KEY(Boolean, denstools, super_verbose)
73 OPT_1GRP_KEY(Boolean, denstools, dump_map_and_mask)
74 OPT_1GRP_KEY(Boolean, denstools, mask)
75 OPT_1GRP_KEY(Boolean, denstools, mask_modelmap)
76 OPT_1GRP_KEY(Real, denstools, mask_resolution)
77 OPT_1GRP_KEY(Boolean, denstools, perres)
78 OPT_1GRP_KEY(Boolean, denstools, bin_squared)
79 OPT_1GRP_KEY(Boolean, denstools, maskonly)
80 OPT_1GRP_KEY(Boolean, denstools, cutonly)
81 
82 
83 using core::scoring::electron_density::poseCoords;
84 using core::scoring::electron_density::poseCoord;
85 
86 // map atom names to elements
87 // loosely based on openbabel logic
88 std::string
89 name2elt( std::string line ) {
90  std::string atmid = line.substr(12,4);
91  while ( !atmid.empty() && atmid[0] == ' ' ) atmid = atmid.substr(1,atmid.size()-1);
92  while ( !atmid.empty() && atmid[atmid.size()-1] == ' ' ) atmid = atmid.substr(0,atmid.size()-1);
93  std::string resname = line.substr(17,3);
94  while ( !resname.empty() && resname[0] == ' ' ) resname = resname.substr(1,resname.size()-1);
95  while ( !resname.empty() && resname[resname.size()-1] == ' ' ) resname = resname.substr(0,resname.size()-1);
96 
97  std::string type;
98 
99  if ( line.substr(0,4) == "ATOM" ) {
100  type = atmid.substr(0,2);
101  if ( isdigit(type[0]) ) {
102  // sometimes non-standard files have, e.g 11HH
103  if ( !isdigit(type[1]) ) type = atmid.substr(1,1);
104  else type = atmid.substr(2,1);
105  } else if ( (line[12] == ' ' && type!="Zn" && type!="Fe" && type!="ZN" && type!="FE")
106  || isdigit(type[1]) ) {
107  type = atmid.substr(0,1); // one-character element
108  }
109 
110  if ( resname.substr(0,2) == "AS" || resname[0] == 'N' ) {
111  if ( atmid == "AD1" ) type = "O";
112  if ( atmid == "AD2" ) type = "N";
113  }
114  if ( resname.substr(0,3) == "HIS" || resname[0] == 'H' ) {
115  if ( atmid == "AD1" || atmid == "AE2" ) type = "N";
116  if ( atmid == "AE1" || atmid == "AD2" ) type = "C";
117  }
118  if ( resname.substr(0,2) == "GL" || resname[0] == 'Q' ) {
119  if ( atmid == "AE1" ) type = "O";
120  if ( atmid == "AE2" ) type = "N";
121  }
122  if ( atmid.substr(0,2) == "HH" ) { // ARG
123  type = "H";
124  }
125  if ( atmid.substr(0,2) == "HD" || atmid.substr(0,2) == "HE" || atmid.substr(0,2) == "HG" ) {
126  type = "H";
127  }
128  } else {
129  if ( isalpha(atmid[0]) ) {
130  if ( atmid.size() > 2 && (atmid[2] == '\0' || atmid[2] == ' ') ) {
131  type = atmid.substr(0,2);
132  } else if ( atmid[0] == 'A' ) { // alpha prefix
133  type = atmid.substr(1, atmid.size() - 1);
134  } else {
135  type = atmid.substr(0,1);
136  }
137  } else if ( atmid[0] == ' ' ) {
138  type = atmid.substr(1,1); // one char element
139  } else {
140  type = atmid.substr(1,2);
141  }
142 
143  if ( atmid == resname ) {
144  type = atmid;
145  if ( type.size() == 2 ) type[1] = toupper(type[1]);
146  } else if ( resname == "ADR" || resname == "COA" || resname == "FAD" ||
147  resname == "GPG" || resname == "NAD" || resname == "NAL" ||
148  resname == "NDP" || resname == "ABA" ) {
149  if ( type.size() > 1 ) type = type.substr(0,1);
150  } else if ( isdigit(type[0]) ) {
151  type = type.substr(1,1);
152  } else if ( type.size() > 1 && isdigit(type[1]) ) {
153  type = type.substr(0,1);
154  } else if ( type.size() > 1 && isalpha(type[1]) ) {
155  if ( type[0] == 'O' && type[1] == 'H' ) {
156  type = type.substr(0,1); // no "Oh" element (e.g. 1MBN)
157  } else if ( islower(type[1]) ) {
158  type[1] = toupper(type[1]);
159  }
160  }
161  }
162  return type;
163 }
164 
165 
166 // quick and dirty PDB read where we only care about heavyatom locations and atom ids
167 void
168 readPDBcoords(std::string filename, poseCoords &atmlist) {
169  std::ifstream inpdb(filename.c_str());
170  std::string buf;
171 
172  while ( std::getline(inpdb, buf ) ) {
173  if ( buf.substr(0,4)!="ATOM" && buf.substr(0,6)!="HETATM" ) continue;
174  poseCoord atom_i;
175 
176  atom_i.x_[0] = atof(buf.substr(30,8).c_str());
177  atom_i.x_[1] = atof(buf.substr(38,8).c_str());
178  atom_i.x_[2] = atof(buf.substr(46,8).c_str());
179  atom_i.B_ = atof(buf.substr(60,6).c_str());
180 
181  atom_i.elt_ = name2elt( buf ); // horrible hacky logic mapping name->elt (could use PDB fields 76-77 if on by default)
182  if ( atom_i.elt_ == "H" ) continue;
183 
184  atmlist.push_back( atom_i );
185  }
186 }
187 
188 
189 ///////////////////////////////////////////////////////////////////////////////
190 void
192 {
193  using namespace protocols::moves;
194  using namespace scoring;
195  using namespace basic::options;
196  using namespace basic::options::OptionKeys;
197 
198  // outputs
199  Size nresobins = option[ denstools::nresbins ]();
200  bool bin_squared = option[ denstools::bin_squared ]();
201  utility::vector1< core::Real > resobins, mapI, maskedmapI, modelI, maskI;
202  utility::vector1< core::Size > resobin_counts;
204 
205  utility::vector1< core::Real > mapmapFSC, maskedMapMapFSC;
206  utility::vector1< core::Real > modelmapFSC, maskedModelMapFSC;
207 
208  // resolution limits for analysis
209  core::Real hires = option[ denstools::hires ]();
211  core::Real truncate_hires = option[ denstools::truncate_hires ]();
212  core::Real truncate_lowres = option[ denstools::truncate_lowres ]();
213  core::Real mask_resolution = option[ denstools::mask_resolution ]();
214  bool perres =option[ denstools::perres ]();
215 
216  ObjexxFCL::FArray3D< double > rhoC, rhoMask, rhoOmask, rhoO2mask;
217  ObjexxFCL::FArray3D< std::complex<double> > FrhoC, FrhoMask, FrhoCmask, FrhoOmask, FrhoO2mask;
219 
220  if ( hires == 0.0 ) hires = core::scoring::electron_density::getDensityMap().maxNominalRes();
221  if ( truncate_hires == 0.0 ) truncate_hires = core::scoring::electron_density::getDensityMap().maxNominalRes();
222 
223  runtime_assert( lowres > hires );
224  runtime_assert( truncate_lowres > truncate_hires );
225 
226  hires = 1.0/hires;
227  lowres = 1.0/lowres;
228  truncate_lowres = 1.0/truncate_lowres;
229  truncate_hires = 1.0/truncate_hires;
230 
231  // fft
232  std::cout << "Stage 1: FFT rho_obs" << std::endl;
233  numeric::fourier::fft3(core::scoring::electron_density::getDensityMap().get_data(), FrhoO);
234  core::scoring::electron_density::getDensityMap().getIntensities(FrhoO, nresobins, lowres, hires, mapI, bin_squared);
235 
236  // load model, mask density
237  std::cout << "Stage 2: model processing" << std::endl;
238  bool userpose = (option[ in::file::s ].user());
239 
240  core::scoring::electron_density::getDensityMap().getResolutionBins(nresobins, lowres, hires, resobins, resobin_counts, bin_squared);
241 
242  // Truncate map only
243  if ( option[ denstools::truncate_map ] ) {
244  utility::vector1< core::Real > trunc = mapI;
245  for ( int i=1; i<=(int)mapI.size(); ++i ) {
246  if ( resobins[i] <= truncate_lowres || resobins[i] >= truncate_hires ) {
247  trunc[i] = 0;
248  } else {
249  trunc[i] = 1;
250  }
251  }
252 
253  core::scoring::electron_density::getDensityMap().scaleIntensities( trunc, lowres, hires, bin_squared );
254  core::scoring::electron_density::getDensityMap().writeMRC( "map_trunc.mrc" );
255  std::cout << "Wrote truncated map" << std::endl;
256  return;
257  }
258 
259  poseCoords pose;
260  core::pose::Pose fullpose; // needed for per-residue stats (if requested)
261  std::string pdbfile;
262  if ( userpose ) {
265 
266  std::cout << " : calc rho_c" << std::endl;
267  core::scoring::electron_density::getDensityMap().calcRhoC( pose, mask_resolution, rhoC, rhoMask );
268  }
269 
270  // Mask map only
271  if ( option[ denstools::maskonly ] ) {
272  if ( !userpose ) {
273  utility_exit_with_message(" -maskonly given but no PDB file provided!");
274  }
275 
276  rhoOmask = rhoMask;
277  for ( int i=0; i<rhoC.u1()*rhoC.u2()*rhoC.u3(); ++i ) {
278  rhoOmask[i] *= core::scoring::electron_density::getDensityMap().get_data()[i];
279  }
280 
281  core::scoring::electron_density::getDensityMap().set_data(rhoOmask);
282  core::scoring::electron_density::getDensityMap().writeMRC( option[ edensity::mapfile]+"_masked.mrc" );
283  return;
284  }
285 
286  // Cut map only
287  if ( option[ denstools::cutonly ] ) {
288  if ( !userpose ) {
289  utility_exit_with_message(" -maskonly given but no PDB file provided!");
290  }
291 
292  rhoOmask = rhoMask;
293  for ( int i=0; i<rhoC.u1()*rhoC.u2()*rhoC.u3(); ++i ) {
294  rhoOmask[i] = (1-rhoOmask[i])*core::scoring::electron_density::getDensityMap().get_data()[i];
295  }
296 
297  core::scoring::electron_density::getDensityMap().set_data(rhoOmask);
298  core::scoring::electron_density::getDensityMap().writeMRC( option[ edensity::mapfile]+"_cut.mrc" );
299  return;
300  }
301 
302  // collect masked map statistics
303  if ( userpose ) {
304  std::cout << " : FFT" << std::endl;
305  numeric::fourier::fft3(rhoC, FrhoC);
306  numeric::fourier::fft3(rhoMask, FrhoMask);
307 
308  // apply mask
309  std::cout << " : mask map" << std::endl;
310  rhoOmask = rhoMask;
311  for ( int i=0; i<rhoC.u1()*rhoC.u2()*rhoC.u3(); ++i ) {
312  rhoOmask[i] *= core::scoring::electron_density::getDensityMap().get_data()[i];
313  }
314  numeric::fourier::fft3(rhoOmask, FrhoOmask);
315 
316  // intensities
317  std::cout << " : get intensities" << std::endl;
318  core::scoring::electron_density::getDensityMap().getIntensities(FrhoC, nresobins, lowres, hires, modelI, bin_squared);
319  core::scoring::electron_density::getDensityMap().getIntensities(FrhoMask, nresobins, lowres, hires, maskI, bin_squared);
320  core::scoring::electron_density::getDensityMap().getIntensities(FrhoOmask, nresobins, lowres, hires, maskedmapI, bin_squared);
321  }
322 
323 
324  // map vs map stats
325  std::cout << "Stage 3: map vs map" << std::endl;
326  core::scoring::electron_density::ElectronDensity mapAlt;
327  bool usermap = option[ edensity::alt_mapfile ].user();
328  if ( usermap ) {
329  std::string mapfile = option[ edensity::alt_mapfile ];
331  core::Real mapsampling = option[ edensity::grid_spacing ]();
332  std::cout << " : load alt_map + FFT" << std::endl;
333  mapAlt.readMRCandResize( mapfile , mapreso , mapsampling );
334  numeric::fourier::fft3(mapAlt.get_data(), FrhoO2);
335 
336  if ( userpose ) {
337  std::cout << " : mask alt_map" << std::endl;
338  rhoO2mask = rhoMask;
339  for ( int i=0; i<rhoC.u1()*rhoC.u2()*rhoC.u3(); ++i ) {
340  rhoO2mask[i] *= mapAlt.get_data()[i];
341  }
342  numeric::fourier::fft3(rhoO2mask, FrhoO2mask);
343  }
344 
345  // unmasked
346  std::cout << " : get FSCs" << std::endl;
347  core::scoring::electron_density::getDensityMap().getFSC(FrhoO, FrhoO2, nresobins, lowres, hires, mapmapFSC, bin_squared);
348 
349  // masked
350  if ( userpose ) {
351  core::scoring::electron_density::getDensityMap().getFSC(FrhoOmask, FrhoO2mask, nresobins, lowres, hires, mapmapFSC, bin_squared);
352  }
353  }
354 
355  // [3] model-map stats (intensity + model v map FSC + RSCC + per-res corrleations)
356  Real modelMapFSCsum=0, maskedModelMapFSCsum=0, RSCC=0;
357 
358  std::cout << "Stage 4: model vs map" << std::endl;
359  if ( userpose ) {
360  if ( perres ) {
361  std::cout << " : per-res" << std::endl;
362  core::chemical::ResidueTypeSetCAP rsd_set;
363  rsd_set = core::chemical::ChemicalManager::get_instance()->residue_type_set( "fa_standard" );
364  core::import_pose::pose_from_file( fullpose, pdbfile , core::import_pose::PDB_file);
365 
366  core::Size nres = fullpose.total_residue();
367  perResCC.resize( nres, 0.0 );
368 
369  protocols::electron_density::SetupForDensityScoringMoverOP dockindens( new protocols::electron_density::SetupForDensityScoringMover );
370  dockindens->apply( fullpose );
371 
372  core::scoring::electron_density::getDensityMap().set_nres( nres );
373  core::scoring::electron_density::getDensityMap().setScoreWindowContext( true );
374  core::scoring::electron_density::getDensityMap().setWindow( option[ denstools::rscc_wdw ]() );
375 
376  core::scoring::ScoreFunctionOP scorefxn = core::scoring::get_score_function();
377  scorefxn->set_weight( core::scoring::elec_dens_window, 1.0 );
378  (*scorefxn)(fullpose);
379 
380  for ( core::uint r = 1; r <= nres; ++r ) {
381  perResCC[r] = core::scoring::electron_density::getDensityMap().matchRes( r , fullpose.residue(r), fullpose, NULL , false);
382  }
383  }
384 
385  std::cout << " : FSCs" << std::endl;
386  core::scoring::electron_density::getDensityMap().getFSC(FrhoO, FrhoC, nresobins, lowres, hires, modelmapFSC, bin_squared);
387  core::scoring::electron_density::getDensityMap().getFSC(FrhoOmask, FrhoC, nresobins, lowres, hires, maskedModelMapFSC, bin_squared);
388 
389  std::cout << " : RSCC" << std::endl;
390  RSCC = core::scoring::electron_density::getDensityMap().getRSCC( rhoC, rhoMask );
391 
392  // sum FSC over reso bins
393  for ( Size i=1; i<=resobins.size(); ++i ) {
394  modelMapFSCsum += modelmapFSC[i];
395  maskedModelMapFSCsum += maskedModelMapFSC[i];
396  }
397  modelMapFSCsum /= resobins.size();
398  maskedModelMapFSCsum /= resobins.size();
399  }
400 
401  // verbose
402  if ( option[ denstools::verbose ]() ) {
403  std::cerr << "res count";
404  if ( mapI.size() ) std::cerr << " I_map";
405  if ( maskedmapI.size() ) std::cerr << " I_map_masked";
406  if ( modelI.size() ) std::cerr << " I_model" ;
407  if ( maskI.size() ) std::cerr << " I_mask" ;
408  if ( mapmapFSC.size() ) std::cerr << " FSC_mapmap";
409  if ( modelmapFSC.size() ) std::cerr << " FSC_modelmap";
410  if ( maskedModelMapFSC.size() ) std::cerr << " FSC_maskedmodelmap";
411  std::cerr << std::endl;
412  for ( Size i=1; i<=resobins.size(); ++i ) {
413  std::cerr << resobins[i] << " " << resobin_counts[i];
414  if ( mapI.size() ) std::cerr << " " << mapI[i];
415  if ( maskedmapI.size() ) std::cerr << " " << maskedmapI[i];
416  if ( modelI.size() ) std::cerr << " " << modelI[i];
417  if ( maskI.size() ) std::cerr << " " << maskI[i];
418  if ( mapmapFSC.size() ) std::cerr << " " << mapmapFSC[i];
419  if ( modelmapFSC.size() ) std::cerr << " " << modelmapFSC[i];
420  if ( maskedModelMapFSC.size() ) std::cerr << " " << maskedModelMapFSC[i];
421  std::cerr << std::endl;
422  }
423  }
424 
425  // dump
426  if ( userpose && option[ denstools::dump_map_and_mask ]() ) {
427  core::scoring::electron_density::getDensityMap().set_data(rhoOmask);
428  core::scoring::electron_density::getDensityMap().writeMRC( "map_masked.mrc" );
429 
430  core::scoring::electron_density::getDensityMap().set_data(rhoC);
431  core::scoring::electron_density::getDensityMap().writeMRC( "model_dens.mrc" );
432 
433  core::scoring::electron_density::getDensityMap().set_data(rhoMask);
434  core::scoring::electron_density::getDensityMap().writeMRC( "model_mask.mrc" );
435  }
436 
437  if ( userpose && option[ denstools::perres ]() ) {
438  for ( core::uint r = 1; r <= perResCC.size(); ++r ) {
439  std::cerr << "PERRESCC residue " << r << " " << perResCC[r] << std::endl;
440  }
441  }
442 
443  // compact
444  if ( userpose ) {
445  std::cerr << pdbfile << "RSCC/FSC/FSCmask: " << RSCC << " " << modelMapFSCsum << " " << maskedModelMapFSCsum;
446  std::cerr << std::endl;
447  }
448 }
449 
450 
451 ///////////////////////////////////////////////////////////////////////////////
452 
453 int
454 main( int argc, char * argv [] )
455 {
456  try {
457  // options, random initialization
458  NEW_OPT(denstools::lowres, "low res limit", 1000.0);
459  NEW_OPT(denstools::hires, "high res limit", 0.0);
460  NEW_OPT(edensity::alt_mapfile, "alt mapfile", "");
461  NEW_OPT(denstools::nresbins, "# resolution bins for statistics", 200);
462  NEW_OPT(denstools::truncate_map, "dump map with map I scaled to to model I?", false);
463  NEW_OPT(denstools::truncate_lowres, "low res truncation", 1000.0);
464  NEW_OPT(denstools::truncate_hires, "high res truncation", 0.0);
465  NEW_OPT(denstools::dump_map_and_mask, "dump mrc of rho_calc and eps_calc", false);
466  NEW_OPT(denstools::mask, "mask all calcs", false);
467  NEW_OPT(denstools::mask_modelmap, "mask model-map calcs only", false);
468  NEW_OPT(denstools::mask_resolution, "radius for masking", 0.0);
469  NEW_OPT(denstools::perres, "output per-residue stats", false);
470  NEW_OPT(denstools::verbose, "dump extra output", false);
471  NEW_OPT(denstools::super_verbose, "dump a lot of extra output", false);
472  NEW_OPT(denstools::bin_squared, "bin uniformly in 1/res^2 (default bins 1/res)", false);
473  NEW_OPT(denstools::rscc_wdw, "sliding window to calculate rscc", 3);
474  NEW_OPT(denstools::maskonly, "mask", false);
475  NEW_OPT(denstools::cutonly, "cut", false);
476 
477  devel::init( argc, argv );
478  densityTools();
479  } catch ( utility::excn::EXCN_Base const & e ) {
480  std::cout << "caught exception " << e.msg() << std::endl;
481  return -1;
482  }
483  return 0;
484 }
ocstream cerr(std::cerr)
Wrapper around std::cerr.
Definition: ocstream.hh:290
#define utility_exit_with_message(m)
Exit with file + line + message.
Definition: exit.hh:47
virtual std::string const msg() const
Definition: EXCN_Base.hh:70
std::istream & getline(std::istream &stream, Fstring &s)
Get Line from Stream.
Definition: Fstring.cc:1610
void init(int argc, char *argv[])
Command line init() version.
Definition: init.cc:23
core::pose::Pose Pose
Definition: supercharge.cc:101
#define runtime_assert(_Expression)
Assert that the condition holds. Evaluated for both debug and release builds.
Definition: exit.hh:63
Random number generator system.
std::string start_file()
kind of like the old -s – just one file
Definition: util.cc:41
BooleanOptionKey const edensity
void fft3(ObjexxFCL::FArray3D< std::complex< double > > const &X, ObjexxFCL::FArray3D< std::complex< double > > &fX)
3D fft c->c double
Definition: FFT.cc:152
tuple scorefxn
Definition: PyMOL_demo.py:63
basic::options::OptionKeys collection
RealOptionKey const grid_spacing("edensity:grid_spacing")
macros to define options on a per-application basis at the top of app files (those with main) ...
StringOptionKey const mapfile("edensity:mapfile")
basic::options::OptionKeys collection
void readPDBcoords(std::string filename, poseCoords &atmlist)
basic::options::OptionKeys collection
rule< Scanner, options_closure::context_t > options
Definition: Tag.cc:377
double Real
Definition: types.hh:39
BooleanOptionKey const verbose
int main(int argc, char *argv[])
static char * line
Definition: Svm.cc:2683
#define NEW_OPT(akey, help, adef)
ocstream cout(std::cout)
Wrapper around std::cout.
Definition: ocstream.hh:287
vector1: std::vector with 1-based indexing
void densityTools()
std::string name2elt(std::string line)
std::size_t uint
Definition: types.hh:39
Common numeric constants in varying precisions.
#define OPT_1GRP_KEY(type, grp, key)
Program options global and initialization function.
Fast (x,y,z)-coordinate numeric vector.
RealOptionKey const mapreso("edensity:mapreso")
platform::Size Size
Definition: random.fwd.hh:30
FileVectorOptionKey const s("in:file:s")
rule< Scanner, option_closure::context_t > option
Definition: Tag.cc:378
FArray3D: Fortran-Compatible 3D Array.
Definition: FArray3.hh:27