annotate lib/HR2_v1.04.cpp @ 2:23970530a518 draft

master branch Updating with tag :CI_COMMIT_TAG - - Fxx
author fgiacomoni
date Tue, 17 Jan 2023 10:31:32 +0000
parents 86296c048e46
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
1 /*
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
2
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
3 HR2.C
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
4 V1.04
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
5 (Changes: meb)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
6
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
7 A program to calculate elemental compositions for a given mass.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
8 See the file README for details.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
9
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
10 --------------------------------------------------------------------
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
11 Copyright (c) 2001...2005 Joerg Hau <joerg.hau(at)dplanet.ch>.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
12
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
13 mail: joerg.hau@dplanet.ch
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
14 www: http://www.mysunrise.ch/users/joerg.hau/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
15
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
16 *changed version by Tobias Kind (TK), 2006 , Fiehnlab,
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
17 *added extended valencies, added implementation of
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
18 seven golden rules of molecular formula filtering
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
19
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
20
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
21 This program is free software; you can redistribute it and/or
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
22 modify it under the terms of version 2 of the GNU General Public
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
23 License as published by the Free Software Foundation. See the
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
24 file LICENSE for details.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
25
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
26 This program is distributed in the hope that it will be useful,
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
27 but WITHOUT ANY WARRANTY; without even the implied warranty of
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
28 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
29 GNU General Public License for more details.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
30 --------------------------------------------------------------------
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
31
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
32 Creation: somewhere in 1992 by JHa.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
33 Revision: 2001-04-18, GPL'd, first public release (JHa)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
34 2001-04-21, improved help text (JHa)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
35 2002-06-27, added sodium (JHa)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
36 2002-10-09, added 15N (JHa)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
37 2005-02-25, added -v option; license now GPL *v2* (JHa)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
38 2005-02-27, optimised code in calc loop (JHa)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
39 2005-02-28, verified and updated atomic masses (JHa)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
40 2005-06-17, added GPL text when "-h" is used (JHa)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
41 2006-01-01, extended version for BMC Bioinformatics publication - HR2 (TK)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
42 2006-03-03, added element ratio checks, extended valencies, only even electrons - HR2 (TK)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
43 2006-09-09, 1000x-10000x speedup hand optimized hehe. - HR2 (TK)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
44 -->special version for CHNSOP-F-Cl-Br-Si
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
45 2009-05-28, David Enot introduced the concept of 'Adducts' (nadd) for MZedDB and corrected
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
46 some inaccuracies in April 2008. Manfred Beckmann has now corrected the use of
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
47 'nadd' and 'charge' by calculating 'nadd' from 'charge' using abscharge = abs(charge)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
48 (did it manually because I couldn't find 'abs') to correct 'measured_mass' and limits,
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
49 but keeping nadd = 0 for rdb calculation of neutral MW (MB)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
50 2014-08-29, Marion Landi corrected the mass of atoms.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
51
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
52 This is ANSI C and should compile with any C compiler; use
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
53 something along the lines of "gcc -Wall -O3 -o hr hr.c".
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
54 "g++ -O2 -o myhr HR2.cpp" on a Mac OS X G5 proc
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
55 Optimize for speed, you may gain factor 3!
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
56 NOW compiled under Visual C++ Express (faster than GCC) in C++ mode for boolean type.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
57
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
58
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
59 ---------------------------------------------------------------------
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
60 Example arguments:
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
61 1) -m 1 -t 100000 -C 1-100 -H 1-220 -N 0-10 -O 0-10 -P 0-10 -S 0-10 -L 0-10 -B 0-10
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
62 2) -m 500 -t 1 -C 50-100 -H 10-220 -N 0-10 -O 0-10 -P 0-10 -S 0-10 -L 0-10 -B 0-10
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
63 3) hr2-all-res -c "Hexaflumuron_459.982882Da_3ppm" -m 459.982882 -t 1.37995 -C 0-39 -H 0-98 -N 0-34 -O 0-30 -P 0-12 -S 0-12 -F 0-12 -L 0-14 -B 0-7 -I 0-0
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
64 945 formulas found in 253 seconds. (now 4 seconds, before eternal)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
65 4) hr2 -m 459.982882 -t 1.37995 -C 10-39 -H 28-98 -N 4-34 -O 0-30 -P 1-12 -S 1-12 -F 0-12 -L 1-14 -B 2-6 -I 0-0
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
66 1 formula in 0 seconds (former eternal time)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
67 */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
68
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
69 #include <stdio.h>
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
70 #include <string.h>
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
71 #include <errno.h>
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
72 #include <time.h>
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
73
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
74 /* Uncomment this for windows
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
75 #include <windows.h>
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
76 #include <process.h>
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
77 */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
78 #include <math.h>
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
79
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
80
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
81 #define VERSION "20050617" /* String ! */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
82 #define TRUE 1
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
83 #define FALSE 0
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
84 #define MAXLEN 181 /* max. length of input string */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
85
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
86 #define _CRT_SECURE_NO_DEPRECATE 1
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
87
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
88 typedef struct {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
89 const char *sym; /* symbol */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
90 const char *symi; /* non iso symbol */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
91 const double mass; /* accurate mass */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
92 const float val; /* to calculate unsaturations */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
93 const int key; /* used for decoding cmd line */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
94 int min, /* atom count min */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
95 max, /* atom count max */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
96 cnt, /* atom count actual */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
97 save; /* atom count old - for loop exiting*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
98 } Element;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
99
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
100
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
101 /* --- atomic masses as published by IUPAC, 2002-10-02 ---------- */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
102
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
103 Element el[]=
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
104 /* array of the elements used here:
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
105 Symbol, exact mass, dbe, keycode, number, default-min, default-max
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
106 dle: isoptopes are given by iC for 13C, iK for 41K etc....
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
107 */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
108 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
109 { "C", "C", 12.000000000, +2.0, 'C', 0, 100, 0,0 },
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
110 { "iC", "C", 13.0033548378, +2.0, '1', 0, 0, 0 ,0 },
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
111 { "H", "H", 1.0078250321, -1.0, 'H', 0, 200, 0 ,0},
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
112 { "iH", "H", 2.0141017780, -1.0, 'D', 0, 0, 0 ,0},
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
113 { "N", "N", 14.0030740052, +1.0, 'N', 0, 40, 0,0 }, //org +1 = valence = 3: now +3 for valence = 5
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
114 { "iN", "N", 15.0001088984, +1.0, 'M', 0, 0, 0,0 },
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
115 { "O", "O", 15.9949146221, 0.0, 'O', 0, 70, 0 ,0},
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
116 { "F", "F", 18.99840322, -1.0, 'F', 0, 0, 0 ,0},
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
117 { "Na", "Na", 22.98976928, -1.0, 'A', 0, 0, 0 ,0},
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
118 { "Si", "Si", 27.9769265327, +2.0, 'I', 0, 0, 0 ,0},
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
119 { "P", "P", 30.97376163, +3.0, 'P', 0, 10, 0 ,0}, //org +1 valence = 3: now +3 for valence = 5
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
120 { "S", "S", 31.97207069, +4.0, 'S', 0, 0, 0 ,0}, //org 0 = valence = 2; now +4 for valence = 6
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
121 { "Cl", "Cl", 34.96885268, -1.0, 'L', 0, 0, 0 ,0},
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
122 { "iCl", "Cl", 36.96590259, -1.0, 'E', 0, 0, 0 ,0}, // added dle
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
123 { "Br", "Br", 78.9183371, -1.0, 'B', 0, 0, 0 ,0},
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
124 { "iBr", "Br", 80.9162906, -1.0, 'G', 0, 0, 0 ,0}, // added dle
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
125 { "K", "K", 38.96370668, -1.0, 'K', 0, 0, 0 ,0}, // added dle
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
126 { "iK", "K", 40.96182576, -1.0, 'J', 0, 0, 0 ,0}, // added dle
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
127 };
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
128
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
129 const double electron = 0.0005486;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
130
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
131
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
132 /* --- global variables --- */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
133
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
134 double charge, /* charge on the molecule */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
135 tol, /* mass tolerance in mmu */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
136 abscharge, /* abs(charge): to calculate 'measured_mass' and limits - meb */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
137 nadd; /* nadd now calculated as abs(charge) - meb */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
138 char comment[MAXLEN]=""; /* some text ;-) */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
139 int single; /* flag to indicate if we calculate only once and exit */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
140 int nr_el; /* number of elements in array (above) */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
141 bool verbose;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
142 bool applygr;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
143
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
144 /* --- some variables needed for reading the cmd line --- */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
145
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
146 char *optarg; /* global: pointer to argument of current option */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
147 static int optind = 1; /* global: index of which argument is next. Is used
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
148 as a global variable for collection of further
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
149 arguments (= not options) via argv pointers. */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
150
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
151
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
152 /* --- function prototypes ------------------- */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
153
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
154 int input(char *text, double *zahl);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
155 int readfile(char *whatfile);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
156 double calc_mass(void);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
157 float calc_rdb(void);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
158 long do_calculations(double mass, double tolerance);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
159 int clean (char *buf);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
160 int getopt(int argc, char *argv[], char *optionS);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
161 /* you have to compile with C++ or define yourself this bool type (C99 compiler definition) */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
162 bool calc_element_ratios(bool element_probability);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
163
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
164 /* --- threading ------------------- */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
165 /* mass and RDB calculation could be in several other threads
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
166 however the loop is very fast, context switching takes longer and
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
167 slows down the whole process. Single-Thread multiprocessor (cluster) implementation
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
168 seems superior here. */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
169 /* Uncomment for windows
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
170 HANDLE hThread2,hThread3;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
171 unsigned threadID2,threadID3;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
172 */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
173
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
174
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
175 /* --- main --- */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
176
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
177 int main (int argc, char **argv)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
178 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
179 double mz; /* mass */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
180 char buf[MAXLEN];
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
181 int i, tmp;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
182
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
183 static char *id =
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
184 "hr version %s. Copyright (C) by Joerg Hau 2001...2005 & Tobias Kind 2006 :-).\n";
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
185
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
186 static char *disclaimer =
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
187 "\nThis program is free software; you can redistribute it and/or modify it under\n"
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
188 "the terms of version 2 of the GNU General Public License as published by the\n"
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
189 "Free Software Foundation.\n\n"
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
190 "This program is distributed in the hope that it will be useful, but WITHOUT ANY\n"
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
191 "WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n"
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
192 "PARTICULAR PURPOSE. See the GNU General Public License for details.\n";
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
193
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
194 static char *msg =
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
195 "Calculates possible elemental compositions for a given mass.\n\n"
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
196 "usage: hr [options] file\n\nValid command line options are:\n"
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
197 "-h This Help screen.\n"
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
198 "-v Display version information.\n"
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
199 "-t tol Set tolerance to 'tol' mmu (default 5).\n"
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
200 "-m mz Set mass to 'mz'.\n"
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
201 "-s Print only the results (dle)"
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
202 "-c Number of charges i.e -c 1 is equivalent to -p (dle).\n"
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
203 "-p Positive ions; electron mass is removed from the formula.\n"
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
204 "-n Negative ions; electron mass is added to the formula.\n"
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
205 "-g Does not apply 4-7 golden rules (dle).\n"
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
206 "-a Maximum num. of adducts. (dle)\n"
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
207 "-X a-b For element X, use atom range a to b. List of valid atoms:\n\n"
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
208 " X key mass (6 decimals shown)\n"
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
209 " -------------------------------------\n";
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
210
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
211 /* initialise variables */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
212
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
213 nadd = 0.0; /* added dle: number of adducts*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
214 single = FALSE; /* run continuously */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
215 charge = 0.0; /* default charge is neutral */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
216 tol = 1.0; /* default tolerance in mmu */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
217 nr_el = sizeof(el)/sizeof(el[0]); /* calculate array size */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
218 verbose = TRUE; /* added dle: should everything printed out?*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
219 applygr = TRUE; /* added dle: should rules 4-7 applied?*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
220
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
221
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
222 /* decode and read the command line */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
223
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
224 while ((tmp = getopt(argc, argv, "hvpnsgt:m:c:a:C:H:N:M:O:D:1:S:F:L:B:P:I:A:K:E:G:J:")) != EOF)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
225 switch (tmp)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
226 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
227 case 'h': /* help me */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
228 printf (id, VERSION);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
229 printf (msg);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
230 for (i=0; i < nr_el; i++)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
231 printf (" %4s -%c %15.6lf\n",
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
232 el[i].sym, el[i].key, el[i].mass);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
233 printf(disclaimer, "\n");
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
234 return 0;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
235 case 'v': /* version */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
236 printf (id, VERSION);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
237 return 0;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
238 case 'p': /* positive charge */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
239 charge = +1.0;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
240 continue;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
241 case 's': /* simple output dle*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
242 verbose = FALSE;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
243 continue;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
244 case 'n': /* negative carge */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
245 charge = -1.0;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
246 continue;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
247 case 'g': /* apply 7GR dle */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
248 applygr = false;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
249 continue;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
250 case 't': /* tolerance */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
251 strcpy(buf, optarg);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
252 sscanf(buf, "%lf", &tol);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
253 continue;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
254 case 'a': /* num of adducts dle */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
255 strcpy(buf, optarg);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
256 sscanf(buf, "%lf", &nadd);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
257 continue;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
258 case 'm': /* single mass */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
259 strcpy(buf, optarg);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
260 sscanf(buf, "%lf", &mz);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
261 single = TRUE;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
262 continue;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
263 case 'c': /* comment for single mass */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
264 strcpy(buf, optarg);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
265 sscanf(buf, "%lf", &charge);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
266 continue;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
267 continue;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
268 case 'C': /* C12 */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
269 case 'H': /* 1H */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
270 case 'N': /* 14N */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
271 case 'M': /* 15N */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
272 case 'O': /* 16O */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
273 case 'D': /* 2H */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
274 case '1': /* 13C */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
275 case 'A': /* Na ('N' is taken for Nitrogen!) */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
276 case 'S': /* 32S */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
277 case 'F': /* 19F */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
278 case 'L': /* 35Cl ('C' is taken!) */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
279 case 'E': /* 37Cl (chloridE!) */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
280 case 'B': /* 79Br */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
281 case 'K': /* 39K */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
282 case 'J': /* 41K */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
283 case 'G': /* 81Br */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
284 case 'P': /* 31P */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
285 case 'I': /* 28Si ('S' is taken!) */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
286 i = 0;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
287 /* compare keys until found */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
288 while ((i < nr_el) && (el[i].key != tmp))
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
289 i++;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
290 strcpy(buf, optarg);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
291 sscanf(buf, "%d-%d", &el[i].min, &el[i].max); /* copy over */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
292 if (el[i].min > el[i].max) /* swap them */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
293 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
294 tmp = el[i].min;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
295 el[i].min = el[i].max;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
296 el[i].max = tmp;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
297 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
298
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
299 /* printf ("\n %c = %c ... %s (%d-%d)", \
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
300 tmp, el[i].key, el[i].sym, el[i].min, el[i].max); */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
301 continue;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
302 case '~': /* invalid arg */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
303 default:
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
304 printf ("'%s -h' for help.\n", argv[0]);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
305 return 1;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
306 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
307
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
308 if (argv[optind] != NULL) /* remaining parameter on cmd line? */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
309 /* must be a file -- treat it line by line */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
310 return (readfile (argv[optind]));
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
311
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
312 if (single == TRUE) /* only one calculation requested? */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
313 do_calculations(mz, tol); /* do it, then exit ... */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
314 else
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
315 { /* otherwise run a loop */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
316 while (input(comment, &mz))
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
317 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
318 tmp = do_calculations(mz, tol);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
319 printf("\n");
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
320 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
321 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
322
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
323 return 0;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
324 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
325
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
326
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
327 /***************************************************************************
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
328 * INPUT: reads a dataset in "dialog mode". *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
329 * Input: Pointer to comment text, pointer to mass. *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
330 * Returns: Result of sscanf(), 0 if prog is to be finished. *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
331 * Note: This is a fairly primitive way to do it, but it works ;-) *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
332 ****************************************************************************/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
333 int input(char *txt, double *zahl)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
334 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
335 char buf[MAXLEN]; /* input line */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
336
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
337 *zahl = 0.0; /* reset */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
338
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
339 printf("Comment : "); /* display prompt */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
340 fgets(buf, MAXLEN-1, stdin); /* read line */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
341 buf[MAXLEN] = 0x0; /* terminate string */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
342 clean (buf); /* remove linefeed */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
343 strcpy(txt, buf); /* copy text over */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
344
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
345 printf("Mass (ENTER to quit): "); /* display prompt */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
346 fgets(buf, MAXLEN-1, stdin); /* read line */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
347 buf[MAXLEN] = 0x0; /* terminate string */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
348 if (!clean (buf)) /* only a CR ? --> quit */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
349 return 0;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
350 sscanf(buf,"%lf", zahl); /* scan string */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
351
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
352 return 1;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
353 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
354
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
355
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
356 /***************************************************************************
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
357 * READFILE: reads dataset from file. *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
358 * Input: Pointer to comment text, pointer to mass. *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
359 * Returns: 0 if OK, 1 if error. *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
360 ****************************************************************************/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
361 int readfile(char *whatfile)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
362 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
363 double mz; /* measured mass */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
364 char buf[MAXLEN]; /* input line */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
365 FILE *infile;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
366
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
367 infile = fopen(whatfile, "r");
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
368 if (NULL == infile)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
369 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
370 fprintf (stderr, "Error: Cannot open %s.", whatfile);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
371 return 1;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
372 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
373
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
374 while (fgets(buf, MAXLEN-1, infile))
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
375 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
376 buf[MAXLEN] = 0x0; /* terminate string */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
377 if (*buf == ';') /* comment line */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
378 continue;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
379 if (!clean (buf)) /* only a CR ? --> quit */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
380 return 0;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
381 sscanf(buf,"%s %lf", comment, &mz); /* scan string */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
382 do_calculations(mz, tol);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
383 mz = 0.0; /* reset */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
384 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
385 return 0;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
386 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
387
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
388
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
389 /************************************************************************
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
390 * CALC_MASS: Calculates mass of an ion from its composition. *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
391 * Input: nothing (uses global variables) *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
392 * Returns. mass of the ion. *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
393 * Note: Takes care of charge and electron mass! *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
394 * (Positive charge means removal of electrons). *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
395 *************************************************************************/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
396 double calc_mass(void)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
397 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
398 int i;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
399 double sum = 0.0;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
400
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
401 for (i=0; i < nr_el; i++)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
402 sum += el[i].mass * el[i].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
403
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
404 return (sum - (charge * electron));
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
405 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
406
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
407
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
408 /************************************************************************
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
409 * CALC_RDB: Calculates rings & double bond equivalents. *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
410 * Input: nothing (uses global variables) *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
411 * Returns. RDB. *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
412 *************************************************************************/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
413 float calc_rdb(void)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
414 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
415 int i;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
416 float sum = 2.0;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
417
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
418 for (i=0; i < nr_el; i++)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
419 sum += el[i].val * el[i].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
420
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
421 return (sum/2.0);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
422 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
423 /************************************************************************
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
424 * Calculates element ratios , CH2 (more than 8 electrons needed is not handled)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
425 * Calculations element probabilities if element_probability = true
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
426 * Input: nothing (uses global variables)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
427 * Returns. true/false.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
428 *************************************************************************/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
429 bool calc_element_ratios(bool element_probability)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
430 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
431 bool CHNOPS_ok;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
432 float HC_ratio;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
433 float NC_ratio;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
434 float OC_ratio;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
435 float PC_ratio;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
436 float SC_ratio;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
437
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
438 /* added the number of isotopes to the calculation - dle*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
439 float C_count = (float)el[0].cnt+(float)el[1].cnt; // C_count=12C+13C
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
440 float H_count = (float)el[2].cnt+(float)el[3].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
441 float N_count = (float)el[4].cnt+(float)el[5].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
442 /* modif end here */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
443 float O_count = (float)el[6].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
444 float P_count = (float)el[10].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
445 float S_count = (float)el[11].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
446
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
447
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
448 /* ELEMENT RATIOS allowed
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
449 MIN MAX (99.99%)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
450 H/C 0.07 6.00
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
451 N/C 0.00 4.00
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
452 O/C 0.00 3.00
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
453 P/C 0.00 2.00
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
454 S/C 0.00 6.00
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
455 */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
456
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
457 // set CHNOPS_ok = true and assume all ratios are ok
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
458 CHNOPS_ok = true;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
459 /*element_probability = false; */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
460
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
461
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
462 if (C_count && H_count >0) // C and H must have one count anyway (remove for non-organics//
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
463 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
464 HC_ratio = H_count/C_count;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
465 if (element_probability)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
466 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
467 if ((HC_ratio < 0.2) || (HC_ratio > 3.0)) // this is the H/C probability check ;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
468 CHNOPS_ok = false;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
469 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
470 else if (HC_ratio > 6.0) // this is the normal H/C ratio check - type cast from int to float is important
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
471 CHNOPS_ok = false;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
472 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
473
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
474 if (N_count >0) // if positive number of nitrogens then thes N/C ratio else just calc normal
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
475 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
476 NC_ratio = N_count/C_count;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
477 if (element_probability)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
478 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
479 if (NC_ratio > 2.0) // this is the N/C probability check ;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
480 CHNOPS_ok = false;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
481 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
482 else if (NC_ratio > 4.0)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
483 CHNOPS_ok = false;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
484 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
485
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
486 if (O_count >0) // if positive number of O then thes O/C ratio else just calc normal
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
487 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
488 OC_ratio = O_count/C_count;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
489 if (element_probability)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
490 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
491 if (OC_ratio > 1.2) // this is the O/C probability check ;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
492 CHNOPS_ok = false;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
493 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
494 else if (OC_ratio > 3.0)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
495 CHNOPS_ok = false;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
496 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
497
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
498 if (P_count >0) // if positive number of P then thes P/C ratio else just calc normal
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
499 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
500 PC_ratio = P_count/C_count;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
501 if (element_probability)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
502 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
503 if (PC_ratio > 0.32) // this is the P/C probability check ;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
504 CHNOPS_ok = false;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
505
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
506 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
507 else if (PC_ratio > 6.0)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
508 CHNOPS_ok = false;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
509 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
510
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
511 if (S_count >0) // if positive number of S then thes S/C ratio else just calc normal
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
512 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
513 SC_ratio = S_count/C_count;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
514 if (element_probability)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
515 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
516 if (SC_ratio > 0.65) // this is the S/C probability check ;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
517 CHNOPS_ok = false;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
518 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
519 else if (SC_ratio > 2.0)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
520 CHNOPS_ok = false;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
521 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
522
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
523 //-----------------------------------------------------------------------------
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
524
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
525 // check for multiple element ratios together with probability check
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
526 //if N<10, O<20, P<4, S<3 then true
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
527 if (element_probability && (N_count > 10) && (O_count > 20) && (P_count > 4) && (S_count > 1))
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
528 CHNOPS_ok = false;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
529
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
530 // NOP check for multiple element ratios together with probability check
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
531 // NOP all > 3 and (N<11, O <22, P<6 then true)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
532 if (element_probability && (N_count > 3) && (O_count > 3) && (P_count > 3))
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
533 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
534 if (element_probability && (N_count > 11) && (O_count > 22) && (P_count > 6))
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
535 CHNOPS_ok = false;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
536 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
537
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
538 // OPS check for multiple element ratios together with probability check
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
539 // O<14, P<3, S<3 then true
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
540 if (element_probability && (O_count > 14) && (P_count > 3) && (S_count > 3))
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
541 CHNOPS_ok = false;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
542
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
543 // PSN check for multiple element ratios together with probability check
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
544 // P<3, S<3, N<4 then true
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
545 if (element_probability && (P_count > 3) && (S_count > 3) && (N_count >4))
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
546 CHNOPS_ok = false;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
547
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
548
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
549 // NOS check for multiple element ratios together with probability check
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
550 // NOS all > 6 and (N<19 O<14 S<8 then true)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
551 if (element_probability && (N_count >6) && (O_count >6) && (S_count >6))
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
552 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
553 if (element_probability && (N_count >19) && (O_count >14) && (S_count >8))
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
554 CHNOPS_ok = false;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
555 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
556
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
557 // function return value;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
558 if (CHNOPS_ok == true)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
559 return true;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
560 else
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
561 return false;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
562 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
563
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
564 /************************************************************************
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
565 * DO_CALCULATIONS: Does the actual calculation loop. *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
566 * Input: measured mass (in amu), tolerance (in mmu) *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
567 * Returns. number of hits. *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
568 *************************************************************************/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
569 long do_calculations (double measured_mass, double tolerance)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
570 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
571 time_t start, finish;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
572 double elapsed_time;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
573
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
574 double mass; /* calc'd mass */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
575 double limit_lo, limit_hi; /* mass limits */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
576 float rdb, lewis, rdbori; /* Rings & double bonds */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
577 long i,j;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
578 long long hit; /* counts the hits, with long declaration, overflow after 25h with all formulas < 2000 Da
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
579 long = FFFFFFFFh = 4,294,967,295d*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
580 int niso;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
581 long long counter;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
582 bool elementcheck;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
583 bool set_break;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
584
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
585
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
586 time( &start ); // start time
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
587
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
588 /* calculate limits */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
589 /* correct m/z value 'measured_mass' for z>1 using 'abscharge';
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
590 keep charge = 0 for neutral mass searches (z=0);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
591 additionally, keep the idea of 'adducts' for 'rdb', but use charge state instead -meb */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
592 if (charge<0) {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
593 abscharge = -charge;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
594 nadd = abscharge;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
595 } else if (charge>0) {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
596 abscharge = charge;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
597 nadd = abscharge;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
598 } else if (charge==0) {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
599 abscharge = 1; /* for limits */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
600 nadd = 0; /* for rdb */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
601 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
602
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
603 limit_lo = (measured_mass * abscharge) - (tolerance / 1000.0);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
604 limit_hi = (measured_mass * abscharge) + (tolerance / 1000.0);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
605
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
606 if(verbose) /* extended output as in original code - dle */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
607 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
608 if (strlen(comment)) /* print only if there is some text to print */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
609 printf ("Text \t%s\n", comment);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
610
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
611 printf("\n"); /* linefeed */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
612 printf ("Composition = \t");
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
613 for (i=0; i < nr_el; i++)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
614 if (el[i].max > 0)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
615 printf("%s:%d-%d ", el[i].sym, el[i].min, el[i].max);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
616 printf ("\n");
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
617
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
618 printf ("Mass Tolerance [mmu]: \t%.1f\n",tolerance);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
619 printf ("Measured Mass: \t%.6lf\n", measured_mass);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
620 printf ("Charge: \t%+.0lf\n", charge); /* dle */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
621 printf ("Num. of Adducts/Losses: \t%.0lf\n", nadd); /* dle */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
622 printf ("Apply 7GR: \t%d\n\n", applygr); /* dle */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
623 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
624
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
625 hit = 0; /* Reset counter */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
626 counter = 0;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
627 set_break = false; /* set breaker for element counts to false */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
628
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
629 /* Now let's run the big big loop ... I'd like to do that
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
630 recursively but did not yet figure out how ;-)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
631 TK Adds: the loop is just fine.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
632 */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
633
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
634 /* now comes the "COOL trick" for calculating all formulae:
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
635 sorting the high mass elements to the outer loops, the small weights (H)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
636 to the inner loops;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
637
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
638 This will reduce the computational time by factor ~10-60-1000
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
639 OLD HR: Cangrelor at 1ppm 4465 formulas found in 5866 seconds.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
640 NEW HR2: Cangrelor at 1ppm 4465 formulas found in 96 seconds.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
641 NEW2 HR2: Cangrelor at 1ppm 4465 formulas found in 60 seconds.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
642 NEW3 HR2: Cangrelor at 1ppm 4465 formulas found in 59 seconds.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
643 HR2 Fast: Cangrelor at 1ppm 4465 formulas found in 41 seconds by evaluating 2,003,436,894 formulae.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
644 hr2 -c "Cangrelor" -m 774.948 -t 0.77 -C 1-64 -H 1-112 -N 0-30 -O 0-80 -P 0-12 -S 0-9 -F 0-10 -L 0-10
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
645
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
646 Another additional trick is to end the 2nd.. 3rd.. 4th.. xth innermost loop
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
647 to prevent loops which are just higher and higher in mass.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
648 */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
649
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
650 /*dle: process new elements */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
651 el[17].cnt = el[17].min - 1; el[17].save = el[17].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
652 while (el[17].cnt++ < el[17].max) /*"iK"*/{
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
653
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
654 el[16].cnt = el[16].min - 1; el[16].save = el[16].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
655 while (el[16].cnt++ < el[16].max) /*"K"*/{
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
656
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
657 el[15].cnt = el[15].min - 1; el[15].save = el[15].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
658 while (el[15].cnt++ < el[15].max) /* "iBr"*/ {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
659
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
660 el[14].cnt = el[14].min - 1; el[14].save = el[14].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
661 while (el[14].cnt++ < el[14].max) /* "Br"*/ {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
662
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
663 el[13].cnt = el[13].min - 1; el[13].save = el[13].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
664 while (el[13].cnt++ < el[13].max) /*"iCl"*/ {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
665
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
666 el[12].cnt = el[12].min - 1; el[12].save = el[12].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
667 while (el[12].cnt++ < el[12].max) /*"Cl"*/ {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
668
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
669 el[11].cnt = el[11].min - 1; el[11].save = el[11].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
670 while (el[11].cnt++ < el[11].max) /*"S"*/ {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
671
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
672 el[10].cnt = el[10].min - 1; el[10].save = el[10].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
673 while (el[10].cnt++ < el[10].max) /*"P"*/ {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
674
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
675 el[9].cnt = el[9].min - 1; el[9].save = el[9].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
676 while (el[9].cnt++ < el[9].max) /*"Si"*/ {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
677
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
678 el[8].cnt = el[8].min - 1; el[8].save = el[8].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
679 while (el[8].cnt++ < el[8].max) /*"Na"*/{
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
680
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
681 el[7].cnt = el[7].min - 1; el[7].save = el[7].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
682 while (el[7].cnt++ < el[7].max) /*"F"*/ {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
683
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
684 el[6].cnt = el[6].min - 1; el[6].save = el[6].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
685 while (el[6].cnt++ < el[6].max) /*"O"*/ {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
686
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
687 el[5].cnt = el[5].min - 1; el[5].save = el[5].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
688 while (el[5].cnt++ < el[5].max) /*"15N"*/{
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
689
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
690 el[4].cnt = el[4].min - 1; el[4].save = el[4].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
691 while (el[4].cnt++ < el[4].max) /*"N"*/{
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
692
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
693 el[1].cnt = el[1].min - 1; el[1].save = el[1].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
694 while (el[1].cnt++ < el[1].max) /*"13C"*/ {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
695
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
696 el[0].cnt = el[0].min - 1; el[0].save = el[0].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
697 while (el[0].cnt++ < el[0].max) /* "C"*/ {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
698
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
699 el[3].cnt = el[3].min - 1; el[3].save = el[3].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
700 while (el[3].cnt++ < el[3].max) /*"D"*/{
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
701
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
702 el[2].cnt = el[2].min - 1; el[2].save = el[2].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
703 while (el[2].cnt++ < el[2].max) /*"H"*/{
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
704
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
705 mass = calc_mass();
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
706 counter++;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
707
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
708 //just for debug purposes
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
709 //if (mass > limit_hi)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
710 //printf("mass: %f\tC: %d H: %d N: %d O: %d P: %d S: %d Cl: %d Br: %d\n",mass,el[0].cnt,el[2].cnt,el[4].cnt,el[6].cnt,el[10].cnt,el[11].cnt,el[12].cnt,el[13].cnt);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
711
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
712 /* if we exceed the upper limit, we can stop the calculation
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
713 for this particular element (JHa 20050227). <-- comment TK that will only bust the innermost while loop, which is "H"*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
714
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
715 // break H loop
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
716 if (mass > limit_hi) break;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
717
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
718 //************************************************************************************************************/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
719 //Calculus loop with print out
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
720 //************************************************************************************************************/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
721
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
722 if ((mass >= limit_lo) && (mass <= limit_hi)) /* within limits? */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
723 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
724 // element check will be performed always, if variable bool element_probability is true also probabilities will be calculated
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
725 // not an elegant implementation, but fast.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
726
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
727 elementcheck = calc_element_ratios(applygr); /* pass applygr boolean by dle */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
728
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
729 if (elementcheck)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
730 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
731 rdbori = calc_rdb(); /* get RDB */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
732
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
733 rdb = rdbori + 0.5*nadd; /* dle: if nadd addcuts */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
734 lewis = (float)(fmod(rdb, 1)); /*calc reminder*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
735 if ((rdb >= 0) && (lewis != 0.5) && (lewis !=-0.5))/* less than -0.5 RDB does not make sense */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
736 { /* NO(!) CH3F10NS2 exists , RDB = -4.0 M= 282.9547*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
737 hit ++;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
738 for (i = 0; i < nr_el; i++) /* print composition */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
739 if (el[i].cnt > 0) /* but only if useful */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
740 printf("%s%d.", el[i].sym, el[i].cnt); // print formula
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
741
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
742 printf("\t");
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
743 /* dle: print out a more explicit molecular formula for further processing and
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
744 variable niso counts number of isotope elements in the solution */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
745 niso=0;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
746 for (i = 0; i < nr_el; i++)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
747 { /* print composition */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
748 if (el[i].cnt > 0)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
749 { /* but only if useful */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
750 printf("%s%d", el[i].symi, el[i].cnt); // print formula
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
751 if (el[i].symi != el[i].sym)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
752 niso=niso+el[i].cnt;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
753 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
754
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
755 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
756 /* dle: end of molecular print out */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
757
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
758 /* dle: additionnaly print nadd and niso */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
759 printf("\t%.2f\t%.7lf\t%.0lf\t%d\t%+.2lf\n", rdb, mass, nadd,niso, 1000.0 * ((measured_mass * abscharge) - mass));
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
760
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
761 } /* end of 'rdb' loop */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
762
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
763 } // end of elementcheck loop
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
764
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
765 } /* end of 'limit' loop */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
766 //************************************************************************************************************/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
767
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
768
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
769 /*
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
770 TK: if the current mass is larger than the limit the loop can be exited.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
771 Each element must point to the element which is in use and before.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
772 This is a static implementation which can be enhanced with a pointer chain to the lower element.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
773 Actually now its only allowed for CHNSOP-Fl-Cl-Br-Si !!! Brute-force <> elegance :-)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
774 */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
775 } /*"H"*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
776
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
777 if ((mass >= limit_lo) && (el[2].save == el[2].cnt-1)) break;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
778 } /*"D"*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
779
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
780 if ((mass >= limit_lo) && (el[3].save == el[3].cnt-1)) break; /* dle addons */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
781 } /* "C"*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
782
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
783 if ((mass >= limit_lo) && (el[0].save == el[0].cnt-1)) break;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
784 } /*"13C"*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
785
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
786 if ((mass >= limit_lo) && (el[1].save == el[1].cnt-1)) break; /* dle addons */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
787 } /*"N"*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
788
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
789 if ((mass >= limit_lo) && (el[4].save == el[4].cnt-1)) break;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
790 } /*"15N"*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
791
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
792 if ((mass >= limit_lo) && (el[5].save == el[5].cnt-1)) break; /* dle addons */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
793 } /*"O"*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
794
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
795 if ((mass >= limit_lo) && (el[6].save == el[6].cnt-1)) break;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
796 } /*"F"*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
797
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
798 if ((mass >= limit_lo) && (el[7].save == el[7].cnt-1)) break;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
799 } /*"Na"*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
800
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
801 if ((mass >= limit_lo) && (el[8].save == el[8].cnt-1)) break;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
802 } /*"Si"*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
803
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
804 if ((mass >= limit_lo) && (el[9].save == el[9].cnt-1)) break;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
805 } /*"P"*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
806
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
807 if ((mass >= limit_lo) && (el[10].save == el[10].cnt-1)) break;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
808 } /*"S"*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
809
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
810 if ((mass >= limit_lo) && (el[11].save == el[11].cnt-1)) break;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
811 } /*"Cl"*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
812
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
813 if ((mass >= limit_lo) && (el[12].save == el[12].cnt-1)) break;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
814 } /*"iCl"*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
815
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
816 if ((mass >= limit_lo) && (el[13].save == el[13].cnt-1)) break; /* dle addons */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
817 } /*"Br"*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
818
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
819 if ((mass >= limit_lo) && (el[14].save == el[14].cnt-1)) break;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
820 } /*"iBr"*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
821
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
822 if ((mass >= limit_lo) && (el[15].save == el[15].cnt-1)) break; /* dle addons */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
823 } /*"K"*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
824
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
825 if ((mass >= limit_lo) && (el[16].save == el[16].cnt-1)) break; /* dle addons */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
826 } /*"iK"*/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
827
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
828 /* close that giant loop thing started above */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
829
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
830
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
831
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
832
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
833 time(&finish); // stop timer
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
834 elapsed_time = difftime(finish , start); // calulate time difference
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
835
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
836 if(verbose){
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
837 if (!hit)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
838 printf("No matching combination found in %6.0f seconds.\n", elapsed_time );
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
839 else{
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
840 printf("\n%llu formulas found in %6.0f seconds by evaluating %llu formulae.\n",hit,elapsed_time,counter);
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
841 printf("RDBs are overloaded to maximum valence values (N=3,P=5,S=6).\n");
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
842 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
843 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
844 return hit;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
845 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
846
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
847
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
848 /************************************************************************
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
849 * CLEAN: "cleans" a buffer obtained by fgets() *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
850 * Input: Pointer to text buffer *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
851 * Returns: strlen of buffer. *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
852 *************************************************************************/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
853 int clean (char *buf)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
854 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
855 int i;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
856
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
857 for(i = 0; i < strlen(buf); i++) /* search for CR/LF */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
858 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
859 if(buf[i] == '\n' || buf[i] == '\r')
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
860 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
861 buf[i] = 0; /* stop at CR or LF */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
862 break;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
863 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
864 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
865 return (strlen(buf));
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
866 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
867
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
868
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
869
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
870 /***************************************************************************
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
871 * GETOPT: Command line parser, system V style.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
872 *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
873 * This routine is widely (and wildly) adapted from code that was
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
874 * made available by Borland International Inc.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
875 *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
876 * Standard option syntax is:
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
877 *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
878 * option ::= SW [optLetter]* [argLetter space* argument]
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
879 *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
880 * where
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
881 * - SW is '-'
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
882 * - there is no space before any optLetter or argLetter.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
883 * - opt/arg letters are alphabetic, not punctuation characters.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
884 * - optLetters, if present, must be matched in optionS.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
885 * - argLetters, if present, are found in optionS followed by ':'.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
886 * - argument is any white-space delimited string. Note that it
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
887 * can include the SW character.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
888 * - upper and lower case letters are distinct.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
889 *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
890 * There may be multiple option clusters on a command line, each
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
891 * beginning with a SW, but all must appear before any non-option
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
892 * arguments (arguments not introduced by SW). Opt/arg letters may
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
893 * be repeated: it is up to the caller to decide if that is an error.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
894 *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
895 * The character SW appearing alone as the last argument is an error.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
896 * The lead-in sequence SWSW ("--") causes itself and all the rest
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
897 * of the line to be ignored (allowing non-options which begin
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
898 * with the switch char).
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
899 *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
900 * The string *optionS allows valid opt/arg letters to be recognized.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
901 * argLetters are followed with ':'. Getopt () returns the value of
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
902 * the option character found, or EOF if no more options are in the
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
903 * command line. If option is an argLetter then the global optarg is
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
904 * set to point to the argument string (having skipped any white-space).
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
905 *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
906 * The global optind is initially 1 and is always left as the index
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
907 * of the next argument of argv[] which getopt has not taken. Note
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
908 * that if "--" or "//" are used then optind is stepped to the next
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
909 * argument before getopt() returns EOF.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
910 *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
911 * If an error occurs, that is an SW char precedes an unknown letter,
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
912 * then getopt() will return a '~' character and normally prints an
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
913 * error message via perror(). If the global variable opterr is set
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
914 * to false (zero) before calling getopt() then the error message is
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
915 * not printed.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
916 *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
917 * For example, if
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
918 *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
919 * *optionS == "A:F:PuU:wXZ:"
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
920 *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
921 * then 'P', 'u', 'w', and 'X' are option letters and 'A', 'F',
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
922 * 'U', 'Z' are followed by arguments. A valid command line may be:
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
923 *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
924 * aCommand -uPFPi -X -A L someFile
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
925 *
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
926 * where:
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
927 * - 'u' and 'P' will be returned as isolated option letters.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
928 * - 'F' will return with "Pi" as its argument string.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
929 * - 'X' is an isolated option.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
930 * - 'A' will return with "L" as its argument.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
931 * - "someFile" is not an option, and terminates getOpt. The
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
932 * caller may collect remaining arguments using argv pointers.
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
933 ***************************************************************************/
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
934 int getopt(int argc, char *argv[], char *optionS)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
935 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
936 static char *letP = NULL; /* remember next option char's location */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
937 static char SW = '-'; /* switch character */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
938
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
939 int opterr = 1; /* allow error message */
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
940 unsigned char ch;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
941 char *optP;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
942
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
943 if (argc > optind)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
944 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
945 if (letP == NULL)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
946 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
947 if ((letP = argv[optind]) == NULL || *(letP++) != SW)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
948 goto gopEOF;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
949
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
950 if (*letP == SW)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
951 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
952 optind++;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
953 goto gopEOF;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
954 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
955 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
956 if (0 == (ch = *(letP++)))
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
957 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
958 optind++;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
959 goto gopEOF;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
960 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
961 if (':' == ch || (optP = strchr(optionS, ch)) == NULL)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
962 goto gopError;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
963 if (':' == *(++optP))
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
964 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
965 optind++;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
966 if (0 == *letP)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
967 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
968 if (argc <= optind)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
969 goto gopError;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
970 letP = argv[optind++];
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
971 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
972 optarg = letP;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
973 letP = NULL;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
974 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
975 else
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
976 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
977 if (0 == *letP)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
978 {
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
979 optind++;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
980 letP = NULL;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
981 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
982 optarg = NULL;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
983 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
984 return ch;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
985 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
986
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
987 gopEOF:
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
988 optarg = letP = NULL;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
989 return EOF;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
990
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
991 gopError:
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
992 optarg = NULL;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
993 errno = EINVAL;
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
994 if (opterr)
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
995 perror ("Command line option");
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
996 return ('~');
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
997 }
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
998
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
999 /*
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
1000 List of elements sorted according to mass
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
1001 _______________________
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
1002 INo# El Mass
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
1003 2 H 1.007825032
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
1004 3 D 2.014101778
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
1005 0 C 12
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
1006 1 13C 13.00335484
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
1007 4 N 14.00307401
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
1008 5 15N 15.0001089
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
1009 6 O 15.99491462
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
1010 7 F 18.9984032
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
1011 8 Na 22.98976967
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
1012 9 Si 27.97692653
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
1013 10 P 30.97376151
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
1014 11 S 31.97207069
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
1015 12 Cl 34.96885271
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
1016 13 Br 78.9183376
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
1017 ------------------------
86296c048e46 Init repository for [hr2]
fgiacomoni
parents:
diff changeset
1018 */