OSCR

An X-linked long non-coding RNA, PTCHD1-AS, and the core features of autism.

Code ↔ Paper

1 match between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 1 match
  1. [1] § Methods › Proteomics and western blot analysis › Proteomics analysis using TMT-MS ↔ comet_GUI.py, lines 130–206 · score 0.57 · mass range, charge state, acid, TMT, reversed, scan

Paper

Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

Python · 863 lines · 40 KB · MIT · 1 match

  1. """comet_GUI.py
  2. Simple GUI interface for setting common Comet search parameters.
  3. written by Delan Huang, OHSU, 2014
  4. additions by Phil Wilmarth, OHSU, 2014.
  5. The MIT License (MIT)
  6. Copyright (c) 2017 Phillip A. Wilmarth and OHSU
  7. Permission is hereby granted, free of charge, to any person obtaining a copy
  8. of this software and associated documentation files (the "Software"), to deal
  9. in the Software without restriction, including without limitation the rights
  10. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11. copies of the Software, and to permit persons to whom the Software is
  12. furnished to do so, subject to the following conditions:
  13. The above copyright notice and this permission notice shall be included in
  14. all copies or substantial portions of the Software.
  15. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. THE SOFTWARE.
  22. Direct questions to:
  23. Technology & Research Collaborations, Oregon Health & Science University,
  24. Ph: 503-494-8200, FAX: 503-494-4729, Email: [email hidden].
  25. """
  26. # need to change license to MIT
  27. # converted for Python 3 -PW 20170915
  28. # added support for TMT 16-plex to static mods -PW 20200629
  29. # added support for high-res MS2 -PW 20200629
  30. ###########################
  31. # NOTE: there is no input validation checking for numerical fields
  32. ###########################
  33. # default Comet params file contents (this is for version 2016.01 rev. 3)
  34. comet_default_params = """# comet_version 2016.01 rev. 3
  35. # Comet MS/MS search engine parameters file.
  36. # Everything following the '#' symbol is treated as a comment.
  37. database_name = /some/path/db.fasta
  38. decoy_search = 0 # 0=no (default), 1=concatenated search, 2=separate search
  39. num_threads = 0 # 0=poll CPU to set num threads; else specify num threads directly (max 64)
  40. #
  41. # masses
  42. #
  43. peptide_mass_tolerance = 3.00
  44. peptide_mass_units = 0 # 0=amu, 1=mmu, 2=ppm
  45. mass_type_parent = 1 # 0=average masses, 1=monoisotopic masses
  46. mass_type_fragment = 1 # 0=average masses, 1=monoisotopic masses
  47. precursor_tolerance_type = 0 # 0=MH+ (default), 1=precursor m/z; only valid for amu/mmu tolerances
  48. isotope_error = 0 # 0=off, 1=on -1/0/1/2/3 (standard C13 error), 2= -8/-4/0/4/8 (for +4/+8 labeling)
  49. #
  50. # search enzyme
  51. #
  52. search_enzyme_number = 1 # choose from list at end of this params file
  53. num_enzyme_termini = 2 # 1 (semi-digested), 2 (fully digested, default), 8 C-term unspecific , 9 N-term unspecific
  54. allowed_missed_cleavage = 2 # maximum value is 5; for enzyme search
  55. #
  56. # Up to 9 variable modifications are supported
  57. # format: <mass> <residues> <0=variable/else binary> <max_mods_per_peptide> <term_distance> <n/c-term> <required>
  58. # e.g. 79.966331 STY 0 3 -1 0 0
  59. #
  60. variable_mod01 = 15.9949 M 0 3 -1 0 0
  61. variable_mod02 = 0.0 X 0 3 -1 0 0
  62. variable_mod03 = 0.0 X 0 3 -1 0 0
  63. variable_mod04 = 0.0 X 0 3 -1 0 0
  64. variable_mod05 = 0.0 X 0 3 -1 0 0
  65. variable_mod06 = 0.0 X 0 3 -1 0 0
  66. variable_mod07 = 0.0 X 0 3 -1 0 0
  67. variable_mod08 = 0.0 X 0 3 -1 0 0
  68. variable_mod09 = 0.0 X 0 3 -1 0 0
  69. max_variable_mods_in_peptide = 5
  70. require_variable_mod = 0
  71. #
  72. # fragment ions
  73. #
  74. # ion trap ms/ms: 1.0005 tolerance, 0.4 offset (mono masses), theoretical_fragment_ions = 1
  75. # high res ms/ms: 0.02 tolerance, 0.0 offset (mono masses), theoretical_fragment_ions = 0
  76. #
  77. fragment_bin_tol = 1.0005 # binning to use on fragment ions
  78. fragment_bin_offset = 0.4 # offset position to start the binning (0.0 to 1.0)
  79. theoretical_fragment_ions = 1 # 0=use flanking peaks, 1=M peak only
  80. use_A_ions = 0
  81. use_B_ions = 1
  82. use_C_ions = 0
  83. use_X_ions = 0
  84. use_Y_ions = 1
  85. use_Z_ions = 0
  86. use_NL_ions = 0 # 0=no, 1=yes to consider NH3/H2O neutral loss peaks
  87. #
  88. # output
  89. #
  90. output_sqtstream = 0 # 0=no, 1=yes write sqt to standard output
  91. output_sqtfile = 0 # 0=no, 1=yes write sqt file
  92. output_txtfile = 0 # 0=no, 1=yes write tab-delimited txt file
  93. output_pepxmlfile = 1 # 0=no, 1=yes write pep.xml file
  94. output_percolatorfile = 0 # 0=no, 1=yes write Percolator tab-delimited input file
  95. output_outfiles = 0 # 0=no, 1=yes write .out files
  96. print_expect_score = 1 # 0=no, 1=yes to replace Sp with expect in out & sqt
  97. num_output_lines = 5 # num peptide results to show
  98. show_fragment_ions = 0 # 0=no, 1=yes for out files only
  99. sample_enzyme_number = 1 # Sample enzyme which is possibly different than the one applied to the search.
  100. # Used to calculate NTT & NMC in pepXML output (default=1 for trypsin).
  101. #
  102. # mzXML parameters
  103. #
  104. scan_range = 0 0 # start and scan scan range to search; 0 as 1st entry ignores parameter
  105. precursor_charge = 0 0 # precursor charge range to analyze; does not override any existing charge; 0 as 1st entry ignores parameter
  106. override_charge = 0 # 0=no, 1=override precursor charge states, 2=ignore precursor charges outside precursor_charge range, 3=see online
  107. ms_level = 2 # MS level to analyze, valid are levels 2 (default) or 3
  108. activation_method = ALL # activation method; used if activation method set; allowed ALL, CID, ECD, ETD, PQD, HCD, IRMPD
  109. #
  110. # misc parameters
  111. #
  112. digest_mass_range = 600.0 5000.0 # MH+ peptide mass range to analyze
  113. num_results = 100 # number of search hits to store internally
  114. skip_researching = 1 # for '.out' file output only, 0=search everything again (default), 1=don't search if .out exists
  115. max_fragment_charge = 3 # set maximum fragment charge state to analyze (allowed max 5)
  116. max_precursor_charge = 6 # set maximum precursor charge state to analyze (allowed max 9)
  117. nucleotide_reading_frame = 0 # 0=proteinDB, 1-6, 7=forward three, 8=reverse three, 9=all six
  118. clip_nterm_methionine = 0 # 0=leave sequences as-is; 1=also consider sequence w/o N-term methionine
  119. spectrum_batch_size = 0 # max. # of spectra to search at a time; 0 to search the entire scan range in one loop
  120. decoy_prefix = DECOY_ # decoy entries are denoted by this string which is pre-pended to each protein accession
  121. output_suffix = # add a suffix to output base names i.e. suffix "-C" generates base-C.pep.xml from base.mzXML input
  122. mass_offsets = # one or more mass offsets to search (values substracted from deconvoluted precursor mass)
  123. #
  124. # spectral processing
  125. #
  126. minimum_peaks = 10 # required minimum number of peaks in spectrum to search (default 10)
  127. minimum_intensity = 0 # minimum intensity value to read in
  128. remove_precursor_peak = 0 # 0=no, 1=yes, 2=all charge reduced precursor peaks (for ETD)
  129. remove_precursor_tolerance = 1.5 # +- Da tolerance for precursor removal
  130. clear_mz_range = 0.0 0.0 # for iTRAQ/TMT type data; will clear out all peaks in the specified m/z range
  131. #
  132. # additional modifications
  133. #
  134. add_Cterm_peptide = 0.0
  135. add_Nterm_peptide = 0.0
  136. add_Cterm_protein = 0.0
  137. add_Nterm_protein = 0.0
  138. add_G_glycine = 0.0000 # added to G - avg. 57.0513, mono. 57.02146
  139. add_A_alanine = 0.0000 # added to A - avg. 71.0779, mono. 71.03711
  140. add_S_serine = 0.0000 # added to S - avg. 87.0773, mono. 87.03203
  141. add_P_proline = 0.0000 # added to P - avg. 97.1152, mono. 97.05276
  142. add_V_valine = 0.0000 # added to V - avg. 99.1311, mono. 99.06841
  143. add_T_threonine = 0.0000 # added to T - avg. 101.1038, mono. 101.04768
  144. add_C_cysteine = 57.021464 # added to C - avg. 103.1429, mono. 103.00918
  145. add_L_leucine = 0.0000 # added to L - avg. 113.1576, mono. 113.08406
  146. add_I_isoleucine = 0.0000 # added to I - avg. 113.1576, mono. 113.08406
  147. add_N_asparagine = 0.0000 # added to N - avg. 114.1026, mono. 114.04293
  148. add_D_aspartic_acid = 0.0000 # added to D - avg. 115.0874, mono. 115.02694
  149. add_Q_glutamine = 0.0000 # added to Q - avg. 128.1292, mono. 128.05858
  150. add_K_lysine = 0.0000 # added to K - avg. 128.1723, mono. 128.09496
  151. add_E_glutamic_acid = 0.0000 # added to E - avg. 129.1140, mono. 129.04259
  152. add_M_methionine = 0.0000 # added to M - avg. 131.1961, mono. 131.04048
  153. add_O_ornithine = 0.0000 # added to O - avg. 132.1610, mono 132.08988
  154. add_H_histidine = 0.0000 # added to H - avg. 137.1393, mono. 137.05891
  155. add_F_phenylalanine = 0.0000 # added to F - avg. 147.1739, mono. 147.06841
  156. add_U_selenocysteine = 0.0000 # added to U - avg. 150.3079, mono. 150.95363
  157. add_R_arginine = 0.0000 # added to R - avg. 156.1857, mono. 156.10111
  158. add_Y_tyrosine = 0.0000 # added to Y - avg. 163.0633, mono. 163.06333
  159. add_W_tryptophan = 0.0000 # added to W - avg. 186.0793, mono. 186.07931
  160. add_B_user_amino_acid = 0.0000 # added to B - avg. 0.0000, mono. 0.00000
  161. add_J_user_amino_acid = 0.0000 # added to J - avg. 0.0000, mono. 0.00000
  162. add_X_user_amino_acid = 0.0000 # added to X - avg. 0.0000, mono. 0.00000
  163. add_Z_user_amino_acid = 0.0000 # added to Z - avg. 0.0000, mono. 0.00000
  164. #
  165. # COMET_ENZYME_INFO _must_ be at the end of this parameters file
  166. #
  167. [COMET_ENZYME_INFO]
  168. 0. No_enzyme 0 - -
  169. 1. Trypsin 1 KR P
  170. 2. Trypsin/P 1 KR -
  171. 3. Lys_C 1 K P
  172. 4. Lys_N 0 K -
  173. 5. Arg_C 1 R P
  174. 6. Asp_N 0 D -
  175. 7. CNBr 1 M -
  176. 8. Glu_C 1 DE P
  177. 9. PepsinA 1 FL P
  178. 10. Chymotrypsin 1 FWYL P
  179. """
  180. # global imports
  181. from tkinter import *
  182. import tkinter.ttk as ttk
  183. import PAW_lib
  184. import os
  185. import sys
  186. import time
  187. class staticMods(Toplevel):
  188. """Creates a static modification top-level widget.
  189. """
  190. def __init__(self, parent, default_params, static_list):
  191. """Constructor
  192. """
  193. Toplevel.__init__(self, parent)
  194. self.transient(parent)
  195. self.default_params = default_params
  196. self.static_list = static_list
  197. self.parent = parent
  198. self.title('Static modifications')
  199. self.attributes('-topmost', 1)
  200. # parse the static modifications from the default params contents
  201. self.keys = [] # this keeps the order of the static mods
  202. self.static_dict = {}
  203. self.parse_static_mods()
  204. # create a static mods frame with labels and entries
  205. self.create_static_mods_frame()
  206. self.initial_focus = self.static_mods_frame
  207. self.buttonbox()
  208. # this makes the static mods a modal widget
  209. self.grab_set()
  210. self.protocol('WM_DELETE_WINDOW', self.onDone)
  211. self.geometry('+%d+%d' % (parent.winfo_rootx()+50, parent.winfo_rooty()+50))
  212. self.initial_focus.focus_set()
  213. self.wait_window(self)
  214. return
  215. def buttonbox(self):
  216. """Create some action buttons below main GUI elements.
  217. """
  218. box = Frame(self)
  219. w1 = Button(box, text='TMT 6/10/11', width=10, command=self.TMT_229)
  220. w1.pack(side=LEFT, padx=5, pady=5)
  221. w2 = Button(box, text='TMT 16/18', width=10, command=self.TMT_304)
  222. w2.pack(side=LEFT, padx=5, pady=5)
  223. box.pack()
  224. w = Button(box, text='Done', width=10, command=self.onDone)
  225. w.pack(side=LEFT, padx=5, pady=5)
  226. self.bind('<Return>', self.onDone)
  227. box.pack()
  228. def parse_static_mods(self):
  229. """Parses the static modification information from the default params file.
  230. """
  231. for line in self.default_params.splitlines():
  232. line = line.strip()
  233. if line.startswith('add_'):
  234. key = line.split('=')[0].strip()
  235. self.keys.append(key)
  236. value = line.split('=')[1].split('#')[0].strip()
  237. try:
  238. comment = line.split('=')[1].split('#')[1].strip()
  239. except IndexError:
  240. comment = ''
  241. self.static_dict[key] = (value, comment)
  242. else:
  243. continue
  244. return
  245. def create_static_mods_frame(self):
  246. """Creates a grid layout of the static modifications with entries for deltamass.
  247. """
  248. self.static_mods_frame = ttk.Labelframe(self, text='Static modifications:')
  249. self.static_mods_frame.pack(fill=X, expand=YES, padx=5, pady=5)
  250. #Variables
  251. self.static_mass = {}
  252. #Creation
  253. headers = ('Residue/Position', 'Static deltamass', 'Comments')
  254. locations = ('e', 'we', 'w')
  255. for i, header in enumerate(headers):
  256. Label(self.static_mods_frame, text=header).grid(column=i,row=0, sticky=locations[i])
  257. for i, key in enumerate(self.keys):
  258. # get values from parsed dictionary and set entry fields
  259. mass, comment = self.static_dict[key]
  260. self.static_mass[i] = DoubleVar()
  261. self.static_mass[i].set(float(mass))
  262. # grid the widgets
  263. Label(self.static_mods_frame, text=key).grid(column=0, row=i+1, sticky=E)
  264. Entry(self.static_mods_frame, textvariable=self.static_mass[i]).grid(column=1, row=i+1)
  265. Label(self.static_mods_frame, text=comment).grid(column=2, row=i+1, sticky=W)
  266. return
  267. def TMT_229(self, event=None):
  268. """Sets static mods for 10-plex TMT labeling.
  269. """
  270. self.static_dict['add_K_lysine'] = ('229.1629320', 'added to K - avg. 128.1723, mono. 128.09496')
  271. self.static_dict['add_Nterm_peptide'] = ('229.1629320', '')
  272. for i, key in enumerate(self.keys):
  273. # get values from parsed dictionary and set entry fields
  274. mass, comment = self.static_dict[key]
  275. self.static_mass[i].set(float(mass))
  276. def TMT_304(self, event=None):
  277. """Sets static mods for 10-plex TMT labeling.
  278. """
  279. self.static_dict['add_K_lysine'] = ('304.2071', 'added to K - avg. 128.1723, mono. 128.09496')
  280. self.static_dict['add_Nterm_peptide'] = ('304.2071', '')
  281. for i, key in enumerate(self.keys):
  282. # get values from parsed dictionary and set entry fields
  283. mass, comment = self.static_dict[key]
  284. self.static_mass[i].set(float(mass))
  285. def onDone(self, event=None):
  286. """Reads out the deltamass values and loads them into a passed in list pointer, then exits.
  287. """
  288. for i, key in enumerate(self.keys):
  289. self.static_list.append((key, self.static_mass[i].get(), self.static_dict[key][1]))
  290. self.withdraw()
  291. self.update_idletasks()
  292. self.parent.focus_set()
  293. self.destroy()
  294. # end class
  295. class CometGUI:
  296. """Main GUI for setting a few of the common Comet parameters. A modified
  297. comet.params file is written and comet searches can be launched.
  298. """
  299. def __init__(self):
  300. """Constructor. Uses a collection of frames for related parameters.
  301. """
  302. self.root = Tk()
  303. self.root.title('Comet Parameters')
  304. self.root.protocol('WM_DELETE_WINDOW', self.quit_gui)
  305. # self.root.attributes('-topmost', 1)
  306. # self.root.attributes('-topmost', 0)
  307. # set some default attributes
  308. self.ms2_folder = None
  309. self.filename = None
  310. #create GUI
  311. self.create_dir_frame()
  312. self.create_masses_frame()
  313. self.create_use_ion_frame()
  314. self.create_search_enzyme_frame()
  315. self.create_variable_mods_frame()
  316. # buttons at bottom of GUI
  317. Button(self.root, text='Change static modifications', command=self.change_static).pack(pady=2)
  318. self.save_params = Button(self.root, text='Save Settings and Create Parameters File',
  319. command=self.save_settings, state=NORMAL)
  320. self.save_params.pack(pady=2)
  321. self.run_comet = Button(self.root, text='Run Comet', command=self.run_comet)
  322. self.run_comet.pack(pady=2)
  323. Button(self.root, text='Quit', command=self.quit_gui).pack(pady=2)
  324. # place holder for static mod information
  325. self.static_list = []
  326. # enter mainloop
  327. self.root.mainloop()
  328. return
  329. #Functions to help create widgets
  330. def create_entry(self, root, label, variable):
  331. """Creates a text entry widget.
  332. """
  333. frame = Frame(root)
  334. Label(frame, text=label).pack(side=LEFT)
  335. Entry(frame, textvariable=variable).pack(side=LEFT)
  336. return frame
  337. def create_checkboxes(self, root, label, ions_list):
  338. """Creates a checkbox widget.
  339. """
  340. frame = Frame(root)
  341. Label(frame, text=label).pack(side=LEFT)
  342. for button, variable in ions_list:
  343. Checkbutton(frame, text=button, variable=variable).pack(side=LEFT)
  344. return frame
  345. def create_radiobuttons(self, root, label, buttons, variable):
  346. """Creates a radiobutton widget.
  347. """
  348. frame = Frame(root)
  349. Label(frame, text=label).pack(side=LEFT)
  350. for text,value in (buttons):
  351. Radiobutton(frame, text=text, variable=variable, value=value).pack(side=LEFT)
  352. return frame
  353. def create_listbox(self, root, label, items, lines, function):
  354. """Creates a listbox widget.
  355. """
  356. frame = Frame(root)
  357. Label(frame, text=label).pack(side=LEFT)
  358. item_var = StringVar(value=items)
  359. listbox = Listbox(frame, listvariable=item_var, height=lines)
  360. for item, index in enumerate(items):
  361. listbox.insert(item, index)
  362. scrollbar = Scrollbar(frame)
  363. scrollbar.pack(side=RIGHT, fill=BOTH)
  364. listbox.config(yscrollcommand=scrollbar.set)
  365. scrollbar.config(command=listbox.yview)
  366. listbox.pack(side=LEFT,expand=YES, fill=X)
  367. listbox.bind('<<ListboxSelect>>', self.update_enzyme)
  368. return frame
  369. def create_combobox(self, root, label, variable, items):
  370. """Creates a ttk combobox widget.
  371. """
  372. frame = Frame(root)
  373. Label(frame, text=label).pack(side=LEFT)
  374. combobox = ttk.Combobox(frame, textvariable=variable)
  375. combobox['values'] = items
  376. combobox.pack(side=LEFT,expand=YES, fill=X)
  377. return frame, combobox
  378. #Helper Methods
  379. def load_database(self):
  380. """Maybe just handles a cancel button click?
  381. """
  382. database_name = PAW_lib.get_file(self.def_location, self.extension_list, 'Select a FASTA database file')
  383. if not database_name:
  384. self.quit_gui()
  385. self.database.set(database_name)
  386. self.filename = database_name
  387. return
  388. def update_enzyme(self, evt):
  389. """Grabs value of search_enzyme when user click on option in combo box
  390. """
  391. w = evt.widget
  392. self.enzyme_number = int(w.curselection()[0])
  393. enzyme = w.get(self.enzyme_number)
  394. print(enzyme)
  395. return
  396. def callback(self, *args):
  397. """Callback function creates two lists of all values grabbed from variable mods frame (deltamass and residue)
  398. """
  399. self.deltamass_values = []
  400. self.residue_values = []
  401. for i in range(self.max_num_mods):
  402. try:
  403. self.deltamass_values.append(self.num_vars_deltamass[i].get())
  404. except ValueError:
  405. pass
  406. self.residue_values.append(self.num_vars_residue[i].get())
  407. def check_for_blank_mods(self):
  408. """Catches if user inputs a variable mod into a slot number higher than the next available one, ie:
  409. user puts '16.0 M' into variable mod 6, when variable mod 1 is still '0.0 X'
  410. """
  411. # this does not change the GUI variables but copies them into a companion structure
  412. self.vars_deltamass = [0.0 for x in range(self.max_num_mods)]
  413. self.vars_residue = ['' for x in range(self.max_num_mods)]
  414. mod_counter = 0
  415. for mod in range(self.max_num_mods):
  416. if self.num_vars_deltamass[mod].get() > 0.0:
  417. self.vars_deltamass[mod_counter] = self.num_vars_deltamass[mod].get()
  418. self.vars_residue[mod_counter] = self.num_vars_residue[mod].get()
  419. mod_counter += 1
  420. blank_mod = self.max_num_mods - mod_counter
  421. for i in range(blank_mod):
  422. offset = i + mod_counter
  423. self.vars_deltamass[offset] = 0.0
  424. self.vars_residue[offset] = 'X'
  425. def update_variable_mods(self, row):
  426. """Gets the data from the copies of the GUI entry data.
  427. """
  428. residue = self.vars_residue[row]
  429. mass = self.vars_deltamass[row]
  430. if residue == 'N-term' and mass != 0.0:
  431. target_variable_mod = '%0.4f %s %s' % (mass, 'n', '0 3 -1 0 0')
  432. elif residue == 'C-term' and mass != 0.0:
  433. target_variable_mod = '%0.4f %s %s' % (mass, 'c', '0 3 -1 1 0')
  434. else:
  435. target_variable_mod = '%0.4f %s %s' % (mass, residue.upper(), '0 3 -1 0 0')
  436. return target_variable_mod
  437. def get_ms2_folder(self):
  438. """get the folder where MS2 files are located"""
  439. location = os.getcwd()
  440. self.ms2_folder = PAW_lib.get_folder(location, 'Select folder with MS2 files')
  441. return
  442. def save_settings(self):
  443. """Creates an updated Comet parameters file based on the user input.
  444. """
  445. self.check_for_blank_mods()
  446. user_selected_params = {
  447. 'database_name': (self.database.get(), ''),
  448. 'peptide_mass_tolerance': (self.pep_mass_tol.get(), ''),
  449. 'peptide_mass_units': (self.pep_mass_units.get(), '# 0=amu, 1=mmu, 2=ppm'),
  450. 'mass_type_parent': (self.mass_type_par.get(), '# 0=average masses, 1=monoisotopic masses'),
  451. 'mass_type_fragment': (self.mass_type_frag.get(), '# 0=average masses, 1=monoisotopic masses'),
  452. 'use_A_ions': (self.use_A_ions.get(), ''),
  453. 'use_B_ions': (self.use_B_ions.get(), ''),
  454. 'use_C_ions': (self.use_C_ions.get(), ''),
  455. 'use_X_ions': (self.use_X_ions.get(), ''),
  456. 'use_Y_ions': (self.use_Y_ions.get(), ''),
  457. 'use_Z_ions': (self.use_Z_ions.get(), ''),
  458. 'use_NL_ions': (self.use_NL_ions.get(), '# 0=no, 1=yes to consider NH3/H2O neutral loss peaks'),
  459. 'search_enzyme_number': (self.enzyme.get(), '# choose from list at end of this params file'),
  460. 'variable_mod01': (self.update_variable_mods(0), ''),
  461. 'variable_mod02': (self.update_variable_mods(1), ''),
  462. 'variable_mod03': (self.update_variable_mods(2), ''),
  463. 'variable_mod04': (self.update_variable_mods(3), ''),
  464. 'variable_mod05': (self.update_variable_mods(4), ''),
  465. 'variable_mod06': (self.update_variable_mods(5), ''),
  466. 'variable_mod07': (self.update_variable_mods(6), ''),
  467. 'variable_mod08': (self.update_variable_mods(7), ''),
  468. 'variable_mod09': (self.update_variable_mods(8), ''),
  469. 'num_threads': ('20', '# 0=poll CPU to set num threads; else specify num threads directly (max 64)'),
  470. 'output_sqtfile': ('1', '# 0=no, 1=yes write sqt file'),
  471. 'output_pepxmlfile': ('0', '# 0=no, 1=yes write pep.xml file'),
  472. 'num_output_lines': ('12', '# num peptide results to show')
  473. }
  474. if self.frag_ion_type.get() == 0:
  475. user_selected_params['fragment_bin_tol'] = ('1.0005', '# binning to use on fragment ions')
  476. user_selected_params['fragment_bin_offset'] = ('0.4', '# offset position to start the binning (0.0 to 1.0)')
  477. user_selected_params['theoretical_fragment_ions'] = ('1', '# 0=use flanking peaks, 1=M peak only')
  478. user_selected_params['spectrum_batch_size'] =('0', '# max. # of spectra to search at a time; 0 to search the entire scan range in one loop')
  479. else:
  480. user_selected_params['fragment_bin_tol'] = ('0.02', '# binning to use on fragment ions')
  481. user_selected_params['fragment_bin_offset'] = ('0.0', '# offset position to start the binning (0.0 to 1.0)')
  482. user_selected_params['theoretical_fragment_ions'] = ('0', '# 0=use flanking peaks, 1=M peak only')
  483. user_selected_params['spectrum_batch_size'] =('20000', '# max. # of spectra to search at a time; 0 to search the entire scan range in one loop')
  484. if self.cleavage.get() == 1:
  485. user_selected_params['num_enzyme_termini'] = ('1', '# 1 (semi-digested), 2 (fully digested, default), 8 C-term unspecific , 9 N-term unspecific')
  486. # see if database can be found
  487. if not os.path.exists(user_selected_params['database_name'][0]):
  488. self.load_database()
  489. user_selected_params['database_name'] = (self.database.get(), '')
  490. # see if any static mods were changed
  491. if self.static_list:
  492. for key, value, comment in self.static_list:
  493. if comment:
  494. user_selected_params[key] = (value, '# ' + comment)
  495. else:
  496. user_selected_params[key] = (value, '')
  497. # get the folder where MS2 files are located (where to write params file)
  498. if not self.ms2_folder:
  499. self.get_ms2_folder()
  500. if not self.ms2_folder:
  501. return
  502. self.params_filename = os.path.join(self.ms2_folder, 'comet.params')
  503. with open(self.params_filename, 'w') as f:
  504. for line in comet_default_params.splitlines():
  505. key = line.split('=')[0].strip()
  506. if key in user_selected_params: # come back and do string formatting
  507. if key == 'peptide_mass_tolerance':
  508. f.write(str(key) + ' = ' + '{0:.2f}'.format(self.pep_mass_tol.get()) + '\n')
  509. elif key == 'fragment_bin_tol':
  510. f.write('%s = %s%s%s\n' % (key, user_selected_params[key][0], (36-len(key)-len(user_selected_params[key][0]))*' ', user_selected_params[key][1]))
  511. elif key == 'fragment_bin_offset':
  512. f.write('%s = %s%s%s\n' % (key, user_selected_params[key][0], (36-len(key)-len(user_selected_params[key][0]))*' ', user_selected_params[key][1]))
  513. elif key == 'theoretical_fragment_ions':
  514. f.write('%s = %s%s%s\n' % (key, user_selected_params[key][0], (36-len(key)-len(user_selected_params[key][0]))*' ', user_selected_params[key][1]))
  515. elif key == 'spectrum_batch_size':
  516. f.write('%s = %s%s%s\n' % (key, user_selected_params[key][0], (36-len(key)-len(user_selected_params[key][0]))*' ', user_selected_params[key][1]))
  517. elif key.startswith('search_'):
  518. idx = self.search_enzyme_list.index(user_selected_params[key][0])
  519. user_selected_params[key] = (idx, user_selected_params[key][1])
  520. pad = (36 - len(key) - len(str(user_selected_params[key][0]))) * ' '
  521. f.write('%s = %s%s%s\n' % (key, user_selected_params[key][0], pad, user_selected_params[key][1]))
  522. elif key.startswith('use_'):
  523. if user_selected_params[key][0] == True:
  524. user_selected_params[key] = ('1', user_selected_params[key][1])
  525. else:
  526. user_selected_params[key] = ('0', user_selected_params[key][1])
  527. pad = (36 - len(key) - len(user_selected_params[key][0])) * ' '
  528. f.write('%s = %s%s%s\n' % (key, user_selected_params[key][0], pad, user_selected_params[key][1]))
  529. elif key.startswith('variable_'):
  530. f.write('%s = %s \n' % (key, user_selected_params[key][0]))
  531. elif key.startswith('add_'):
  532. value = '%0.4f' % user_selected_params[key][0]
  533. f.write('%s = %s%s%s\n' % (key, value, (36-len(key)-len(value))*' ', user_selected_params[key][1]))
  534. else:
  535. pad = (36 - len(key) - len(str(user_selected_params[key][0]))) * ' '
  536. f.write('%s = %s%s%s\n' % (key, user_selected_params[key][0], pad, user_selected_params[key][1]))
  537. else:
  538. f.write(line + '\n')
  539. # self.run_comet['state'] = NORMAL
  540. return
  541. def run_comet(self):
  542. """This executes Comet using the user-created params file. Assumes that
  543. the input file format is MS2 (output is SQT) and that "Comet" is defined
  544. as an executable command.
  545. """
  546. import glob
  547. import sqt_converter
  548. # create a status bar for search progress
  549. self.progressbar = ttk.Progressbar(self.root)
  550. self.progressbar.pack(expand=Y, fill=X)
  551. self.progresstext = Label(self.root, text='Search progress')
  552. self.progresstext.pack()
  553. self.progressbar.update()
  554. # check if ms2 folder is set
  555. if not self.ms2_folder:
  556. self.get_ms2_folder()
  557. # check if comet.params exists
  558. self.filename = os.path.join(self.ms2_folder, 'comet.params')
  559. if not os.path.exists(self.filename):
  560. self.progresstext.configure(text='WARNING: comet.params file not found!!!')
  561. return
  562. os.chdir(self.ms2_folder)
  563. step = 100/len(glob.glob('*.ms2')) # step for progressbar
  564. starting_time = time.time()
  565. print('...Starting Comet searches at:', time.ctime())
  566. for ms2_file in glob.glob('*.ms2'):
  567. quoted_ms2_file = '"%s"' % ms2_file # in case filenames have spaces
  568. # update status bar
  569. self.progresstext.configure(text='Searching: %s' % (ms2_file,))
  570. self.progressbar.update()
  571. self.progressbar.step(step)
  572. self.progressbar.update()
  573. # run on each MS2 file with a wait for completion
  574. os.system('START "Comet" /WAIT /MIN /LOW CMD /C COMET2016 ' + quoted_ms2_file)
  575. ending_time = time.time()
  576. print('...Comet searches ended at:', time.ctime())
  577. print('...Searches took', ending_time - starting_time, 'seconds')
  578. # this creates top-hit TXT files from the SQT files after Comet has finished
  579. self.progresstext.configure(text='Searches completed. Starting TXT creation.')
  580. ## self.progressbar.update()
  581. ## self.progressbar.step(step)
  582. starting_time = time.time()
  583. print('...Starting conversions at:', time.ctime())
  584. sqt_converter.main(os.path.dirname(self.filename), overwrite=True)
  585. ending_time = time.time()
  586. print('...Conversions ended at:', time.ctime())
  587. print('...Conversions took', ending_time - starting_time, 'seconds')
  588. self.progresstext.configure(text='Conversions completed. Quit when ready...')
  589. def change_static(self):
  590. """Creates a window to view/change the static modifications.
  591. """
  592. staticMods(self.root, comet_default_params, self.static_list)
  593. return
  594. def quit_gui(self):
  595. """Quits the GUI.
  596. """
  597. self.root.withdraw()
  598. self.root.update_idletasks()
  599. self.root.destroy()
  600. sys.exit()
  601. # Methods to create sections of GUI
  602. def create_dir_frame(self):
  603. """Lets the user browse to the FASTA database location
  604. """
  605. dir_frame = ttk.Labelframe(self.root, text='Database:')
  606. dir_frame.pack(fill=X, expand=YES, padx=5, pady=5)
  607. #Variables
  608. self.database=StringVar()
  609. self.def_location = r'C:\\'
  610. self.extension_list = [('FASTA File','*.fasta')]
  611. #Defaults
  612. self.database.set('Select a database (click the button on the left)')
  613. #Creation
  614. ttk.Button(dir_frame, text='Database', command=self.load_database).pack(side=LEFT)
  615. db_entry = ttk.Entry(dir_frame, textvariable=self.database)
  616. db_entry.pack(side=LEFT, fill=X, expand=YES)
  617. return
  618. def create_masses_frame(self):
  619. """Lets the user change parent ion mass tolerance, type, etc.
  620. """
  621. masses_frame = ttk.Labelframe(self.root, text='Mass parameters:')
  622. masses_frame.pack(fill=X, expand=YES, padx=5, pady=5)
  623. #Variables
  624. self.pep_mass_tol = DoubleVar()
  625. self.pep_mass_units = IntVar()
  626. self.mass_type_par = IntVar()
  627. self.mass_type_frag = IntVar()
  628. self.frag_ion_type = IntVar()
  629. #Creation
  630. self.create_entry(masses_frame, 'Peptide Mass Tolerance: ', self.pep_mass_tol).pack(fill=X, expand=YES)
  631. self.create_radiobuttons(masses_frame, 'Peptide Mass Units: ',
  632. [('AMU',0),('MMU',1),('PPM',2)], self.pep_mass_units).pack(fill=X, expand=YES)
  633. self.create_radiobuttons(masses_frame, 'Parent Ion Mass Type: ',
  634. [('Average',0),('Monoisotopic',1)], self.mass_type_par).pack(fill=X, expand=YES)
  635. self.create_radiobuttons(masses_frame, 'Fragment ion type:',
  636. [('low res (IT)', 0), ('high res (Orbi)', 1)], self.frag_ion_type).pack(fill=X, expand=YES)
  637. #Set Defaults
  638. self.pep_mass_tol.set(1.25)
  639. self.pep_mass_units.set(0)
  640. self.mass_type_par.set(1)
  641. self.mass_type_frag.set(1) # hidden: set to monoisotopic
  642. self.frag_ion_type.set(0)
  643. return
  644. def create_use_ion_frame(self):
  645. """Lets the user select the ion series to use in scoring.
  646. """
  647. use_ion_frame = ttk.Labelframe(self.root, text='Ion series:')
  648. use_ion_frame.pack(fill=X, expand=YES, padx=5, pady=5)
  649. #Variables
  650. self.use_A_ions = BooleanVar()
  651. self.use_B_ions = BooleanVar()
  652. self.use_C_ions = BooleanVar()
  653. self.use_X_ions = BooleanVar()
  654. self.use_Y_ions = BooleanVar()
  655. self.use_Z_ions = BooleanVar()
  656. self.use_NL_ions = BooleanVar()
  657. ions_list = [
  658. ('A ions', self.use_A_ions),
  659. ('B ions', self.use_B_ions),
  660. ('C ions', self.use_C_ions),
  661. ('X ions', self.use_X_ions),
  662. ('Y ions', self.use_Y_ions),
  663. ('Z ions', self.use_Z_ions),
  664. ('NL ions', self.use_NL_ions)
  665. ]
  666. #Creation
  667. self.create_checkboxes(use_ion_frame, 'Use: ', ions_list).pack(fill=X, expand=YES)
  668. #Set Defaults
  669. self.use_B_ions.set(True)
  670. self.use_Y_ions.set(True)
  671. self.use_NL_ions.set(True)
  672. return
  673. def create_search_enzyme_frame(self):
  674. """Lets user select digestion enzyme from pulldown menu.
  675. """
  676. enzyme_frame = ttk.Labelframe(self.root, text='Enzyme:')
  677. enzyme_frame.pack(fill=X, expand=YES, padx=5, pady=5)
  678. #Variables
  679. self.search_enzyme_list = [
  680. 'No Enzyme',
  681. 'Trypsin',
  682. 'Trypsin/P',
  683. 'Lys_C',
  684. 'Lys_N',
  685. 'Arg_C',
  686. 'Asp_N',
  687. 'CNBr',
  688. 'Glu_C',
  689. 'PepsinA',
  690. 'Chymotrypsin']
  691. self.cleavage = IntVar()
  692. #Creation
  693. self.enzyme = StringVar()
  694. self.num_termini = IntVar()
  695. frame, combobox = self.create_combobox(enzyme_frame, 'Search Enzyme: ', self.enzyme,
  696. self.search_enzyme_list)
  697. frame.pack(fill=X, expand=YES, padx=5, pady=5)
  698. self.create_radiobuttons(enzyme_frame, 'Cleavage:', [('Fully tryptic', 0), ('Semi tryptic', 1)], self.cleavage).pack(fill=X, expand=YES)
  699. # set default
  700. combobox.set('Trypsin')
  701. self.cleavage.set(0)
  702. return
  703. def create_variable_mods_frame(self):
  704. """Lets user specify up to 7 variable mods (last two used for n-term or c-term mods).
  705. """
  706. self.variable_mods_frame = ttk.Labelframe(self.root, text='Variable modifications:')
  707. self.variable_mods_frame.pack(fill=X, expand=YES, padx=5, pady=5)
  708. #Variables
  709. self.num_variable_mods = IntVar()
  710. self.variable_mod_binary = IntVar()
  711. self.variable_mod_maximum = IntVar()
  712. self.max_num_mods = 9
  713. self.num_vars_residue = {}
  714. self.num_vars_deltamass = {}
  715. #Creation
  716. self.top_label = ('Delta Mass', 'Residues')
  717. for label in range(1, self.max_num_mods+1):
  718. if label == 8:
  719. Label(self.variable_mods_frame, text='N-term Mod:').grid(column=0,row=label+1)
  720. elif label == 9:
  721. Label(self.variable_mods_frame, text='C-term Mod:').grid(column=0,row=label+1)
  722. elif not (4 <= label <= 7):
  723. Label(self.variable_mods_frame, text='Mod %i:'%label).grid(column=0,row=label+1)
  724. for label in range(len(self.top_label)):
  725. Label(self.variable_mods_frame, text=self.top_label[label]).grid(column=label+1,row=0)
  726. for i in range(self.max_num_mods):
  727. self.num_vars_residue[i] = StringVar()
  728. self.num_vars_deltamass[i] = DoubleVar()
  729. #Sneaky Defaults
  730. self.num_vars_deltamass[i].set(0.0)
  731. if i == 0:
  732. self.num_vars_residue[i].set('M')
  733. self.num_vars_deltamass[i].set(15.9949)
  734. elif i == 7:
  735. self.num_vars_residue[i].set('N-term')
  736. elif i == 8:
  737. self.num_vars_residue[i].set('C-term')
  738. else:
  739. self.num_vars_residue[i].set('X')
  740. for j in range(len(self.top_label)):
  741. if 2 < i < 7:
  742. continue
  743. if j == 0:
  744. Entry(self.variable_mods_frame, textvariable=self.num_vars_deltamass[i]).grid(row=i+2,column=j+1)
  745. self.num_vars_deltamass[i].trace('w', self.callback)
  746. elif j == 1:
  747. if i < 7:
  748. Entry(self.variable_mods_frame, textvariable=self.num_vars_residue[i]).grid(row=i+2,column=j+1)
  749. else:
  750. Entry(self.variable_mods_frame, textvariable=self.num_vars_residue[i], state='readonly').grid(row=i+2,column=j+1)
  751. self.num_vars_residue[i].trace('w', self.callback)
  752. else:
  753. pass
  754. if __name__ == '__main__':
  755. comet = CometGUI()

comet_GUI.py at commit 0616a7f, under MIT · at the source

Overview

Authors: Clarrisa A Bradley1,2,3, Sangyoon Y Ko1,2,3,4, Meng Tian5, Liam T Ralph5,6,7, Lia D’Abate1,2,8, Jinyeol Lee6,7, Tianyi Liu1,9,10, Junhui Wang6, Patrick Tidball5,6, Marla Mendes1,2, Xiaolian Fan1,2, Jennifer L Howe1,2, Roumiana Alexandrova1,2, Giovanna Pellecchia1,2, Guillermo Casallo1,2, Tara Paton1,2, Leanne E Wybenga-Groot11, Worrawat Engchuan1,2, Bhooma Thiruvahindrapuram1,2, Brett Trost1,2,12
and 50 other authorsJill de Rijke1,2, Ashish Kadia6, Fuzi Jin6, Nelson Bautista Salazar1,2, J Javier Diaz-Mejia13, Jeffrey R MacDonald1,2, Eric Deneault14, P Joel Ross15, James Ellis8,16, Carole Shum1,2, John Georgiou5,6, Olivia Rennie1,2, Miriam S Reuter1,2, Ny Hoang1,2,8, Ege Sarikaya1,2, Thanuja Selvanayagam1,2,8, Aeen Ebrahim Amini6,7, Annabel Rutherford1,2,8, Natalia Rivera-Alfaro1,2,8, Christian R Marshall17, Marcello Scala1,2,18,19, Cassandra K Runke20, Hutton M Kearney20, John Christodoulou21, David I Francis22, Brian H Y Chung23, Jill Pluciniczak24, Alana Iaboni25, Kristen M Wigby26, Christine W Nordahl26, David G Amaral26, Melissa L Hudson27, Calvin P Sjaarda27, Andrea Guerin28, Mayada Elsabbagh29, Rebecca Landa30,31, Seema Mital2,32,33, Robert Lesurf2, Anjali Jain34, Michael D Wilson2,8, Jacob Ellegood25,35, Jason P Lerch35,36, Leo J Lee9,10, Brendan J Frey9,10, Michael W Salter3,37, Jacob A S Vorstman1,38,39, Evdokia Anagnostou25,40, Paul W Frankland3,37,41, Graham L Collingridge5,6,7, Stephen W Scherer1,2,8,42
42 affiliations
  1. The Centre for Applied Genomics, Program in Genetics & Genome Biology, The Hospital for Sick Children, Toronto, Ontario Canada
  2. Program in Genetics & Genome Biology, The Hospital for Sick Children, Toronto, Ontario Canada
  3. Program in Neurosciences & Mental Health, The Hospital for Sick Children, Toronto, Ontario Canada
  4. Department of Brain and Cognitive Sciences, Korea Advanced Institute of Science and Technology (KAIST), Daejeon, Republic of Korea
  5. Tanz Centre for Research in Neurodegenerative Diseases, Temerty Faculty of Medicine, University of Toronto, Toronto, Ontario Canada
  6. Lunenfeld-Tanenbaum Research Institute, Mount Sinai Hospital, Sinai Health, Toronto, Ontario Canada
  7. Department of Physiology, Temerty Faculty of Medicine, University of Toronto, Toronto, Ontario Canada
  8. Department of Molecular Genetics, Temerty Faculty of Medicine, University of Toronto, Toronto, Ontario Canada
  9. Department of Electrical & Computer Engineering, University of Toronto, Toronto, Ontario Canada
  10. Vector Institute, Toronto, Ontario Canada
  11. SPARC BioCentre, The Hospital for Sick Children, Toronto, Ontario Canada
  12. Program in Molecular Medicine, The Hospital for Sick Children, Toronto, Ontario Canada
  13. Phenomic AI, Toronto, Ontario Canada
  14. Regulatory Research Division, Centre for Oncology, Radiopharmaceuticals and Research, Biologic and Radiopharmaceutical Drugs Directorate, Health Products and Food Branch, Health Canada, Ottawa, Ontario Canada
  15. Department of Biology, University of Prince Edward Island, Charlottetown, Prince Edward Island Canada
  16. Program in Developmental, Stem Cell and Cancer Biology, Hospital for Sick Children, Toronto, Ontario Canada
  17. Genome Diagnostics, Department of Paediatric Laboratory Medicine, Hospital for Sick Children, Toronto, Ontario Canada
  18. Department of Neurosciences, Rehabilitation, Ophthalmology, Genetics, Maternal and Child Health, University of Genoa, Genoa, Italy
  19. Medical Genetics Unit, IRCCS Istituto Giannina Gaslini, Genoa, Italy
  20. Division of Laboratory Genetics & Genomics-Hereditary Section, Department of Laboratory Medicine and Pathology, Mayo Clinic, Rochester, MN USA
  21. Brain and Mitochondrial Research Group, Murdoch Children’s Research Institute, Parkville, Victoria, Australia and Department of Paediatrics, The University of Melbourne, Melbourne, Victoria Australia
  22. Victorian Clinical Genetics Services, Murdoch Children’s Research Institute, Parkville, Victoria Australia
  23. Paediatrics & Adolescent Medicine, The University of Hong Kong Li Ka Shing Faculty of Medicine, Hong Kong, Hong Kong, China
  24. Division of Genetic and Genomic Medicine, Nationwide Children’s Hospital, Columbus, OH USA
  25. Holland Bloorview Kids Rehabilitation Hospital, Bloorview Research Institute, Toronto, Ontario Canada
  26. Department of Psychiatry and Behavioral Sciences, The MIND Institute University of California, Davis, CA USA
  27. Queen’s Genomics Lab at Ongwanada (QGLO), Ongwanada Resource Center and Department of Psychiatry, Queen’s University, Kingston, Ontario Canada
  28. Division of Medical Genetics, Department of Pediatrics, Queen’s University, Kingston, Ontario Canada
  29. Azrieli Centre for Autism Research, Montreal Neurological Institute-Hospital, McGill University, Montreal, Quebec Canada
  30. Center for Autism and Related Disorders, Kennedy Krieger Institute, Baltimore, MD USA
  31. Department of Psychiatry and Behavioral Sciences, The Johns Hopkins University School of Medicine, Baltimore, MD USA
  32. Department of Pediatrics, Hospital for Sick Children, University of Toronto, Toronto, Ontario Canada
  33. Ted Rogers Centre for Heart Research, Toronto, Ontario Canada
  34. The Centre for Computational Medicine, The Hospital for Sick Children, Toronto, Ontario Canada
  35. Mouse Imaging Centre, Hospital for Sick Children, Toronto, Ontario Canada
  36. Wellcome Centre for Integrative Neuroimaging, University of Oxford, Oxford, UK
  37. Department of Physiology and Institute of Medical Science, Temerty Faculty of Medicine, University of Toronto, Toronto, Ontario Canada
  38. Department of Psychiatry, Hospital for Sick Children, Toronto, Ontario Canada
  39. Department of Psychiatry, Temerty Faculty of Medicine, University of Toronto, Toronto, Ontario Canada
  40. Department of Pediatrics, Temerty Faculty of Medicine, University of Toronto, Toronto, Ontario Canada
  41. Department of Psychology, University of Toronto, Toronto, Ontario Canada
  42. McLaughlin Centre, University of Toronto, Toronto, Ontario Canada
Journal: Nature, volume 655, issue 8122, pages 418-428
Dates: received 10 December 2024; accepted 9 April 2026; published online 13 May 2026; in print 2026
Type: Research article · Language: English
License: CC BY-NC-ND
Identifiers: DOI 10.1038/s41586-026-10515-6 · PMID 42129557 · PMCID PMC13345903 · OpenAlex W7161026823
Open access: hybrid, a free copy (OpenAlex)
Status: code verified
Categories: genetics / omics (modality), human (organism), mouse (organism), autism (population), cellular / molecular (subfield)
Methods: Statistics, Smoothing, state filtering, decompositions, Evoked potentials, Connectivity, Complexity, Machine learning, fMRI & imaging, Physiology & signal measures
Keywords: Autism spectrum disorders, Genetics of the nervous system, Medical genomics, Long non-coding RNAs
MeSH: Autism Spectrum Disorder*, Genes, X-Linked*, Genetic Predisposition to Disease*, Membrane Proteins*, RNA, Long Noncoding*, Animals, Autistic Disorder, Chromosome Deletion, Disease Models, Animal, Exons, Female, Hippocampus, Humans, Male, Mice, Mice, Knockout, Social Behavior (* major topic)
Topic: Cancer-related molecular mechanisms research (Cancer Research, Biochemistry, Genetics and Molecular Biology), according to OpenAlex
Citations: not cited yet (Europe PMC); 101 references in the paper
Research resources: as annotated in Cellosaurus RRID:CVCL_C8ZT, RRID:SCR_025375, the Advanced Imaging Facility RRID:SCR_025389

Abstract

The abstract is not reproduced here: the paper's license (CC BY-NC-ND) does not allow it. Read it in the paper, at the publisher or on Europe PMC.

Repository

Its files are read in the Code ↔ Paper reader above, with 1 match between paragraphs and lines of code.

pwilmart/PAW_pipeline

License: MIT
State: the link answers, verified on 28 September 2026
Evidence: files inventoried
Commit: 0616a7f5f265401bdd42b3d8e5fb00e279bd6871, 20 March 2024
Languages: Python (12)
Size: 219 files, 12 scripts
Software Heritage: not archived
Found in: the text, “Differential protein expression analysis”
Holds: README, license file, documentation
Not found: CITATION.cff, environment file, tests, continuous integration
Tools: NumPy (7 files), pandas (6 files), Matplotlib (1 file), SciPy (1 file)
Availability: 1 check, the latest on 28 September 2026: the link answers
  • 28 September 2026: the link answers
14 files

Tracing map

Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.

What the map holds:

  • 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 12 scripts, each with its path and the digest of its content;
  • 1 match between paragraphs of the paper and lines of the code (method lexical-v1);
  • neither the text of the paper nor the code itself.

Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.

Data

Datasets cited

Data availability statement

The paper has a data availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:

Read it in the paper: doi.org/10.1038/s41586-026-10515-6.

Versions

The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.

Version 2, 28 September 2026

  • Publisher: n/a → Nature Portfolio

Version 1, 28 September 2026: the first record

Recorded: type, language, journal, volume, issue, pages, dates, 70 authors, 4 keywords, 17 MeSH terms, 95 references, 3 RRIDs.

Cite

This paper

Bradley, C. A., Ko, S. Y., Tian, M., Ralph, L. T., D’Abate, L., Lee, J., Liu, T., Wang, J., Tidball, P., Mendes, M., Fan, X., Howe, J. L., Alexandrova, R., Pellecchia, G., Casallo, G., Paton, T., Wybenga-Groot, L. E., Engchuan, W., Thiruvahindrapuram, B., . . . Scherer, S. W. (2026). An X-linked long non-coding RNA, PTCHD1-AS, and the core features of autism. Nature, 655(8122), 418-428. https://doi.org/10.1038/s41586-026-10515-6

BibTeX

@article{bradley2026x,
author = {Bradley, Clarrisa A and Ko, Sangyoon Y and Tian, Meng and Ralph, Liam T and D’Abate, Lia and Lee, Jinyeol and Liu, Tianyi and Wang, Junhui and Tidball, Patrick and Mendes, Marla and Fan, Xiaolian and Howe, Jennifer L and Alexandrova, Roumiana and Pellecchia, Giovanna and Casallo, Guillermo and Paton, Tara and Wybenga-Groot, Leanne E and Engchuan, Worrawat and Thiruvahindrapuram, Bhooma and Trost, Brett and de Rijke, Jill and Kadia, Ashish and Jin, Fuzi and Salazar, Nelson Bautista and Diaz-Mejia, J Javier and MacDonald, Jeffrey R and Deneault, Eric and Ross, P Joel and Ellis, James and Shum, Carole and Georgiou, John and Rennie, Olivia and Reuter, Miriam S and Hoang, Ny and Sarikaya, Ege and Selvanayagam, Thanuja and Amini, Aeen Ebrahim and Rutherford, Annabel and Rivera-Alfaro, Natalia and Marshall, Christian R and Scala, Marcello and Runke, Cassandra K and Kearney, Hutton M and Christodoulou, John and Francis, David I and Chung, Brian H Y and Pluciniczak, Jill and Iaboni, Alana and Wigby, Kristen M and Nordahl, Christine W and Amaral, David G and Hudson, Melissa L and Sjaarda, Calvin P and Guerin, Andrea and Elsabbagh, Mayada and Landa, Rebecca and Mital, Seema and Lesurf, Robert and Jain, Anjali and Wilson, Michael D and Ellegood, Jacob and Lerch, Jason P and Lee, Leo J and Frey, Brendan J and Salter, Michael W and Vorstman, Jacob A S and Anagnostou, Evdokia and Frankland, Paul W and Collingridge, Graham L and Scherer, Stephen W},
title = {{An X-linked long non-coding RNA, PTCHD1-AS, and the core features of autism}},
journal = {Nature},
year = {2026},
month = may,
volume = {655},
number = {8122},
pages = {418--428},
publisher = {Nature Portfolio},
issn = {0028-0836},
doi = {10.1038/s41586-026-10515-6},
url = {https://doi.org/10.1038/s41586-026-10515-6},
pmid = {42129557},
pmcid = {PMC13345903}
}

RIS

TY - JOUR
AU - Bradley, Clarrisa A
AU - Ko, Sangyoon Y
AU - Tian, Meng
AU - Ralph, Liam T
AU - D’Abate, Lia
AU - Lee, Jinyeol
AU - Liu, Tianyi
AU - Wang, Junhui
AU - Tidball, Patrick
AU - Mendes, Marla
AU - Fan, Xiaolian
AU - Howe, Jennifer L
AU - Alexandrova, Roumiana
AU - Pellecchia, Giovanna
AU - Casallo, Guillermo
AU - Paton, Tara
AU - Wybenga-Groot, Leanne E
AU - Engchuan, Worrawat
AU - Thiruvahindrapuram, Bhooma
AU - Trost, Brett
AU - de Rijke, Jill
AU - Kadia, Ashish
AU - Jin, Fuzi
AU - Salazar, Nelson Bautista
AU - Diaz-Mejia, J Javier
AU - MacDonald, Jeffrey R
AU - Deneault, Eric
AU - Ross, P Joel
AU - Ellis, James
AU - Shum, Carole
AU - Georgiou, John
AU - Rennie, Olivia
AU - Reuter, Miriam S
AU - Hoang, Ny
AU - Sarikaya, Ege
AU - Selvanayagam, Thanuja
AU - Amini, Aeen Ebrahim
AU - Rutherford, Annabel
AU - Rivera-Alfaro, Natalia
AU - Marshall, Christian R
AU - Scala, Marcello
AU - Runke, Cassandra K
AU - Kearney, Hutton M
AU - Christodoulou, John
AU - Francis, David I
AU - Chung, Brian H Y
AU - Pluciniczak, Jill
AU - Iaboni, Alana
AU - Wigby, Kristen M
AU - Nordahl, Christine W
AU - Amaral, David G
AU - Hudson, Melissa L
AU - Sjaarda, Calvin P
AU - Guerin, Andrea
AU - Elsabbagh, Mayada
AU - Landa, Rebecca
AU - Mital, Seema
AU - Lesurf, Robert
AU - Jain, Anjali
AU - Wilson, Michael D
AU - Ellegood, Jacob
AU - Lerch, Jason P
AU - Lee, Leo J
AU - Frey, Brendan J
AU - Salter, Michael W
AU - Vorstman, Jacob A S
AU - Anagnostou, Evdokia
AU - Frankland, Paul W
AU - Collingridge, Graham L
AU - Scherer, Stephen W
TI - An X-linked long non-coding RNA, PTCHD1-AS, and the core features of autism
T2 - Nature
J2 - Nature
PY - 2026
DA - 2026/05/13
VL - 655
IS - 8122
SP - 418
EP - 428
SN - 0028-0836
PB - Nature Portfolio
DO - 10.1038/s41586-026-10515-6
UR - https://doi.org/10.1038/s41586-026-10515-6
LA - en
ER -

CSL-JSON

{
"id": "10.1038/s41586-026-10515-6",
"type": "article-journal",
"title": "An X-linked long non-coding RNA, PTCHD1-AS, and the core features of autism",
"container-title": "Nature",
"author": [
{
"family": "Bradley",
"given": "Clarrisa A"
},
{
"family": "Ko",
"given": "Sangyoon Y"
},
{
"family": "Tian",
"given": "Meng"
},
{
"family": "Ralph",
"given": "Liam T"
},
{
"family": "D’Abate",
"given": "Lia"
},
{
"family": "Lee",
"given": "Jinyeol"
},
{
"family": "Liu",
"given": "Tianyi"
},
{
"family": "Wang",
"given": "Junhui"
},
{
"family": "Tidball",
"given": "Patrick"
},
{
"family": "Mendes",
"given": "Marla"
},
{
"family": "Fan",
"given": "Xiaolian"
},
{
"family": "Howe",
"given": "Jennifer L"
},
{
"family": "Alexandrova",
"given": "Roumiana"
},
{
"family": "Pellecchia",
"given": "Giovanna"
},
{
"family": "Casallo",
"given": "Guillermo"
},
{
"family": "Paton",
"given": "Tara"
},
{
"family": "Wybenga-Groot",
"given": "Leanne E"
},
{
"family": "Engchuan",
"given": "Worrawat"
},
{
"family": "Thiruvahindrapuram",
"given": "Bhooma"
},
{
"family": "Trost",
"given": "Brett"
},
{
"family": "de Rijke",
"given": "Jill"
},
{
"family": "Kadia",
"given": "Ashish"
},
{
"family": "Jin",
"given": "Fuzi"
},
{
"family": "Salazar",
"given": "Nelson Bautista"
},
{
"family": "Diaz-Mejia",
"given": "J Javier"
},
{
"family": "MacDonald",
"given": "Jeffrey R"
},
{
"family": "Deneault",
"given": "Eric"
},
{
"family": "Ross",
"given": "P Joel"
},
{
"family": "Ellis",
"given": "James"
},
{
"family": "Shum",
"given": "Carole"
},
{
"family": "Georgiou",
"given": "John"
},
{
"family": "Rennie",
"given": "Olivia"
},
{
"family": "Reuter",
"given": "Miriam S"
},
{
"family": "Hoang",
"given": "Ny"
},
{
"family": "Sarikaya",
"given": "Ege"
},
{
"family": "Selvanayagam",
"given": "Thanuja"
},
{
"family": "Amini",
"given": "Aeen Ebrahim"
},
{
"family": "Rutherford",
"given": "Annabel"
},
{
"family": "Rivera-Alfaro",
"given": "Natalia"
},
{
"family": "Marshall",
"given": "Christian R"
},
{
"family": "Scala",
"given": "Marcello"
},
{
"family": "Runke",
"given": "Cassandra K"
},
{
"family": "Kearney",
"given": "Hutton M"
},
{
"family": "Christodoulou",
"given": "John"
},
{
"family": "Francis",
"given": "David I"
},
{
"family": "Chung",
"given": "Brian H Y"
},
{
"family": "Pluciniczak",
"given": "Jill"
},
{
"family": "Iaboni",
"given": "Alana"
},
{
"family": "Wigby",
"given": "Kristen M"
},
{
"family": "Nordahl",
"given": "Christine W"
},
{
"family": "Amaral",
"given": "David G"
},
{
"family": "Hudson",
"given": "Melissa L"
},
{
"family": "Sjaarda",
"given": "Calvin P"
},
{
"family": "Guerin",
"given": "Andrea"
},
{
"family": "Elsabbagh",
"given": "Mayada"
},
{
"family": "Landa",
"given": "Rebecca"
},
{
"family": "Mital",
"given": "Seema"
},
{
"family": "Lesurf",
"given": "Robert"
},
{
"family": "Jain",
"given": "Anjali"
},
{
"family": "Wilson",
"given": "Michael D"
},
{
"family": "Ellegood",
"given": "Jacob"
},
{
"family": "Lerch",
"given": "Jason P"
},
{
"family": "Lee",
"given": "Leo J"
},
{
"family": "Frey",
"given": "Brendan J"
},
{
"family": "Salter",
"given": "Michael W"
},
{
"family": "Vorstman",
"given": "Jacob A S"
},
{
"family": "Anagnostou",
"given": "Evdokia"
},
{
"family": "Frankland",
"given": "Paul W"
},
{
"family": "Collingridge",
"given": "Graham L"
},
{
"family": "Scherer",
"given": "Stephen W"
}
],
"container-title-short": "Nature",
"volume": "655",
"issue": "8122",
"page": "418-428",
"DOI": "10.1038/s41586-026-10515-6",
"PMID": "42129557",
"PMCID": "PMC13345903",
"ISSN": "0028-0836",
"publisher": "Nature Portfolio",
"URL": "https://doi.org/10.1038/s41586-026-10515-6",
"language": "en",
"issued": {
"date-parts": [
[
2026,
5,
13
]
]
}
}

The tracing map gets a citation of its own once an author has validated it and it has a DOI.

Similar papers

The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.

[1] doi:10.1038/s41467-026-76676-0 [code]
Determinants of functional burden pleiotropy and gene dosage responses across human traits.
Journal: Nature communications
In common: pandas, SciPy, Matplotlib, 1 other tool, genetics / omics, cellular / molecular, 4 authors
[2] doi:10.1038/s41586-026-10679-1 [code]
Cortical development dynamics across autism spectrum disorder mouse models.
Journal: Nature
In common: pandas, SciPy, Matplotlib, 1 other tool, autism, genetics / omics, mouse, 1 other category, 9 references
[3] doi:10.1126/sciadv.aeb5842 [code]
Regulation of autism-related self-injurious behavior by electrical stimulation of corticostriatal circuits in mice and humans.
Journal: Science advances
In common: SciPy, NumPy, autism, mouse, 4 references, author Jacob Ellegood
[4] doi:10.1126/sciadv.adq6577 [code]
Autism-like phenotypes and increased NMDAR2D expression in mice with KDM5B histone lysine demethylase deficiency.
Journal: Science advances
In common: pandas, SciPy, Matplotlib, 1 other tool, autism, mouse, 3 references, author Jacob Ellegood
[5] doi:10.1016/j.xgen.2026.101278 [code]
Single-cell profiling of DNA methylation in autism spectrum disorder prefrontal cortex reveals distinct regulatory and aging signatures.
Journal: Cell genomics
In common: pandas, NumPy, autism, genetics / omics, 8 references
[6] doi:10.1016/j.xhgg.2026.100652 [code]
CRISPR-engineered deletion of POGZ alters transcription factor binding at promoters of genes involved in synaptic signaling.
Journal: HGG advances
In common: pandas, SciPy, Matplotlib, 1 other tool, autism, cellular / molecular, 6 references
[7] doi:10.1038/s41467-026-76675-1 [code]
Long-read proteogenomic atlas of human neuronal differentiation reveals isoform diversity informing neurodevelopmental risk mechanisms.
Journal: Nature communications
In common: pandas, SciPy, Matplotlib, 1 other tool, autism, genetics / omics, 5 references
[8] doi:10.1038/s41586-026-10512-9 [code]
Astrocyte glucocorticoid receptor signalling restricts neuronal plasticity.
Journal: Nature
In common: pandas, SciPy, Matplotlib, 1 other tool, mouse, cellular / molecular, 6 references
[9] doi:10.1038/s41467-026-74320-5 [code]
Spatial architecture of autism pathogenesis reveals mosaic structural disarray during early development.
Journal: Nature communications
In common: pandas, SciPy, Matplotlib, 1 other tool, autism, genetics / omics, 5 references
[10] doi:10.1038/s41467-026-69944-6 [code]
Multi-modal dissection of cell-type specific TDP-43 pathology in the motor cortex.
Journal: Nature communications
In common: pandas, SciPy, Matplotlib, 1 other tool, genetics / omics, 6 references

Contribute

The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.

Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.

Request its removal

To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).

Discussion, reproductions, activity

Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.

Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.