OSCR

Brain-derived plasma p-tau217 shows enhanced dynamic range for Alzheimer's disease neuropathological change.

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 › Tau‐PET imaging ↔ src/RSF.c, lines 395–464 · score 0.52 · FreeSurfer defined, ROIs, PET, fields

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

C · 793 lines · 26 KB · BSD-3-Clause · 1 match

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5. #include <math.h>
  6. #include <time.h>
  7. #include <endianio.h>
  8. #include <Getifh.h>
  9. #include <rec.h>
  10. #include <librms.h>
  11. #include <nrutil.h>
  12. #include <RSF.h>
  13. IMAGE_4dfp *read_image_4dfp(char *filespc, IMAGE_4dfp *image)
  14. {
  15. int n, m1, m2, isbig;
  16. char imgroot[MAXL], imgfile[MAXL];
  17. FILE *imgfp=NULL;
  18. if (!image) {
  19. image=(IMAGE_4dfp *)malloc((size_t)sizeof(IMAGE_4dfp));
  20. if (!image) errm("read_image_4dfp");
  21. getroot(filespc, imgroot);
  22. sprintf (imgfile, "%s.4dfp.img", imgroot);
  23. Getifh(imgfile, &(image->ifh));
  24. m2=image->ifh.number_of_bytes_per_pixel*image->ifh.matrix_size[0]*image->ifh.matrix_size[1]*image->ifh.matrix_size[2]*image->ifh.matrix_size[3];
  25. } else {
  26. m1=image->ifh.number_of_bytes_per_pixel*image->ifh.matrix_size[0]*image->ifh.matrix_size[1]*image->ifh.matrix_size[2]*image->ifh.matrix_size[3];
  27. getroot(filespc, imgroot);
  28. sprintf (imgfile, "%s.4dfp.img", imgroot);
  29. Getifh(imgfile, &(image->ifh));
  30. m2=image->ifh.number_of_bytes_per_pixel*image->ifh.matrix_size[0]*image->ifh.matrix_size[1]*image->ifh.matrix_size[2]*image->ifh.matrix_size[3];
  31. if (m1!=m2) { /*free old memory if the image size does not match*/
  32. free((void *) image->image);
  33. }
  34. }
  35. isbig = strcmp (image->ifh.imagedata_byte_order, "littleendian");
  36. if (!(imgfp = fopen (imgfile, "rb"))) errr ("read_image_4dfp", imgfile);
  37. m2=m2/image->ifh.number_of_bytes_per_pixel;
  38. image->image=(float *)malloc((size_t)(m2*sizeof(float))); /*Allocate memory for reading the image*/
  39. if (!image->image) errm("read_image_4dfp");
  40. if (eread(image->image, m2, isbig, imgfp)) errr("read_image_4dfp", imgfile);
  41. fclose(imgfp);
  42. return image;
  43. }
  44. int write_image_4dfp(char *filespc, IMAGE_4dfp *image)
  45. {
  46. int isbig, vdim, status = 0;
  47. char imgroot[MAXL], imgfile[MAXL], command[MAXL];
  48. FILE *imgfp;
  49. char control = '\0';
  50. isbig = strcmp (image->ifh.imagedata_byte_order, "littleendian");
  51. if (!control) control = (isbig) ? 'b' : 'l';
  52. vdim=image->ifh.matrix_size[0]*image->ifh.matrix_size[1]*image->ifh.matrix_size[2]*image->ifh.matrix_size[3];
  53. getroot(filespc, imgroot);
  54. sprintf(imgfile, "%s.4dfp.img", imgroot);
  55. if (!(imgfp = fopen (imgfile, "wb"))) errw("write_image_4dfp", imgfile);
  56. if (ewrite(image->image, vdim, control, imgfp)) errw("write_image_4dfp", imgfile);
  57. /* ifh hdr rec */
  58. if (fclose(imgfp)) errw("write_image_4dfp", imgfile);
  59. if (Writeifh("write_image_4dfp", imgfile, &image->ifh, control)) errw("write_image_4dfp", imgroot);
  60. sprintf(command, "ifh2hdr %s", imgroot);
  61. status |= system (command);
  62. return status;
  63. }
  64. float getroimean_4dfp(IMAGE_4dfp *in_image, IMAGE_4dfp *Mask, int val)
  65. {
  66. float *fptr1, *fptr2, roimean, lo, hi;
  67. int i, n, nv;
  68. /*need to implement a input checking mechanism*/
  69. roimean=0;
  70. n=0;
  71. fptr1 = in_image->image;
  72. fptr2 = Mask->image;
  73. lo=(float)val - 0.5;
  74. hi=(float)val + 0.5;
  75. nv = in_image->ifh.matrix_size[0]*in_image->ifh.matrix_size[1]*in_image->ifh.matrix_size[2]*in_image->ifh.matrix_size[3];
  76. for (i=0; i<nv; i++)
  77. {
  78. if (*fptr2<hi && *fptr2>lo) {
  79. n++;
  80. roimean+=*fptr1;
  81. }
  82. fptr1++;
  83. fptr2++;
  84. }
  85. if (n>0) {
  86. roimean=roimean/(float)n;
  87. } else {
  88. printf("Warning: ROI has no voxels\n");
  89. }
  90. return roimean;
  91. }
  92. IMAGE_4dfp *copy_image_4dfp(IMAGE_4dfp *in_image, IMAGE_4dfp *out_image)
  93. {
  94. int i, m1, m2;
  95. float *fptr1, *fptr2;
  96. m2=in_image->ifh.number_of_bytes_per_pixel*in_image->ifh.matrix_size[0]*in_image->ifh.matrix_size[1]*in_image->ifh.matrix_size[2]*in_image->ifh.matrix_size[3];
  97. if (!out_image) {
  98. out_image=(IMAGE_4dfp *)malloc((size_t)sizeof(IMAGE_4dfp));
  99. if (!out_image) errm("copy_image_4dfp");
  100. out_image->image=(float *)malloc((size_t)m2);
  101. if (!out_image->image) errm("copy_image_4dfp");
  102. } else {
  103. m1=out_image->ifh.number_of_bytes_per_pixel*out_image->ifh.matrix_size[0]*out_image->ifh.matrix_size[1]*out_image->ifh.matrix_size[2]*out_image->ifh.matrix_size[3];
  104. if (m1!=m2) {
  105. free((void *) out_image->image);
  106. out_image->image=(float *)malloc((size_t)m2);
  107. if (!out_image->image) errm("copy_image_4dfp");
  108. }
  109. }
  110. strcpy(out_image->ifh.interfile, in_image->ifh.interfile);
  111. strcpy(out_image->ifh.version_of_keys, in_image->ifh.version_of_keys);
  112. strcpy(out_image->ifh.conversion_program, in_image->ifh.conversion_program);
  113. strcpy(out_image->ifh.name_of_data_file, in_image->ifh.name_of_data_file);
  114. /* needs to modify out_image->name_of_data_file to avoid duplication of file names*/
  115. strcpy(out_image->ifh.number_format, in_image->ifh.number_format);
  116. strcpy(out_image->ifh.imagedata_byte_order, in_image->ifh.imagedata_byte_order);
  117. out_image->ifh.number_of_bytes_per_pixel=in_image->ifh.number_of_bytes_per_pixel;
  118. out_image->ifh.number_of_dimensions=in_image->ifh.number_of_dimensions;
  119. for (i=0; i<3; i++)
  120. {
  121. out_image->ifh.matrix_size[i]=in_image->ifh.matrix_size[i];
  122. out_image->ifh.scaling_factor[i]=in_image->ifh.scaling_factor[i];
  123. out_image->ifh.mmppix[i]=in_image->ifh.mmppix[i];
  124. out_image->ifh.center[i]=in_image->ifh.center[i];
  125. }
  126. out_image->ifh.matrix_size[3]=in_image->ifh.matrix_size[3];
  127. out_image->ifh.scaling_factor[3]=in_image->ifh.scaling_factor[3];
  128. out_image->ifh.orientation=in_image->ifh.orientation;
  129. m2=m2/in_image->ifh.number_of_bytes_per_pixel;
  130. fptr1=in_image->image;
  131. fptr2=out_image->image;
  132. for (i=0; i<m2; i++)
  133. {
  134. *fptr2=*fptr1;
  135. fptr1++;
  136. fptr2++;
  137. }
  138. return out_image;
  139. }
  140. IMAGE_4dfp *extract_roi_4dfp(IMAGE_4dfp *image, int MaskVal, IMAGE_4dfp *roimask)
  141. {
  142. int i, m1, m2;
  143. float *fptr1, *fptr2, lo, hi;
  144. m2=image->ifh.number_of_bytes_per_pixel*image->ifh.matrix_size[0]*image->ifh.matrix_size[1]*image->ifh.matrix_size[2]*image->ifh.matrix_size[3];
  145. if (!roimask) {
  146. roimask=(IMAGE_4dfp *)malloc((size_t)sizeof(IMAGE_4dfp));
  147. if (!roimask) errm("extract_roi_4dfp");
  148. roimask->image=(float *)malloc((size_t)m2);
  149. if (!roimask->image) errm("extract_roi_4dfp");
  150. } else {
  151. m1=roimask->ifh.number_of_bytes_per_pixel*roimask->ifh.matrix_size[0]*roimask->ifh.matrix_size[1]*roimask->ifh.matrix_size[2]*roimask->ifh.matrix_size[3];
  152. if (m1!=m2) {
  153. free((void *) roimask->image);
  154. roimask->image=(float *)malloc((size_t)m2);
  155. if (!roimask->image) errm("extract_roi_4dfp");
  156. }
  157. }
  158. strcpy(roimask->ifh.interfile, image->ifh.interfile);
  159. strcpy(roimask->ifh.version_of_keys, image->ifh.version_of_keys);
  160. strcpy(roimask->ifh.conversion_program, image->ifh.conversion_program);
  161. strcpy(roimask->ifh.name_of_data_file, image->ifh.name_of_data_file);
  162. /* needs to modify roimask->name_of_data_file to avoid duplication of file names*/
  163. strcpy(roimask->ifh.number_format, image->ifh.number_format);
  164. strcpy(roimask->ifh.imagedata_byte_order, image->ifh.imagedata_byte_order);
  165. roimask->ifh.number_of_bytes_per_pixel=image->ifh.number_of_bytes_per_pixel;
  166. roimask->ifh.number_of_dimensions=image->ifh.number_of_dimensions;
  167. for (i=0; i<3; i++)
  168. {
  169. roimask->ifh.matrix_size[i]=image->ifh.matrix_size[i];
  170. roimask->ifh.scaling_factor[i]=image->ifh.scaling_factor[i];
  171. roimask->ifh.mmppix[i]=image->ifh.mmppix[i];
  172. roimask->ifh.center[i]=image->ifh.center[i];
  173. }
  174. roimask->ifh.matrix_size[3]=image->ifh.matrix_size[3];
  175. roimask->ifh.scaling_factor[3]=image->ifh.scaling_factor[3];
  176. roimask->ifh.orientation=image->ifh.orientation;
  177. fptr1=image->image;
  178. fptr2=roimask->image;
  179. m2=m2/image->ifh.number_of_bytes_per_pixel;
  180. lo = (float)MaskVal - 0.5;
  181. hi = (float)MaskVal + 0.5;
  182. for (i=0; i<m2; i++)
  183. {
  184. if (*fptr1<hi && *fptr1>lo) {
  185. *fptr2=1;
  186. } else {
  187. *fptr2=0;
  188. }
  189. fptr1++;
  190. fptr2++;
  191. }
  192. return roimask;
  193. }
  194. void getroismean_4dfp(IMAGE_4dfp *in_image, IMAGE_4dfp *Mask, int n, float *a)
  195. {
  196. float *fptr1, *fptr2, *p;
  197. int i, nv, idx;
  198. p=vector(1,n);
  199. for (i=1; i<=n; i++) {a[i]=0.0; p[i]=0.;}
  200. nv = in_image->ifh.matrix_size[0]*in_image->ifh.matrix_size[1]*in_image->ifh.matrix_size[2]*in_image->ifh.matrix_size[3];
  201. fptr1=in_image->image;
  202. fptr2=Mask->image;
  203. for (i=0; i<nv; i++) {
  204. idx=(int)rint((double)(*fptr2))+1;
  205. a[idx]+=*fptr1;
  206. p[idx]+=1.;
  207. if (idx>n) printf("something is wrong.\n");
  208. fptr1++;
  209. fptr2++;
  210. }
  211. for (i=1; i<=n; i++) {a[i]=a[i]/p[i];}
  212. }
  213. void getroismean2_4dfp(IMAGE_4dfp *in_image, IMAGE_4dfp *Mask, IMAGE_4dfp *PETMask, int n, float *a, float *p)
  214. {
  215. float *fptr1, *fptr2, *fptr3, m;
  216. int i, nv, idx, nm;
  217. for (i=1; i<=n; i++) {a[i]=0.0; p[i]=0.;}
  218. nv = in_image->ifh.matrix_size[0]*in_image->ifh.matrix_size[1]*in_image->ifh.matrix_size[2]*in_image->ifh.matrix_size[3];
  219. fptr1=in_image->image;
  220. fptr2=Mask->image;
  221. fptr3=PETMask->image;
  222. nm=0;
  223. m=0;
  224. for (i=0; i<nv; i++) {
  225. if (*fptr3>0){
  226. idx=(int)rint((double)(*fptr2))+1; /*belong to ROI # idx*/
  227. a[idx]+=*fptr1; /*sum for ROI #idx + voxel value*/
  228. p[idx]+=1.; /* voxel number for ROI #idx increase by 1 */
  229. if (idx>n) printf("something is wrong.\n");
  230. if (*fptr2 >0 ){
  231. nm++;
  232. m+=*fptr1;
  233. }
  234. }
  235. fptr1++;
  236. fptr2++;
  237. fptr3++;
  238. }
  239. m=m/(float)nm*.8;
  240. for (i=1; i<=n; i++) {
  241. if (p[i]>0) {
  242. a[i]=a[i]/p[i];
  243. /*printf("%f\t%f\n",p[i], a[i]);*/
  244. } else { /* to protect cases that ROI #i is completely out of PET field of view */
  245. a[i]=m; /* in such case, the ROI mean is replaced with mean value of all non-unknown regions multiplied by 0.8 */
  246. }
  247. }
  248. }
  249. void getroismean3_4dfp(IMAGE_4dfp *in_image, IMAGE_4dfp *Mask, IMAGE_4dfp *PETMask, int n, float *a, float *p)
  250. {
  251. /* get roimean excluding non-valid voxels */
  252. float *fptr1, *fptr2, *fptr3, m;
  253. int i, nv, idx, nm;
  254. for (i=1; i<=n; i++) {a[i]=0.0; p[i]=0.;}
  255. nv = in_image->ifh.matrix_size[0]*in_image->ifh.matrix_size[1]*in_image->ifh.matrix_size[2]*in_image->ifh.matrix_size[3];
  256. fptr1=in_image->image;
  257. fptr2=Mask->image;
  258. fptr3=PETMask->image;
  259. nm=0;
  260. m=0;
  261. for (i=0; i<nv; i++) {
  262. if (*fptr3>0 && isnormal (*fptr1) && *fptr1 != (float) 1.e-37 && *fptr1 !=0){
  263. idx=(int)rint((double)(*fptr2))+1; /*belong to ROI # idx*/
  264. a[idx]+=*fptr1; /*sum for ROI #idx + voxel value*/
  265. p[idx]+=1.; /* voxel number for ROI #idx increase by 1 */
  266. if (idx>n) printf("something is wrong.\n");
  267. if (*fptr2 >0 ){
  268. nm++;
  269. m+=*fptr1;
  270. }
  271. }
  272. fptr1++;
  273. fptr2++;
  274. fptr3++;
  275. }
  276. m=m/(float)nm*.8;
  277. for (i=1; i<=n; i++) {
  278. if (p[i]>0) {
  279. a[i]=a[i]/p[i];
  280. /*printf("%f\t%f\n",p[i], a[i]);*/
  281. } else { /* to protect cases that ROI #i is completely out of PET field of view */
  282. a[i]=0; /* in such case, the ROI mean is replaced with mean value of all non-unknown regions multiplied by 0.8 */
  283. }
  284. }
  285. }
  286. RSFMat *calrsfmat(IMAGE_4dfp *image, ROIList *rois, float fhalf)
  287. {
  288. RSFMat *rsfmat = NULL;
  289. IMAGE_4dfp *tmp_img=NULL;
  290. int val, nx, ny, nz, i, j, nv;
  291. float cmppix[3], *fptr, l;
  292. IFH tmp_ifh;
  293. clock_t start, end;
  294. rsfmat = (RSFMat *) malloc((size_t)sizeof(RSFMat));
  295. if (!rsfmat) errm("calrsfmat");
  296. rsfmat->n = rois->NumberOfRegions;
  297. rsfmat->mat = matrix(1,rsfmat->n,1,rsfmat->n);
  298. nx = image->ifh.matrix_size[0];
  299. ny = image->ifh.matrix_size[1];
  300. nz = image->ifh.matrix_size[2];
  301. cmppix[0]=image->ifh.scaling_factor[0]/10.;
  302. cmppix[1]=image->ifh.scaling_factor[1]/10.;
  303. cmppix[2]=image->ifh.scaling_factor[2]/10.;
  304. /* Converting roi values to consecutive numbers*/
  305. start = clock();
  306. nv = image->ifh.matrix_size[0]*image->ifh.matrix_size[1]*image->ifh.matrix_size[2]*image->ifh.matrix_size[3];
  307. for (j=0; j<rois->NumberOfRegions; j++) {
  308. val = rois->List[j].MaskVal;
  309. fptr = image->image;
  310. for (i=0; i<nv; i++) {
  311. if (fabs(*fptr-(float)val)<1e-4) {
  312. *fptr=(float)j;
  313. }
  314. fptr++;
  315. }
  316. }
  317. fptr=image->image;
  318. l=(float)(rois->NumberOfRegions-.5);
  319. for (i=0; i<nv; i++) {
  320. if (*fptr>l) *fptr=0;
  321. fptr++;
  322. }
  323. end = clock();
  324. printf("CPU TIME USED for roi preprocessing is %f\n",((double) (end - start)) / CLOCKS_PER_SEC);
  325. /* Calculate RSF Matrix */
  326. for (i=1;i<=rsfmat->n;i++) {
  327. printf("%s\n", rois->List[i-1].Name);
  328. tmp_img=extract_roi_4dfp(image, i-1, tmp_img);
  329. start = clock();
  330. gauss3d(tmp_img->image, &nx, &ny, &nz, cmppix, &fhalf);
  331. end = clock();
  332. printf("CPU TIME USED for gauss3d is %f\n",((double) (end - start)) / CLOCKS_PER_SEC);
  333. start = clock();
  334. getroismean_4dfp(tmp_img, image, rsfmat->n, rsfmat->mat[i]);
  335. /*for (j=1; j<=rsfmat->n; j++) {
  336. printf("%e\n",rsfmat->mat[i][j]);
  337. }*/
  338. end = clock();
  339. printf("CPU TIME USED for getroimeans is %f\n",((double) (end - start)) / CLOCKS_PER_SEC);
  340. }
  341. /*
  342. for (i=1;i<=rsfmat->n;i++) {
  343. printf("%s\n", rois->List[i-1].Name);
  344. val = rois->List[i-1].MaskVal;
  345. tmp_img=extract_roi_4dfp(image, val, tmp_img);
  346. start = clock();
  347. gauss3d(tmp_img->image, &nx, &ny, &nz, cmppix, &fhalf);
  348. end = clock();
  349. printf("CPU TIME USED for gauss3d is %f\n",((double) (end - start)) / CLOCKS_PER_SEC);
  350. start = clock();
  351. for (j=1; j<=rsfmat->n; j++) {
  352. rsfmat->mat[i][j]=getroimean_4dfp(tmp_img, image, rois->List[j-1].MaskVal);
  353. printf("%e\n",rsfmat->mat[i][j]);
  354. }
  355. end = clock();
  356. printf("CPU TIME USED for getroimean is %f\n",((double) (end - start)) / CLOCKS_PER_SEC);
  357. }
  358. */
  359. return rsfmat;
  360. }
  361. RSFROIS *Preprocess_RSF(IMAGE_4dfp *FS_Mask, IMAGE_4dfp *Head_Mask, IMAGE_4dfp *PET_Mask, RSFROIS *rsfrois, char *FSLUT)
  362. /*
  363. Combine Freesurfer defined masks, MR based head mask, and PET field of view based mask into a RSF Mask. It makes
  364. sure that meaningful ROIs are only defined on those area within PET field of view.
  365. */
  366. {
  367. int i, j, k, nv, tmp, xb, yb, zb, x, y, z, FSVal[16384], nfsroi, nroi, fsflag[16384], oflag[64], fsidx, val, maxfsval;
  368. float *fptr1, *fptr2, *fptr3, *fptr4, l;
  369. char **FSRegions = NULL;
  370. char line[512], otherstr[256];
  371. FILE *fp = NULL;
  372. printf("0\n");
  373. /* allocate memory and initiate rsfrois */
  374. nv=FS_Mask->ifh.number_of_bytes_per_pixel*FS_Mask->ifh.matrix_size[0]*FS_Mask->ifh.matrix_size[1]*FS_Mask->ifh.matrix_size[2]*FS_Mask->ifh.matrix_size[3];
  375. if (!rsfrois) {
  376. rsfrois=(RSFROIS *)malloc((size_t)sizeof(RSFROIS));
  377. if (!rsfrois) errm("Preprocess_RSF");
  378. rsfrois->RSFMask=(IMAGE_4dfp *)malloc((size_t)sizeof(IMAGE_4dfp));
  379. if (!rsfrois->RSFMask) errm("Preprocess_RSF");
  380. rsfrois->RSFMask->image=(float *)malloc((size_t)nv);
  381. if (!rsfrois->RSFMask->image) errm("Preprocess_RSF");
  382. rsfrois->rois=(ROIList *)malloc((size_t)sizeof(ROIList));
  383. if (!rsfrois->rois) errm("Preprocess_RSF");
  384. } else {
  385. nrerror("rsfrois should be a NULL pointer passing to Preprocess_RSF");
  386. }
  387. nv = nv/FS_Mask->ifh.number_of_bytes_per_pixel;
  388. strcpy(rsfrois->RSFMask->ifh.interfile, FS_Mask->ifh.interfile);
  389. strcpy(rsfrois->RSFMask->ifh.version_of_keys, FS_Mask->ifh.version_of_keys);
  390. strcpy(rsfrois->RSFMask->ifh.conversion_program, FS_Mask->ifh.conversion_program);
  391. strcpy(rsfrois->RSFMask->ifh.name_of_data_file, "RSFMask");
  392. strcpy(rsfrois->RSFMask->ifh.number_format, FS_Mask->ifh.number_format);
  393. strcpy(rsfrois->RSFMask->ifh.imagedata_byte_order, FS_Mask->ifh.imagedata_byte_order);
  394. rsfrois->RSFMask->ifh.number_of_bytes_per_pixel=FS_Mask->ifh.number_of_bytes_per_pixel;
  395. rsfrois->RSFMask->ifh.number_of_dimensions=FS_Mask->ifh.number_of_dimensions;
  396. for (i=0; i<3; i++)
  397. {
  398. rsfrois->RSFMask->ifh.matrix_size[i]=FS_Mask->ifh.matrix_size[i];
  399. rsfrois->RSFMask->ifh.scaling_factor[i]=FS_Mask->ifh.scaling_factor[i];
  400. rsfrois->RSFMask->ifh.mmppix[i]=FS_Mask->ifh.mmppix[i];
  401. rsfrois->RSFMask->ifh.center[i]=FS_Mask->ifh.center[i];
  402. }
  403. rsfrois->RSFMask->ifh.matrix_size[3]=FS_Mask->ifh.matrix_size[3];
  404. rsfrois->RSFMask->ifh.scaling_factor[3]=FS_Mask->ifh.scaling_factor[3];
  405. rsfrois->RSFMask->ifh.orientation=FS_Mask->ifh.orientation;
  406. printf("1\n");
  407. /* load in freesurfer region definition*/
  408. FSRegions = (char **)malloc((size_t)(16384*sizeof(char *)));
  409. if (!FSRegions) errm("Preprocess_RSF");
  410. fp = fopen(FSLUT,"r");
  411. if (!fp) errr("Preprocess_RSF",FSLUT);
  412. maxfsval=0;
  413. for (i=0; i<16384; i++) fsflag[i]=0;
  414. while (fgets(line, 512, fp)){
  415. if (line[0]>='0'&&line[0]<='9') {
  416. sscanf(line, "%d%s%*s", &maxfsval, otherstr);
  417. FSRegions[maxfsval]=(char *)malloc((size_t)(256*sizeof(char)));
  418. if (!FSRegions[maxfsval]) errm("Preprocess_RSF");
  419. strcpy(FSRegions[maxfsval], otherstr);
  420. fsflag[maxfsval]=1;
  421. printf("%s\t%d\n",FSRegions[maxfsval],maxfsval);
  422. /*nfsroi++;*/
  423. }
  424. }
  425. fclose(fp);
  426. printf("maxfsval=%d\n",maxfsval);
  427. /* combine FS_Mask, Head_Mask and PET_Mask to form RSFMask*/
  428. xb=FS_Mask->ifh.matrix_size[0]/4;
  429. yb=FS_Mask->ifh.matrix_size[1]/4;
  430. zb=FS_Mask->ifh.matrix_size[2]/4;
  431. fptr1=FS_Mask->image;
  432. fptr2=Head_Mask->image;
  433. fptr3=rsfrois->RSFMask->image;
  434. fptr4=PET_Mask->image;
  435. l=0;
  436. for (i=0; i<64; i++) oflag[i]=0; /*set all "other region" flags to be 0, no "other region" is defined at this point*/
  437. for (z=0;z<FS_Mask->ifh.matrix_size[2];z++) {
  438. for (y=0; y<FS_Mask->ifh.matrix_size[1]; y++) {
  439. for (x=0; x<FS_Mask->ifh.matrix_size[0]; x++) {
  440. tmp=x/xb+y/yb*4+z/zb*16;
  441. if (*fptr1>0 && *fptr4>0) { /*for voxels defined in FS_Mask and within PET field of view*/
  442. if (l<*fptr1) l=*fptr1;
  443. *fptr3=*fptr1;
  444. fsidx=(int)rint((double)*fptr1);
  445. if (fsflag[fsidx]<=0) { /*the fs region is undefined*/
  446. if (*fptr2>0) { /*within Head Mask*/
  447. *fptr3=(float)(tmp+16384);
  448. oflag[tmp]=1;
  449. } else {/*outside of Head Mask*/
  450. *fptr3=0;
  451. fsflag[0]=2;
  452. }
  453. } else { /* fs region is defined */
  454. fsflag[fsidx]=2;
  455. }
  456. } else if (*fptr1<=0&&*fptr2>0&&*fptr4>0) { /*outside of fs defined region, within Head Mask*/
  457. *fptr3=(float)(tmp+16384);
  458. oflag[tmp]=1;
  459. } else {
  460. *fptr3=0;
  461. fsflag[0]=2;
  462. }
  463. fptr1++;
  464. fptr2++;
  465. fptr3++;
  466. fptr4++;
  467. }
  468. }
  469. }
  470. nroi=0;
  471. maxfsval=(int)rint((double)l);
  472. printf("maxfsval=%d\n",maxfsval);
  473. printf("fsflag[%d]=%d\n",1999,fsflag[1999]);
  474. for (i=0; i<=maxfsval; i++) {
  475. if (fsflag[i]>1) {nroi++; printf("%s\t%d\n",FSRegions[i], i);}
  476. }
  477. printf("nroi=%d\n",nroi);
  478. for (i=0; i<64; i++) {
  479. if (oflag[i]>0) nroi++;
  480. }
  481. rsfrois->rois->NumberOfRegions=nroi;
  482. rsfrois->rois->List=(ROI_Info *)malloc((size_t)(nroi*sizeof(ROI_Info)));
  483. if (!rsfrois->rois->List) errm("Preprocess_RSF");
  484. k=0;
  485. for (i=0; i<=maxfsval; i++) {
  486. if (fsflag[i]>1) {
  487. strcpy(rsfrois->rois->List[k].Name, FSRegions[i]);
  488. rsfrois->rois->List[k].MaskVal=i;
  489. k++;
  490. }
  491. }
  492. for (i=0; i<64; i++) {
  493. if (oflag[i]>0) {
  494. sprintf(otherstr,"other%d",i+16384);
  495. strcpy(rsfrois->rois->List[k].Name, otherstr);
  496. rsfrois->rois->List[k].MaskVal=i+16384;
  497. k++;
  498. }
  499. }
  500. printf("%d\n",rsfrois->rois->NumberOfRegions);
  501. for (j=0; j<rsfrois->rois->NumberOfRegions; j++) {
  502. val = rsfrois->rois->List[j].MaskVal;
  503. fptr3 = rsfrois->RSFMask->image;
  504. for (i=0; i<nv; i++) {
  505. if (fabs(*fptr3-(float)val)<1e-4) {
  506. *fptr3=(float)j;
  507. }
  508. fptr3++;
  509. }
  510. }
  511. fptr3=rsfrois->RSFMask->image;
  512. l=(float)(rsfrois->rois->NumberOfRegions)-.5;
  513. for (i=0; i<nv; i++) {
  514. if (*fptr3>l) *fptr3=0;
  515. fptr3++;
  516. }
  517. for (i=0; i<nroi; i++) {rsfrois->rois->List[i].MaskVal=i; rsfrois->rois->List[i].NVoxels=0;}
  518. fptr3=rsfrois->RSFMask->image;
  519. for (i=0; i<nv; i++) {
  520. val=(int)rint((double)*fptr3);
  521. rsfrois->rois->List[val].NVoxels++;
  522. fptr3++;
  523. }
  524. return rsfrois;
  525. }
  526. RSFROIS *Preprocess_RSF2(IMAGE_4dfp *FS_Mask, IMAGE_4dfp *Head_Mask, RSFROIS *rsfrois, char *FSLUT)
  527. /*
  528. Combine Freesurfer defined masks, MR based head maskinto a RSF Mask.
  529. */
  530. {
  531. int i, j, k, nv, tmp, xb, yb, zb, x, y, z, FSVal[16384], nfsroi, nroi, fsflag[16384], oflag[64], fsidx, val, maxfsval;
  532. float *fptr1, *fptr2, *fptr3, l;
  533. char **FSRegions = NULL;
  534. char line[512], otherstr[256];
  535. FILE *fp = NULL;
  536. /* allocate memory and initiate rsfrois */
  537. nv=FS_Mask->ifh.number_of_bytes_per_pixel*FS_Mask->ifh.matrix_size[0]*FS_Mask->ifh.matrix_size[1]*FS_Mask->ifh.matrix_size[2]*FS_Mask->ifh.matrix_size[3];
  538. if (!rsfrois) {
  539. rsfrois=(RSFROIS *)malloc((size_t)sizeof(RSFROIS));
  540. if (!rsfrois) errm("Preprocess_RSF");
  541. rsfrois->RSFMask=(IMAGE_4dfp *)malloc((size_t)sizeof(IMAGE_4dfp));
  542. if (!rsfrois->RSFMask) errm("Preprocess_RSF");
  543. rsfrois->RSFMask->image=(float *)malloc((size_t)nv);
  544. if (!rsfrois->RSFMask->image) errm("Preprocess_RSF");
  545. rsfrois->rois=(ROIList *)malloc((size_t)sizeof(ROIList));
  546. if (!rsfrois->rois) errm("Preprocess_RSF");
  547. } else {
  548. nrerror("rsfrois should be a NULL pointer passing to Preprocess_RSF");
  549. }
  550. nv = nv/FS_Mask->ifh.number_of_bytes_per_pixel;
  551. strcpy(rsfrois->RSFMask->ifh.interfile, FS_Mask->ifh.interfile);
  552. strcpy(rsfrois->RSFMask->ifh.version_of_keys, FS_Mask->ifh.version_of_keys);
  553. strcpy(rsfrois->RSFMask->ifh.conversion_program, FS_Mask->ifh.conversion_program);
  554. strcpy(rsfrois->RSFMask->ifh.name_of_data_file, "RSFMask");
  555. strcpy(rsfrois->RSFMask->ifh.number_format, FS_Mask->ifh.number_format);
  556. strcpy(rsfrois->RSFMask->ifh.imagedata_byte_order, FS_Mask->ifh.imagedata_byte_order);
  557. rsfrois->RSFMask->ifh.number_of_bytes_per_pixel=FS_Mask->ifh.number_of_bytes_per_pixel;
  558. rsfrois->RSFMask->ifh.number_of_dimensions=FS_Mask->ifh.number_of_dimensions;
  559. for (i=0; i<3; i++)
  560. {
  561. rsfrois->RSFMask->ifh.matrix_size[i]=FS_Mask->ifh.matrix_size[i];
  562. rsfrois->RSFMask->ifh.scaling_factor[i]=FS_Mask->ifh.scaling_factor[i];
  563. rsfrois->RSFMask->ifh.mmppix[i]=FS_Mask->ifh.mmppix[i];
  564. rsfrois->RSFMask->ifh.center[i]=FS_Mask->ifh.center[i];
  565. }
  566. rsfrois->RSFMask->ifh.matrix_size[3]=FS_Mask->ifh.matrix_size[3];
  567. rsfrois->RSFMask->ifh.scaling_factor[3]=FS_Mask->ifh.scaling_factor[3];
  568. rsfrois->RSFMask->ifh.orientation=FS_Mask->ifh.orientation;
  569. /* load in freesurfer region definition*/
  570. FSRegions = (char **)malloc((size_t)(16384*sizeof(char *)));
  571. if (!FSRegions) errm("Preprocess_RSF");
  572. fp = fopen(FSLUT,"r");
  573. if (!fp) errr("Preprocess_RSF",FSLUT);
  574. maxfsval=0;
  575. for (i=0; i<16384; i++) fsflag[i]=0;
  576. while (fgets(line, 512, fp)){
  577. if (line[0]>='0'&&line[0]<='9') {
  578. sscanf(line, "%d%s%*s", &maxfsval, otherstr);
  579. FSRegions[maxfsval]=(char *)malloc((size_t)(256*sizeof(char)));
  580. if (!FSRegions[maxfsval]) errm("Preprocess_RSF");
  581. strcpy(FSRegions[maxfsval], otherstr);
  582. fsflag[maxfsval]=1;
  583. /*printf("%s\t%d\n",FSRegions[maxfsval],maxfsval);*/
  584. /*nfsroi++;*/
  585. }
  586. }
  587. fclose(fp);
  588. printf("maxfsval=%d\n",maxfsval);
  589. /* combine FS_Mask, Head_Mask to form RSFMask*/
  590. xb=FS_Mask->ifh.matrix_size[0]/4;
  591. yb=FS_Mask->ifh.matrix_size[1]/4;
  592. zb=FS_Mask->ifh.matrix_size[2]/4;
  593. fptr1=FS_Mask->image;
  594. fptr2=Head_Mask->image;
  595. fptr3=rsfrois->RSFMask->image;
  596. l=0;
  597. for (i=0; i<64; i++) oflag[i]=0; /*set all "other region" flags to be 0, no "other region" is defined at this point*/
  598. for (z=0;z<FS_Mask->ifh.matrix_size[2];z++) {
  599. for (y=0; y<FS_Mask->ifh.matrix_size[1]; y++) {
  600. for (x=0; x<FS_Mask->ifh.matrix_size[0]; x++) {
  601. tmp=x/xb+y/yb*4+z/zb*16;
  602. if (*fptr1>0 ) { /*for voxels defined in FS_Mask*/
  603. if (l<*fptr1) l=*fptr1;
  604. *fptr3=*fptr1;
  605. fsidx=(int)rint((double)*fptr1);
  606. if (fsflag[fsidx]<=0) { /*the fs region is undefined*/
  607. if (*fptr2>0) { /*within Head Mask*/
  608. *fptr3=(float)(tmp+16384);
  609. oflag[tmp]=1;
  610. } else {/*outside of Head Mask*/
  611. *fptr3=0;
  612. fsflag[0]=2;
  613. }
  614. } else { /* fs region is defined */
  615. fsflag[fsidx]=2;
  616. }
  617. } else if (*fptr1<=0&&*fptr2>0) { /*outside of fs defined region, within Head Mask*/
  618. *fptr3=(float)(tmp+16384);
  619. oflag[tmp]=1;
  620. } else {
  621. *fptr3=0;
  622. fsflag[0]=2;
  623. }
  624. fptr1++;
  625. fptr2++;
  626. fptr3++;
  627. }
  628. }
  629. }
  630. nroi=0;
  631. maxfsval=(int)rint((double)l);
  632. printf("maxfsval=%d\n",maxfsval);
  633. printf("fsflag[%d]=%d\n",1999,fsflag[1999]);
  634. for (i=0; i<=maxfsval; i++) {
  635. if (fsflag[i]>1) {nroi++; printf("%s\t%d\n",FSRegions[i], i);}
  636. }
  637. printf("nroi=%d\n",nroi);
  638. for (i=0; i<64; i++) {
  639. if (oflag[i]>0) nroi++;
  640. }
  641. rsfrois->rois->NumberOfRegions=nroi;
  642. rsfrois->rois->List=(ROI_Info *)malloc((size_t)(nroi*sizeof(ROI_Info)));
  643. if (!rsfrois->rois->List) errm("Preprocess_RSF");
  644. k=0;
  645. for (i=0; i<=maxfsval; i++) {
  646. if (fsflag[i]>1) {
  647. strcpy(rsfrois->rois->List[k].Name, FSRegions[i]);
  648. rsfrois->rois->List[k].MaskVal=i;
  649. k++;
  650. }
  651. }
  652. for (i=0; i<64; i++) {
  653. if (oflag[i]>0) {
  654. sprintf(otherstr,"other%d",i+16384);
  655. strcpy(rsfrois->rois->List[k].Name, otherstr);
  656. rsfrois->rois->List[k].MaskVal=i+16384;
  657. k++;
  658. }
  659. }
  660. printf("%d\n",rsfrois->rois->NumberOfRegions);
  661. for (j=0; j<rsfrois->rois->NumberOfRegions; j++) {
  662. val = rsfrois->rois->List[j].MaskVal;
  663. fptr3 = rsfrois->RSFMask->image;
  664. for (i=0; i<nv; i++) {
  665. if (fabs(*fptr3-(float)val)<1e-4) {
  666. *fptr3=(float)j;
  667. }
  668. fptr3++;
  669. }
  670. }
  671. fptr3=rsfrois->RSFMask->image;
  672. l=(float)(rsfrois->rois->NumberOfRegions)-.5;
  673. for (i=0; i<nv; i++) {
  674. if (*fptr3>l) *fptr3=0;
  675. fptr3++;
  676. }
  677. for (i=0; i<nroi; i++) {rsfrois->rois->List[i].MaskVal=i; rsfrois->rois->List[i].NVoxels=0;}
  678. fptr3=rsfrois->RSFMask->image;
  679. for (i=0; i<nv; i++) {
  680. val=(int)rint((double)*fptr3);
  681. rsfrois->rois->List[val].NVoxels++;
  682. fptr3++;
  683. }
  684. return rsfrois;
  685. }
  686. float *RSFPVC(RSFMat *RSFMat, float *roimean, int iters)
  687. /*
  688. RSFMat is a RSFMat structure that contains the matrix size n and a floating point matrix of n by n;
  689. roimean is a vector that counts from 1 to n;
  690. iters is the number of iterations to be performed using the iterative PVC algorithm;
  691. The return value is a pointer that points to a vector that counts from 1 to n
  692. */
  693. {
  694. int i, j, k, NROI;
  695. float *r, *val, *m;
  696. NROI=RSFMat->n;
  697. r=vector(1,NROI);
  698. val=vector(1,NROI);
  699. m=vector(1,NROI);
  700. for (i=1; i<=NROI; i++) {m[i]=roimean[i];} /* Initial estimation */
  701. for (k=0; k<iters; k++)
  702. {
  703. for (i=1; i<=NROI; i++){
  704. val[i]=0.;
  705. for (j=1; j<=NROI; j++) {
  706. val[i]+=m[j]*RSFMat->mat[j][i]; /* Blurred regional value assuming current estimation */
  707. }
  708. r[i]=fabs(roimean[i]/val[i]); /* ratio between reblurred value and observed value */
  709. r[i]= (r[i]<1.2)?r[i]:1.2; /* constraints for the ratio to be applied to avoid blow up */
  710. r[i]= (r[i]>0.8)?r[i]:0.8;
  711. }
  712. for (i=1; i<=NROI; i++) {
  713. m[i]=m[i]*r[i]; /* Apply correction for current iteration */
  714. }
  715. }
  716. free_vector(r, 1, NROI);
  717. free_vector(val, 1, NROI);
  718. return m;
  719. }
  720. void readtac(char *fn, float *tac, float *frd, float *st, float *nv, int *nframes)
  721. {
  722. FILE *fp;
  723. char line[MAXL], dummy[MAXL];
  724. float fdum, *fptr1, *fptr2, *fptr3, *fptr4;
  725. int i;
  726. if (!(fp=fopen(fn, "r"))) errr("readtac","fn");
  727. fgets(line, 512, fp);
  728. sscanf(line, "%s%s%s%s%s%f", dummy, dummy, dummy, dummy, dummy, nv);
  729. fptr3=tac;
  730. fptr2=frd;
  731. fptr1=st;
  732. *nframes=0;
  733. while(fgets(line, 512, fp))
  734. {
  735. sscanf(line, "%f%f%f%f", &fdum, fptr1, fptr2, fptr3);
  736. fptr1++;
  737. fptr2++;
  738. fptr3++;
  739. (*nframes)++;
  740. }
  741. fclose(fp);
  742. }

RSF.c at commit 746dd5d, under BSD-3-Clause · at the source

Overview

Authors: Marisa N. Denkinger1, Wagner S. Brum1,2, Antoine Leuzy1,2, Alpana Singh1, Taina M. Marques1, Valentina Ghisays3, Hillary Protas3, Yi Su3, Ali Atri1, Thomas G. Beach1, Geidy E. Serrano1, Kinal Bhatt4, Corey M. Carlson4, Katharine Hoffmann4, Eric M. Reiman3, Nicholas J. Ashton1,3
  1. Banner Sun Health Research Institute Sun City Arizona USA
  2. ZRO Imaging Santiago de Compostela Spain
  3. Banner Alzheimer's Institute Phoenix Arizona USA
  4. Beckman Coulter Inc. Chaska Minnesota USA
Journal: Alzheimer's & dementia : the journal of the Alzheimer's Association, volume 22, issue 9, article e71773
Dates: received 25 February 2026; accepted 2 July 2026; published online 1 September 2026; in print September 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1002/alz.71773 · PMID 42677463 · PMCID PMC13531372 · OpenAlex W7204906212
Open access: hybrid, a free copy (OpenAlex)
Status: code verified
Categories: other (modality), histology / microscopy (modality), PET / SPECT (modality), human (organism), Alzheimer's / dementia (population)
Methods: Connectivity, Statistics, fMRI & imaging
Keywords: Alzheimer's disease, amyloid, blood biomarkers, brain‐derived tau, diagnosis, neuropathology, phosphorylated tau, plasma biomarkers, p‐tau217
MeSH: Alzheimer Disease*, Brain*, tau Proteins*, Aged, Aged, 80 and over, Amyloid beta-Peptides, Biomarkers, Female, Humans, Male, Peptide Fragments, Phosphorylation, Positron-Emission Tomography (* major topic)
Topic: Alzheimer's disease research and treatments (Physiology, Medicine), according to OpenAlex
Citations: not cited yet (Europe PMC); 38 references in the paper

Abstract

INTRODUCTION: Plasma phosphorylated tau (p‐tau), particularly p‐tau217, is a highly specific biomarker of Alzheimer's disease (AD) pathology. However, plasma p‐tau217 can be elevated in rare non‐AD conditions. Brain‐derived (BD) p‐tau217 may reduce these off‐target effects, but its performance against neuropathology has not been evaluated.

METHODS: We compared p‐tau217, BD p‐tau217, their amyloid beta 42 (Aβ42) ratios, BD p‐tau217/p‐tau217, and BD p‐tau217/BD tau in end‐of‐life plasma from 288 neuropathologically characterized participants using a fully automated immunoassay. Biomarkers were assessed against National Institute on Aging–Alzheimer's Association (NIA‐AA) classification, Thal phase, Braak stage, cognitive decline, and tau‐PET (positron emission tomography).

RESULTS: All markers tracked neuropathological severity, with BD p‐tau217 having larger fold‐changes than p‐tau217 but BD p‐tau217/Aβ42 enhancing this further. BD p‐tau217/BD tau achieved the highest area under the curve (AUC) for distinguishing Intermediate/High from Not/Low AD neuropathological change (ADNC) (0.89 vs 0.82 for p‐tau217). Although BD p‐tau217/p‐tau217 showed smaller fold‐changes, it had the strongest association with continuous tangle burden in AD (R2 = 0.68) and best predicted Clinical Dementia Rating Sum of Boxes (CDR‐SB decline) (R2 = 0.26).

DISCUSSION: BD p‐tau217 and BD‐based ratios enhance dynamic range and prognostic performance while maintaining diagnostic accuracy, supporting further clinical evaluation.

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

Repository

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

ysu001/PUP

License: BSD-3-Clause
State: the link answers, verified on 26 September 2026
Evidence: files inventoried
Commit: 746dd5dce34807d85a820ac02aa22887a71005ed, 13 October 2020
Languages: C (198), C/C++ (66), MATLAB (10), Perl (1)
Size: 669 files, 275 scripts
Software Heritage: not archived
Found in: the text, “Tau‐PET imaging”
Holds: README, license file
Not found: CITATION.cff, environment file, tests, continuous integration, documentation
Availability: 1 check, the latest on 26 September 2026: the link answers
  • 26 September 2026: the link answers
277 files
At the source: github.com/ysu001/PUP

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;
  • 275 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

No dataset and no data link were found in the paper.

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, issue, pages, dates, 16 authors, 9 keywords, 13 MeSH terms, 6 funders, 37 references.

Cite

This paper

Denkinger, M. N., Brum, W. S., Leuzy, A., Singh, A., Marques, T. M., Ghisays, V., Protas, H., Su, Y., Atri, A., Beach, T. G., Serrano, G. E., Bhatt, K., Carlson, C. M., Hoffmann, K., Reiman, E. M., & Ashton, N. J. (2026). Brain-derived plasma p-tau217 shows enhanced dynamic range for Alzheimer's disease neuropathological change. Alzheimer's & dementia : the journal of the Alzheimer's Association, 22(9), e71773. https://doi.org/10.1002/alz.71773

BibTeX

@article{denkinger2026brain,
author = {Denkinger, Marisa N. and Brum, Wagner S. and Leuzy, Antoine and Singh, Alpana and Marques, Taina M. and Ghisays, Valentina and Protas, Hillary and Su, Yi and Atri, Ali and Beach, Thomas G. and Serrano, Geidy E. and Bhatt, Kinal and Carlson, Corey M. and Hoffmann, Katharine and Reiman, Eric M. and Ashton, Nicholas J.},
title = {{Brain-derived plasma p-tau217 shows enhanced dynamic range for Alzheimer's disease neuropathological change}},
journal = {Alzheimer's \& dementia : the journal of the Alzheimer's Association},
year = {2026},
month = sep,
volume = {22},
number = {9},
pages = {e71773},
publisher = {Wiley},
issn = {1552-5260},
doi = {10.1002/alz.71773},
url = {https://doi.org/10.1002/alz.71773},
pmid = {42677463},
pmcid = {PMC13531372}
}

RIS

TY - JOUR
AU - Denkinger, Marisa N.
AU - Brum, Wagner S.
AU - Leuzy, Antoine
AU - Singh, Alpana
AU - Marques, Taina M.
AU - Ghisays, Valentina
AU - Protas, Hillary
AU - Su, Yi
AU - Atri, Ali
AU - Beach, Thomas G.
AU - Serrano, Geidy E.
AU - Bhatt, Kinal
AU - Carlson, Corey M.
AU - Hoffmann, Katharine
AU - Reiman, Eric M.
AU - Ashton, Nicholas J.
TI - Brain-derived plasma p-tau217 shows enhanced dynamic range for Alzheimer's disease neuropathological change
T2 - Alzheimer's & dementia : the journal of the Alzheimer's Association
J2 - Alzheimers Dement
PY - 2026
DA - 2026/09/01
VL - 22
IS - 9
SP - e71773
SN - 1552-5260
PB - Wiley
DO - 10.1002/alz.71773
UR - https://doi.org/10.1002/alz.71773
LA - en
ER -

CSL-JSON

{
"id": "10.1002/alz.71773",
"type": "article-journal",
"title": "Brain-derived plasma p-tau217 shows enhanced dynamic range for Alzheimer's disease neuropathological change",
"container-title": "Alzheimer's & dementia : the journal of the Alzheimer's Association",
"author": [
{
"family": "Denkinger",
"given": "Marisa N."
},
{
"family": "Brum",
"given": "Wagner S."
},
{
"family": "Leuzy",
"given": "Antoine"
},
{
"family": "Singh",
"given": "Alpana"
},
{
"family": "Marques",
"given": "Taina M."
},
{
"family": "Ghisays",
"given": "Valentina"
},
{
"family": "Protas",
"given": "Hillary"
},
{
"family": "Su",
"given": "Yi"
},
{
"family": "Atri",
"given": "Ali"
},
{
"family": "Beach",
"given": "Thomas G."
},
{
"family": "Serrano",
"given": "Geidy E."
},
{
"family": "Bhatt",
"given": "Kinal"
},
{
"family": "Carlson",
"given": "Corey M."
},
{
"family": "Hoffmann",
"given": "Katharine"
},
{
"family": "Reiman",
"given": "Eric M."
},
{
"family": "Ashton",
"given": "Nicholas J."
}
],
"container-title-short": "Alzheimers Dement",
"volume": "22",
"issue": "9",
"page": "e71773",
"DOI": "10.1002/alz.71773",
"PMID": "42677463",
"PMCID": "PMC13531372",
"ISSN": "1552-5260",
"publisher": "Wiley",
"URL": "https://doi.org/10.1002/alz.71773",
"language": "en",
"issued": {
"date-parts": [
[
2026,
9,
1
]
]
}
}

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.1093/brain/awaf375 [code]
Reference proteins to improve Core 1 and Core 2 Alzheimer's disease CSF and plasma biomarkers.
Journal: Brain : a journal of neurology
In common: PET / SPECT, other, Alzheimer's / dementia, 6 references
[2] doi:10.1002/alz.71711 [code]
Exploring longitudinal relationships among Alzheimer's disease biomarkers.
Journal: Alzheimer's & dementia : the journal of the Alzheimer's Association
In common: PET / SPECT, other, Alzheimer's / dementia, 5 references
[3] doi:10.1002/ana.78300
Distribution of Big Tau Isoforms in the Human Central and Peripheral Nervous System.
Journal: Annals of neurology
In common: other, Alzheimer's / dementia, 5 references
[4] doi:10.1186/s13195-026-02119-z
Age-dependent diagnostic and correlational architecture of multiplex plasma biomarkers in Alzheimer's disease: a cross-ethnic, cross-platform validation study.
Journal: Alzheimer's research & therapy
In common: PET / SPECT, other, Alzheimer's / dementia, 5 references
[5] doi:10.1002/acn3.70423
Impact of Plasma p-tau181 on Cognition, Motor Phenotypes, and Disease Course in ALS.
Journal: Annals of clinical and translational neurology
In common: other, Alzheimer's / dementia, 5 references
[6] doi:10.1002/alz.71530 [code]
Differential associations of plasma biomarkers with Alzheimer's disease and small vessel disease: A multimodal imaging study.
Journal: Alzheimer's & dementia : the journal of the Alzheimer's Association
In common: PET / SPECT, other, Alzheimer's / dementia, 4 references
[7] doi:10.64898/2026.05.06.26352540 [code]
Generating synthetic tau-PET scans in Alzheimer’s disease from MRI, blood biomarkers and demographics with deep learning
Journal: medRxiv (preprint)
In common: PET / SPECT, other, Alzheimer's / dementia, 4 references
[8] doi:10.1093/brain/awaf413 [code]
Estimating the time course of biomarker changes in Alzheimer's disease.
Journal: Brain : a journal of neurology
In common: PET / SPECT, Alzheimer's / dementia, 4 references
[9] doi:10.1007/s00401-026-03042-1
Tau368 improves p-tau diagnostic accuracy for FTLD-tau from FTLD-TDP.
Journal: Acta neuropathologica
In common: Alzheimer's / dementia, 4 references
[10] doi:10.1002/hbm.70508 [code]
Cyclic 2.5D Perceptual Loss for Cross-Modal 3D Medical Image Synthesis: T1w MRI to Tau PET.
Journal: Human brain mapping
In common: PET / SPECT, Alzheimer's / dementia, 3 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.