OSCR

Shao-Ma-Zhi-Jing granules alleviate Tourette Syndrome by modulating the cAMP/PI3K/AKT/NF-κB signaling pathway, T cell differentiation, microglia, and gut microbiota.

Code ↔ Paper

The paper beside its authors' code: matches between them have not been computed for this paper yet.

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 · 947 lines · 30 KB · GPL-3.0

  1. #!/usr/bin/env python
  2. # MinPath
  3. # developed by Yuzhen Ye ([email hidden])
  4. # Indiana University, Bloomington
  5. # what's new in version 1.2 (released on Oct 19, 2010)
  6. # MinPath1.2 works on any pathway system
  7. # what you need: a pathway-function mapping file (e.g, data/ec2path), and your input file
  8. # what's new in version 1.1 (released on July 31, 2010)
  9. # * numpy independent
  10. # * add detailed output of ko assignments to each pathway
  11. import sys
  12. import os
  13. import re
  14. import operator
  15. import math
  16. # LJM Add location to minpath directory
  17. import subprocess
  18. minpath=os.path.join(os.path.dirname(os.path.abspath(__file__)),"MinPath")
  19. # LJM Remove search for minpath directory
  20. #minpath = os.environ.get('MinPath')
  21. #path0 = "/home/yye/Pathways/MinPath"
  22. #if minpath or os.path.exists(path0):
  23. # if os.path.exists(path0):
  24. # minpath = path0
  25. #else:
  26. # sys.exit("Environment variable MinPath not set")
  27. keggPath0, seedPath0, mapPath0, glpsol0 = minpath + "/data", minpath + "/data", minpath + "/data", minpath + "/glpk-4.6/examples/glpsol"
  28. # LJM Check if glpsol is installed globally, if so use this version instead
  29. glpsol_global=None
  30. paths = os.environ["PATH"].split(os.pathsep)
  31. for path in paths:
  32. fullexe = os.path.join(path,"glpsol")
  33. if os.path.exists(fullexe):
  34. if os.access(fullexe,os.X_OK):
  35. glpsol_global=fullexe
  36. break
  37. if not glpsol_global is None:
  38. # check if the global install is working properly
  39. try:
  40. stdout=subprocess.check_output([glpsol_global,"--help"])
  41. except (EnvironmentError,subprocess.CalledProcessError):
  42. glpsol_global=None
  43. # if the global install is operating as expected, then use this version
  44. if not glpsol_global is None:
  45. glpsol0=glpsol_global
  46. # this function returns a string from a group of items
  47. def get_string(*items):
  48. return " ".join(str(i) for i in items)
  49. def intmatrix(dim1, dim2):
  50. mat = []
  51. for i in range(dim1):
  52. tmp = [0] * dim2
  53. mat.append(tmp)
  54. return mat
  55. class MinPath:
  56. def __init__(self, whichdb = "KEGG", pathdir="", getgene = False, givenspe = "", mapfile = ""):
  57. self.whichDB = whichdb
  58. self.speID = givenspe
  59. global keggPath0
  60. global seedPath0
  61. global mapPath0
  62. if pathdir == "":
  63. if whichdb == "KEGG":
  64. self.dataDir = keggPath0
  65. elif whichdb == "SEED":
  66. self.dataDir = seedPath0
  67. else:
  68. self.dataDir = mapPath0
  69. else:
  70. self.dataDir = pathdir
  71. self.famTot = 0
  72. self.pathwayTot = 0
  73. self.famList = []
  74. self.famID = []
  75. self.famName = []
  76. self.famCount = []
  77. self.fam2Path = []
  78. self.pathList = []
  79. self.pathName = []
  80. self.path2Fam = []
  81. self.path2FamUni = []
  82. self.orgList = []
  83. self.orgGene2Fam = []
  84. self.orgGeneList = []
  85. self.famMapped = []
  86. self.pathMapped = []
  87. if whichdb == "SEED":
  88. print("now get SEED")
  89. fig2ssfile = self.dataDir + "/figfam_subsystem.dat"
  90. self.ReadFigSubsytem(fig2ssfile)
  91. elif whichdb == "KEGG":
  92. pathfile = self.dataDir + "/map_title.tab"
  93. self.ReadKEGGPath(pathfile)
  94. kofile = self.dataDir + "/ko"
  95. self.ReadKO(kofile, getgene, givenspe) #KO: KEGG family
  96. else:
  97. if os.path.exists(mapfile):
  98. print("mapfile", mapfile)
  99. self.ReadAnyMap(mapfile)
  100. elif os.path.exists(self.dataDir + "/" + os.path.basename(mapfile)):
  101. print("file: ", self.dataDir + "/" + os.path.basename(mapfile))
  102. self.ReadAnyMap(self.dataDir + "/" + os.path.basename(mapfile))
  103. else:
  104. sys.exit("file " + mapfile + " not found")
  105. self.CheckUniqueFam()
  106. def GetPathList(self):
  107. return self.pathList;
  108. def GetPathName(self):
  109. return self.pathName;
  110. def ReadAnyMap(self, mapfile):
  111. try:
  112. file = open(mapfile, "rt")
  113. except IOError:
  114. print("open file %s error" % mapfile)
  115. for aline in file:
  116. if aline[0] == '#':
  117. continue
  118. subs = aline.strip().split()
  119. if len(subs) < 2:
  120. continue
  121. path = subs[0]
  122. for fam in subs[1:]:
  123. if path in self.pathName:
  124. pathidx = self.pathName.index(path)
  125. else:
  126. pathidx = len(self.pathList)
  127. self.pathList.append(str(pathidx + 1))
  128. self.pathName.append(path)
  129. self.path2Fam.append([])
  130. if fam in self.famID:
  131. famidx = self.famID.index(fam)
  132. else:
  133. famidx = len(self.famList)
  134. self.famList.append(str(famidx + 1))
  135. self.famName.append(fam)
  136. self.famID.append(fam)
  137. self.fam2Path.append([])
  138. if famidx not in self.path2Fam[pathidx]:
  139. self.path2Fam[pathidx].append(famidx)
  140. self.fam2Path[famidx].append(pathidx)
  141. #same path & fun could be listed multiple times
  142. self.famTot = len(self.famList)
  143. self.pathTot = len(self.pathList)
  144. print("total family", self.famTot, " pathway", self.pathTot)
  145. #for idx in range(self.pathTot):
  146. # print "path", self.pathName[idx], " include fam", len(self.path2Fam[idx])
  147. #read SEED figfam to subsytem mapping
  148. def ReadFigSubsytem(self, fig2ssfile):
  149. print("fig2ssfile=%s" % fig2ssfile)
  150. try:
  151. file = open(fig2ssfile, "rt")
  152. except IOError:
  153. print("open file %s error" % fig2ssfile)
  154. for aline in file:
  155. aline = aline.strip()
  156. #note: in seed, a "family" (or "function") can have multiple FIG "sub"families
  157. #the families and the subsytems have names, but not codes
  158. #(subfam, fam, path) = aline.split('\t')
  159. cols = aline.split('\t')
  160. if len(cols) < 3:
  161. continue # skip the families that have NO subsystems assignment
  162. fam = cols[1]
  163. if fam in self.famName:
  164. famidx = self.famName.index(fam)
  165. else:
  166. famidx = len(self.famName)
  167. self.famList.append("F" + str(famidx + 1))
  168. self.famID.append(cols[0])
  169. self.famName.append(fam)
  170. row = []
  171. self.fam2Path.append(row)
  172. for path in cols[2:]:
  173. # note: a line could have multiple subsytems??
  174. if path[:4] == "CBSS":
  175. continue # skip the clustering-based subsystems
  176. if path in self.pathName:
  177. pathidx = self.pathName.index(path)
  178. else:
  179. pathidx = len(self.pathName)
  180. self.pathList.append("S" + str(pathidx + 1))
  181. self.pathName.append(path)
  182. row = []
  183. self.path2Fam.append(row)
  184. if pathidx not in self.fam2Path[famidx]:
  185. self.fam2Path[famidx].append(pathidx)
  186. if famidx not in self.path2Fam[pathidx]:
  187. self.path2Fam[pathidx].append(famidx)
  188. file.close()
  189. self.pathTot = len(self.pathList)
  190. self.famTot = len(self.famList)
  191. print("total SEED subsystem=%d" % self.pathTot)
  192. print("total SEED functions(families)=%d" % self.famTot)
  193. #read KEGG pathways from ~/pathway/map-title.tab
  194. def ReadKEGGPath(self, pathfile):
  195. try:
  196. file = open(pathfile, "rt")
  197. except IOError:
  198. sys.exit("open file error " + pathfile)
  199. for aline in file:
  200. aline = aline[:-1]
  201. row = aline.split("\t")
  202. self.pathList.append(row[0])
  203. self.pathName.append(row[1])
  204. row = []
  205. self.path2Fam.append(row)
  206. file.close()
  207. self.pathTot = len(self.pathList)
  208. print("total KEGG pathway=%d" % self.pathTot)
  209. #read the KEGG families (KO) from ~/genes/ko
  210. def ReadKO(self, kofile = "", ifreadgene = False, ifgivenspe = ""):
  211. try:
  212. file = open(kofile, "rt")
  213. except IOError:
  214. print("open file %s error" % kofile)
  215. print("read kofile=%s" % kofile)
  216. for aline in file:
  217. aline = aline.strip()
  218. m = re.search(r'^ENTRY\s+(?P<ko>[\S]+)', aline)
  219. if m:
  220. self.famList.append(m.group('ko'))
  221. koidx = len(self.famList) - 1
  222. row = []
  223. self.fam2Path.append(row)
  224. for aline in file:
  225. name = aline[12:-1]
  226. self.famName.append(name)
  227. break
  228. #print "ko=%d %s name=%s" % (koidx, m.group('ko'), name)
  229. continue
  230. m = re.search(r'\[PATH:ko(?P<path>[^\]]+)', aline)
  231. if m:
  232. thispath = m.group('path')
  233. if thispath in self.pathList:
  234. pathidx = self.pathList.index(thispath)
  235. #print "thispath=%s %d idx=%d" % (thispath, pathidx, len(self.famList))
  236. self.fam2Path[koidx].append(pathidx)
  237. self.path2Fam[pathidx].append(koidx)
  238. continue
  239. #this information is only needed for KEGG pathway inference (blast-result to ko assignment)
  240. #reading this information is time-consuming
  241. if not ifreadgene:
  242. continue
  243. m = re.search(r'^GENES', aline)
  244. if not m:
  245. continue
  246. #raw_input(" continue with reading gene...")
  247. lines = [aline]
  248. for aline in file:
  249. if aline[:3] == "///":
  250. break
  251. lines.append(aline)
  252. ifvalid = False
  253. for aline in lines:
  254. #print 'now check line', aline
  255. if aline[15] == ':':
  256. org = aline[12:15].lower()
  257. #print "org", org, "ifgivenspe", ifgivenspe
  258. if ifgivenspe != "" and org != ifgivenspe:
  259. ifvalid = False
  260. elif (ifgivenspe != "" and org == ifgivenspe) or (ifgivenspe == ""):
  261. ifvalid = True
  262. if org in self.orgList:
  263. orgidx = self.orgList.index(org)
  264. else:
  265. orgidx = len(self.orgList)
  266. self.orgList.append(org)
  267. row = []
  268. self.orgGeneList.append(row)
  269. row = []
  270. self.orgGene2Fam.append(row)
  271. if not ifvalid:
  272. continue
  273. #else: the org is the same
  274. info = aline[17:]
  275. info2 = re.sub(r'\([^\)]+\)', "", info)
  276. items = info2.split()
  277. for aquery in items:
  278. #thisgene = org + ":" + aquery
  279. thisgene = aquery
  280. #print "thisgene = ", thisgene
  281. if thisgene in self.orgGeneList[orgidx]:
  282. geneidx = self.orgGeneList[orgidx].index(thisgene)
  283. else:
  284. geneidx = len(self.orgGeneList[orgidx])
  285. self.orgGeneList[orgidx].append(thisgene)
  286. row = []
  287. self.orgGene2Fam[orgidx].append(row)
  288. self.orgGene2Fam[orgidx][geneidx].append(koidx)
  289. file.close()
  290. self.famTot = len(self.famList)
  291. self.famID = self.famList
  292. self.orgTot = len(self.orgList)
  293. print("total KEGG fam=%d" % (self.famTot))
  294. if ifreadgene:
  295. print("total organisms involved =%d" % (self.orgTot))
  296. one2one = 0
  297. one2mul = 0
  298. for i in range(self.orgTot):
  299. #print " org %s has %d genes assigned to KO" % (self.orgList[i], len(self.orgGeneList[i]))
  300. for j in range(len(self.orgGeneList[i])):
  301. if len(self.orgGene2Fam[i][j]) > 1:
  302. one2mul += 1
  303. else:
  304. one2one += 1
  305. print("total %d genes matched to multiple KO; %d matched to single KO" % (one2mul, one2one))
  306. #calcualte the uniqueness of Fam (KEGG families or SEED families)
  307. def CheckUniqueFam(self):
  308. for i in range(self.famTot):
  309. if len(self.fam2Path[i]) > 10:
  310. print("fam=%d %s [%s] map-to-path=%d" % (i, self.famList[i], self.famName[i], len(self.fam2Path[i])))
  311. for p in self.fam2Path[i]:
  312. print(" path-%d[%s %s]" % (p, self.pathList[p], self.pathName[p]))
  313. ubifam = 0
  314. for i in range(self.famTot):
  315. if len(self.fam2Path[i]) > 1:
  316. ubifam += 1
  317. print("total families that mapped to more than one pathway = %d" % ubifam)
  318. for p in range(self.pathTot):
  319. row = []
  320. totfam = len(self.path2Fam[p])
  321. uniquefam = 0
  322. print("pathway-%d[%s; %s] fam=%d" % (p, self.pathList[p], self.pathName[p], totfam))
  323. for k in range(totfam):
  324. fam = self.path2Fam[p][k]
  325. if len(self.fam2Path[fam]) == 1:
  326. uniquefam = uniquefam + 1
  327. row.append(fam)
  328. print(" unique fam-%d %s %s" % (fam, self.famList[fam], self.famName[fam]))
  329. self.path2FamUni.append(row)
  330. print(">>>pathway-%d[%s; %s] fam=%d unique-fam=%d" % (p, self.pathList[p], self.pathName[p], totfam, uniquefam))
  331. def GetPath2FamUniMapped(self, apath, what):
  332. if apath in self.pathList:
  333. p = self.pathList.index(apath)
  334. famlist = []
  335. for fam in self.path2FamUni[p]:
  336. if fam in self.famMapped:
  337. if what == "name":
  338. famlist.append(self.famList[fam])
  339. else:
  340. famlist.append(fam)
  341. return famlist
  342. else:
  343. return []
  344. def GetPath2FamMapped(self, apath, what):
  345. if apath in self.pathList:
  346. p = self.pathList.index(apath)
  347. famlist = []
  348. #print "apath=", apath, "total fam", len(self.path2Fam[p])
  349. for fam in self.path2Fam[p]:
  350. #print " >>>check fam", fam, "famMapped-total", len(self.famMapped)
  351. if fam in self.famMapped:
  352. if what == "name":
  353. famlist.append(self.famList[fam])
  354. else:
  355. famlist.append(fam)
  356. #print " >>>Found in the famMapped"
  357. return famlist
  358. else:
  359. return []
  360. #return the index of families
  361. def GetPath2FamUni(self, apath):
  362. if apath in self.pathList:
  363. p = self.pathList.index(apath)
  364. return self.path2FamUni[p]
  365. else:
  366. return []
  367. #return the index of families
  368. def GetPath2Fam(self, apath):
  369. if apath in self.pathList:
  370. p = self.pathList.index(apath)
  371. return self.path2Fam[p]
  372. else:
  373. return []
  374. #note: this function only works when the givenspe is defined (see KEGG2html.py)
  375. def OrthMapBasedOnKO(self, spe=""):
  376. if spe == "":
  377. return
  378. if spe not in self.orgList:
  379. return
  380. self.famMapped = []
  381. s = self.orgList.index(spe)
  382. print("spe", spe, "total gene", len(self.orgGeneList[s]))
  383. for g in range(len(self.orgGeneList[s])):
  384. for fam in self.orgGene2Fam[s][g]:
  385. if fam not in self.famMapped:
  386. self.famMapped.append(fam)
  387. print("total family=", len(self.famList), "total mapped=", len(self.famMapped))
  388. #raw_input("type enter to continue")
  389. def OrthMap(self, famidxlist=[], famnamelist=[], famcount = []):
  390. if len(famidxlist) == 0 and len(famnamelist) == 0:
  391. return []
  392. if famcount:
  393. self.famCount = [0] * self.famTot
  394. #get only the orthologs that are mappped to a pathway
  395. if len(famidxlist) > 0:
  396. famlist = famidxlist
  397. famref = self.famList
  398. else:
  399. famlist = famnamelist
  400. famref = self.famName
  401. orthtot0 = len(famlist)
  402. orthtotfind = 0
  403. orthtotmap = 0
  404. self.famMapped = []
  405. pathmap = [0] * self.pathTot
  406. for i in range(len(famlist)):
  407. orth = famlist[i]
  408. if orth in famref:
  409. idx = famref.index(orth)
  410. if famcount:
  411. self.famCount[idx] = famcount[i]
  412. orthtotfind += 1
  413. if len(self.fam2Path[idx]) > 0:
  414. self.famMapped.append(idx)
  415. orthtotmap += 1
  416. for path in self.fam2Path[idx]:
  417. pathmap[path] = 1
  418. print("original ortholog=%d found-in-the-fam-list=%d found-in-the-fam-mapped-to-pathway=%d" % (orthtot0, orthtotfind, orthtotmap))
  419. self.pathMapped = []
  420. for p in range(self.pathTot):
  421. if pathmap[p]:
  422. self.pathMapped.append(p)
  423. #assign orthologs to pathways
  424. #strategy 1: first assign unique ones -- then other orthologs
  425. def Orth2PathUni(self, famidxlist=[], famnamelist=[], famcount=[]):
  426. self.OrthMap(famidxlist = famidxlist, famnamelist = famnamelist, famcount=famcount)
  427. orthtotmap = len(self.famMapped)
  428. #sort the orthologs based on their "uniqueness"
  429. fam2path = []
  430. for i in self.famMapped:
  431. if len(self.fam2Path[i]) == 0:
  432. continue
  433. fam2path.append((len(self.fam2Path[i]), i))
  434. #print "fam2path = ", len(fam2path)
  435. #raw_input("type enter to continue..")
  436. fam2pathsorted = sorted(fam2path, key=operator.itemgetter(0))
  437. pathsort = map(operator.itemgetter(0), fam2pathsorted)
  438. famsort = map(operator.itemgetter(1), fam2pathsorted)
  439. #for i in range(len(famsort)):
  440. # print "fam0 %d fam %d [%s; %s] topath %d" % (i, famsort[i], self.famList[famsort[i]], self.famName[famsort[i]], pathsort[i])
  441. #pathfam & pathfam0: the number of fam families assigned to each pathway
  442. pathfam = [0] * self.pathTot
  443. pathfam0 = [0] * self.pathTot
  444. #pathfam0: the number of fam assigned to each pathway (using all multiple assignments)
  445. for fam in famsort:
  446. for p in self.fam2Path[fam]:
  447. pathfam0[p] = pathfam0[p] + 1
  448. #pathfam: the number of fam assigned to each pathway considering the "uniqueness" of fam to each pathway
  449. maxhit = pathsort[-1]
  450. print("the maximum number of pathways a family is assigned to=%d" % maxhit)
  451. hit = 1
  452. unassigned = len(famsort)
  453. beg = 0
  454. annpath = []
  455. famassign = [-1] * orthtotmap
  456. while (hit <= maxhit) and (unassigned > 0):
  457. #print "check hit=%d beg=%d" % (hit, beg)
  458. for k in range(beg, orthtotmap):
  459. if famassign[k] != -1:
  460. continue
  461. if pathsort[k] > hit:
  462. break
  463. fam = famsort[k]
  464. maxsaturate = -1
  465. maxsaturate_p = 0
  466. #print "check k=%d fam=%d %s %s" % (k, fam, self.famList[fam], self.famName[fam])
  467. for p in self.fam2Path[fam]:
  468. saturate = 1.0 * pathfam[p] / len(self.fam2Path[fam])
  469. if(saturate > maxsaturate):
  470. maxsaturate = saturate
  471. maxsaturate_p = p
  472. famassign[k] = maxsaturate_p
  473. pathfam[maxsaturate_p] = pathfam[maxsaturate_p] + 1
  474. beg = k
  475. unassigned = 0
  476. for k in range(orthtotmap):
  477. if famassign[k] == -1:
  478. unassigned = unassigned + 1
  479. #print "try hit=%d unassigned=%d (tot=%d)" % (hit, unassigned, orthtotmap)
  480. #raw_input()
  481. hit = hit + 1
  482. annpath0 = 0
  483. annpath = 0
  484. self.pathMappedOpt = []
  485. for k in range(self.pathTot):
  486. if pathfam0[k] != 0:
  487. annpath0 = annpath0 + 1
  488. if pathfam[k] != 0:
  489. annpath = annpath + 1
  490. self.pathMappedOpt.append(k)
  491. print("total pathway %d (%d) is found, compared to %d (%d)" % (annpath, len(self.pathMappedOpt), annpath0, len(self.pathMapped)))
  492. print("%-50s %s\t%s" % ("#pathway", "fam-assigned(all)", "fam-assigned(unique)[weight]"))
  493. for p in range(self.pathTot):
  494. if pathfam0[p] == 0 and pathfam[p] == 0:
  495. continue
  496. tmp = self.pathList[p] + "[" + self.pathName[p] + "]"
  497. weight = .0
  498. for k in range(orthtotmap):
  499. ks = famsort[k]
  500. if famassign[k] != p:
  501. continue
  502. weight = weight + 1.0 / len(self.fam2Path[ks])
  503. print("%-50s %d\t%d[%.1f]" % (tmp, pathfam0[p], pathfam[p], weight))
  504. return self.pathMappedOpt
  505. #Parsinomy approach to pathway inference
  506. def Orth2PathMin(self, famidxlist=[], famnamelist=[], famcount=[], mpsfile="test.mps", glpsol=""):
  507. # write mps file (the input for glpsol, the integer programming package)
  508. print("now write mps file..")
  509. self.WriteMps(famidxlist=famidxlist, famnamelist=famnamelist, famcount=famcount, mpsfile=mpsfile)
  510. # run glpsol
  511. global glpsol0
  512. if glpsol == "":
  513. glpsol = glpsol0
  514. lpout = mpsfile + ".LPout"
  515. # LJM change to subprocess call
  516. # command = glpsol + " " + mpsfile + " -o " + lpout
  517. command = [glpsol,mpsfile,"-o",lpout]
  518. #print "now run command = %s" % command
  519. #os.system(command)
  520. try:
  521. subprocess_output=subprocess.check_output(command)
  522. except (EnvironmentError, subprocess.CalledProcessError) as e:
  523. message="Error when running glpsol from MinPath.\n"
  524. if hasattr(e, 'output') and e.output:
  525. message+="\nError message returned from glpsol :\n" + e.output.decode("utf-8") +"\n"
  526. sys.exit(message)
  527. # check the result
  528. self.GetLPOut(lpout)
  529. return self.pathMappedOpt
  530. #output mps file for integer programming (most parsinomy pathway inference)
  531. def WriteMps(self, famidxlist=[], famnamelist=[], famcount=[], mpsfile="test.mps"):
  532. try:
  533. file = open(mpsfile, "w")
  534. except IOError:
  535. sys.exit("open file error " + mpsfile)
  536. str = "%-14s%s\n" % ("NAME", "PATH")
  537. file.write(str)
  538. self.OrthMap(famidxlist=famidxlist, famnamelist=famnamelist, famcount=famcount)
  539. orthtotmap = len(self.famMapped)
  540. #write ROWS
  541. file.write("ROWS\n")
  542. file.write(" N NUM\n")
  543. for orth in self.famMapped:
  544. str = " G F%s\n" % self.famList[orth];
  545. #note 1: use a different idx of family for mps file
  546. #note 2: when use E, there is no feasible solution
  547. #G>=1, mean each family has to be assigned to at least one pathway
  548. file.write(str)
  549. #write COLUMNS
  550. #the same column (pathway) needs to be organized in the same block
  551. file.write("COLUMNS\n")
  552. pathvalid = [0] * self.pathTot
  553. for p in self.pathMapped:
  554. #note: use a different pathway idx in mps
  555. pathname = "P%s" % self.pathList[p]
  556. str = " %-10s%-10s%10d\n" %(pathname, "NUM", 1)
  557. file.write(str)
  558. for orth in self.famMapped:
  559. famname = "F%s" % self.famList[orth];
  560. for path in self.fam2Path[orth]:
  561. if path == p:
  562. str = " %-10s%-10s%10d\n" %(pathname, famname, 1)
  563. file.write(str)
  564. pathvalid[p] = 1
  565. #write RHS
  566. file.write("RHS\n")
  567. for orth in self.famMapped:
  568. famname = "F%s" % self.famList[orth]
  569. str = " %-10s%-10s%10.1f\n" % ("RHS1", famname, 1.0);
  570. file.write(str)
  571. #write bounds
  572. file.write("BOUNDS\n")
  573. for p in range(self.pathTot):
  574. if pathvalid[p]:
  575. path = self.pathList[p]
  576. pathname = "P%s" % path;
  577. str = " BV %-10s%-10s\n" %("BND1", pathname);
  578. #all variants are binary (1 keep the pathway; 0 pathway not necessary)
  579. file.write(str)
  580. file.write("ENDATA\n")
  581. file.close()
  582. print("End of PrintMPS")
  583. def GetLPOut(self, lpoutfile="test.mps.LPout"):
  584. try:
  585. file = open(lpoutfile, "rt")
  586. except IOError:
  587. sys.exit("open file error " + lpoutfile)
  588. keeppath = []
  589. for aline in file:
  590. aline = aline.strip()
  591. cols = aline.split()
  592. if len(cols) < 2:
  593. continue
  594. if cols[0] == "Columns:":
  595. Columns = int(cols[1])
  596. elif cols[0] == "Objective:":
  597. MINimum = int(cols[3])
  598. elif cols[0] == "No." and cols[1] == "Column":
  599. for aline2 in file:
  600. if aline2[0] == '-':
  601. continue
  602. aline2 = aline2.strip()
  603. cols2 = aline2.split()
  604. if len(cols2) < 1:
  605. break
  606. if cols2[3] == '1':
  607. keeppath.append(cols2[1][1:])
  608. #check with WriteMps: the pathway idx used in mps is to add "P" before the pathList
  609. file.close()
  610. if len(keeppath) != MINimum:
  611. print("reading %s error: minimum %d read %d" % (lpoutfile, MINimum, len(keeppath)))
  612. sys.exit()
  613. self.pathMappedOpt = []
  614. for path in keeppath:
  615. if path not in self.pathList:
  616. print("Error: unknown pathList %s" % path)
  617. sys.exit()
  618. pathidx = self.pathList.index(path)
  619. self.pathMappedOpt.append(pathidx)
  620. print("total pathways mappd: before inference %d, after inference %d" % (len(self.pathMapped), len(self.pathMappedOpt)))
  621. #add the pathways with many functions annotated, even they were considered as redundant ones!
  622. def PopulatePath(self, pathmapped = [], par = 0.7):
  623. famvalid = [0] * self.famTot
  624. for fam in self.famMapped:
  625. famvalid[fam] = 1
  626. addpath = 0
  627. for p in range(self.pathTot):
  628. if len(self.path2Fam[p]) == 0:
  629. continue
  630. if not p in pathmapped:
  631. add = 0
  632. for f in self.path2Fam[p]:
  633. if famvalid[f] == 1:
  634. add += 1
  635. #pathways with most functions annotated should be added back -- even it is a redundant one
  636. print("pathway", p, self.pathList[p], self.pathName[p], "path2fam", len(self.path2Fam[p]), " real-family", add)
  637. if add >= len(self.path2Fam[p]) * par:
  638. pathmapped.append(p)
  639. addpath += 1
  640. print("this pathway is added back")
  641. #else:
  642. # print "this pathway does not have enough functions"
  643. #raw_input("type enter to continue")
  644. print("added pathway =", addpath)
  645. #remove the pathways with too few functions annotated (e.g., 2, use par),
  646. #even when their associated families are annotated(but NOT the unique ones)
  647. #not unique families assigned to this pathway? ubiquitous families have to be assigned to at least one of the pathways, right
  648. def RemoveSparsePath(self, pathmapped = [], par = 2):
  649. famvalid = [0] * self.famTot
  650. for fam in self.famMapped:
  651. famvalid[fam] = 1
  652. delpath = 0
  653. for p in range(self.pathTot):
  654. if len(self.path2Fam[p]) == 0:
  655. continue
  656. if p in pathmapped:
  657. add = 0
  658. uni = 0
  659. for f in self.path2Fam[p]:
  660. if famvalid[f] == 1:
  661. add += 1
  662. if len(self.fam2Path[f]) == 1:
  663. uni += 1
  664. #pathways with few functions annotated are removed
  665. if uni == 0 and add <= par:
  666. pathmapped.remove(p)
  667. delpath += 1
  668. print("pathway", p, self.pathList[p], self.pathName[p], "path2fam", len(self.path2Fam[p]), " real-family", add, " is removed from the list!!")
  669. #raw_input("type enter to continue")
  670. print("deleted pathway =", delpath)
  671. def DiffPathMap(self, maps, tags):
  672. maps.insert(0, self.pathMapped)
  673. tags.insert(0, "Ori")
  674. mapnum = len(maps)
  675. pathvalid = intmatrix(self.pathTot, mapnum)
  676. for m in range(mapnum):
  677. for p in maps[m]:
  678. pathvalid[p][m] = 1
  679. print("#Summary for the pathway inference")
  680. #print description line
  681. str = "%-5s %-10s %-70s %-5s %-5s" % ("ID", "List", "Name", "Fam", "Fam-found")
  682. for atag in tags:
  683. str += " %-3s" % atag
  684. print(str + " Same/Diff")
  685. #print each pathway
  686. totsame = 0
  687. totdiff = 0
  688. famvalid = [0] * self.famTot
  689. for fam in self.famMapped:
  690. famvalid[fam] = 1
  691. for p in range(self.pathTot):
  692. add = sum(pathvalid[p])
  693. if add == 0:
  694. continue
  695. add = sum(pathvalid[p][1:])
  696. if add == mapnum - 1 or add == 0:
  697. label = "Same"
  698. if add != 0:
  699. totsame += 1
  700. else:
  701. label = "Diff"
  702. totdiff += 1
  703. add = 0
  704. for f in self.path2Fam[p]:
  705. if famvalid[f] == 1:
  706. add += 1
  707. str = "%-5d %-10s %-70s %-5d %-5d" % (p + 1, self.pathList[p], self.pathName[p], len(self.path2Fam[p]), add)
  708. for m in range(len(maps)):
  709. str += " %-3d" % pathvalid[p][m]
  710. print(str + " " + label)
  711. #print total number line
  712. str = "%-5s %-10s %-70s %-5s %-5s" % ("#total", "", "", "", "")
  713. for m in range(mapnum):
  714. str += " %-3d" % len(maps[m])
  715. print(str)
  716. #print functional diveristy line
  717. #str = "#functional-diversity [max: log(%d)=%.3f]" % (self.pathTot, math.log(self.pathTot * 1.0))
  718. #str = "%-99s" % str
  719. #for m in range(mapnum):
  720. ## str += " %.3f" % math.log(len(maps[m]) * 1.0)
  721. #print str
  722. print("#total match=%d diff=%d" % (totsame, totdiff))
  723. def WriteReport(self, minpath, reportfile, detailfile):
  724. na = True
  725. if self.whichDB == "KEGG":
  726. keggmap = []
  727. keggdir = "/dataomics/kegg/kegg-curr"
  728. mapfile = keggdir + "/pathway/" + self.speID.lower() + "/map.list"
  729. if os.path.exists(mapfile):
  730. file = open(mapfile, "rt")
  731. for aline in file:
  732. m = re.match('^[^\d]+(?P<id>\d+)', aline)
  733. if m:
  734. id = m.group('id')
  735. idx = self.pathList.index(id)
  736. keggmap.append(idx)
  737. na = False
  738. tags = ["kegg", "naive", "minpath"]
  739. maps = [keggmap, self.pathMapped, minpath]
  740. else:
  741. seedmap = []
  742. if self.whichDB == 'SEED':
  743. tags = ["seed", "naive", "minpath"]
  744. else:
  745. tags = ["any", "naive", "minpath"]
  746. maps = [seedmap, self.pathMapped, minpath]
  747. mapnum = len(maps)
  748. pathvalid = intmatrix(self.pathTot, mapnum)
  749. for m in range(mapnum):
  750. for p in maps[m]:
  751. pathvalid[p][m] = 1
  752. famvalid = [0] * self.famTot
  753. for fam in self.famMapped:
  754. famvalid[fam] = 1
  755. file = open(reportfile, "w")
  756. if detailfile:
  757. detail = open(detailfile, "w")
  758. for p in range(self.pathTot):
  759. add = sum(pathvalid[p])
  760. if add == 0:
  761. continue
  762. add = 0
  763. for f in self.path2Fam[p]:
  764. if famvalid[f] == 1:
  765. add += 1
  766. if na:
  767. tmp = "n/a"
  768. else:
  769. tmp = pathvalid[p][0]
  770. file.write(get_string("path", self.pathList[p], tags[0], tmp, " naive", pathvalid[p][1], " minpath", pathvalid[p][2], " fam0 ", len(self.path2Fam[p]), " fam-found ", add, " name ", self.pathName[p])+"\n")
  771. if not (detailfile and pathvalid[p][2]):
  772. continue
  773. #print details
  774. detail.write(get_string("path", self.pathList[p], "fam0", len(self.path2Fam[p]), "fam-found", add, "#", self.pathName[p])+"\n")
  775. for f in self.path2Fam[p]:
  776. if famvalid[f] == 1 and self.famCount:
  777. detail.write(get_string(" ", self.famID[f], "hits", self.famCount[f], "#", self.famName[f])+"\n")
  778. elif famvalid[f] == 1:
  779. detail.write(get_string(" ", self.famID[f], "#", self.famName[f])+"\n")
  780. print("")
  781. print("Results are saved in file:" + reportfile)
  782. file.close()
  783. if detailfile:
  784. print("Details are saved in file:" + detailfile)
  785. detail.close()
  786. # this function reads in KO/fig assignment, then map KO/fig families to the pathways
  787. # last update by Yuzhen Ye on July 3, 2009
  788. def Orth2Path(infile = "demo.ko", whichdb = "KEGG", mpsfile = "test.mps", reportfile = "test.minpath", detailfile = "", mapfile=""):
  789. try:
  790. file = open(infile, "rt")
  791. except IOError:
  792. sys.exit("open file error " + infile)
  793. orthlist, orthcount = [], []
  794. add = 0
  795. for aline in file:
  796. #aline = aline.strip()
  797. #tmp = aline.split("\t")
  798. tmp = aline.strip().split()
  799. if len(tmp) >= 2:
  800. try:
  801. ab = float(tmp[1])
  802. except (ValueError,IndexError):
  803. ab = 0.0
  804. add = add + ab
  805. if tmp[0] not in orthlist:
  806. orthlist.append(tmp[0])
  807. orthcount.append(ab)
  808. #print "ko-%d=%s" % (len(orthlist), tmp[1])
  809. else:
  810. idx = orthlist.index(tmp[0])
  811. orthcount[idx] += ab
  812. file.close()
  813. print("total input orth=%d unique=%d" % (add, len(orthlist)))
  814. test = MinPath(whichdb = whichdb, mapfile = mapfile) #default pathwaydb: KEGG
  815. if whichdb == "KEGG":
  816. map = test.Orth2PathMin(famidxlist=orthlist, famnamelist=[], famcount=orthcount, mpsfile=mpsfile)
  817. elif whichdb == "SEED":
  818. map = test.Orth2PathMin(famidxlist=[], famnamelist=orthlist, famcount=orthcount, mpsfile=mpsfile)
  819. else:
  820. map = test.Orth2PathMin(famidxlist=[], famnamelist=orthlist, famcount=orthcount, mpsfile=mpsfile)
  821. #KEGG by ids, and fig by names
  822. map_add = map[:]
  823. par = 0.5
  824. test.PopulatePath(pathmapped = map_add, par = par)
  825. test.WriteReport(map_add, reportfile, detailfile)
  826. os.system("rm " + mpsfile + "*")
  827. if __name__ == '__main__':
  828. kofile, figfile, anyfile, mapfile, mpsfile, reportfile, detailfile = "", "", "", "", "test.mps", "test.minpath", ""
  829. for i in range(len(sys.argv)):
  830. if sys.argv[i] == "-ko":
  831. kofile = sys.argv[i + 1]
  832. elif sys.argv[i] == "-fig":
  833. figfile = sys.argv[i + 1]
  834. elif sys.argv[i] == "-any":
  835. anyfile = sys.argv[i + 1]
  836. elif sys.argv[i] == "-map":
  837. mapfile = sys.argv[i + 1]
  838. elif sys.argv[i] == "-report":
  839. reportfile = sys.argv[i + 1]
  840. elif sys.argv[i] == "-details":
  841. detailfile = sys.argv[i + 1]
  842. elif sys.argv[i] == "-mps":
  843. mpsfile = sys.argv[i + 1]
  844. if kofile:
  845. Orth2Path(infile = kofile, mpsfile = mpsfile, reportfile = reportfile, detailfile = detailfile)
  846. elif figfile:
  847. Orth2Path(infile = figfile, mpsfile = mpsfile, reportfile = reportfile, detailfile = detailfile, whichdb = "SEED")
  848. elif anyfile and mapfile:
  849. Orth2Path(infile = anyfile, mpsfile = mpsfile, reportfile = reportfile, detailfile = detailfile, whichdb = "ANY", mapfile=mapfile)
  850. else:
  851. print("Usage: python MinPath.py <-ko filename>/<-fig filename>/<-any annfile> [-map mapfile] [-report filename] [-details detailed-output]")
  852. print("Note: your input file can contain functional annotations in either of the following")
  853. print(" -ko file: annotation in KEGG KO families")
  854. print(" -fig file: annotation in SEED fig families")
  855. print(" -any file: annotation in any families, then you must specify -map, the pathway-function mapping file")
  856. print("Example 1: python MinPath.py -ko demo.ko -report demo.ko.minpath")
  857. print("Example 2: python MinPath.py -ko demo.ko -report demo.ko.minpath -details demo.ko.minpath.details")
  858. print("Example 3: python MinPath.py -fig demo.fig -report demo.fig.minpath")
  859. print("Example 4: python MinPath.py -fig demo.fig -report demo.fig.minpath -details demo.fig.minpath.details")
  860. print("Example 5: python MinPath.py -any demo.ec -map ec2path -report demo.ec.minpath -details demo.ec.minpath.details")
  861. sys.exit(1)

MinPath12hmp.py at commit d91caaa, under GPL-3.0 · at the source

Overview

Authors: Xin Xue1, Lin-Ying Luo1, Jing Wang2, Rui Yang2, Xiao-Hui Ma2, Gen-Bei Wang2, Zhao-Hui Song2, Xin-Xin Li2
  1. School of Traditional Chinese Pharmacy, China Pharmaceutical University, Nanjing, China
  2. National Key Laboratory of Chinese Medicine Modernization, Tasly Research Academy, Tasly Holding Group Co, Ltd., Tianjin, China
Journal: Frontiers in physiology, volume 17, article 1827824
Dates: received 11 March 2026; accepted 29 May 2026; published online 17 June 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.3389/fphys.2026.1827824 · PMID 42389750 · PMCID PMC13318577 · OpenAlex W7164880331
Open access: gold, a free copy (OpenAlex)
Status: code verified
Categories: rat (organism), other condition (population), cellular / molecular (subfield)
Methods: Statistics, Machine learning, Connectivity
Keywords: immune mechanism, intestinal flora, microbial-gut-brain axis, Shao-Ma-Zhi-Jing granules, Tourette syndrome
Topic: Obsessive-Compulsive Spectrum Disorders (Clinical Psychology, Psychology), according to OpenAlex
Citations: not cited yet (Europe PMC); 53 references in the paper

Abstract

Introduction: Shao-Ma-Zhi-Jing Granules (SMZJ) is clinically used for Tourette syndrome (TS). This study aimed to investigate the regulatory effects of SMZJ on the immune system and gut microbiota of the 3,3’-iminodipropionitrile (IDPN)-induced TS rat model.

Methods: Immune-related indicators were detected by flow cytometry, western blotting, ELISA and qRT-PCR. Gut microbiota composition was analyzed via 16S rDNA sequencing, and Spearman analysis was performed to assess the correlation between gut microbiota and immune function.

Results: SMZJ suppressed IDPN-induced stereotypical behaviors. Furthermore, SMZJ regulated the mRNA and protein levels of T helper 1 (Th1), Th2, Th17, and T regulatory (Treg) cell-related transcription factors and modulated Th1 and Th2 cytokines in the TS rat model. SMZJ downregulated the inflammatory pathway in the brain striatum, the TNF-α and IL-6 (inflammatory cytokines) levels, and the striatal iNOS levels in the TS rat model. The diversity and structure of the gut microbiota were remodeled using the SMZJ-treated TS rat model. SMZJ modulated the correlation between immune parameters and gut microbiota.

Conclusions: SMZJ alleviated peripheral and neuroinflammation in TS rats via promoting T cell differentiation and downregulating TNF-α and IL-6 levels, which may be related to changes in the cAMP/PI3K/Akt/NF-κB signaling pathway. SMZJ downregulated the activation of striatal M1 microglia in the TS model. SMZJ may potentially modulated gut microbiota structure and metabolism, relieves peripheral and neuroinflammation, and ameliorates intestinal mucosal barrier injury.

Reproduced under the paper's license (CC BY), from the paper cited above.

Repository

Its files are read in the Code ↔ Paper reader above.

picrust/picrust2

License: GPL-3.0
State: the link answers, verified on 27 September 2026
Evidence: files inventoried
Commit: d91caaa287444a79161023f7bf1547202b7acd64, 25 September 2026
Languages: Python (33), R (2)
Size: 211 files, 35 scripts
Software Heritage: archived
Found in: the text, “Analysis of gut microbiota using 16S rRNA sequen”
Holds: README, license file, environment (pyproject.toml, setup.py), tests, continuous integration
Not found: CITATION.cff, documentation
Tools: pandas (10 files), NumPy (5 files), h5py (1 file), SciPy (1 file)
Availability: 1 check, the latest on 27 September 2026: the link answers
  • 27 September 2026: the link answers
37 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;
  • 35 scripts, each with its path and the digest of its content;
  • no match between paragraphs and code yet;
  • 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 data presented in the study are deposited in the Mendeley Data repository, accession number https://doi.org/10.17632/246p9b4tp4.1.

Reproduced under the paper's license (CC BY), from the paper cited above.

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 1, 27 September 2026: the first record

Recorded: type, language, journal, volume, pages, dates, 8 authors, 5 keywords, 52 references.

Cite

This paper

Xue, X., Luo, L.-Y., Wang, J., Yang, R., Ma, X.-H., Wang, G.-B., Song, Z.-H., & Li, X.-X. (2026). Shao-Ma-Zhi-Jing granules alleviate Tourette Syndrome by modulating the cAMP/PI3K/AKT/NF-κB signaling pathway, T cell differentiation, microglia, and gut microbiota. Frontiers in physiology, 17, 1827824. https://doi.org/10.3389/fphys.2026.1827824

BibTeX

@article{xue2026shao,
author = {Xue, Xin and Luo, Lin-Ying and Wang, Jing and Yang, Rui and Ma, Xiao-Hui and Wang, Gen-Bei and Song, Zhao-Hui and Li, Xin-Xin},
title = {{Shao-Ma-Zhi-Jing granules alleviate Tourette Syndrome by modulating the cAMP/PI3K/AKT/NF-κB signaling pathway, T cell differentiation, microglia, and gut microbiota}},
journal = {Frontiers in physiology},
year = {2026},
month = jun,
volume = {17},
pages = {1827824},
publisher = {Frontiers Media SA},
issn = {1664-042X},
doi = {10.3389/fphys.2026.1827824},
url = {https://doi.org/10.3389/fphys.2026.1827824},
pmid = {42389750},
pmcid = {PMC13318577}
}

RIS

TY - JOUR
AU - Xue, Xin
AU - Luo, Lin-Ying
AU - Wang, Jing
AU - Yang, Rui
AU - Ma, Xiao-Hui
AU - Wang, Gen-Bei
AU - Song, Zhao-Hui
AU - Li, Xin-Xin
TI - Shao-Ma-Zhi-Jing granules alleviate Tourette Syndrome by modulating the cAMP/PI3K/AKT/NF-κB signaling pathway, T cell differentiation, microglia, and gut microbiota
T2 - Frontiers in physiology
J2 - Front Physiol
PY - 2026
DA - 2026/06/17
VL - 17
SP - 1827824
SN - 1664-042X
PB - Frontiers Media SA
DO - 10.3389/fphys.2026.1827824
UR - https://doi.org/10.3389/fphys.2026.1827824
LA - en
ER -

CSL-JSON

{
"id": "10.3389/fphys.2026.1827824",
"type": "article-journal",
"title": "Shao-Ma-Zhi-Jing granules alleviate Tourette Syndrome by modulating the cAMP/PI3K/AKT/NF-κB signaling pathway, T cell differentiation, microglia, and gut microbiota",
"container-title": "Frontiers in physiology",
"author": [
{
"family": "Xue",
"given": "Xin"
},
{
"family": "Luo",
"given": "Lin-Ying"
},
{
"family": "Wang",
"given": "Jing"
},
{
"family": "Yang",
"given": "Rui"
},
{
"family": "Ma",
"given": "Xiao-Hui"
},
{
"family": "Wang",
"given": "Gen-Bei"
},
{
"family": "Song",
"given": "Zhao-Hui"
},
{
"family": "Li",
"given": "Xin-Xin"
}
],
"container-title-short": "Front Physiol",
"volume": "17",
"page": "1827824",
"DOI": "10.3389/fphys.2026.1827824",
"PMID": "42389750",
"PMCID": "PMC13318577",
"ISSN": "1664-042X",
"publisher": "Frontiers Media SA",
"URL": "https://doi.org/10.3389/fphys.2026.1827824",
"language": "en",
"issued": {
"date-parts": [
[
2026,
6,
17
]
]
}
}

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.1016/j.isci.2026.116231 [code]
Endocytic turnover of endothelial cell-membrane proteins as a driver of rat blood-brain barrier specialization and dysfunction.
Journal: iScience
In common: pandas, SciPy, NumPy, rat, cellular / molecular, 1 reference
[2] doi:10.1371/journal.pcbi.1013752 [code]
Calmodulin controls spatial and temporal specificity of calcium-induced calcium release.
Journal: PLoS computational biology
In common: h5py, pandas, SciPy, 1 other tool, rat, cellular / molecular
[3] doi:10.1073/pnas.2533168123 [code]
Dendritic morphology and synaptic nonlinearities enhance functional complexity in human cortical neurons.
Journal: Proceedings of the National Academy of Sciences of the United States of America
In common: h5py, pandas, SciPy, 1 other tool, rat, cellular / molecular
[4] doi:10.1186/s12974-026-03890-4 [code]
Neuronal toll-like receptor-4 regulation of matrix metalloproteinase-9 activity mediates dentate circuit dysfunction after traumatic brain injury.
Journal: Journal of neuroinflammation
In common: h5py, pandas, SciPy, 1 other tool, rat, cellular / molecular
[5] doi:10.1038/s41467-026-73796-5 [code]
Cross-species transcriptomic analysis of rodent model fidelity to human mesial temporal lobe epilepsy.
Journal: Nature communications
In common: h5py, pandas, SciPy, 1 other tool, rat, cellular / molecular
[6] doi:10.1038/s41467-026-76939-w [code]
HIPPIE: a generative model for electrophysiological analysis across species, technologies, and modalities.
Journal: Nature communications
In common: h5py, pandas, SciPy, 1 other tool, rat
[7] doi:10.7554/elife.95562 [code]
Spatially targeted inhibitory rhythms differentially affect neuronal integration.
Journal: eLife
In common: h5py, pandas, SciPy, 1 other tool, rat
[8] doi:10.2147/jir.s633117 [code]
Single-Nucleus Transcriptomic Mapping Reveals Correlative Microglial Changes Associated with rTMS in the Motor Cortex After Spinal Cord Injury.
Journal: Journal of inflammation research
In common: h5py, pandas, SciPy, 1 other tool, other condition, cellular / molecular
[9] doi:10.1371/journal.pcbi.1014327 [code]
Supervised deep learning with gene functional annotation for cell classification.
Journal: PLoS computational biology
In common: h5py, pandas, SciPy, 1 other tool, other condition, cellular / molecular
[10] doi:10.1186/s13293-026-00927-4 [code]
Gene regulatory network analysis identifies dysregulation of hypoxia pathways as contributing to glioblastoma treatment resistance in females.
Journal: Biology of sex differences
In common: h5py, pandas, SciPy, 1 other tool, other condition, cellular / molecular

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.