5
5
"errors"
6
6
"fmt"
7
7
"log"
8
- "math"
9
8
"regexp"
10
9
"slices"
11
10
"strconv"
@@ -112,10 +111,10 @@ func (db *PostgresSQLDB) GetIndexes() []Index {
112
111
indexes = append (indexes , Index {IndexName : "browse_options_atomcount_index" , TableName : "browse_options" , Columns : []string {"atomcount" }})
113
112
114
113
indexes = append (indexes , Index {IndexName : "peak_differences_spectrum_id_index" , TableName : "peak_differences" , Columns : []string {"spectrum_id" }})
114
+ indexes = append (indexes , Index {IndexName : "peak_differences_peak_id_index" , TableName : "peak_differences" , Columns : []string {"peak_id" }})
115
+ indexes = append (indexes , Index {IndexName : "peak_differences_precursor_mass_id_index" , TableName : "peak_differences" , Columns : []string {"precursor_mass" }})
115
116
indexes = append (indexes , Index {IndexName : "peak_differences_difference_index" , TableName : "peak_differences" , Columns : []string {"difference" }})
116
- indexes = append (indexes , Index {IndexName : "peak_differences_peak1_id_index" , TableName : "peak_differences" , Columns : []string {"peak1_id" }})
117
- indexes = append (indexes , Index {IndexName : "peak_differences_peak2_id_index" , TableName : "peak_differences" , Columns : []string {"peak2_id" }})
118
- indexes = append (indexes , Index {IndexName : "peak_differences_min_rel_intensity_index" , TableName : "peak_differences" , Columns : []string {"min_rel_intensity" }})
117
+ indexes = append (indexes , Index {IndexName : "peak_differences_rel_intensity_index" , TableName : "peak_differences" , Columns : []string {"rel_intensity" }})
119
118
120
119
indexes = append (indexes , Index {IndexName : "records_massbank_id_index" , TableName : "records" , Columns : []string {"massbank_id" }})
121
120
indexes = append (indexes , Index {IndexName : "records_accession_index" , TableName : "records" , Columns : []string {"accession" }})
@@ -1147,10 +1146,10 @@ func (p *PostgresSQLDB) NeutralLossSearch(neutralLoss *[]float64, tolerance *flo
1147
1146
for i := 0 ; i < neutralLossesCount ; i ++ {
1148
1147
parameters = append (parameters , strconv .FormatFloat ((* neutralLoss )[i ]- * tolerance , 'f' , - 1 , 64 ))
1149
1148
parameters = append (parameters , strconv .FormatFloat ((* neutralLoss )[i ]+ * tolerance , 'f' , - 1 , 64 ))
1150
- with = with + "t" + strconv .Itoa (i + 1 ) + " AS (SELECT spectrum_id, array_agg(ARRAY[peak1_id, peak2_id ]) AS agg FROM peak_differences WHERE difference BETWEEN $" + strconv .Itoa (len (parameters )- 1 ) + " AND $" + strconv .Itoa (len (parameters ))
1149
+ with = with + "t" + strconv .Itoa (i + 1 ) + " AS (SELECT spectrum_id, array_agg(ARRAY[peak_id, precursor_mass ]) AS agg FROM peak_differences WHERE difference BETWEEN $" + strconv .Itoa (len (parameters )- 1 ) + " AND $" + strconv .Itoa (len (parameters ))
1151
1150
if minRelIntensity != nil {
1152
1151
parameters = append (parameters , strconv .FormatInt (* minRelIntensity , 10 ))
1153
- with = with + " AND min_rel_intensity >= $" + strconv .Itoa (len (parameters ))
1152
+ with = with + " AND rel_intensity >= $" + strconv .Itoa (len (parameters ))
1154
1153
}
1155
1154
with = with + " GROUP BY spectrum_id)"
1156
1155
if i > 0 {
@@ -1167,6 +1166,7 @@ func (p *PostgresSQLDB) NeutralLossSearch(neutralLoss *[]float64, tolerance *flo
1167
1166
selectAggregations = selectAggregations + ")::json"
1168
1167
1169
1168
query = with + " SELECT " + selectAggregations + ", browse_options.accession, browse_options.atomcount " + from + " JOIN spectrum ON spectrum.id = t1.spectrum_id JOIN browse_options ON browse_options.massbank_id = spectrum.massbank_id;"
1169
+
1170
1170
stmt , err := p .database .Prepare (query )
1171
1171
if err != nil {
1172
1172
return nil , nil , nil , err
@@ -1880,40 +1880,43 @@ func (p *PostgresSQLDB) AddRecord(record *massbank.MassBank2, metaDataId string,
1880
1880
return err
1881
1881
}
1882
1882
1883
- if (msType == "MS2" || msType == "MS3" || msType == "MS4" ) && * record .Peak .NumPeak > 1 {
1884
- var sb strings.Builder
1885
- sb .WriteString ("INSERT INTO peak_differences (spectrum_id, difference, peak1_id, peak2_id, min_rel_intensity) VALUES" )
1886
- var diff float64
1887
- var toInsert = false
1888
- for i := 0 ; i < len (insertedPeaks .Id ); i ++ {
1889
- for j := i + 1 ; j < len (insertedPeaks .Id ); j ++ {
1890
- if insertedPeaks .Mz [i ] >= insertedPeaks .Mz [j ] {
1891
- diff = insertedPeaks .Mz [i ] - insertedPeaks .Mz [j ]
1892
- } else {
1893
- diff = insertedPeaks .Mz [j ] - insertedPeaks .Mz [i ]
1894
- }
1895
- if diff > 11.5 {
1896
- sb .WriteString (fmt .Sprintf (" (%d, %f, %d, %d, %f)" , spectrumId , diff , insertedPeaks .Id [i ], insertedPeaks .Id [j ], math .Min (float64 (insertedPeaks .Rel [i ]), float64 (insertedPeaks .Rel [j ]))))
1897
- if j < len (insertedPeaks .Id )- 1 {
1883
+ if (msType == "MS2" || msType == "MS3" || msType == "MS4" ) && * record .Peak .NumPeak > 1 && record .MassSpectrometry .FocusedIon != nil {
1884
+ var precursorStr = ""
1885
+ for _ , subProp := range * record .MassSpectrometry .FocusedIon {
1886
+ if subProp .Subtag == "PRECURSOR_M/Z" {
1887
+ precursorStr = subProp .Value
1888
+ break
1889
+ }
1890
+ }
1891
+ if precursorStr != "" {
1892
+ precursorMass , err := strconv .ParseFloat (precursorStr , 64 )
1893
+ if err == nil {
1894
+ var sb strings.Builder
1895
+ sb .WriteString ("INSERT INTO peak_differences (spectrum_id, peak_id, precursor_mass, difference, rel_intensity) VALUES" )
1896
+ var diff float64
1897
+ var toInsert = false
1898
+ for i := 0 ; i < len (insertedPeaks .Id ); i ++ {
1899
+ if insertedPeaks .Mz [i ] >= precursorMass {
1900
+ diff = insertedPeaks .Mz [i ] - precursorMass
1901
+ } else {
1902
+ diff = precursorMass - insertedPeaks .Mz [i ]
1903
+ }
1904
+ sb .WriteString (fmt .Sprintf (" (%d, %d, %f, %f, %f)" , spectrumId , insertedPeaks .Id [i ], precursorMass , diff , float64 (insertedPeaks .Rel [i ])))
1905
+ if i < len (insertedPeaks .Id )- 1 {
1898
1906
sb .WriteString ("," )
1899
1907
}
1900
1908
toInsert = true
1901
- } else {
1902
- toInsert = false
1903
1909
}
1904
- }
1905
- if toInsert && i < len (insertedPeaks .Id )- 2 {
1906
- sb .WriteString ("," )
1907
- }
1908
- }
1909
- if toInsert {
1910
- sb .WriteString (";" )
1911
- _ , err = tx .Exec (sb .String ())
1912
- if err != nil {
1913
- if err2 := tx .Rollback (); err2 != nil {
1914
- return errors .New ("Could not rollback after error: " + err2 .Error () + "\n :" + err .Error ())
1910
+ if toInsert {
1911
+ sb .WriteString (";" )
1912
+ _ , err = tx .Exec (sb .String ())
1913
+ if err != nil {
1914
+ if err2 := tx .Rollback (); err2 != nil {
1915
+ return errors .New ("Could not rollback after error: " + err2 .Error () + "\n :" + err .Error ())
1916
+ }
1917
+ return err
1918
+ }
1915
1919
}
1916
- return err
1917
1920
}
1918
1921
}
1919
1922
}
@@ -1936,6 +1939,7 @@ func (p *PostgresSQLDB) AddRecord(record *massbank.MassBank2, metaDataId string,
1936
1939
if err2 := tx .Rollback (); err2 != nil {
1937
1940
return errors .New ("Could not rollback after error: " + err2 .Error () + "\n :" + err .Error ())
1938
1941
}
1942
+ return err
1939
1943
}
1940
1944
1941
1945
err = tx .Commit ()
@@ -1955,13 +1959,19 @@ func (p *PostgresSQLDB) AddRecords(records []*massbank.MassBank2, metaDataId str
1955
1959
return errors .New ("records and mb3RecordJsons must have the same length" )
1956
1960
}
1957
1961
1962
+ start := time .Now ()
1963
+
1958
1964
for i , record := range records {
1959
1965
err := p .AddRecord (record , metaDataId , mb3RecordJsons [i ])
1960
1966
if err != nil {
1961
1967
return err
1962
1968
}
1963
1969
}
1964
1970
1971
+ elapsed := time .Since (start )
1972
+ fmt .Printf ("\n -> AddRecord function took %s" , elapsed )
1973
+ fmt .Println ()
1974
+
1965
1975
return nil
1966
1976
}
1967
1977
@@ -2163,11 +2173,11 @@ func (p *PostgresSQLDB) Init() error {
2163
2173
);
2164
2174
2165
2175
CREATE TABLE peak_differences (
2166
- spectrum_id INT NOT NULL REFERENCES spectrum(id) ON UPDATE CASCADE ON DELETE CASCADE,
2167
- difference FLOAT NOT NULL,
2168
- peak1_id INT NOT NULL REFERENCES peak(id) ON UPDATE CASCADE ON DELETE CASCADE ,
2169
- peak2_id INT NOT NULL REFERENCES peak(id) ON UPDATE CASCADE ON DELETE CASCADE,
2170
- min_rel_intensity FLOAT NOT NULL
2176
+ spectrum_id INT NOT NULL REFERENCES spectrum(id) ON UPDATE CASCADE ON DELETE CASCADE,
2177
+ peak_id INT NOT NULL REFERENCES peak(id) ON UPDATE CASCADE ON DELETE CASCADE,
2178
+ precursor_mass FLOAT NOT NULL,
2179
+ difference FLOAT NOT NULL,
2180
+ rel_intensity FLOAT NOT NULL
2171
2181
);
2172
2182
2173
2183
CREATE TABLE IF NOT EXISTS records (
0 commit comments