Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/builder.cpp

    r112b09 r980dd6  
    4747 */
    4848
    49 #include "Helpers/MemDebug.hpp"
    5049
    5150#include <boost/bind.hpp>
     
    8584#include "version.h"
    8685#include "World.hpp"
    87 
     86#include "Helpers/MemDebug.hpp"
    8887
    8988/********************************************* Subsubmenu routine ************************************/
     
    15311530            break;
    15321531          case 'v':
    1533             setVerbosity(atoi(argv[argptr]));
    1534             ArgcList.insert(argptr-1);
    1535             ArgcList.insert(argptr);
    1536             argptr++;
     1532            if ((argptr >= argc) || (argv[argptr][0] == '-')) {
     1533              DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments for specifying verbosity: -v <level>" << endl);
     1534              performCriticalExit();
     1535            } else {
     1536              setVerbosity(atoi(argv[argptr]));
     1537              ArgcList.insert(argptr-1);
     1538              ArgcList.insert(argptr);
     1539              argptr++;
     1540            }
    15371541            break;
    15381542          case 'V':
     
    15411545            break;
    15421546          case 'B':
    1543             ArgcList.insert(argptr-1);
    1544             ArgcList.insert(argptr);
    1545             ArgcList.insert(argptr+1);
    1546             ArgcList.insert(argptr+2);
    1547             ArgcList.insert(argptr+3);
    1548             ArgcList.insert(argptr+4);
    1549             ArgcList.insert(argptr+5);
    1550             argptr+=6;
    15511547            if (ExitFlag == 0) ExitFlag = 1;
     1548            if ((argptr+5 >= argc)) {
     1549              DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments for setting Box: -B <xx> <<xy> <<xz> <yy> <yz> <zz>" << endl);
     1550              performCriticalExit();
     1551            } else {
     1552              ArgcList.insert(argptr-1);
     1553              ArgcList.insert(argptr);
     1554              ArgcList.insert(argptr+1);
     1555              ArgcList.insert(argptr+2);
     1556              ArgcList.insert(argptr+3);
     1557              ArgcList.insert(argptr+4);
     1558              ArgcList.insert(argptr+5);
     1559              argptr+=6;
     1560            }
    15521561            break;
    15531562          case 'e':
     
    15561565              performCriticalExit();
    15571566            } else {
    1558               DoLog(0) && (Log() << Verbose(0) << "Using " << argv[argptr] << " as elements database." << endl);
    1559               strncpy (configuration.databasepath, argv[argptr], MAXSTRINGSIZE-1);
    1560               DatabasePathGiven = true;
     1567              ArgcList.insert(argptr-1);
     1568              ArgcList.insert(argptr);
    15611569              argptr+=1;
    15621570            }
     
    15671575              performCriticalExit();
    15681576            } else {
    1569               BondGraphFileName = argv[argptr];
    1570               DoLog(0) && (Log() << Verbose(0) << "Using " << BondGraphFileName << " as bond length table." << endl);
     1577              ArgcList.insert(argptr-1);
     1578              ArgcList.insert(argptr);
    15711579              argptr+=1;
    15721580            }
     
    15781586              performCriticalExit();
    15791587            } else {
    1580               configuration.basis = argv[argptr];
    1581               DoLog(1) && (Log() << Verbose(1) << "Setting MPQC basis to " << configuration.basis << "." << endl);
     1588              ArgcList.insert(argptr-1);
     1589              ArgcList.insert(argptr);
    15821590              argptr+=1;
    15831591            }
    15841592            break;
    15851593          case 'n':
    1586             DoLog(0) && (Log() << Verbose(0) << "I won't parse trajectories." << endl);
    1587             configuration.FastParsing = true;
     1594            if ((argptr >= argc) || (argv[argptr][0] == '-')) {
     1595              ExitFlag = 255;
     1596              DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for setting fast-parsing: -n <0/1>" << endl);
     1597              performCriticalExit();
     1598            } else {
     1599              ArgcList.insert(argptr-1);
     1600              ArgcList.insert(argptr);
     1601              argptr+=1;
     1602            }
    15881603            break;
    15891604          case 'X':
    1590             {
    1591               World::getInstance().setDefaultName(argv[argptr]);
    1592               DoLog(0) && (Log() << Verbose(0) << "Default name of new molecules set to " << World::getInstance().getDefaultName() << "." << endl);
     1605            if ((argptr >= argc) || (argv[argptr][0] == '-')) {
     1606              ExitFlag = 255;
     1607              DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for setting default molecule name: -X <name>" << endl);
     1608              performCriticalExit();
     1609            } else {
     1610              ArgcList.insert(argptr-1);
     1611              ArgcList.insert(argptr);
     1612              argptr+=1;
    15931613            }
    15941614            break;
     
    16011621    } while (argptr < argc);
    16021622
    1603     // 3a. Parse the element database
    1604     if (DatabasePathGiven)
    1605       if (periode->LoadPeriodentafel(configuration.databasepath)) {
    1606         DoLog(0) && (Log() << Verbose(0) << "Element list loaded successfully." << endl);
    1607         //periode->Output();
    1608       } else {
    1609         DoLog(0) && (Log() << Verbose(0) << "Element list loading failed." << endl);
    1610         return 1;
    1611       }
    16121623    // 3b. Find config file name and parse if possible, also BondGraphFileName
    16131624    if (argv[1][0] != '-') {
     
    16641675       molecules->insert(mol);
    16651676     }
    1666      if (configuration.BG == NULL) {
    1667        configuration.BG = new BondGraph(configuration.GetIsAngstroem());
    1668        if ((!BondGraphFileName.empty()) && (configuration.BG->LoadBondLengthTable(BondGraphFileName))) {
    1669          DoLog(0) && (Log() << Verbose(0) << "Bond length table loaded successfully." << endl);
    1670        } else {
    1671          DoeLog(1) && (eLog()<< Verbose(1) << "Bond length table loading failed." << endl);
    1672        }
    1673      }
    16741677
    16751678    // 4. parse again through options, now for those depending on elements db and config presence
     
    17001703            case 'a':
    17011704              if (ExitFlag == 0) ExitFlag = 1;
    1702               if ((argptr >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) || (!IsValidNumber(argv[argptr+3]))) {
     1705              if ((argptr+4 >= argc) || (argv[argptr][0] == '-')) {
    17031706                ExitFlag = 255;
    1704                 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments for adding atom: -a <element> <x> <y> <z>" << endl);
     1707                DoeLog(0) && (eLog()<< Verbose(0) << "Not enough arguments for adding atom: -a <Z> --position <x> <y> <z>" << endl);
    17051708                performCriticalExit();
    17061709              } else {
    1707                 SaveFlag = true;
    1708                 Log() << Verbose(1) << "Adding new atom with element " << argv[argptr] << " at (" << argv[argptr+1] << "," << argv[argptr+2] << "," << argv[argptr+3] << "), ";
    1709                 first = World::getInstance().createAtom();
    1710                 first->type = periode->FindElement(atoi(argv[argptr]));
    1711                 if (first->type != NULL)
    1712                   DoLog(2) && (Log() << Verbose(2) << "found element " << first->type->name << endl);
    1713                 for (int i=NDIM;i--;)
    1714                   first->x[i] = atof(argv[argptr+1+i]);
    1715                 if (first->type != NULL) {
    1716                   mol->AddAtom(first);  // add to molecule
    1717                   if ((configPresent == empty) && (mol->getAtomCount() != 0))
    1718                     configPresent = present;
    1719                 } else
    1720                   DoeLog(1) && (eLog()<< Verbose(1) << "Could not find the specified element." << endl);
    1721                 argptr+=4;
     1710                ArgcList.insert(argptr-1);
     1711                ArgcList.insert(argptr);
     1712                ArgcList.insert(argptr+1);
     1713                ArgcList.insert(argptr+2);
     1714                ArgcList.insert(argptr+3);
     1715                ArgcList.insert(argptr+4);
     1716                argptr+=5;
    17221717              }
    17231718              break;
     
    17301725            case 'D':
    17311726              if (ExitFlag == 0) ExitFlag = 1;
    1732               {
    1733                 DoLog(1) && (Log() << Verbose(1) << "Depth-First-Search Analysis." << endl);
    1734                 MoleculeLeafClass *Subgraphs = NULL;      // list of subgraphs from DFS analysis
    1735                 int *MinimumRingSize = new int[mol->getAtomCount()];
    1736                 atom ***ListOfLocalAtoms = NULL;
    1737                 class StackClass<bond *> *BackEdgeStack = NULL;
    1738                 class StackClass<bond *> *LocalBackEdgeStack = NULL;
    1739                 mol->CreateAdjacencyList(atof(argv[argptr]), configuration.GetIsAngstroem(), &BondGraph::CovalentMinMaxDistance, NULL);
    1740                 Subgraphs = mol->DepthFirstSearchAnalysis(BackEdgeStack);
    1741                 if (Subgraphs != NULL) {
    1742                   int FragmentCounter = 0;
    1743                   while (Subgraphs->next != NULL) {
    1744                     Subgraphs = Subgraphs->next;
    1745                     Subgraphs->FillBondStructureFromReference(mol, FragmentCounter, ListOfLocalAtoms, false);  // we want to keep the created ListOfLocalAtoms
    1746                     LocalBackEdgeStack = new StackClass<bond *> (Subgraphs->Leaf->BondCount);
    1747                     Subgraphs->Leaf->PickLocalBackEdges(ListOfLocalAtoms[FragmentCounter], BackEdgeStack, LocalBackEdgeStack);
    1748                     Subgraphs->Leaf->CyclicStructureAnalysis(LocalBackEdgeStack, MinimumRingSize);
    1749                     delete(LocalBackEdgeStack);
    1750                     delete(Subgraphs->previous);
    1751                     FragmentCounter++;
    1752                   }
    1753                   delete(Subgraphs);
    1754                   for (int i=0;i<FragmentCounter;i++)
    1755                     delete[](ListOfLocalAtoms[i]);
    1756                   delete[](ListOfLocalAtoms);
    1757                 }
    1758                 delete(BackEdgeStack);
    1759                 delete[](MinimumRingSize);
    1760               }
    1761               //argptr+=1;
     1727              if ((argptr >= argc) || (argv[argptr][0] == '-')) {
     1728                ExitFlag = 255;
     1729                DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for depth-first-search analysis: -D <max. bond distance>" << endl);
     1730                performCriticalExit();
     1731              } else {
     1732                ArgcList.insert(argptr-1);
     1733                ArgcList.insert(argptr);
     1734                argptr+=1;
     1735              }
    17621736              break;
    17631737            case 'I':
    17641738              DoLog(1) && (Log() << Verbose(1) << "Dissecting molecular system into a set of disconnected subgraphs ... " << endl);
    1765               // @TODO rather do the dissection afterwards
    1766               molecules->DissectMoleculeIntoConnectedSubgraphs(periode, &configuration);
    1767               mol = NULL;
    1768               if (molecules->ListOfMolecules.size() != 0) {
    1769                 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++)
    1770                   if ((*ListRunner)->ActiveFlag) {
    1771                     mol = *ListRunner;
    1772                     break;
    1773                   }
    1774               }
    1775               if ((mol == NULL) && (!molecules->ListOfMolecules.empty())) {
    1776                 mol = *(molecules->ListOfMolecules.begin());
    1777                 if (mol != NULL)
    1778                   mol->ActiveFlag = true;
    1779               }
     1739              ArgcList.insert(argptr-1);
     1740              argptr+=0;
    17801741              break;
    17811742            case 'C':
    17821743              {
    1783                 int ranges[3] = {1, 1, 1};
    1784                 bool periodic = (argv[argptr-1][2] =='p');
    17851744                if (ExitFlag == 0) ExitFlag = 1;
    1786                 if ((argptr >= argc)) {
     1745                if ((argptr+11 >= argc)) {
    17871746                  ExitFlag = 255;
    17881747                  DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for pair correlation analysis: -C[p] <type: E/P/S> [more params] <output> <bin output> <BinStart> <BinEnd>" << endl);
     
    17911750                  switch(argv[argptr][0]) {
    17921751                    case 'E':
    1793                       {
    1794                         if ((argptr+6 >= argc) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+5])) || (!IsValidNumber(argv[argptr+6])) || (!IsValidNumber(argv[argptr+2])) || (argv[argptr+1][0] == '-') || (argv[argptr+2][0] == '-') || (argv[argptr+3][0] == '-') || (argv[argptr+4][0] == '-')) {
    1795                           ExitFlag = 255;
    1796                           DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for pair correlation analysis: -C E <Z1> <Z2> <output> <bin output> <binstart> <binend>" << endl);
    1797                           performCriticalExit();
    1798                         } else {
    1799                           ofstream output(argv[argptr+3]);
    1800                           ofstream binoutput(argv[argptr+4]);
    1801                           const double BinStart = atof(argv[argptr+5]);
    1802                           const double BinEnd = atof(argv[argptr+6]);
    1803 
    1804                           const element *elemental = periode->FindElement((const int) atoi(argv[argptr+1]));
    1805                           const element *elemental2 = periode->FindElement((const int) atoi(argv[argptr+2]));
    1806                           PairCorrelationMap *correlationmap = NULL;
    1807                           if (periodic)
    1808                             correlationmap = PeriodicPairCorrelation(molecules, elemental, elemental2, ranges);
    1809                           else
    1810                             correlationmap = PairCorrelation(molecules, elemental, elemental2);
    1811                           OutputPairCorrelation(&output, correlationmap);
    1812                           BinPairMap *binmap = BinData( correlationmap, 0.5, BinStart, BinEnd );
    1813                           OutputCorrelation ( &binoutput, binmap );
    1814                           output.close();
    1815                           binoutput.close();
    1816                           delete(binmap);
    1817                           delete(correlationmap);
    1818                           argptr+=7;
    1819                         }
    1820                       }
     1752                      ArgcList.insert(argptr-1);
     1753                      ArgcList.insert(argptr);
     1754                      ArgcList.insert(argptr+1);
     1755                      ArgcList.insert(argptr+2);
     1756                      ArgcList.insert(argptr+3);
     1757                      ArgcList.insert(argptr+4);
     1758                      ArgcList.insert(argptr+5);
     1759                      ArgcList.insert(argptr+6);
     1760                      ArgcList.insert(argptr+7);
     1761                      ArgcList.insert(argptr+8);
     1762                      ArgcList.insert(argptr+9);
     1763                      ArgcList.insert(argptr+10);
     1764                      ArgcList.insert(argptr+11);
     1765                      argptr+=12;
    18211766                      break;
    18221767
    18231768                    case 'P':
    1824                       {
    1825                         if ((argptr+8 >= argc) || (!IsValidNumber(argv[argptr+1])) ||  (!IsValidNumber(argv[argptr+2])) || (!IsValidNumber(argv[argptr+3])) || (!IsValidNumber(argv[argptr+4])) || (!IsValidNumber(argv[argptr+7])) || (!IsValidNumber(argv[argptr+8])) || (argv[argptr+1][0] == '-') || (argv[argptr+2][0] == '-') || (argv[argptr+3][0] == '-') || (argv[argptr+4][0] == '-') || (argv[argptr+5][0] == '-') || (argv[argptr+6][0] == '-')) {
    1826                           ExitFlag = 255;
    1827                           DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for pair correlation analysis: -C P <Z1> <x> <y> <z> <output> <bin output> <binstart> <binend>" << endl);
    1828                           performCriticalExit();
    1829                         } else {
    1830                           ofstream output(argv[argptr+5]);
    1831                           ofstream binoutput(argv[argptr+6]);
    1832                           const double BinStart = atof(argv[argptr+7]);
    1833                           const double BinEnd = atof(argv[argptr+8]);
    1834 
    1835                           const element *elemental = periode->FindElement((const int) atoi(argv[argptr+1]));
    1836                           Vector *Point = new Vector((const double) atof(argv[argptr+1]),(const double) atof(argv[argptr+2]),(const double) atof(argv[argptr+3]));
    1837                           CorrelationToPointMap *correlationmap = NULL;
    1838                           if (periodic)
    1839                             correlationmap  = PeriodicCorrelationToPoint(molecules, elemental, Point, ranges);
    1840                           else
    1841                             correlationmap = CorrelationToPoint(molecules, elemental, Point);
    1842                           OutputCorrelationToPoint(&output, correlationmap);
    1843                           BinPairMap *binmap = BinData( correlationmap, 0.5, BinStart, BinEnd );
    1844                           OutputCorrelation ( &binoutput, binmap );
    1845                           output.close();
    1846                           binoutput.close();
    1847                           delete(Point);
    1848                           delete(binmap);
    1849                           delete(correlationmap);
    1850                           argptr+=9;
    1851                         }
    1852                       }
     1769                      ArgcList.insert(argptr-1);
     1770                      ArgcList.insert(argptr);
     1771                      ArgcList.insert(argptr+1);
     1772                      ArgcList.insert(argptr+2);
     1773                      ArgcList.insert(argptr+3);
     1774                      ArgcList.insert(argptr+4);
     1775                      ArgcList.insert(argptr+5);
     1776                      ArgcList.insert(argptr+6);
     1777                      ArgcList.insert(argptr+7);
     1778                      ArgcList.insert(argptr+8);
     1779                      ArgcList.insert(argptr+9);
     1780                      ArgcList.insert(argptr+10);
     1781                      ArgcList.insert(argptr+11);
     1782                      ArgcList.insert(argptr+12);
     1783                      ArgcList.insert(argptr+13);
     1784                      ArgcList.insert(argptr+14);
     1785                      argptr+=15;
    18531786                      break;
    18541787
    18551788                    case 'S':
    1856                       {
    1857                         if ((argptr+6 >= argc) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+4])) || (!IsValidNumber(argv[argptr+5])) || (!IsValidNumber(argv[argptr+6])) || (argv[argptr+1][0] == '-') || (argv[argptr+2][0] == '-') || (argv[argptr+3][0] == '-')) {
    1858                           ExitFlag = 255;
    1859                           DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for pair correlation analysis: -C S <Z> <output> <bin output> <BinWidth> <BinStart> <BinEnd>" << endl);
    1860                           performCriticalExit();
    1861                         } else {
    1862                           ofstream output(argv[argptr+2]);
    1863                           ofstream binoutput(argv[argptr+3]);
    1864                           const double radius = 4.;
    1865                           const double BinWidth = atof(argv[argptr+4]);
    1866                           const double BinStart = atof(argv[argptr+5]);
    1867                           const double BinEnd = atof(argv[argptr+6]);
    1868                           double LCWidth = 20.;
    1869                           if (BinEnd > 0) {
    1870                             if (BinEnd > 2.*radius)
    1871                                 LCWidth = BinEnd;
    1872                             else
    1873                               LCWidth = 2.*radius;
    1874                           }
    1875 
    1876                           // get the boundary
    1877                           class molecule *Boundary = NULL;
    1878                           class Tesselation *TesselStruct = NULL;
    1879                           const LinkedCell *LCList = NULL;
    1880                           // find biggest molecule
    1881                           int counter  = 0;
    1882                           for (MoleculeList::iterator BigFinder = molecules->ListOfMolecules.begin(); BigFinder != molecules->ListOfMolecules.end(); BigFinder++) {
    1883                             if ((Boundary == NULL) || (Boundary->getAtomCount() < (*BigFinder)->getAtomCount())) {
    1884                               Boundary = *BigFinder;
    1885                             }
    1886                             counter++;
    1887                           }
    1888                           bool *Actives = new bool[counter];
    1889                           counter = 0;
    1890                           for (MoleculeList::iterator BigFinder = molecules->ListOfMolecules.begin(); BigFinder != molecules->ListOfMolecules.end(); BigFinder++) {
    1891                             Actives[counter++] = (*BigFinder)->ActiveFlag;
    1892                             (*BigFinder)->ActiveFlag = (*BigFinder == Boundary) ? false : true;
    1893                           }
    1894                           LCList = new LinkedCell(Boundary, LCWidth);
    1895                           const element *elemental = periode->FindElement((const int) atoi(argv[argptr+1]));
    1896                           FindNonConvexBorder(Boundary, TesselStruct, LCList, radius, NULL);
    1897                           CorrelationToSurfaceMap *surfacemap = NULL;
    1898                           if (periodic)
    1899                             surfacemap = PeriodicCorrelationToSurface( molecules, elemental, TesselStruct, LCList, ranges);
    1900                           else
    1901                             surfacemap = CorrelationToSurface( molecules, elemental, TesselStruct, LCList);
    1902                           OutputCorrelationToSurface(&output, surfacemap);
    1903                           // check whether radius was appropriate
    1904                           {
    1905                             double start; double end;
    1906                             GetMinMax( surfacemap, start, end);
    1907                             if (LCWidth < end)
    1908                               DoeLog(1) && (eLog()<< Verbose(1) << "Linked Cell width is smaller than the found range of values! Bins can only be correct up to: " << radius << "." << endl);
    1909                           }
    1910                           BinPairMap *binmap = BinData( surfacemap, BinWidth, BinStart, BinEnd );
    1911                           OutputCorrelation ( &binoutput, binmap );
    1912                           output.close();
    1913                           binoutput.close();
    1914                           counter = 0;
    1915                           for (MoleculeList::iterator BigFinder = molecules->ListOfMolecules.begin(); BigFinder != molecules->ListOfMolecules.end(); BigFinder++)
    1916                             (*BigFinder)->ActiveFlag = Actives[counter++];
    1917                           delete[](Actives);
    1918                           delete(LCList);
    1919                           delete(TesselStruct);
    1920                           delete(binmap);
    1921                           delete(surfacemap);
    1922                           argptr+=7;
    1923                         }
    1924                       }
     1789                      ArgcList.insert(argptr-1);
     1790                      ArgcList.insert(argptr);
     1791                      ArgcList.insert(argptr+1);
     1792                      ArgcList.insert(argptr+2);
     1793                      ArgcList.insert(argptr+3);
     1794                      ArgcList.insert(argptr+4);
     1795                      ArgcList.insert(argptr+5);
     1796                      ArgcList.insert(argptr+6);
     1797                      ArgcList.insert(argptr+7);
     1798                      ArgcList.insert(argptr+8);
     1799                      ArgcList.insert(argptr+9);
     1800                      ArgcList.insert(argptr+10);
     1801                      ArgcList.insert(argptr+11);
     1802                      ArgcList.insert(argptr+12);
     1803                      ArgcList.insert(argptr+13);
     1804                      ArgcList.insert(argptr+14);
     1805                      argptr+=15;
    19251806                      break;
    19261807
     
    19361817            case 'E':
    19371818              if (ExitFlag == 0) ExitFlag = 1;
    1938               if ((argptr+1 >= argc) || (!IsValidNumber(argv[argptr])) || (argv[argptr+1][0] == '-')) {
     1819              if ((argptr+2 >= argc) || (!IsValidNumber(argv[argptr]))) {
    19391820                ExitFlag = 255;
    1940                 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for changing element: -E <atom nr.> <element>" << endl);
     1821                DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for changing element: -E <atom nr.> --element <Z>" << endl);
    19411822                performCriticalExit();
    19421823              } else {
    1943                 mol->getAtomCount();
    1944                 SaveFlag = true;
    1945                 DoLog(1) && (Log() << Verbose(1) << "Changing atom " << argv[argptr] << " to element " << argv[argptr+1] << "." << endl);
    1946                 first = mol->FindAtom(atoi(argv[argptr]));
    1947                 first->type = periode->FindElement(atoi(argv[argptr+1]));
    1948                 argptr+=2;
     1824                ArgcList.insert(argptr-1);
     1825                ArgcList.insert(argptr);
     1826                ArgcList.insert(argptr+1);
     1827                ArgcList.insert(argptr+2);
     1828                argptr+=3;
    19491829              }
    19501830              break;
    19511831            case 'F':
    19521832              if (ExitFlag == 0) ExitFlag = 1;
    1953               MaxDistance = -1;
    1954               if (argv[argptr-1][2] == 'F') { // option is -FF?
    1955                 // fetch first argument as max distance to surface
    1956                 MaxDistance = atof(argv[argptr++]);
    1957                 DoLog(0) && (Log() << Verbose(0) << "Filling with maximum layer distance of " << MaxDistance << "." << endl);
    1958               }
    1959               if ((argptr+7 >=argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) || (!IsValidNumber(argv[argptr+3])) || (!IsValidNumber(argv[argptr+4])) || (!IsValidNumber(argv[argptr+5])) || (!IsValidNumber(argv[argptr+6])) || (!IsValidNumber(argv[argptr+7]))) {
     1833              if ((argptr+12 >= argc) || (argv[argptr][0] == '-')) {
    19601834                ExitFlag = 255;
    1961                 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for filling box with water: -F <xyz of filler> <dist_x> <dist_y> <dist_z> <boundary> <randatom> <randmol> <DoRotate>" << endl);
     1835                DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for filling with molecule: -F <filler xyz file> --MaxDistance <distance or -1> --distances <x> <y> <z>  --lengths <surface> <randatm> <randmol> --DoRotate <0/1>" << endl);
    19621836                performCriticalExit();
    19631837              } else {
    1964                 SaveFlag = true;
    1965                 DoLog(1) && (Log() << Verbose(1) << "Filling Box with water molecules." << endl);
    1966                 // construct water molecule
    1967                 molecule *filler = World::getInstance().createMolecule();
    1968                 if (!filler->AddXYZFile(argv[argptr])) {
    1969                   DoeLog(0) && (eLog()<< Verbose(0) << "Could not parse filler molecule from " << argv[argptr] << "." << endl);
    1970                 }
    1971                 filler->SetNameFromFilename(argv[argptr]);
    1972                 configuration.BG->ConstructBondGraph(filler);
    1973                 molecule *Filling = NULL;
    1974                 // call routine
    1975                 double distance[NDIM];
    1976                 for (int i=0;i<NDIM;i++)
    1977                   distance[i] = atof(argv[argptr+i+1]);
    1978                 Filling = FillBoxWithMolecule(molecules, filler, configuration, MaxDistance, distance, atof(argv[argptr+4]), atof(argv[argptr+5]), atof(argv[argptr+6]), atoi(argv[argptr+7]));
    1979                 if (Filling != NULL) {
    1980                   Filling->ActiveFlag = false;
    1981                   molecules->insert(Filling);
    1982                 }
    1983                 World::getInstance().destroyMolecule(filler);
    1984                 argptr+=6;
     1838                ArgcList.insert(argptr-1);
     1839                ArgcList.insert(argptr);
     1840                ArgcList.insert(argptr+1);
     1841                ArgcList.insert(argptr+2);
     1842                ArgcList.insert(argptr+3);
     1843                ArgcList.insert(argptr+4);
     1844                ArgcList.insert(argptr+5);
     1845                ArgcList.insert(argptr+6);
     1846                ArgcList.insert(argptr+7);
     1847                ArgcList.insert(argptr+8);
     1848                ArgcList.insert(argptr+9);
     1849                ArgcList.insert(argptr+10);
     1850                ArgcList.insert(argptr+11);
     1851                ArgcList.insert(argptr+12);
     1852                argptr+=13;
    19851853              }
    19861854              break;
    19871855            case 'A':
     1856              if (ExitFlag == 0) ExitFlag = 1;
     1857              if ((argptr+2 >= argc) || (argv[argptr][0] == '-')) {
     1858                ExitFlag =255;
     1859                DoeLog(0) && (eLog()<< Verbose(0) << "Missing source file for bonds in molecule: -A <bond sourcefile> --molecule-by-id <molecule_id>" << endl);
     1860                performCriticalExit();
     1861              } else {
     1862                ArgcList.insert(argptr-1);
     1863                ArgcList.insert(argptr);
     1864                ArgcList.insert(argptr+1);
     1865                ArgcList.insert(argptr+2);
     1866                argptr+=3;
     1867              }
     1868              break;
     1869
     1870            case 'J':
     1871              if (ExitFlag == 0) ExitFlag = 1;
     1872              if ((argptr+2 >= argc) || (argv[argptr][0] == '-')) {
     1873                ExitFlag =255;
     1874                DoeLog(0) && (eLog()<< Verbose(0) << "Missing path of adjacency file: -J <path> --molecule-by-id <molecule_id>" << endl);
     1875                performCriticalExit();
     1876              } else {
     1877                ArgcList.insert(argptr-1);
     1878                ArgcList.insert(argptr);
     1879                ArgcList.insert(argptr+1);
     1880                ArgcList.insert(argptr+2);
     1881                argptr+=3;
     1882              }
     1883              break;
     1884
     1885            case 'j':
    19881886              if (ExitFlag == 0) ExitFlag = 1;
    19891887              if ((argptr >= argc) || (argv[argptr][0] == '-')) {
    19901888                ExitFlag =255;
    1991                 DoeLog(0) && (eLog()<< Verbose(0) << "Missing source file for bonds in molecule: -A <bond sourcefile>" << endl);
     1889                DoeLog(0) && (eLog()<< Verbose(0) << "Missing path of bonds file: -j <path> --molecule-by-id <molecule_id>" << endl);
    19921890                performCriticalExit();
    19931891              } else {
    1994                 DoLog(0) && (Log() << Verbose(0) << "Parsing bonds from " << argv[argptr] << "." << endl);
    1995                 ifstream input(argv[argptr]);
    1996                 mol->CreateAdjacencyListFromDbondFile(&input);
    1997                 input.close();
    1998                 argptr+=1;
    1999               }
    2000               break;
    2001 
    2002             case 'J':
    2003               if (ExitFlag == 0) ExitFlag = 1;
    2004               if ((argptr >= argc) || (argv[argptr][0] == '-')) {
    2005                 ExitFlag =255;
    2006                 DoeLog(0) && (eLog()<< Verbose(0) << "Missing path of adjacency file: -j <path>" << endl);
     1892                ArgcList.insert(argptr-1);
     1893                ArgcList.insert(argptr);
     1894                ArgcList.insert(argptr+1);
     1895                ArgcList.insert(argptr+2);
     1896                argptr+=3;
     1897              }
     1898              break;
     1899
     1900            case 'N':
     1901              if (ExitFlag == 0) ExitFlag = 1;
     1902              if ((argptr+4 >= argc) || (argv[argptr][0] == '-')){
     1903                ExitFlag = 255;
     1904                DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for non-convex envelope: -N <molecule_id> --sphere-radius <radius> --nonconvex-file <output prefix>" << endl);
    20071905                performCriticalExit();
    20081906              } else {
    2009                 DoLog(0) && (Log() << Verbose(0) << "Storing adjacency to path " << argv[argptr] << "." << endl);
    2010                 configuration.BG->ConstructBondGraph(mol);
    2011                 mol->StoreAdjacencyToFile(NULL, argv[argptr]);
    2012                 argptr+=1;
    2013               }
    2014               break;
    2015 
    2016             case 'j':
    2017               if (ExitFlag == 0) ExitFlag = 1;
    2018               if ((argptr >= argc) || (argv[argptr][0] == '-')) {
    2019                 ExitFlag =255;
    2020                 DoeLog(0) && (eLog()<< Verbose(0) << "Missing path of bonds file: -j <path>" << endl);
     1907                ArgcList.insert(argptr-1);
     1908                ArgcList.insert(argptr);
     1909                ArgcList.insert(argptr+1);
     1910                ArgcList.insert(argptr+2);
     1911                ArgcList.insert(argptr+3);
     1912                ArgcList.insert(argptr+4);
     1913                argptr+=5;
     1914              }
     1915              break;
     1916            case 'S':
     1917              if (ExitFlag == 0) ExitFlag = 1;
     1918              if ((argptr+2 >= argc) || (argv[argptr][0] == '-')) {
     1919                ExitFlag = 255;
     1920                DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for storing tempature: -S <temperature file> --molecule-by-id 0" << endl);
    20211921                performCriticalExit();
    20221922              } else {
    2023                 DoLog(0) && (Log() << Verbose(0) << "Storing bonds to path " << argv[argptr] << "." << endl);
    2024                 configuration.BG->ConstructBondGraph(mol);
    2025                 mol->StoreBondsToFile(NULL, argv[argptr]);
    2026                 argptr+=1;
    2027               }
    2028               break;
    2029 
    2030             case 'N':
    2031               if (ExitFlag == 0) ExitFlag = 1;
    2032               if ((argptr+1 >= argc) || (argv[argptr+1][0] == '-')){
     1923                ArgcList.insert(argptr-1);
     1924                ArgcList.insert(argptr);
     1925                ArgcList.insert(argptr+1);
     1926                ArgcList.insert(argptr+2);
     1927                argptr+=3;
     1928              }
     1929              break;
     1930            case 'L':
     1931              if (ExitFlag == 0) ExitFlag = 1;
     1932              if ((argptr+8 >= argc) || (argv[argptr][0] == '-')) {
    20331933                ExitFlag = 255;
    2034                 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for non-convex envelope: -o <radius> <tecplot output file>" << endl);
     1934                DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for linear interpolation: -L <prefix> --start-step <step0> --end-step <step1> --molecule-by-id 0 --id-mapping <0/1>" << endl);
    20351935                performCriticalExit();
    20361936              } else {
    2037                 class Tesselation *T = NULL;
    2038                 const LinkedCell *LCList = NULL;
    2039                 molecule * Boundary = NULL;
    2040                 //string filename(argv[argptr+1]);
    2041                 //filename.append(".csv");
    2042                 DoLog(0) && (Log() << Verbose(0) << "Evaluating non-convex envelope of biggest molecule.");
    2043                 DoLog(1) && (Log() << Verbose(1) << "Using rolling ball of radius " << atof(argv[argptr]) << " and storing tecplot data in " << argv[argptr+1] << "." << endl);
    2044                 // find biggest molecule
    2045                 int counter  = 0;
    2046                 for (MoleculeList::iterator BigFinder = molecules->ListOfMolecules.begin(); BigFinder != molecules->ListOfMolecules.end(); BigFinder++) {
    2047                   if ((Boundary == NULL) || (Boundary->getAtomCount() < (*BigFinder)->getAtomCount())) {
    2048                     Boundary = *BigFinder;
    2049                   }
    2050                   counter++;
    2051                 }
    2052                 DoLog(1) && (Log() << Verbose(1) << "Biggest molecule has " << Boundary->getAtomCount() << " atoms." << endl);
    2053                 start = clock();
    2054                 LCList = new LinkedCell(Boundary, atof(argv[argptr])*2.);
    2055                 if (!FindNonConvexBorder(Boundary, T, LCList, atof(argv[argptr]), argv[argptr+1]))
    2056                   ExitFlag = 255;
    2057                 //FindDistributionOfEllipsoids(T, &LCList, N, number, filename.c_str());
    2058                 end = clock();
    2059                 DoLog(0) && (Log() << Verbose(0) << "Clocks for this operation: " << (end-start) << ", time: " << ((double)(end-start)/CLOCKS_PER_SEC) << "s." << endl);
    2060                 delete(LCList);
    2061                 delete(T);
    2062                 argptr+=2;
    2063               }
    2064               break;
    2065             case 'S':
    2066               if (ExitFlag == 0) ExitFlag = 1;
    2067               if ((argptr >= argc) || (argv[argptr][0] == '-')) {
     1937                ArgcList.insert(argptr-1);
     1938                ArgcList.insert(argptr);
     1939                ArgcList.insert(argptr+1);
     1940                ArgcList.insert(argptr+2);
     1941                ArgcList.insert(argptr+3);
     1942                ArgcList.insert(argptr+4);
     1943                ArgcList.insert(argptr+5);
     1944                ArgcList.insert(argptr+6);
     1945                ArgcList.insert(argptr+7);
     1946                ArgcList.insert(argptr+8);
     1947                argptr+=9;
     1948              }
     1949              break;
     1950            case 'P':
     1951              if (ExitFlag == 0) ExitFlag = 1;
     1952              if ((argptr+2 >= argc) || (argv[argptr][0] == '-')) {
    20681953                ExitFlag = 255;
    2069                 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for storing tempature: -S <temperature file>" << endl);
     1954                DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for parsing and integrating forces: -P <forces file> --molecule-by-id <molecule_id>" << endl);
    20701955                performCriticalExit();
    20711956              } else {
    2072                 DoLog(1) && (Log() << Verbose(1) << "Storing temperatures in " << argv[argptr] << "." << endl);
    2073                 ofstream *output = new ofstream(argv[argptr], ios::trunc);
    2074                 if (!mol->OutputTemperatureFromTrajectories(output, 0, mol->MDSteps))
    2075                   DoLog(2) && (Log() << Verbose(2) << "File could not be written." << endl);
    2076                 else
    2077                   DoLog(2) && (Log() << Verbose(2) << "File stored." << endl);
    2078                 output->close();
    2079                 delete(output);
    2080                 argptr+=1;
    2081               }
    2082               break;
    2083             case 'L':
    2084               if (ExitFlag == 0) ExitFlag = 1;
    2085               if ((argptr >= argc) || (argv[argptr][0] == '-')) {
     1957                ArgcList.insert(argptr-1);
     1958                ArgcList.insert(argptr);
     1959                ArgcList.insert(argptr+1);
     1960                ArgcList.insert(argptr+2);
     1961                argptr+=3;
     1962              }
     1963              break;
     1964            case 'R':
     1965              if (ExitFlag == 0) ExitFlag = 1;
     1966              if ((argptr+4 >= argc) || (argv[argptr][0] == '-'))  {
    20861967                ExitFlag = 255;
    2087                 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for linear interpolation: -L <step0> <step1> <prefix> <identity mapping?>" << endl);
     1968                DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for removing atoms: -R <distance> --position <x> <y> <z>" << endl);
    20881969                performCriticalExit();
    20891970              } else {
    2090                 SaveFlag = true;
    2091                 DoLog(1) && (Log() << Verbose(1) << "Linear interpolation between configuration " << argv[argptr] << " and " << argv[argptr+1] << "." << endl);
    2092                 if (atoi(argv[argptr+3]) == 1)
    2093                   DoLog(1) && (Log() << Verbose(1) << "Using Identity for the permutation map." << endl);
    2094                 if (!mol->LinearInterpolationBetweenConfiguration(atoi(argv[argptr]), atoi(argv[argptr+1]), argv[argptr+2], configuration, atoi(argv[argptr+3])) == 1 ? true : false)
    2095                   DoLog(2) && (Log() << Verbose(2) << "Could not store " << argv[argptr+2] << " files." << endl);
    2096                 else
    2097                   DoLog(2) && (Log() << Verbose(2) << "Steps created and " << argv[argptr+2] << " files stored." << endl);
    2098                 argptr+=4;
    2099               }
    2100               break;
    2101             case 'P':
    2102               if (ExitFlag == 0) ExitFlag = 1;
    2103               if ((argptr >= argc) || (argv[argptr][0] == '-')) {
     1971                ArgcList.insert(argptr-1);
     1972                ArgcList.insert(argptr);
     1973                ArgcList.insert(argptr+1);
     1974                ArgcList.insert(argptr+2);
     1975                ArgcList.insert(argptr+3);
     1976                ArgcList.insert(argptr+4);
     1977                argptr+=5;
     1978              }
     1979              break;
     1980            case 't':
     1981              if (ExitFlag == 0) ExitFlag = 1;
     1982              if ((argptr+4 >= argc) || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) ) {
    21041983                ExitFlag = 255;
    2105                 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for parsing and integrating forces: -P <forces file>" << endl);
     1984                DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for translation: -t <x> <y> <z> --molecule-by-id <molecule_id> --periodic <0/1>" << endl);
    21061985                performCriticalExit();
    21071986              } else {
    2108                 SaveFlag = true;
    2109                 DoLog(1) && (Log() << Verbose(1) << "Parsing forces file and Verlet integrating." << endl);
    2110                 if (!mol->VerletForceIntegration(argv[argptr], configuration))
    2111                   DoLog(2) && (Log() << Verbose(2) << "File not found." << endl);
    2112                 else
    2113                   DoLog(2) && (Log() << Verbose(2) << "File found and parsed." << endl);
    2114                 argptr+=1;
    2115               }
    2116               break;
    2117             case 'R':
    2118               if (ExitFlag == 0) ExitFlag = 1;
    2119               if ((argptr+3 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) || (!IsValidNumber(argv[argptr+3])))  {
    2120                 ExitFlag = 255;
    2121                 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for removing atoms: -R <x> <y> <z> <distance>" << endl);
    2122                 performCriticalExit();
    2123               } else {
    2124                 SaveFlag = true;
    2125                 const double radius = atof(argv[argptr+3]);
    2126                 Vector point(atof(argv[argptr]),atof(argv[argptr+1]),atof(argv[argptr+2]));
    2127                 DoLog(1) && (Log() << Verbose(1) << "Removing atoms around " << point << " with radius " << radius << "." << endl);
    2128                 atom *Walker = NULL;
    2129                 molecule::iterator advancer = mol->begin();
    2130                 for(molecule::iterator iter = advancer; advancer != mol->end();) {
    2131                   iter = advancer++;
    2132                   if ((*iter)->x.DistanceSquared(point) > radius*radius){ // distance to first above radius ...
    2133                     Walker = (*iter);
    2134                     DoLog(1) && (Log() << Verbose(1) << "Removing atom " << *Walker << "." << endl);
    2135                     mol->RemoveAtom(*(iter));
    2136                     World::getInstance().destroyAtom(Walker);
    2137                   }
    2138                 }
    2139                 argptr+=4;
    2140               }
    2141               break;
    2142             case 't':
    2143               if (ExitFlag == 0) ExitFlag = 1;
    2144               if ((argptr+2 >= argc) || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) ) {
    2145                 ExitFlag = 255;
    2146                 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for translation: -t <x> <y> <z>" << endl);
    2147                 performCriticalExit();
    2148               } else {
    2149                 if (ExitFlag == 0) ExitFlag = 1;
    2150                 SaveFlag = true;
    2151                 DoLog(1) && (Log() << Verbose(1) << "Translating all ions by given vector." << endl);
    2152                 for (int i=NDIM;i--;)
    2153                   x[i] = atof(argv[argptr+i]);
    2154                 mol->Translate((const Vector *)&x);
    2155                 argptr+=3;
    2156               }
    2157               break;
    2158             case 'T':
    2159               if (ExitFlag == 0) ExitFlag = 1;
    2160               if ((argptr+2 >= argc) || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1])) || (!IsValidNumber(argv[argptr+2])) ) {
    2161                 ExitFlag = 255;
    2162                 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for periodic translation: -T <x> <y> <z>" << endl);
    2163                 performCriticalExit();
    2164               } else {
    2165                 if (ExitFlag == 0) ExitFlag = 1;
    2166                 SaveFlag = true;
    2167                 DoLog(1) && (Log() << Verbose(1) << "Translating all ions periodically by given vector." << endl);
    2168                 for (int i=NDIM;i--;)
    2169                   x[i] = atof(argv[argptr+i]);
    2170                 mol->TranslatePeriodically((const Vector *)&x);
    2171                 argptr+=3;
     1987                ArgcList.insert(argptr-1);
     1988                ArgcList.insert(argptr);
     1989                ArgcList.insert(argptr+1);
     1990                ArgcList.insert(argptr+2);
     1991                ArgcList.insert(argptr+3);
     1992                ArgcList.insert(argptr+4);
     1993                ArgcList.insert(argptr+5);
     1994                ArgcList.insert(argptr+6);
     1995                argptr+=7;
    21721996              }
    21731997              break;
     
    22462070                performCriticalExit();
    22472071              } else {
    2248                 mol->getAtomCount();
    2249                 SaveFlag = true;
    2250                 DoLog(1) && (Log() << Verbose(1) << "Removing atom " << argv[argptr] << "." << endl);
    2251                 atom *first = mol->FindAtom(atoi(argv[argptr]));
    2252                 mol->RemoveAtom(first);
     2072                ArgcList.insert(argptr-1);
     2073                ArgcList.insert(argptr);
    22532074                argptr+=1;
    22542075              }
     
    22562077            case 'f':
    22572078              if (ExitFlag == 0) ExitFlag = 1;
    2258               if ((argptr+1 >= argc) || (argv[argptr][0] == '-') || (!IsValidNumber(argv[argptr])) || (!IsValidNumber(argv[argptr+1]))) {
     2079              if ((argptr+1 >= argc) || (argv[argptr][0] == '-')) {
    22592080                ExitFlag = 255;
    22602081                DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments for fragmentation: -f <max. bond distance> <bond order>" << endl);
    22612082                performCriticalExit();
    22622083              } else {
    2263                 DoLog(0) && (Log() << Verbose(0) << "Fragmenting molecule with bond distance " << argv[argptr] << " angstroem, order of " << argv[argptr+1] << "." << endl);
    2264                 DoLog(0) && (Log() << Verbose(0) << "Creating connection matrix..." << endl);
    2265                 start = clock();
    2266                 mol->CreateAdjacencyList(atof(argv[argptr]), configuration.GetIsAngstroem(), &BondGraph::CovalentMinMaxDistance, NULL);
    2267                 DoLog(0) && (Log() << Verbose(0) << "Fragmenting molecule with current connection matrix ..." << endl);
    2268                 if (mol->hasBondStructure()) {
    2269                   ExitFlag = mol->FragmentMolecule(atoi(argv[argptr+1]), &configuration);
    2270                 }
    2271                 end = clock();
    2272                 DoLog(0) && (Log() << Verbose(0) << "Clocks for this operation: " << (end-start) << ", time: " << ((double)(end-start)/CLOCKS_PER_SEC) << "s." << endl);
    2273                 argptr+=2;
     2084                ArgcList.insert(argptr-1);
     2085                ArgcList.insert(argptr);
     2086                ArgcList.insert(argptr+1);
     2087                ArgcList.insert(argptr+2);
     2088                ArgcList.insert(argptr+3);
     2089                ArgcList.insert(argptr+4);
     2090                argptr+=5;
    22742091              }
    22752092              break;
     
    22842101                SaveFlag = true;
    22852102                DoLog(0) && (Log() << Verbose(0) << "Converting to prinicipal axis system." << endl);
     2103                mol->PrincipalAxisSystem((bool)j);
    22862104              } else
    2287                 DoLog(0) && (Log() << Verbose(0) << "Evaluating prinicipal axis." << endl);
    2288               mol->PrincipalAxisSystem((bool)j);
     2105                ArgcList.insert(argptr-1);
     2106                argptr+=0;
    22892107              break;
    22902108            case 'o':
    22912109              if (ExitFlag == 0) ExitFlag = 1;
    2292               if ((argptr+1 >= argc) || (argv[argptr][0] == '-')){
     2110              if ((argptr+4 >= argc) || (argv[argptr][0] == '-')){
    22932111                ExitFlag = 255;
    2294                 DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for convex envelope: -o <convex output file> <non-convex output file>" << endl);
     2112                DoeLog(0) && (eLog()<< Verbose(0) << "Not enough or invalid arguments given for convex envelope: -o <molecule_id> --output-file <output file> --output-file <binned output file>" << endl);
    22952113                performCriticalExit();
    22962114              } else {
    2297                 class Tesselation *TesselStruct = NULL;
    2298                 const LinkedCell *LCList = NULL;
    2299                 DoLog(0) && (Log() << Verbose(0) << "Evaluating volume of the convex envelope.");
    2300                 DoLog(1) && (Log() << Verbose(1) << "Storing tecplot convex data in " << argv[argptr] << "." << endl);
    2301                 DoLog(1) && (Log() << Verbose(1) << "Storing tecplot non-convex data in " << argv[argptr+1] << "." << endl);
    2302                 LCList = new LinkedCell(mol, 10.);
    2303                 //FindConvexBorder(mol, LCList, argv[argptr]);
    2304                 FindNonConvexBorder(mol, TesselStruct, LCList, 5., argv[argptr+1]);
    2305 //                RemoveAllBoundaryPoints(TesselStruct, mol, argv[argptr]);
    2306                 double volumedifference = ConvexizeNonconvexEnvelope(TesselStruct, mol, argv[argptr]);
    2307                 double clustervolume = VolumeOfConvexEnvelope(TesselStruct, &configuration);
    2308                 DoLog(0) && (Log() << Verbose(0) << "The tesselated volume area is " << clustervolume << " " << (configuration.GetIsAngstroem() ? "angstrom" : "atomiclength") << "^3." << endl);
    2309                 DoLog(0) && (Log() << Verbose(0) << "The non-convex tesselated volume area is " << clustervolume-volumedifference << " " << (configuration.GetIsAngstroem() ? "angstrom" : "atomiclength") << "^3." << endl);
    2310                 delete(TesselStruct);
    2311                 delete(LCList);
    2312                 argptr+=2;
     2115                ArgcList.insert(argptr-1);
     2116                ArgcList.insert(argptr);
     2117                ArgcList.insert(argptr+1);
     2118                ArgcList.insert(argptr+2);
     2119                ArgcList.insert(argptr+3);
     2120                ArgcList.insert(argptr+4);
     2121                argptr+=5;
    23132122              }
    23142123              break;
     
    23312140                  performCriticalExit();
    23322141              } else {
    2333                 double density;
    2334                 SaveFlag = true;
    2335                 DoLog(0) && (Log() << Verbose(0) << "Evaluating necessary cell volume for a cluster suspended in water.");
    2336                 density = atof(argv[argptr++]);
    2337                 if (density < 1.0) {
    2338                   DoeLog(1) && (eLog()<< Verbose(1) << "Density must be greater than 1.0g/cm^3 !" << endl);
    2339                   density = 1.3;
    2340                 }
    2341 //                for(int i=0;i<NDIM;i++) {
    2342 //                  repetition[i] = atoi(argv[argptr++]);
    2343 //                  if (repetition[i] < 1)
    2344 //                    DoeLog(1) && (eLog()<< Verbose(1) << "repetition value must be greater 1!" << endl);
    2345 //                  repetition[i] = 1;
    2346 //                }
    2347                 PrepareClustersinWater(&configuration, mol, volume, density);  // if volume == 0, will calculate from ConvexEnvelope
     2142                ArgcList.insert(argptr-1);
     2143                ArgcList.insert(argptr);
     2144                argptr+=1;
    23482145              }
    23492146              break;
     
    23932190  ActionRegistry::purgeInstance();
    23942191  ActionHistory::purgeInstance();
    2395 #ifdef LOG_OBSERVER
    2396   cout << observerLog().getLog();
    2397 #endif
    23982192  Memory::getState();
    23992193}
     
    24432237      // handle arguments by ParseCommandLineOptions()
    24442238      ExitFlag = ParseCommandLineOptions(argc,argv,World::getInstance().getMolecules(),World::getInstance().getPeriode(),*World::getInstance().getConfig(), &ConfigFileName, ArgcList);
     2239      World::getInstance().setExitFlag(ExitFlag);
    24452240      // copy all remaining arguments to a new argv
    24462241      Arguments = new char *[ArgcList.size()];
     
    24562251      // handle remaining arguments by CommandLineParser
    24572252      MapOfActions::getInstance().AddOptionsToParser();
    2458       CommandLineParser::getInstance().Run(ArgcSize,Arguments);
     2253      map <std::string, std::string> ShortFormToActionMap = MapOfActions::getInstance().getShortFormToActionMap();
     2254      CommandLineParser::getInstance().Run(ArgcSize,Arguments, ShortFormToActionMap);
    24592255      if (!CommandLineParser::getInstance().isEmpty()) {
    24602256        DoLog(0) && (Log() << Verbose(0) << "Setting UI to CommandLine." << endl);
     
    24832279  delete[](ConfigFileName);
    24842280
     2281  ExitFlag = World::getInstance().getExitFlag();
    24852282  return (ExitFlag == 1 ? 0 : ExitFlag);
    24862283}
Note: See TracChangeset for help on using the changeset viewer.