diff --git a/.gitignore b/.gitignore index 902b29b..cbfcc50 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ replay_pid* /.idea/ /data/ /prompts/ +/fenominal-mined.txt diff --git a/docs/cases/PMID_15673476.txt b/docs/cases/PMID_15673476.txt new file mode 100644 index 0000000..d061f7c --- /dev/null +++ b/docs/cases/PMID_15673476.txt @@ -0,0 +1,15 @@ +[source] +pmid = PMID:15673476 +title = A novel heterozygous missense mutation in the UMOD gene responsible for Familial Juvenile Hyperuricemic Nephropathy +[diagnosis] +disease_id = OMIM:162000 +disease_label = Tubulointerstitial kidney disease, autosomal dominant, 1 +[text] +The proband is an affected female who was first evaluated at the age of 24, when she presented with a gout attack and hyperuricemia. + At age 27 she was told having renal failure. However, a renal biopsy was not performed. + At age 44, serum creatinine was 2.8 mg/dl and ultrasound imaging detected numerous renal cysts. + Renal disease slowly progressed and the patient reached ESRD when she was 49 years old. + Her father died at the age of 55 from ESRD and suffered from hyperuricemia and gout. + The proband's only son is also affected. At the age of 18 years he had a gout attack. + On the initial evaluation, serum uric acid was 15 mg/dl and serum creatinine 1.6 mg/dl. + Renal cysts were also detected on ultrasound examination. \ No newline at end of file diff --git a/docs/cases/PMID_16962354.txt b/docs/cases/PMID_16962354.txt new file mode 100644 index 0000000..7e636fa --- /dev/null +++ b/docs/cases/PMID_16962354.txt @@ -0,0 +1,11 @@ +[source] +pmid = PMID:16962354 +title = Functional analysis of mutations in TGIF associated with holoprosencephaly +[diagnosis] +disease_id = OMIM:142946 +disease_label = Holoprosencephaly 4 +[text] +A male proband presenting with lobar holoprosencephaly, atypical ventricles with small frontal horns, +hypothalamic and caudate fusion, diabetes insipidus, seizures, +premaxillary agenesis, microcephaly, absent nasal root and septum with a +depressed nasal tip (Fig. 1A and B). diff --git a/docs/cases/PMID_17661815.txt b/docs/cases/PMID_17661815.txt new file mode 100644 index 0000000..6aecbbd --- /dev/null +++ b/docs/cases/PMID_17661815.txt @@ -0,0 +1,43 @@ +[source] +pmid = PMID:17661815 +title = Familial CHARGE syndrome because of CHD7 mutation: clinical intra- and interfamilial variability +[diagnosis] +disease_id = OMIM:214800 +disease_label = CHARGE syndrome +[text] +Patient A III-2 is the second boy of non-consanguineous French parents, respectively, aged 30 and 29 years, at the time of conception. +The pregnancy was characterized by polyhydramnios from the 26th week of gestation. +Delivery took place after 38 weeks by caesarean section with normal birth weight (BW) (3025 g, 50th centile), birth length (BL) +(48 cm, 25th centile) and head circumference (OFC) (34.5 cm, 50th centile). MCA noted at birth included esophageal atresia with tracheoesophageal fistula, +bilateral cleft lip and palate, large ventricular septal defect, dextroposition of aorta, atresia of the brachiocephalic trunk, +malacia of the right main bronchus, costovertebral abnormalities (bifid fourth dorsal vertebrae, duplication of the fourth right rib, +and spina bifida occulta from the seventh to the ninth dorsal vertebrae) and left cryptorchidism. +Axial control acquisition was delayed as he sat at the age of 11 months, walked at 22 months. +Balance problems persisted for several years. Recurrent otitis media, responsible for conductive hearing loss, +required bilateral tympanostomy tubes. First words were delayed till 30 months. Learning disabilities and writing difficulties +were confirmed when he was 8 year. When referred to the genetic department at the age of 15 years, +he was 151 cm tall (−2 SD ), weighted 40 kg (−2 SD), and had an OFC of 52 cm (−2 SD). +At that time, he had a long face with prominent chin, small mouth, high nasal bridge and triangular shape of right concha +(Fig. 1). He had postural instability. Vestibular testing showed absence of response on canal function test with residual otolith +function and residual left vestibulospinal responses on vestibular evoked myogenic potential test. +Magnetic resonance imaging (MRI) examination showed hypoplastic superior and lateral semicircular canals (SCC) in the right ear +and aplastic superior and hypoplastic lateral SCC in the left ear (Fig. 2). The vestibulae and the cochleae were normal. +Facial and vestibulo-cochlear nerves were present on both sides. Brain MRI revealed a hypoplastic internal left carotid artery. +There was no evidence for arhinencephaly. He had mild convergent strabismus, discrete myopia and posterior embryotoxon. +Funduscopic examination revealed hypoplastic papillae. Using WISC IV scale at age 15 years his verbal conceptual index (VCI) was 78, +perceptual reasoning index (PRI) 58, working memory index (WMI) 62 and processing speed index (PSI) 81. +[text] +Patient B III-1 is the first child from healthy unrelated Caucasian parents. Mother and father were both 26 years old at time of conception. +Cerebral ventricular dilatation was suspected on pre-natal ultrasound but not confirmed by fetal cerebral MRI. +Fetal karyotype was normal (46, XY). Premature labor occurred and delivery took place at a gestational age of 35 weeks. +BW was 2050 g (third centile); BL 46.5 cm (50th centile) and OFC 34 cm (90th centile). He had cup-shaped ears with missing earlobes, +right facial palsy, bifid uvula and mild retrognathism (Fig. 4) with associated cryptorchidism and global hypotonia. +Swallowing difficulties with poor feeding were noted. Laryngoscopy revealed left vocal cord palsy. +An atrial septal defect was diagnosed by echocardiography. Fundoscopy showed right retinal coloboma. +Brainstem electric response audiometry identified a sensorineural deafness, visual evoked potentials were in the normal range. +Metabolic work-up did not show any anomaly. This boy died on day 19 after refractory convulsive episodes starting on day 4. +Encephalopathy and hydrocephaly were subsequently noted, as post-natal cerebral MRI (day 7) showed quadriventricular enlargement +because of bloody effusion in occipital horns without any underlying vascular malformation. On autopsy, +brain external examination revealed the absence of olfactory bulbs with a thin corpus callosum. +On microscopic exam, cranial nerve roots were normal. Deep cerebellar heterotopia was present. +Complete macroscopic and microscopic examinations were otherwise normal except for the presence of testis in the inguinal canals. \ No newline at end of file diff --git a/docs/cases/PMID_19208399.txt b/docs/cases/PMID_19208399.txt new file mode 100644 index 0000000..06c6724 --- /dev/null +++ b/docs/cases/PMID_19208399.txt @@ -0,0 +1,39 @@ +[source] +pmid = PMID:19208399 +title = A novel mutation in the VCP gene (G157R) in a German family with inclusion-body myopathy with Paget disease of bone and frontotemporal dementia +[diagnosis] +disease_id = OMIM:167320 +disease_label = Inclusion body myopathy with early-onset Paget disease and frontotemporal dementia 1 +[text] +Patient II-3. At the age of 41 years, the +male index patient developed slowly progressive symmetric muscle weakness, which started in the proximal upper limb muscles +but is now most pronounced in the proximal leg muscles. Three years +after onset he noticed increasing hearing impairment and bone pain. Elevated plasma levels of the +bone-specific alkaline phosphatase isoenzyme (168 g/L, normal 8 –17) in combination with typical +changes on a 99mTc total body bone scan suggested +a diagnosis of PDB. Biphosphonate treatment was +initiated and led to improvement of bone pain and a +marked reduction of alkaline phosphatase. +The muscle weakness, however, continued to increase, and +eventually the patient became unable to walk more +than 30 meters unaided. On examination, there was +proximal weakness and atrophy of the limb muscles +with bilateral scapular winging and a positive Trendelenburg sign. He had a waddling gait and required +the support of two crutches. The patient’s wife had +recently noticed an impaired capability of her husband to recognize faces of persons known to him. In +addition, he had become apathetic and had lost +interest in previous hobbies. Plasma creatine kinase +(CK) levels were mildly elevated. Nerve conduction +studies were normal, but electromyographic studies +showed moderate myopathic changes with fibrillation potentials and polyphasic small-amplitude, +short-duration motor unit potentials. Neuropsychological evaluation (DemTect, frontal assessment battery) + did not show significant cognitive impairment. Audiometry revealed moderate left-sided +perceptive deafness of 50 dB HL. Cranial magnetic +resonance imaging (MRI) showed bony changes typical of Paget disease, but no evidence of auditory +nerve compression due to Paget disease. Intracranial +findings were normal without signs of frontal lobe +atrophy. A muscle biopsy from the quadriceps muscle revealed moderate histopathological changes +consisting of angulated and atrophic fibers with a +few inclusion bodies, but no rimmed vacuoles. The +inclusions were ubiquitin-positive, but they were negative for beta-amyloid. Ubiquitin-positive inclusions +could also be demonstrated in the nucleus of myocytes, endothelial cells, and fibroblasts. \ No newline at end of file diff --git a/docs/cases/PMID_20149460.txt b/docs/cases/PMID_20149460.txt new file mode 100644 index 0000000..75c305e --- /dev/null +++ b/docs/cases/PMID_20149460.txt @@ -0,0 +1,18 @@ +[source] +pmid = PMID:20149460 +title = A novel mutation in the signal transducer and activator of transcription 3 (STAT3) gene, in hyper-IgE syndrome +[diagnosis] +disease_id = OMIM:147060 +disease_label = Hyper-IgE syndrome 1, autosomal dominant, with recurrent infections +[text] +A 12-year-old Greek girl was admitted because of fever, and cough for a week. Her parents were not consanguineous. +She had no remarkable perinatal problems and had been vaccinated as scheduled. She had a history of atopic dermatitis since 6 months of age. +Past medical history also revealed recurrent infections, including multiple episodes of skin abscesses and pneumonia. +She had a history of two hospitalizations for pneumonia with cyst formation in the right lung and numerous visits at the +clinic for the treatment of skin abscesses caused by Staphyloccocus aureus. Family history revealed no members with relevant allergic or immunologic diseases. +On physical examination, her height was 118 cm (under the 5th percentile), and her weight was 25.8 kg (under the 5th percentile). +She had coarse facial features with facial asymmetry, and prominent forehead. She was also diagnosed with scoliosis with maximal curvature of 14°. +Complete blood cell counts demonstrated a high total eosinophil count (max 4000 cells/μl). +The serum IgE level was increased at 74.000 IU/ml. All other laboratory data examined, such as serum immunoglobulin level, +the oxidative burst of granulocytes and complement components, were normal with the exception of slightly increased IgD titer (300 mg/l). +Lymphocyte subset analyses revealed normal levels of both CD4+ and CD8+ T cells (883 and 850 cells/μl, respectively). diff --git a/docs/cases/PMID_20932317.txt b/docs/cases/PMID_20932317.txt new file mode 100644 index 0000000..5e942f0 --- /dev/null +++ b/docs/cases/PMID_20932317.txt @@ -0,0 +1,26 @@ +[source] +pmid = PMID:20932317 +title = Frameshift mutation hotspot identified in Smith-Magenis syndrome: case report and review of literature +[diagnosis] +disease_id = OMIM:182290 +disease_label = Smith-Magenis syndrome +[text] +Case 1 +SMS324 is an 18-year-old male who was delivered at 38 weeks gestation following premature labor and antepartum haemorrhage. +His birth weight was 2,750 g (10th-50th centile). While his neonatal period was complicated by gastroesophageal reflux +and failure to thrive, he was admitted to the hospital at 1 year of age for being considerably overweight, with fat folds +on his arms and legs. He spoke his first words at 6 months and walked at 12 months. His medical history includes two +episodes of severe asthma, petit mal seizures between the ages of 5-10 y and three spontaneous pneumothoraces (SP). +He had a square shaped face, upslanting palpebral fissures, down turned mouth, inverted upper lip, and synophrys (Fig. 1A). +Other physical anomalies included brachydactyly, bilateral fifth finger clinodactyly with +a small middle phalanx of his fifth fingers, and pes planus. At 16 years of age, height was 163 cm (< 3rd centile), +head circumference was 54 cm, and he presented with relative truncal obesity. +Behaviorally, SMS324 exhibited head-banging and rage attacks starting at age 3. +At age 16, he continues to have recurrent episodes of rage attacks, anxiety, and obsessional behavior. +He has never slept through the night, with recurrent 3 a.m. wakenings. +Apart from finger chewing, he exhibits no self-injurious behaviors, self hugging, onychotillomania or polyembolokomania. +He has had a persistent history of sleep disturbance. +A formal developmental assessment indicated a mild global developmental delay. +He was initially diagnosed with attention deficit disorder; +however, a later assessment indicated this diagnosis was incorrect. +He was initially mainstreamed in a regular classroom at school but at age 16 now functions in an OI classroom with supervision. diff --git a/docs/cases/PMID_22560515.txt b/docs/cases/PMID_22560515.txt new file mode 100644 index 0000000..97f5525 --- /dev/null +++ b/docs/cases/PMID_22560515.txt @@ -0,0 +1,69 @@ +[source] +pmid = PMID:22560515 +title = Congenital myopathy caused by a novel missense mutation in the CFL2 gene +[diagnosis] +disease_id = OMIM:610687 +disease_label = Nemaline myopathy 7, autosomal recessive +[text] +Patient 1 +The proband is the first child of Iraqi Kurdish consanguineous parents (Fig. 1A–C) and was born at term by cesarean section +due to a breech presentation. Her initial development was reportedly normal. She started to sit at the age of 6 months +and to crawl when she was 11 months old. However, she did not walk until the age of 2 years and 6 months. +Her maximum walking distance was a few hundred meters. Fine motor skills were intact. In Iraq, the diagnosis ‘progressive myopathy’ was made. +By age 13, she had developed a severe kyphoscoliosis (Cobb angle of 60°, a kyphosis of 69°, and a torsion of 25° of pelvis and lumbar spine). +Because of unforeseen problems, surgical correction had to be postponed and the kyphosis increased to 118° with a thoracolumbar scoliotic bend +to the left of 57° and a compensatory angle of 44°. At the age of 15 years, the family had fled to the Netherlands and the patient was seen +in our Neurology department. She complained about difficulties keeping her head straight and the need to support it with her hands. +She reported reasonable arm strength but said her legs felt weak. The maximum walking distance was 50–100 m. +Neurological examination showed a girl with normal intelligence and social skills. Vision and hearing were normal. She had a high-arched palate, +a very low-pitched voice and needed to support her head with her hands. Facial muscles showed a slight weakness, MRC grade 4, without involvement of the +eye muscles. She had a fixated back and a cervical lordosis (Fig. 1A–C). The neck muscles were hypotonic with a paresis grade 2 of the flexor muscles +and a paresis grade 4 of the extensor muscles. The shoulder girdle muscles had a paresis grade 2, whereas the rest of the arms showed a grade 4 weakness. +For getting up, she used the Gowers’ manoeuvre. The strength of the iliopsoas muscles was an MRC grade 1, the other legs muscles had a paresis grade 3–4. +The sensory exam was normal and reflexes were absent. The knees had a contracture of 10°. Routine hematological and chemical analysis was normal, +the CK level at the age of 11 years was 134 U/l (normal). CT scanning of the limbs at the age of 12 years revealed fatty changes in a number of leg, +trunk and arm muscles, most conspicuously in the soleus and quadriceps, but sparing the rectus femoris, and also of the semitendinosus, adductor magnus, +serratus anterior and latissimus dorsi. Slight abnormalities were seen in the gluteals and peroneal muscles, largely sparing the tibialis anterior. +Unfortunately the scan quality was insufficient to examine the upper extremity muscles, due to movement artefacts. +Nerve latencies and conduction velocities were normal on EMG examination. Needle examination revealed fibrillations and +positive spikes with small low amplitude polyphasic motor units with an increased recruitment pattern. The ear, nose and throat specialist concluded +that the low-pitched voice was due to her posture. No cardiac abnormalities were found with echocardiography. +In the following years, a gradual decline of strength was noted. Her ability to walk had decreased to a few meters indoors and the head drop increased. +As she complained of shortness of breath on occasions, pulmonary function tests were done. This revealed a chronic respiratory insufficiency due to + muscle weakness. Non-invasive nocturnal positive pressure ventilation was initiated, resulting in an improvement of her general physical condition. + At the age of 21 years she is completely wheelchair dependent, but studies architecture and enjoys an active social life. + The muscle biopsy of patient 1 showed a dystrophic pattern with increased endomysial connective tissue and increased fat cells (Fig. 4). + There was an increased variability of muscle fiber caliber with a 98% predominance of type 1 fibers. Seventy-two percent of the fibers + had internal nuclei, several whorled fibers with splitting were seen and there were numerous cytoplasmic bodies. Enzyme histochemistry + showed uneven distribution of ATP-ase causing a rubbed-out aspect, and core-like areas of diminished to absent staining with SDH and COX. + In these areas immunohistochemical staining with desmin was enhanced. With immunohistochemistry for dystrophin, sarcoglycans, spectrin, + dysferlin, and caveolin-3 normal staining of the muscle membranes was seen. With merosin there was a normal staining of the basement + membrane. With caveolin- 3, vimentin and dysferlin roughly and diffusely stained aggregates were seen in the rubbed out areas of the + cytoplasm of the fibers. More fine and partly punctiform to linear staining was seen with antibodies against dystrophin and all sarcoglycans. + Electron microscopy could not be performed because insufficient material was available. +[text] +Patient 2 +The proband’s sister was also born at term by cesarean section because of a breech presentation. Because of her affected sibling, +neurological examination was performed in the neonatal period, but no abnormalities were seen until the age of 2 years and 7 months. +From that moment, she started to lag in motor development. Neurological examination at that time showed hypotonia, hyperextension of +the knees and elbows, and a waddling gait. Gowers’ sign was positive. Although due to lack of cooperation formal muscle strength testing +was not possible, no obvious facial and shoulder weakness was seen. She had a lumbar lordosis and pes planes (Fig. 1D–F). +Cardiac examination was normal and routine hematological and chemical analysis showed no abnormalities. +EMG revealed normal motor and sensory conduction velocities, and amplitudes. Due to lack of cooperation, needle examination was limited +to the rectus femoris muscle which showed no abnormalities. Quantitative muscle ultrasound [9] showed abnormal echo intensities +in all extremities (Fig. 2). At the most recent follow-up at the age of 5 years, the parents reported that she had more difficulties with +keeping her head straight with an occasional head drop backwards. Running skills have improved slightly but she stumbled regularly. +Examination showed a girl with normal intelligence. Muscle strength testing showed weakness MRC grade 2 of the neck flexors, axial muscles, +hip abductor, and periscapular muscles, and a weakness grade 4 of the hip flexors, biceps and distal muscles. +The muscle biopsy of patient 2 at the age of 3 years and 3 months showed an increased percentage of fibers (19%) with internal nuclei (Fig. 5). +The fibers were unevenly stained on HE and Gomori trichrome, with the presence of cytoplasmic bodies and large clusters of nemaline rods. +There was a predominance of type 1 fibers. Enzyme histochemistry with ATP-ase revealed rubbed out areas; with NADH, SDH and COX uneven areas +with diminished to absent staining became apparent. Immunohistochemistry with antibodies against alpha-actinin-2 revealed accumulations of rods, +in other areas aggregations of desminpositive material were present. Immunohistochemistry for dystrophin, sarcoglycans, alpha-dystroglycan, +dysferlin, and caveolin-3 showed normal staining of the muscle membranes. With immunocytochemistry for merosin, the muscle basal membrane +stained normally. Nuclei were normally stained with emerin and lamin A/C. With caveolin-3, vimentin, dysferlin and beta-dystroglycan +roughly and diffusely stained aggregates were seen in the rubbed out areas of the cytoplasm of the fibers. More discrete, partly +linear staining was seen with antibodies against dystrophins and all sarcoglycans. Electron microscopy analysis showed areas with +Z-band streaming and rods, often in large aggregates. These aggregates were accompanied by osmiophilic granular material, +degenerating membranous organelles and cytoplasmic bodies. Intranuclear rods were not present. Biochemical analysis for mitochondrial +defects revealed no abnormalities. \ No newline at end of file diff --git a/docs/cases/PMID_23562786.txt b/docs/cases/PMID_23562786.txt new file mode 100644 index 0000000..b1ed5ae --- /dev/null +++ b/docs/cases/PMID_23562786.txt @@ -0,0 +1,18 @@ +[source] +pmid = PMID:23562786 +title = A novel COMP mutation in a Chinese patient with pseudoachondroplasia +[diagnosis] +disease_id = OMIM:177170 +disease_label = Pseudoachondroplasia +[text] +The patient was the first child of healthy non-consanguineous Chinese parents. He was born at term with a birth weight of 3.5 kg and a height of 50 cm. +His development milestone appeared normal before the age of approximately 1.5 years, by which time he had learnt to walk. Since then the boy had complained of pain in lower extremities at times. +His growth rate had been lower than normal since age 2 years. The patient was first referred for genetics and endocrine evaluation for his short stature at the age of 2.75 years. +He was with a height of 85.7 cm (< 3th centile; − 2.02 SD), a weight of 13 kg (25–50th centile; − 0.17 SD), and a sitting-height of 53 cm (− 1.48 SD). Sitting height/leg length ratio was 1.621 (+ 1.51 SD). +Disproportionate short-limb short stature was noted. Waddling gait and genu varus were obvious. Examination of his upper limbs showed restricted extension at the elbows and moderate brachydactyly. +No facial dysmorphism or other positive signs were noted. There is no family history. Laboratory tests including mucopolysaccharide analysis of urine and thyroid function tests were normal. +Radiographs revealed features suggestive of pseudoachondroplasia including short tubular bones with irregular epiphyses and metaphyses, small capital femoral epiphyses, brachydactyly, and anterior tonguing or beaking of the vertebral bodies (Figs. 1A–D). +And the skull X-ray was normal (figure not shown). +Fig. 1. Radiographic findings in the 2.75-year-old patient. (A) The pelvic showed: abnormal acetabular with flat roof and irregular margins; small capital femoral epiphyses and irregular, flared metaphyseal borders. +(B) The hand showed: shortening and broadening of phalanges and metacarpals with irregular metaphyses; obvious delay in carpal ossification. (C) The femoral and tibias showed widened, irregular and flared metaphyseal borders. +(D) Characteristic anterior tonguing or beaking of the vertebral bodies was displayed. \ No newline at end of file diff --git a/docs/cases/PMID_23566664.txt b/docs/cases/PMID_23566664.txt new file mode 100644 index 0000000..af3c18e --- /dev/null +++ b/docs/cases/PMID_23566664.txt @@ -0,0 +1,23 @@ +[source] +pmid = PMID:23566664 +title = A mutation in NOTCH2 gene in a Chinese patient with Hajdu-Cheney syndrome +[diagnosis] +disease_id = OMIM:102500 +disease_label = Hajdu-Cheney syndrome +[text] +The affected individual has normal secondary sexual characteristics with no pregnancy history. +When she was 12 years old, her fingers and toes became shorter and broader. Because she did not feel any +pain, she did not go to see a doctor at that time. Since a compression fracture of lumbar spine one in 2007, +she has had severe lumbago and difficulty in walking. She came to our department in December 2008. + +She was presented with a short stature of 152 cm. She had bushy eyebrows, and her hair was black and coarse. +She had a flat face, a large auricle, and a small lower jaw (Fig. 1a) Her fingers and toes were short and broad (Fig. 1b). +Her hearing was normal. On superficial examination, the teeth appear normal. Her intelligence was normal, +but a memory decline had been progressing during the last 5 years. +Radiographs showed osteoporosis of the hands and acro-osteolysis and soft tissue swelling at the proximal ends of the +distal phalanges of the fingers (Fig. 1c) and toes. There was osteoporosis of the spine, with compression fractures of +T4, T5, T7, T11 and L1 vertebrae. +Physical characteristics: her hair was black and coarse, and she had facial features characteristic of elderly individuals, +a broad nose, bushy eyebrows, a flat face, a large auricle and a small lower jaw (a); +her fingers were short and broad (b). Radiography features: osteoporosis of the hands, +osteolysis and soft tissue swelling at the proximal end of the distal phalanges of the fingers (c). \ No newline at end of file diff --git a/docs/cases/PMID_23726037.txt b/docs/cases/PMID_23726037.txt new file mode 100644 index 0000000..4e37410 --- /dev/null +++ b/docs/cases/PMID_23726037.txt @@ -0,0 +1,29 @@ +[source] +pmid = PMID:23726037 +title = The first case of CDK5RAP2-related primary microcephaly in a non-consanguineous patient identified by next generation sequencing +[diagnosis] +disease_id = OMIM:604804 +disease_label = Microcephaly 3, primary, autosomal recessive +[text] +The patient, a 6 year old Caucasian female, was the product of a triplet pregnancy born at 33 weeks gestation. +She was noted, in utero, to have a smaller head than either of her siblings, and by parents’ report at 30 days of age +her head circumference was 30 cm (−2 SD on preterm growth curve). +At birth, she was noted to have issues with temperature regulation, waking and feeding, but was able to be discharged +with her siblings at 29 days of age. Besides a history of short stature, delayed bone age, asthma, environmental allergies +and a question of sleep apnea, she has been generally in good health. Primary concerns for the patient has been with her development. + While motor milestones were met fairly normally, her cognitive, language, and fine motor/adaptive skills were delayed. + She required early intervention and attended developmental preschool. For the current school year she is in an integrated + 1st grade class with an aide. She receives occupational therapy to assist with visual motor integration, speech therapy to + improve her articulation, and extra help for reading. Most recent measures of general intelligence (performed at 6½ years of age) + reveal a below average full scale IQ of 75 with greatest impairment in processing speed. On the Wechsler Preschool and + Primary Scale of Intelligence III Revised (for children 2 years 6 m – 7 years 3 m), she obtained a Verbal IQ of 83, + Nonverbal IQ of 75, and Processing speed 71. On the Wechsler Individual Achievement Testing (WIAT) she showed + significant struggles in secondary language on tasks of early reading (SS 60), word reading (SS 70), reading comprehension (SS 69) + and struggles in math on the task of numerical operations (SS 61) (WPPSI – R and WIAT mean = 100 and SD = 15). + Parents report subjectively that differences in development relative to her sisters are becoming more apparent with time. + +In terms of the patient’s family history, the patient was born to a Northern European mother and Caucasian father with +Cherokee ancestry with no reported consanguinity (Fig. 1b). The patient’s family history was remarkable for benign familial +epilepsy and pseudohypoparathyroidism in her older sibling, history of seizures on her maternal side and a history of attention +deficient disorder and cleft palate on the paternal side. Head circumferences measurements were taken on the patient’s +three sisters and were all well within the normal range. \ No newline at end of file diff --git a/docs/cases/PMID_24073597.txt b/docs/cases/PMID_24073597.txt new file mode 100644 index 0000000..91730b0 --- /dev/null +++ b/docs/cases/PMID_24073597.txt @@ -0,0 +1,21 @@ +[source] +pmid = PMID:24073597 +title = X-linked Megalocornea Associated with the Novel CHRDL1 Gene Mutation p.(Pro56Leu*8) +[diagnosis] +disease_id = OMIM:309300 +disease_label = Megalocornea 1, X-linked +[text] +An eleven-year-old boy (Figure 1, III-1) with a history of impaired vision since age 4 was referred to one of the +authors (S.J.I.) for evaluation. Corrected distance visual acuity (CDVA) was 20/25 OU and both corneas were clear but +enlarged with horizontal corneal diameters measuring 15.0 mm OD and 14.5 mm OS (Figure 2A–C). +The intraocular pressures were within normal limits and optic nerve cupping was not observed in either eye. +At age 15, he was referred to another of the authors (A.J.A.) for examination and DNA collection. +CDVA measured 20/25 OD and 20/30 OS and slit lamp examination revealed bilaterally enlarged cornea diameters of 14.0 mm OU +without abnormalities of clarity or contour. The anterior chambers were of increased depth, measuring 6.34 mm OD and +6.14 mm OS and the central corneal pachymetry was decreased at 463 microns OD and 461 microns OS. Corneal topographic +imaging was unremarkable, with average keratometry values of 43.9 D OD and 44.0 D OS (Figure 2D). +Slit lamp photomicrographs of 11-year-old boy with X-linked megalocornea demonstrating (A) enlarged corneal diameter +(B) normal corneal contour and (C) deep anterior chamber. (D) Corneal tomographic imaging of the right eye demonstrates +an average corneal curvature of 43.9 D and 1.4 diopters of with-the-rule astigmatism on the Keratometric map (bottom left). +The Thickness map (bottom right) demonstrates decreased central and peripheral corneal thickness and an estimated +anterior chamber depth of 6.34 mm. diff --git a/docs/cases/PMID_24239060.txt b/docs/cases/PMID_24239060.txt new file mode 100644 index 0000000..d693396 --- /dev/null +++ b/docs/cases/PMID_24239060.txt @@ -0,0 +1,58 @@ +[source] +pmid = PMID:24239060 +title = Novel TPM3 mutation in a family with cap myopathy and review of the literature +[diagnosis] +disease_id = OMIM:609284 +disease_label = Congenital myopathy 4B, autosomal recessive +[text] +The index patient (II.2; Fig. 1B and D) is a 45-year-old +woman, who developed a mild proximal muscle weakness +since early childhood. She never crawled and started to +walk at the age of 2 years. She fell frequently and +performed poorly at school sports. She suffered from mild +progressive scoliosis since the age of 13 years (Fig. 1D). +At the age of 45 years, she presented with a waddling gait +and a mild proximal and distal lower limb weakness, +resulting in problems to run and difficulties to climb the +stairs. She walked unassisted without distance limitation. +She had no myalgia, myoglobinuria, diplopia, dysarthria +or dysphagia. Pulmonal infections or signs of respiratory +insufficiency did not occur. The clinical neurological +examination revealed generalized muscle hypotrophy and +a body mass index (BMI) of 17.2. The index patient +presented a long narrow face, high arched palate, discrete +micrognathia (Fig. 1B), scoliosis and scapula alata +(Fig. 1D). She did not present facial weakness, +ophthalmoparesis, or ptosis. She could not walk on the +heels, while toe walking was normal. The patient did not +present a Gowers’ sign. Muscle strength was +symmetrically decreased in the neck flexors (MRC 4/5), +deltoid (4/5), biceps brachii (4/5), hamstrings (4/5), foot +extensors (4/5) and foot supination and pronation (4/5) +muscles. The index patient did not have foot deformities. +Deep tendon reflexes were weak or absent. Touch and +vibration sense were unremarkable. +The muscle biopsy of the index patient (left quadriceps +femoris muscle; 34 years; performed 11 years prior to her +first presentation at our neurological department) showed +cap-shaped, bluish subsarcolemmal inclusions in 6% of +the fibres on mGT (Fig. 3A), that were slightly +eosinophilic on HE (Fig. 3B). The caps comprised up to +50% of the muscle fibre at transverse sections. Myosin +ATPase reactivity was reduced in the cap areas (Fig. 3C +and D). The cap structures were darkly stained on +NADH-TR (Fig. 3E) and were not detectable on periodic +acid-Schiff (PAS) staining. The myosin ATPase stains +revealed type 1 fibre predominance. Numerous atrophic +fibres and nuclear bags were observed. The endomysial +connective tissue was not increased. Rare myophagic +reactions in muscle fibres were present, while +inflammatory infiltrates were absent. +In the index +patient, MRI revealed symmetrical fatty infiltration in +paraspinal muscles (Fig. 2C), gluteus maximus and +minimus (Fig. 2E), semimembranosus and biceps femoris +muscles (Fig. 2G), and less pronounced in soleus and +tibial anterior muscles (Fig. 2I). . +Serum CK levels were examined in patients II.2 and III.1 +and were normal. \ No newline at end of file diff --git a/docs/cases/PMID_24403049.txt b/docs/cases/PMID_24403049.txt new file mode 100644 index 0000000..b4788cd --- /dev/null +++ b/docs/cases/PMID_24403049.txt @@ -0,0 +1,27 @@ +[source] +pmid = PMID:24403049 +title = Congenital disorder of fucosylation type 2c (LADII) presenting with short stature and developmental delay with minimal adhesion defect +[diagnosis] +disease_id = OMIM:266265 +disease_label = Congenital disorder of glycosylation, type IIc +[text] +Our patients are two brothers, now 21 (Proband 1) and 19 (Proband 2) years of age, born to non-consanguineous +parents of British heritage with unremarkable family history. The pregnancies and births were uncomplicated. +Proband 1 had a birth weight of 2.5 kg (<2nd %) and length of 49.5 cm (60th %), and Proband 2 had a birth +weight of 3.0 kg (25th %) and length of 51 cm (70th %). Their 13-year-old sister has had normal growth and development. +The brothers have global developmental delay; however, expressive language and cognition are the more significant +challenges. Proband 1 currently has an ∼150 word vocabulary, speaking in three word phrases with echolalia; +he has anxiety and is on the autism/pervasive developmental disorder spectrum. Proband 2 has less global delays, +milder autistic features and obsessive–compulsive disorder. +Their past medical history is significant for multiple episodes of otitis media as infants which responded to oral +antimicrobial therapy. Neither had placement of tympanostomy drainage tubes, but Proband 2 had an adenoidectomy +secondary to episodic sinus infections. Proband 1 had a hospitalization at age 12 weeks for bronchiolitis and +at age 10 months for a febrile seizure, but otherwise neither brother had any serious infections. +Comprehensive endocrine and metabolic evaluation revealed normal serum IGF-I and IGFBP-3 levels, +plasma amino acids, urine amino acids and organic acids, urine sialic acid, mucopolysaccharides and urine +oligosaccharides. Chromosomal microarrays showed no copy number variants or areas with loss of heterozygosity. +Notably, white blood cell counts and absolute neutrophil counts were within the normal range on two occasions +(Supplementary Material, Table S1) and both brothers had the O+ blood type. +Phenotypically, both brothers have short stature with heights of −2.8 and −3.3 standard deviations, +coarse facial features with a bulbous nose, widow's peak, small hands and feet with brachydactyly and +persistent fetal finger pads (Fig. 1). \ No newline at end of file diff --git a/docs/cases/PMID_24800029.txt b/docs/cases/PMID_24800029.txt new file mode 100644 index 0000000..f02f515 --- /dev/null +++ b/docs/cases/PMID_24800029.txt @@ -0,0 +1,20 @@ +[source] +pmid = PMID:24800029 +title = A Novel Missense Mutation in BRAF Caused Cardio-Facio-Cutaneous Syndrome +[diagnosis] +disease_id = OMIM:115150 +disease_label = Cardiofaciocutaneous syndrome +[text] +We present here a 10-year-old boy who was referred to the department of Medical Genetics for dysmorphological evaluation +because of severe developmental delay, short stature and dysmorphic features. He was the third child of healthy, non-consanguineous Turkish parents. +His parents and two siblings were healthy. He was born at term after an uneventful pregnancy. His birth weight was 3000 g (10-25th centile), +height 50 cm (50th centile). His developmental milestones were globally delayed. + +At the age of 10, his height was 87.5 cm (<3rd centile), his weight 15300 g (10-25 centile) and head circumference 49,5 cm (<3rd centile). +Physical examination revealed coarse facial appearance, low-set ears, sparse eyebrows, bilateral ptosis, down-slanted palpebral fissures, +epicanthal folds, bulbous nose, prominent philtrum, high-arched palate, thick lower lip, pectus excavatum, clinodactyly of fifth fingers (Fig. 1a). +His hair was curly. Two cafe-au-lait spots were also noted. A hypertrophic cardiomyopathy was detected by echocardiography. +On neurological examination, he had severe mental retardation (IQ below 50) with poor social interaction at the age of 10. +Myopia was detected on ophthalmical examination. Fundus examination and visual evoked potentials were normal. Laboratory tests were normal. +Magnetic resonance imaging showed cortical atrophy of the brain. Abdominal ultrasonography, X-ray of vertebral column and extremities were normal. +A hearing test was normal. His karyotype was 46 XY. \ No newline at end of file diff --git a/docs/cases/PMID_27180139.txt b/docs/cases/PMID_27180139.txt new file mode 100644 index 0000000..df19375 --- /dev/null +++ b/docs/cases/PMID_27180139.txt @@ -0,0 +1,21 @@ +[source] +pmid = PMID:27180139 +title = A novel nonsense GPSM2 mutation in a Yemeni family underlying Chudley-McCullough syndrome +[diagnosis] +disease_id = OMIM:604213 +disease_label = Chudley-McCullough syndrome +[text] +Case 1: The proband (IV.1, Fig. 1) was a 12-year old boy born to consanguineous parents of Yemeni origin. +He was born at term via spontaneous vaginal delivery. At 8-months of age, his parents noted hearing deficit, +which was clinically diagnosed as bilateral severe sensorineural hearing loss. A cochlear implant (CI) was placed in the +right ear at 4 years of age. He was asthmatic, and parents reported an acute exacerbation of asthma once every three months, +requiring salbutamol nebulization. At 3-years of age, he had an episode of bronchopneumonia along with an acute exacerbation +of asthma. +Upon examination, he was found to be an alert and active boy with a thin build. Height and weight measurements were both +around the 3rd centile. He had a triangular face with deep seated eyes, sparse eyebrows and prominent and posteriorly angulated ears + (Fig. 2A). Syndactyly was noted between the 2nd and 3rd toes bilaterally, and the elbow and knee joints were found to be + hyperextensible. There were no other clinically abnormal findings, apart from hyperpigmented skin lesions at the suprapubic + region and the presence of dry scaly palms. Speech delay was moderate. He was able to speak in sentences, but with poor + articulation. There was also cognitive delay, noted by the inability to tell the time in minutes, or to follow complex commands. + Brain CT scan revealed a posterior third ventricular cystic lesion, suggestive of an arachnoid cyst, along with + partial agenesis of the corpus callosum. \ No newline at end of file diff --git a/docs/cases/PMID_27330822.txt b/docs/cases/PMID_27330822.txt new file mode 100644 index 0000000..783e01e --- /dev/null +++ b/docs/cases/PMID_27330822.txt @@ -0,0 +1,12 @@ +[source] +pmid = PMID:27330822 +title = A novel deleterious mutation in the COMP gene that causes pseudoachondroplasia +[diagnosis] +disease_id = OMIM:177170 +disease_label = Pseudoachondroplasia +[text] +The proband (II-1) was 3 years old and 77 cm tall. He had strikingly short limbs (upper limb length 42 cm and lower limb length 33 cm), small hands, short fingers and a waddling gait. +A lateral spine radiograph (Figure 2a) showed anterior beaking of the vertebrae and platyspondyly. +The pelvis radiograph (Figure 2c) showed small femoral heads, irregular acetabulae, enlarged acetabular angles and a widened symphysis pubis. +Radiographs further indicated epiphyseal and metaphyseal changes in the joints of the long and short tubular bones including the femur, tibia, fibula, ulna and radius (Figure 2b,d). +(a) Radiograph showing anterior beaking of the vertebral bodies. (b) Radiograph of knees. (c) Radiograph showing small femoral heads, flared metaphyseal borders and widened symphysis pubis. \ No newline at end of file diff --git a/docs/cases/PMID_28148925.txt b/docs/cases/PMID_28148925.txt new file mode 100644 index 0000000..877dbc1 --- /dev/null +++ b/docs/cases/PMID_28148925.txt @@ -0,0 +1,22 @@ +[source] +pmid = PMID:28148925 +title = A novel mutation in the proteolytic domain of LONP1 causes atypical CODAS syndrome +[diagnosis] +disease_id = OMIM:600373 +disease_label = CODAS syndrome +[text] +The proband is a 12-year-old male, born to healthy, non-consanguineous parents. He has one healthy brother. He was born by cesarean section due to placenta previa at 36 weeks of gestation. +No asphyxia was recorded. His birth weight, length and head circumference were 2324bg (−0.6 s.d.), 42.6 cm (−1.5 s.d.) and 32.5 cm (+0.3 s.d.), respectively. +Imperforate anus with rectovesical fistula and bilateral congenital cataracts were diagnosed at birth and were operated twice on at 1 day and 3 months, respectively. + +He was referred to our hospital because of developmental delay at 10 months. Physical examination revealed short stature, hypotonia and spasticity of lower extremities. +No facial dimorphism, including microcornea, auricular or teeth deformities, was seen. At 1 year 6 months, he could crawl but could not sit alone nor speak coherent words. +At 2 years, he regressed and could not crawl. At 2 years 10 months, he presented with brief tonic seizures, which were controlled with valproate. Electric encephalogram +showed rare spikes. At 8 years, a gastrostomy was placed for progressive swallowing difficulties. At 9 years, he presented with intermittent choreoathetotic movement. +MRI performed at 10 months and 5 years showed progressive atrophy of the cerebellar cortex and caudate, with hyperintensity of the cerebellar cortex on T2-weighted images (Figures 1a–d). +He had normal serum creatine kinase, amino acid, lactate, pyruvate, tandem mass spectroscopy and karyotype. Nerve conduction time and brainstem auditory evoked potentials were also normal. +Skeletal radiography showed epiphyseal dysplasia on both knees (Figure 1e). +Brain MRI of the case. (a, b) Hyperintensity of the cerebellar cortex on T2-weighted images was visible at 10 months. (c,d) +Progressive atrophy of cerebellar cortex and caudate and hyperintensity of the cerebellar cortex on T2-weighted images was +seen at 5 years. (e) Skeletal radiography of the patient’s knees at 12 years. Epiphyseal dysplasia in both femoral metaphysis was seen. + diff --git a/docs/cases/PMID_28327087.txt b/docs/cases/PMID_28327087.txt new file mode 100644 index 0000000..da28ee9 --- /dev/null +++ b/docs/cases/PMID_28327087.txt @@ -0,0 +1,27 @@ +[source] +pmid = PMID:28327087 +title = NT5C2 novel splicing variant expands the phenotypic spectrum of Spastic Paraplegia (SPG45): case report of a new member of thin corpus callosum SPG-Subgroup +[diagnosis] +disease_id = OMIM:613162 +disease_label = Spastic paraplegia 45, autosomal recessive +[text] +Patient II.1 is the oldest brother (9 years old). Although he is similarly affected, he was originally misdiagnosed for +cerebral palsy because of prematurity and early lower limb spasticity. Postnatally, he was admitted to the NICU because +of respiratory distress; however, no mechanical ventilation was required. By the age of 4 months, his lower limbs +were markedly spastic with scissoring. As a 2-year-old, his speech and motor developmental delay were notable. +He could not sit unsupported for long periods, but could take a few steps while holding onto objects with evident +lower limbs spasticity and marked truncal hypotonia. He started to speak when he was 3 years old. On examination, +he was alert and cooperative despite delay in active speech. His gait, performed with difficulty for few steps, +demonstrated tiptoe walking with limited knee and hip extension and trunk flexion. +At 2 and 3 years old, he was admitted to an inpatient pediatric rehabilitation and training program for 4 months each, +which aimed to support motor and speech development. The response was good, as gross motor functions, including sitting, +crawling and kneeling, standing, and walking for a short distance without support or orthopedic aid, became possible. +He showed a more secure and significantly improved gait, and was able to pick up objects from the ground and walk up to +600 meters without supportive aids. His Gross Motor Function Measure (GMFM) chart, at the age of 3 years showed continued +improvements with the percentage of sitting 100%, standing 74% and walking 56%. However, as a 7-year-old, he underwent +tenotomies for his spastic hips and ankles. +Follow up at 9 years showed him to have an unsupported gait with primary forefoot contact, knee in flexion and lumber lordosis. +Features of truncal hypotonia, markedly limited ankle dorsiflexion and ankle clonus were notable. +His speech showed mild dysarthria. He has learning difficulties and is attending a mainstream school with extra support. +Multiple and variable-sized areas of brownish skin discoloration were present at different places on his body (Fig. 1.1). +Brain Magnetic Resonance Imaging (MRI) showed dysgenic/TCC and white matter cystic changes (Fig. 1.2). \ No newline at end of file diff --git a/docs/cases/PMID_28446873.txt b/docs/cases/PMID_28446873.txt new file mode 100644 index 0000000..4b933ac --- /dev/null +++ b/docs/cases/PMID_28446873.txt @@ -0,0 +1,28 @@ +[source] +pmid = PMID:28446873 +title = Novel VPS13A Gene Mutations Identified in Patients Diagnosed with Chorea-acanthocytosis (ChAc): Case Presentation and Literature Review +[diagnosis] +disease_id = OMIM:200150 +disease_label = Choreoacanthocytosis +[text] +Case 1 +A 37-year-old man, a warehouse keeper, presented with perioral chorea, dysphagia, dysarthria, vocalization, and involuntary upper limb movements for 5 months. +His symptoms had been gradually progressing, aggravated recently by involuntary self-mutilation behaviors: tongue and lip biting. +The past history revealed that he was diagnosed with generalized tonic–clonic seizure (GTCS) at age 30, but maintaining continuous remission +with regular sodium valproate administration. On neurological examination, the patient showed perioral chorea, reduced muscle tone and tendon reflex and sporadic mouth ulcers, +especially accompany frequent suck-mimicking activity. Upon admission screening stage, the laboratory biomedical tests revealed a considerable elevation in serum creatine kinase (CK), + l-lactate dehydrogenase (LDH) and alpha hydroxybutyrate dehydrogenase (HBDH), especially for CK reaching up to seven-fold (see Table 1). + The subsequent brain magnetic resonance imaging (MRI) scanning indicated moderate anterior horn dilation of lateral ventricles and mild caudate nucleus head atrophy + (see Figure 1A-left column). + Then four repeated and independent blood smears were performed, revealing that acanthocytes ratio averaged to 18% of the complete blood count (CBC). +[text] +Case 2 +A 45-year-old housewife gradually developed involuntary bruxism (teeth grinding), dysphagia, dysarthria, vocalization, and frequent self-mutilation behaviors (tongue and lip biting) +after a recovery from a severe mouth ulcer 1 month ago. Her orofacial chorea was characterized by clumsy, non-coordinated mandibular movement and occasional grimacing activities. +A further family history inquiry revealed no similar symptom presenters. On neurological examination, she showed frequent teeth clenching, reduced limb muscle tone and tendon reflex and +multiple lip ulcers. To prevent the risk of self-mutilation, she had to continuously hold a roll of cloth in her mouth. The serum CK, LDH, and HBDH levels are all within normal ranges +(see Table 1). On the basis of clinical features and serum biomchemical indicators, the patient was temporarily diagnosed with oromandibular dystonia. +But a routine blood smear test accidentally detected acanthocytes. +Subsequently, three repeated and independent peripheral blood smears conformably detected acanthocytes, with acanthocytes ratio averaged to 17% of CBC (see Figure 1B-right column). +Besides, brain MRI scanning demonstrated mild atrophy in the caudate head and putamen bilaterally, accompanying moderate anterior horn dilation of lateral ventricles +(see Figure 1A-right column). diff --git a/docs/cases/PMID_28687524.txt b/docs/cases/PMID_28687524.txt new file mode 100644 index 0000000..34b1777 --- /dev/null +++ b/docs/cases/PMID_28687524.txt @@ -0,0 +1,66 @@ +[source] +pmid = PMID:28687524 +title = Pierpont syndrome associated with the p.Tyr446Cys missense mutation in TBL1XR1 +[diagnosis] +disease_id = OMIM:602342 +disease_label = Pierpont syndrome +[text] +Both parents were healthy and of Caucasian ethnicity without +known consanguinity. A maternal uncle was diagnosed incidentally +with an Arnold-Chiari malformation, but additional medical +records were not available. The pregnancy with the proband was +complicated by hypertension and hyperemesis, but no maternal +exposures were reported. An ultrasound scan at 34 weeks of +gestation showed reduced fetal movements without any detected +structural abnormalities, and an ultrasound scan at 35 weeks was +reported to be normal. The proband was born to a 28-year old, +G1P0-1 mother by spontaneous vaginal delivery at 40 weeks and 6 +days of gestation. His weight was 3286 g (10e25th centile) and +length was 50.8 cm (25-50th centile). Apgar scores were 3, 4, and +8 at 1, 5 and 10 min respectively. He remained in the neonatal +intensive care unit (NICU) for 25 days after birth because of +respiratory distress and jaundice and was evaluated for sepsis during +his stay. +During the neonatal period, he was noted to have dysmorphic +features and global developmental delays. A submucous cleft palate +was identified at three years of age, but no surgery was performed +and he suffered episodes of food in his Eustachian tubes. +His general health was complicated by frequent ear infections that were +treated by myringotomy at five years of age and he had a perforated +right tympanic membrane. However, his last audiogram at five +years of age showed normal hearing. He has had chronic constipation and had one admission for fecal impaction. He underwent +surgery for strabismus and had orchidopexy for bilateral cryptorchidism at five years of age. He has been treated for talipes with +braces. When last seen at seven years of age, he had oral aversion, +and his diet was limited to avocado, rice cereal and flaxseed oil. He +was able to crawl and walk independently. He was able to babble +and vocalize but did not utter words with meaning; he would tug +on his parents’ clothing and use a picture board to communicate his +needs. +On examination at seven years of age, height was 111.8 cm +(0.21st centile; Z score 2.86) and weight was 18.5 kg (0.46th +centile; Z score 2.6). Head circumference was 49.5 cm at five years +of age (19th centile). He had a frontal upsweep with a high anterior +hairline, small eyes with slightly upslanted and narrow palpebral +fissures and relatively large ears. The nasal tip was bulbous and he +had a short columella and a large mouth with a thin vermilion and a +small chin. The left side of his chest was prominent and he had +thoracolumbar scoliosis. The elbows could not fully extend and he +wore orthoses for bilateral talipes. He had camptodactyly of the +second to fifth fingers and short second and fifth toes and his +second toes overlapped his third toes bilaterally. His fingers were +doughy and his hands and feet showed fleshy palmar and plantar +skin with deep creases. There was lateral foot dimpling at the fifth +metatarsophalangeal joints. His hands and feet were reddened, and +he had small nails. He was hypotonic and the reflexes were hard to +elicit. +A magnetic resonance imaging (MRI) scan of the brain showed +an Arnold-Chiari malformation type I, with crowding of the foramen magnum. +An abdominal radiograph showed a 3.2 3.4 cm +cystic structure in the left perihilar region that was thought to be a +bronchogenic cyst. Radiographs of the pelvis and spine showed a +large, S-shaped right thoracic scoliosis with an apex at T8 and a +40 curvature, a left thoracolumbar scoliosis with the center at L2 +and a 47 curvature. His chest was described as ‘bell-shaped’ and +his pelvis had large iliac crests and a small inlet. Renal imaging +showed hydronephrosis, multiple bilateral renal cysts and calyceal +diverticula. \ No newline at end of file diff --git a/docs/cases/PMID_28966590.txt b/docs/cases/PMID_28966590.txt new file mode 100644 index 0000000..57d2712 --- /dev/null +++ b/docs/cases/PMID_28966590.txt @@ -0,0 +1,40 @@ +[source] +pmid = PMID:28966590 +title = TUBB2B Mutation in an Adult Patient with Myoclonus-Dystonia +[diagnosis] +disease_id = OMIM:610031 +disease_label = Cortical dysplasia, complex, with other brain malformations 7 +[text] +A 31-year-old, right-handed, Caucasian woman of Northern European ancestry presented to the Neurogenetics Clinic at the +National Institutes of Health (Bethesda, MD, USA) for evaluation of myoclonus-dystonia. Her parents were neurologically healthy; +however, her sister had died at age 30 years of genetically confirmed Friedreich ataxia. The patient herself did not +carry a pathologic FXN expansion. She was born at full-term via an uncomplicated vaginal delivery after an uneventful pregnancy, +weighing 3.35 kg. Her Apgar scores at 1 and 5 minutes were 8 and 9. She had minor motor delays throughout infancy, +such as not crawling until 10 months and a tremor with minimal head tilt by 12 months. At this time, she was diagnosed with mild cerebral palsy. +At 24 months, she began walking and speaking, but required physical therapy for balance problems. + +Cervical dystonia became apparent at age 16 years, presenting with involuntary left head tilt and left torticollis. +Subsequently, she developed intermittent upper body myoclonus, confirmed to be nonepileptic in nature by EEG. +Her movement disorder has been static since that time, and has been treated symptomatically with trihexyphenidyl. +Carbidopa/levodopa had been briefly tried without any symptomatic improvement. +She was taking Ritalin for attention deficit disorder for many years. She graduated from a high school that emphasized +special education and attended 1 year of community college. She has been working full-time as a receptionist. +At age 30 years, she had her first generalized, tonic-clonic seizure. +She was started on 750 mg of levetiracetam 2 times daily for seizure prophylaxis, and remains seizure free. +During the most recent neurological exam (age 31 years), the patient displayed mild cognitive impairment (Montreal Cognitive Assessment Test Score: 22/30). +Her speech was fluent and grammatically correct. Her occipital frontal circumference was 57 cm (approximately 1 standard deviation +above the mean for her gender and height). Her gaze was slightly dysconjugate, though her extraocular movements were otherwise intact. +She had a slight left laterocollis and mild left torticollis with hypertrophic right sternocleidomastoid and trapezius muscles. +Occasional myoclonic jerks were apparent in her neck, trunk, and upper extremities. She had a low amplitude, high frequency postural tremor in her left hand. +Muscle tone and bulk were normal throughout. Reflexes were 2+ and symmetric. Babinski reflex was negative bilaterally. +Musculoskeletal examination demonstrated bilateral genu valgum deformity, left hip dysplasia, and dextroscoliosis with lumbar hyperlordosis. + +Skin biopsy showed no evidence of a storage disorder, and all blood panels were within normal limits (complete blood count, complete metabolic panel, +amino acids, thyroid stimulating hormone, free thyroxine 4, ceruloplasmin, heavy metals, organic acids, and triglycerides). +Brain MRI revealed numerous structural abnormalities, suggestive of a neuronal migrational disorder (Fig.1). +Isolated lissencephaly was noted with asymmetric temporal and parietal pachygyria. Enlarged and dysmorphic lateral ventricles, dysmorphic basal ganglia, +dysmorphic hippocampi, and mild superior vermian cerebellar dysplasia were also present. Her corpus callosum and cerebellar hemispheres appeared structurally normal +MR images illustrate pachygyria in horizontal (a) and coronal (b) sections in the brain of the patient. +a Irregular cortical surface with asymmetrically enlarged gyri is indicated by white arrows; the lateral ventricles are enlarged and dysmorphic +in appearance with dysmorphic basal ganglia (white stars). The hippocampi appear dysmorphic and asymmetrical (white triangles in b), while the +superior cerebellar vermis is mildly dysplastic (white circle in a). \ No newline at end of file diff --git a/docs/cases/PMID_28984260.txt b/docs/cases/PMID_28984260.txt new file mode 100644 index 0000000..27001c3 --- /dev/null +++ b/docs/cases/PMID_28984260.txt @@ -0,0 +1,44 @@ +[source] +pmid = PMID:28984260 +title = Glycogen Storage Disease Type VI With a Novel Mutation in PYGL Gene +[diagnosis] +disease_id = OMIM:232700 +disease_label = Glycogen storage disease VI +[text] +A 2-year-5-month-old, developmentally normal female +child was brought with complaints of progressive +abdominal distension noticed since one year of age. +There was no history of fever, vomiting, loose stools or +constipation. Jaundice or bleeding manifestations were +absent. Poor weight- and height-gain were noticed since +infancy. There were no seizures, altered sensorium, early +morning lethargy or earlier hospital admissions. The +child was the first-born of second-degree consanguineous +parents. There was no similar illness in the family. She +had a cherubic facies. There was no pallor, icterus or +clubbing. The height (74 cm) and weight (8.45 kg) were +less for the age (weight-for-age z-score was -3.4; heightfor-age z-score was -4.7). +A firm hepatomegaly was +palpable 12 cm below the costal margin. The spleen was +not palpable. +The haematological workup, serum electrolytes, +bilirubin, creatinine, International Normalized Ratio, uric +acid, and Creatinine phospho kinase (and its MB +component) were within normal range. The child had +serum aspartate transaminase of 445 IU/L, serum alanine +aminotransferase of 484 IU/L, serum alkaline +phosphatase of 813 IU/L, serum albumin of 4.2 g/dL, +serum total protein of 7 g/dL. Serum triglycerides were +854 mg/dL and serum cholesterol was 249 mg/dL. +Fasting blood glucose was 60 mg/dL and serum +bicarbonate was 23 meq/L. Ultrasound showed +hepatomegaly without any adenoma or nodularity and +normal-sized kidneys. Liver biopsy showed mildly +distorted architecture. Hepatocytes were swollen with +rarefaction of cytoplasm, prominent cell membrane and +centrally placed nucleus. Portal tracts showed mild to +moderate inflammatory infiltrate composed predominantly of lymphocytes and few neutrophils. There was +fibrous expansion of portal tracts with porto-portal +bridging and occasional incomplete nodule. PeriodicAcid-Schiff staining positivity with diastase-sensitivity +was present. Esophago-gastroduodenoscopy did not +show varices. \ No newline at end of file diff --git a/docs/cases/PMID_29037160.txt b/docs/cases/PMID_29037160.txt new file mode 100644 index 0000000..28941d2 --- /dev/null +++ b/docs/cases/PMID_29037160.txt @@ -0,0 +1,12 @@ +[source] +pmid = PMID:29037160 +title = Homozygous, and compound heterozygous mutation in 3 Turkish family with Jervell and Lange-Nielsen syndrome: case reports +[diagnosis] +disease_id = OMIM:220400 +disease_label = Jervell and Lange-Nielsen syndrome +[text] +Case 3 (family III) +A 5 year old male child (Fig. 2c; IV-5) was examined due to pre-diagnosis of long QT syndrome. He was a second child of a first-degree consanguineous marriage. +He displayed symptoms of tachypnea and postnatal bradycardia and was transferred to another hospital on the second day of his birth. +In the physical examination, bilateral hearing loss was determined. His resting 12 lead ECG exhibited a prolongation in +QTc distance of 520 ms (Fig. 2d). The ECG of both parents demonstrated normal ECG readings at rest. No syncope was detected on his follow-up period. \ No newline at end of file diff --git a/docs/cases/PMID_29050284.txt b/docs/cases/PMID_29050284.txt new file mode 100644 index 0000000..af91eb6 --- /dev/null +++ b/docs/cases/PMID_29050284.txt @@ -0,0 +1,9 @@ +[source] +pmid = PMID:29050284 +title = Mutational analysis of a Chinese family with oculocutaneous albinism type 2 +[diagnosis] +disease_id = OMIM:203200 +disease_label = Albinism, oculocutaneous, type II +[text] +Both the patients have yellow eyebrows and hair, milky skin, and heterochromia iridis, accompanied with photophobia, +impaired visual acuity, and nystagmus. On the other hand, unaffected family members present normal pigmentation. \ No newline at end of file diff --git a/docs/cases/PMID_29174093.txt b/docs/cases/PMID_29174093.txt new file mode 100644 index 0000000..7070406 --- /dev/null +++ b/docs/cases/PMID_29174093.txt @@ -0,0 +1,33 @@ +[source] +pmid = PMID:29174093 +title = Novel GNB1 de novo mutation in a patient with neurodevelopmental disorder and cutaneous mastocytosis: Clinical report and literature review +[diagnosis] +disease_id = OMIM:616973 +disease_label = Intellectual developmental disorder, autosomal dominant 42 +[text] +The female proband was born to a nonconsanguineous healthy 40-year-old mother and a healthy 50-year-old father. +No family history of note or exposure to teratogens was reported. The proband has two healthy half-brothers. +She was born by cesarean section at 39 weeks gestation. Apgar scores were 8 and 9 after 1 and 3 min respectively. +Birthweight was 2520 g (5th centile), length 53 cm (95th centile) and occipito-frontal circumference (OFC) 33 cm (15th centile). +No congenital anomalies or dysmorphic features were noted at birth except microretrognathia. +Standard intracranial US revealed slightly increased right ventricle. +Although there were no feeding difficulties or slowing of physical growth within the first year of life, +the achievement of major milestones was severely delayed when assessed for both gross and fine motor, speech, and +social skills development (Table 1). Early neurological assessment revealed muscular hypotonia and extrapyramidal +symptoms (upper-limb choreoathetosis). +Features of cutaneous mastocytosis have been evident in the proband since the end of the first year of life (Fig. 1). +The diagnosis of urticaria pigmentosa form was confirmed by skin biopsy. +Currently, at 4 years, the proband's weight is 14.8 kg (25th-50th centile), height 105 cm (50th-75th centile) and +OFC 48.5 cm (10th-25th centile). She is globally developmentally delayed, although no formal psychological +assessment has been performed yet. She understands simple commands and can speak a few words which seems to +be her biggest challenge. Eye contact is weak. The gait is unstable and wide-based and when walking she +tends to lean forward as if her movements were deconstructed. Generalized hypotonia requires her to prop up when standing up. +The upper and lower limb reflexes are normal. The hand stereotypies (frequent hand-to-mouth movements) +that add to an already existent extrapyramidal upper-limb activity are present. She also has bruxism, +hypermobile tongue and apparently is unable to chew solid foods. The proband has bilateral severe vesicoureteral +reflux that has already required unilateral nephrectomy. Subclinical hypothyroidism has been diagnosed as well. +No significant behavioral abnormalities have been recorded in the proband. Discrete dysmorphic features such as +prominent eyebrows and eyelashes, bilateral fifth finger clinodactyly (present in the relatives on the maternal side) and +unilateral partial skin syndactyly of second and third toes are present. + + In EEG generalized bursts of sharp and slow wave complexes were present but these did not require antiepileptic medication. MRI of the head performed twice was normal as were metabolic studies (TANDEM Mass Spectrometry and Gas Chromatography). \ No newline at end of file diff --git a/docs/cases/PMID_29333303.txt b/docs/cases/PMID_29333303.txt new file mode 100644 index 0000000..415e842 --- /dev/null +++ b/docs/cases/PMID_29333303.txt @@ -0,0 +1,21 @@ +[source] +pmid = PMID:29333303 +title = Schinzel-Giedion Syndrome with Congenital Megacalycosis in a Turkish Patient: Report of SETBP1 Mutation and Literature Review of the Clinical Features +[diagnosis] +disease_id = OMIM:269150 +disease_label = Schinzel-Giedion midface retraction syndrome +[text] +The proposita was born at 39 1/7 weeks of gestation by spontaneous vaginal delivery after an uneventful pregnancy. +The infant was an appropriate size for her gestational age, with a birth weight of 3,020 g. +The parents were nonconsanguineous. Antenatal ultrasonography revealed bilateral pelvic dilatation and polyhydramnios. +At birth, the patient had coarse facial features with midface retraction, frontal bossing, bitemporal narrowing, wide anterior fontanel, +hypertrichosis over the forehead, low nasal bridge, ocular hypertelorism, low set ears, abdominal distention, and bilateral talipes equinovarus (Figure 1). +Radiological examination showed bowed long bones and broad ribs (Figure 2). Echocardiogram revealed patent ductus arteriosus and patent foramen ovale. +Abdominal ultrasound showed severe hydronephrosis on the right, moderate hydronephrosis on the left, and diastasis recti. +Optic fundus examination and auditory brainstem response testing were normal. Cerebral magnetic resonance imaging (MRI) +showed moderate dilatation of the third and lateral ventricles, 2-3 mm choroidal cysts with grossly normal cerebral structures. +Bilateral megacalycosis with nonobstructive dilatation was seen on abdominal MRI (Figure 3). Screening tests for inborn metabolism +errors were negative. Complete blood count and renal function tests were normal. On follow-up examination at 8 months of age, +the patient had severe growth retardation, developmental delays, feeding problems, and seizures, which were partially controlled with +antiepileptic drugs. She had severe visual impairment with absence of fixation and no reaction to bright light. +An auditory evoked response test was repeated and showed severe deafness. She died at 11 months of age from respiratory failure. \ No newline at end of file diff --git a/docs/cases/PMID_29382611.txt b/docs/cases/PMID_29382611.txt new file mode 100644 index 0000000..e060fb7 --- /dev/null +++ b/docs/cases/PMID_29382611.txt @@ -0,0 +1,46 @@ +[source] +pmid = PMID:29382611 +title = Novel variant in Sp7/Osx associated with recessive osteogenesis imperfecta with bone fragility and hearing impairment +[diagnosis] +disease_id = OMIM:613849 +disease_label = Osteogenesis imperfecta, type XII +[text] +The proband (II.5) was the 4th of eight children born from an uncomplicated pregnancy to healthy +consanguineous parents of Iraqi descent (Fig. 1, Fig. 2). There were no perinatal issues and psychomotor +development progressed normally. Between 5 and 10 years of age, his family noticed he had insidious +and progressive hearing difficulties. He was later diagnosed with hearing impairment and required hearing aids. The individual immigrated to Australia with his family at the age of 12 years and serial hearing assessments revealed profound sensorineural hearing loss with normal middle ear function. By the time he was referred to our service he was 14 years of age and his hearing had further deteriorated requiring maximal amplification and he was awaiting cochlear implants. Risk factors for hearing loss, such as prolonged hyperbilirubinemia, ototoxic medications, recurrent acute otitis media, skull fracture or noise exposure, were excluded. +From a bone health perspective, he had a significant history of low trauma fractures starting at 13 years of +age. These included 2 separate forearm fractures from being hit by a soccer ball, a distal radial metaphyseal +fracture, and 2 separate femur fractures requiring surgical correction, the last of which was further +complicated by a transverse fracture at the level of the orthopaedic hardware. Furthermore, while recovering +from his lower limb fractures, he sustained an olecranon stress fracture after using crutches as a mobility +aid and a pelvic avulsion fracture with unknown mechanism of injury. + +Physical examination revealed short stature (142.6 cm; 0.1th percentile, SDS-3.01) for his +midparental height on the 28th centile. Weight (43.2 kg; 7th percentile, SDS -1.41), +head circumference (54.5 cm; 49th percentile, SDS 0.0) and body mass index (BMI) were +normal (21.3 kg/m2; 70th percentile, SDS 0.53). +Facial features included white sclerae, mild facial asymmetry, high prominent forehead, +prominent supraorbital ridges, midface hypoplasia, prominent ears, depressed nasal bridge, +microstomia and high-arched palate (Fig. 2). There was a history of delayed tooth eruption, +but no evidence of dentinogenesis imperfecta. Whilst limbs were symmetrical and proportional, +knee joint hyperlaxity and valgus deformities were noted bilaterally. Spinal exam revealed a mild scoliosis +with thoracic spinal tenderness. +At 14 years and 8 months, he had Tanner stage 2–3 pubic hair with testes measuring 12–15 mL bilaterally. +CT scan images revealed significant bilateral otospongiosis (osteosclerosis) and poor mineralization of +the ossicles and petrous temporal bone (Fig. 3). Magnetic resonance imaging of the brain and internal +auditory meatus were normal without evidence of auditory nerve or inner ear anomalies. +Spinal radiography revealed thoracic platyspondyly and reduced vertebral body height at all +levels with pronounced vertebral crush fractures (VFs) at the thoraco-lumbar junction (Fig. 4). +A skeletal survey showed generalized osteopenia and a striking under-tubulation of long bones, +metatarsals and metacarpals with associated thickening of cortices (Fig. 5). +No bowing deformities were noted. Non-traumatic anterior subluxation at the C2–C3 cervical spine +was also noted on imaging. +Bone densitometry indicated diffuse low bone mineral density (Table 1). pQCT showed strikingly reduced cortical volumetric +bone mineral density (vBMD) and elevated cortical cross-sectional area. +A transiliac bone biopsy (Fig. 6) revealed very high cortical porosity, with long canals that traversed the cortex parallel to the periosteal surface. Cortical width was 60% of the mean for age. Cancellous bone volume was in the lower part of the reference range and hyperosteocytosis was also noted. Surface based parameters of bone formation and bone resorption were very high. Inferred bone formation rate was +9 standard deviations (SD) above the normal mean for age. Osteoclast parameters were similarly elevated. +There was no mineralization defect (Table 2). Overall, the qualitatively elevated cortical porosity +and very high trabecular bone turnover (Table 1) was reminiscent of hyperphosphatasia; +this was not in keeping with his preliminary blood results. Vitamin D insufficiency +(37 nmol/L; range 50–200 nmol/L) was corrected with supplementation and treatment with intravenous +Zoledronate (0.025 mg/kg 3 monthly) was initiated. diff --git a/docs/cases/PMID_29482508.txt b/docs/cases/PMID_29482508.txt new file mode 100644 index 0000000..43c88d5 --- /dev/null +++ b/docs/cases/PMID_29482508.txt @@ -0,0 +1,21 @@ +[source] +pmid = PMID:29482508 +title = Difficult diagnosis and genetic analysis of fibrodysplasia ossificans progressiva: a case report +[diagnosis] +disease_id = OMIM:135100 +disease_label = Fibrodysplasia ossificans progressiva +[text] +A sixteen-year-old male patient was brought to our emergency room with the complaints of pain and swelling in his upper back, in which a biopsy had been performed two months before. At the age of 9, the patient developed tender stiffness of his shoulders and neck. Over the next 4 years, he experienced multiple similar swellings on the upper back; subsequently, the movement of the shoulders and neck was limited, and masses grew progressively. The patient went to the specialists at some local hospitals for examination and treatment, and they managed the patient without making a confirmative diagnosis. Two months before, one of these doctors arranged a biopsy for the patient, but the results of the pathological examination only revealed that the mass was heterotopic ossification, the cause of which was unclear. + +The physical examination presented serious stiffness with a tiny range of motion in the patient’s neck and shoulders; +multiple bony masses with irregular sizes on the neck, back and buttocks; bilateral halluces characterized by hallux valgus +deformity with macrodactyly, which was more serious on the left side; and fused interphalangeal joints of both halluces. +The biopsy site was marked tenderness and swelling. The imaging examinations showed widespread heterotopic ossification +in the cervical spine, shoulder girdles and thorax (Fig. 1). As indicated by the radiograph of the cervical spine, +the bony bridge formation was visible in the nuchal ligament, which may have predominantly contributed to the neck ankylosis (Fig. 2). +The computerized tomography (CT) scan found several initial heterotopic ossification lesions in the pectoralis major and +serratus anterior (Fig. 3). Dorso-plantar radiograph indicated that the bilateral feet developed hallux valgus and +fusion of the halluces’ interphalangeal joint (Fig. 4). As indicated by the laboratory blood tests, +alkaline phosphatase was 276 (45–125) U/L, while serum calcium, phosphorus, hemoglobin, erythrocyte sedimentation rate, +C-reactive protein, liver enzymes, urea, creatinine and parathyroid hormone were all within normal limits. +From the other hospital, the biopsy section revealed the features of inflammatory fibroproliferative and osteogenic neoplasm. \ No newline at end of file diff --git a/docs/cases/PMID_29483676.txt b/docs/cases/PMID_29483676.txt new file mode 100644 index 0000000..109d3da --- /dev/null +++ b/docs/cases/PMID_29483676.txt @@ -0,0 +1,33 @@ +[source] +pmid = PMID:29483676 +title = The second point mutation in PREPL: a case report and literature review +[diagnosis] +disease_id = OMIM:616224 +disease_label = Myasthenic syndrome, congenital, 22 +[text] +The proband is a 10-year-old female born to healthy parents as an only child (Fig. 1). +Her nonconsanguineous parents originated from the same small part of Chiloé Island off the coast of southern Chile. +She was born after an uneventful pregnancy at 38 weeks of gestation with Apgar scores of 9 and 10 at 1 and 5 min, respectively. +At birth, her weight, length, and occipitofrontal circumference were 2950 g (−0.73 SD), 49 cm (−0.33 SD), and 34 cm (−0.41 SD), +respectively. Dysmorphic features were noted at birth, including dolichocephaly, prominent ears, +long palpebral fissures with palpebral ptosis, and high-arched palate. She presented with neonatal hypotonia and feeding problems +with severe failure to thrive during the first 3 years of life (Fig. 1), requiring nutritional supplements and a nasogastric tube. +Neurological evaluation at 10 months of age revealed global hypotonia, muscle weakness, and nystagmus, which is currently absent. +After the first year of life, hypotonia and muscular weakness showed spontaneous improvement. She showed predominantly motor +developmental delay, walking independently at 27 months of age. After 1 year of age, she spoke single words with difficulty and +a remarkable nasal voice. +Serum creatine kinase was normal in her medical records. Electromyography and nerve conduction velocity were normal +at 3 and 6 years of age. Muscle biopsy had not been performed. Brain magnetic resonance imaging at 6 years was unremarkable +and serum amino-acid profile was normal. At 7 years, her intelligence quotient was 49, requiring special educational support. +At 9 years, serum insulin-like growth factor-1 (IGF-1; 199 ng/ml, normal range: 175–445 ng/ml) and IGF-binding protein-3 +(IGFBP-3; 3188 ng/ml, normal range: 3100–4544 ng/ml) were normal, and bone age was concordant with her chronological age. +Growth hormone and sexual hormones were not measured. Her karyotype is 46,XX. +From the age of 4 years, she developed hyperphagia (Fig. 1). Her current body mass index at 10 years is 27.6 kg/m2 (+2.8 SD) +based on weight (46 kg, +1.9 SD) and height (129 cm, −1.6 SD). She had facial weakness with bilateral palpebral ptosis, +open mouth with tented upper lip, and large front teeth (Fig. 1). Social development is normal. Salivation is normal, +and her nasal voice persists. Her motor exam revealed that the patient has global muscle weakness and it is more +prominent at the proximal muscles (deltoid and psoas muscles), with reduced osteotendinous reflexes and Gower sign. +Her gait is normal and mild scoliosis is recognized, and she is accordingly receiving physiotherapeutic intervention. +There is no history of fatigability or muscle wasting induced by exercise or fluctuation in peripheral weakness. +Facial weakness is occasionally seen and irregularly improves transiently together with mild attenuation of palpebral ptosis +and open mouth. \ No newline at end of file diff --git a/docs/cases/PMID_29742735.txt b/docs/cases/PMID_29742735.txt new file mode 100644 index 0000000..7a64c52 --- /dev/null +++ b/docs/cases/PMID_29742735.txt @@ -0,0 +1,17 @@ +[source] +pmid = PMID:29742735 +title = A case report of heterozygous TINF2 gene mutation associated with pulmonary fibrosis in a patient with dyskeratosis congenita +[diagnosis] +disease_id = OMIM:613990 +disease_label = Dyskeratosis congenita, autosomal dominant 3 +[text] +At the time of admission, the proband was a 32-year-old woman. She had been complaining of a +dry irritating cough for 2 years and progressive breathlessness on exertion for 6 months. +She had no exudative retinopathy, growth retardation, immune deficiency, or cancer. +Physical examination revealed reticulated hypopigmentation of the body, nail dystrophy, and tongue leukoplakia +(Fig.1A–C). Computed tomography of chest showed subpleural, basal predominance of reticular abnormalities +and honeycombing with traction bronchiectasis (Fig.1D). Her pulmonary function test showed severe +restrictive ventilator dysfunction. Forced vital capacity was 32.46% of the predicted value, and the +forced expiratory volume in first second was 36.81% of the predicted value. +A right heel rash biopsy showed obvious pathological hyperkeratosis, focal acantholysis, +squamous epithelial hyperplasia, and epithelial foot extension. diff --git a/docs/cases/PMID_30046498.txt b/docs/cases/PMID_30046498.txt new file mode 100644 index 0000000..24aa1a1 --- /dev/null +++ b/docs/cases/PMID_30046498.txt @@ -0,0 +1,27 @@ +[source] +pmid = PMID:30046498 +title = A Novel c.91dupG JAG1 Gene Mutation Is Associated with Early Onset and Severe Alagille Syndrome +[diagnosis] +disease_id = OMIM:118450 +disease_label = Alagille syndrome 1 +[text] +The proband is a 2-year and 7-month-old Mexican mestizo male (Figure 1(a), individual III.2). +He was referred at 5 months of age due to cholestatic syndrome characterized by jaundice and pale stools, +which began as of the third week of life. He is the only child of a young, apparently healthy, and unrelated couple. +The pregnancy lasted 39 weeks and was complicated by maternal cholelithiasis at the fourth month. +Antibiotics were indicated for repetitive urinary infections as of the fifth month. +Delivery was carried out by cesarean section due to fetal distress. +The newborn’s weight was 2200 g (P<5), height was 48 cm (P<5), and Apgar score was 8/9. + +The cognitive development of the patient is normal. At nine months of age, his weight was 6 kg (P<5), +height was 64 cm (P<5), and head circumference was 44.5 cm (P25-50). He manifested generalized jaundice, +dry skin, and an anterior fontanelle that had not yet closed. He had sparse eyebrows, a broad forehead, +deep-set eyes, a triangular face, prominent ears, a heart murmur, hepatomegaly, and hypotrophic limbs (Figures 1(b) and 1(c)). +His liver function tests were abnormal (Figure 1(d)) and an abdominal ultrasound analysis demonstrated +generalized thickening of the biliary tract. The X-ray analysis showed a butterfly-like image in several dorsal +vertebrae (Figure 1(e)). Right and left pulmonary hypoplasia were diagnosed by echocardiogram analysis. +A magnetic resonance image analysis at the age of 1 year and 2 months displayed +widening of the subarachnoid space and bilateral subarachnoid cysts in the temporal fossa. +The optic nerve in both eyes was normal. At 2 years and 2 months of age, he developed xanthomata +in both elbows and in his knuckles, and at 2 years and 4 months of age, posterior embryotoxon was diagnosed. +A hepatic biopsy detected intracytoplasmic cholestasis and the absence of interlobular conducts. \ No newline at end of file diff --git a/docs/cases/PMID_30050362.txt b/docs/cases/PMID_30050362.txt new file mode 100644 index 0000000..bd45ca8 --- /dev/null +++ b/docs/cases/PMID_30050362.txt @@ -0,0 +1,29 @@ +[source] +pmid = PMID:30050362 +title = Protein-losing enteropathy and joint contractures caused by a novel homozygous ANTXR2 mutation +[diagnosis] +disease_id = OMIM:228600 +disease_label = Hyaline fibromatosis syndrome +[text] +The patient was an Asian 10-month-old male (individual II-3 in Figure 1) who was bom full term with a birth weight of +3.75 kg (66 percentile). His parents were half-first cousins and had 2 healthy daughters (Figure 1). +The proband had mild contractures in major joints at birth but was otherwise noted to be healthy. +At 5 months of age, his joint contractures had progressively worsened and were associated with pain in his wrists, +elbows, shoulders, hips, knees, and ankles. Concurrently, he developed dark brown/black spots on his knuckles, ankles, +back, and neck. Initially, arthrogryposis was suspected, and so he received physical therapy, which resulted in a femur fracture. +At that time, he also developed persistent protein-losing enteropathy with significant weight loss. +He came to the USA for additional medical care at the age of 10 months. According to the family, +there were no other family members who had similar symptoms as the patient. +On presentation, the most striking features were the severe malnutrition (5 kg; <3 percentile) and constant irritability. +On physical examination, significant joint contractures of the wrists, knees, hips, and ankles were noted (Figure 2A and B). +Oral mucosa demonstrated gingival hyperplasia (Figure 2C). There were generalized sclerodermatous changes of the skin, +most prominently in the left lower extremity (Figure 2B ). Skin was significant for pearly, erythematous papules +and indurated plaques located symmetrically on the back (Figure 2C and D). Similar indurated plaques that were more +erythematous than violaceous were also seen on the posterior scalp (Figure 2E). +The perianal area revealed multiple coalescent skin-colored, indurated papules involving the perineum (Figure 2F ). +Due to long-standing malnutrition, the child had multiple electrolyte abnormalities including a nonanion gap acidosis, +hyponatremia, hyperkalemia, and hypoalbuminemia. +Clinical findings of patient and skin biopsy. Notes: Contractures of the wrists and ankles (A and B). +There were generalized sclerodermatous changes of the skin also appreciated in the extremities, +most prominently in the left lower extremity (B). Gingival hyperplasia (C). Skin findings on the back (D), +posterior scalp (E), and perineum perianal area (F). diff --git a/docs/cases/PMID_30364145.txt b/docs/cases/PMID_30364145.txt new file mode 100644 index 0000000..ddb7c92 --- /dev/null +++ b/docs/cases/PMID_30364145.txt @@ -0,0 +1,20 @@ +[source] +pmid = PMID:30364145 +title = First Replication of the Involvement of OTUD6B in Intellectual Disability Syndrome With Seizures and Dysmorphic Features +[diagnosis] +disease_id = OMIM:617452 +disease_label = Intellectual developmental disorder with dysmorphic facies, seizures, and distal limb anomalies +[text] +The proband is a 6-year-old female, second-born of non-consanguineous healthy parents. She was born by cesarean section delivery at 38 weeks of gestation, +after a pregnancy complicated by intrauterine growth restriction (IUGR). Her birth weight was 2,095 g. A Tetralogy of Fallot was diagnosed soon after birth, +requiring cardiac surgery intervention at the age of 6 months. +During the first 2 months, she showed feeding difficulties, associated with gastroesophageal reflux. +Moreover, she also had a neurodevelopmental delay. She sat independently at 11 months, walked at 18 months, and pronounced her first words at 2 years. +Due to the occurrence of palpebral ptosis, a Duane syndrome was suspected. Nevertheless, brain MRI was normal, +occipitofrontal circumference was 47.8 cm (z-score −1.5). +Main dysmorphic facial features included: large ears, long smooth philtrum, thin upper lip, high arched palate, hanging columella, +narrow long face, wide forehead, sunken eyes, and hypotelorism (Figure 1A). +The patient also has finger abnormalities, i.e., broad thumbs and first toes, and fetal pads (Figure 1A). +At 5 years, tonic-clonic seizures occurred, thus valproate treatment was started. +At the latest neurological evaluation, at 6 years of age, she has mild intellectual disability, mild motor difficulty, and episodic behavioral disorders. + diff --git a/docs/cases/PMID_30400883.txt b/docs/cases/PMID_30400883.txt new file mode 100644 index 0000000..b2daaf1 --- /dev/null +++ b/docs/cases/PMID_30400883.txt @@ -0,0 +1,33 @@ +[source] +pmid = PMID:30400883 +title = A novel SLC6A8 mutation associated with intellectual disabilities in a Chinese family exhibiting creatine transporter deficiency: case report +[diagnosis] +disease_id = OMIM:300352 +disease_label = Cerebral creatine deficiency syndrome 1 +[text] + +[text] +The proband was the second boy of healthy nonconsanguineous parents (pedigree in Fig. 1a). He was born at 39 weeks of + gestation from an uneventful pregnancy and delivered by Caesarean section (weight, 3600 g; length, 50 cm; head circumference, 36 cm). + He showed head control at 12 months, ability to sit by himself at 15 months, and walking with aid at 20 months. His verbal + language was nearly absent and he made no visual contact. He suffered from seizures from 6 months old. He had no craniofacial + dysmorphism. Gastrointestinal problems such as chronic constipation or nausea were noted in the proband. + The physical examination on the proband showed 95 cm height, weight 18.2 kg and developmental and language delay. + The proband also had an electroencephalogram (EEG) test, which showed sharp and slow waves in sleep during 24-h EEG monitoring. + A brain stem auditory-evoked potential (BAEP) test showed mild abnormality. The proband had a Children’s Autism Rating Scale + (CARS) score of 33, which indicated mildly autistic characteristics. The Gesell developmental scale test was used to evaluate the proband. + Both the development age (DA) and developmental quotient (DQ) data showed extremely low grades which suggested severe development delay + (adaptability, DA=14.23mo., DQ=23; gross motor, DA=26.37mo., DQ=43; fine movement DA=15.87mo., DQ=26; vocabulary DA=13.07mo., DQ=21; + personal-social skill DA=13.3mo., DQ=22). The test results are depicted in Additional file 1: Figure S1A. + The affected brother of the proband (II:1) was not available for the physical examination. + The parental description of the clinical phenotype of the brother was mostly the same as the proband. + The parents were physically healthy and indicated no significant past medical, surgical or family history. +Biochemical screening was performed with blood and urine samples from the proband and his mother. +The creatine/creatinine (Cr:Crn) ratio was determined by liquid chromatography-mass spectrometry with deuterated internal +standards in two urine samples taken on different days. A urine creatine test of the proband showed significantly +elevated levels of creatine (0.805 mg/ml, normal control 0.160±0.177 mg/ml) (Additional file 1: Figure S1B), +and the creatine/creatinine ratio was significantly elevated compared to controls. +Proton magnetic resonance spectroscopy (MRS, Magnetom Skyra 3.0-T, Siemens Healthcare GmbH, Erlangen, Germany), +examination using a 3.0-T system at the brain left parietal lobe, right parietal lobe and genu of corpus callosum +all showed marked reduction of the brain creatine peak (Fig. 1b left part). Brain MRI showed a thin corpus callosum +in the proband (Fig. 1b right part). The MRS and MRI examination of the mother (I:2) showed normal results (Additional file 1: Figure S1C). \ No newline at end of file diff --git a/docs/cases/PMID_30701076.txt b/docs/cases/PMID_30701076.txt new file mode 100644 index 0000000..bb7dfec --- /dev/null +++ b/docs/cases/PMID_30701076.txt @@ -0,0 +1,19 @@ +[source] +pmid = PMID:30701076 +title = Activation of TGF-β signaling in an aortic aneurysm in a patient with Loeys-Dietz syndrome caused by a novel loss-of-function variant of TGFBR1 +[diagnosis] +disease_id = OMIM:609192 +disease_label = Loeys-Dietz syndrome 1 +[text] +The patient was a Japanese man with his tall stature, thin body habitus (height, 182cm; weight, 43.6 kg), +and scoliosis at the age of 15 years. Echocardiography revealed an enlargement of the sinus of Valsalva +(36 mm; aortic root Z-score4, 5.87), for which he had been followed up at a local hospital. +At the age of 27 years, his aortic root diameter was 41 mm (188 cm; 50 kg; Z-score, 5.17). +He had a positive wrist and thumb sign and presented with pectus excavatum, a hindfoot deformity, +lumbosacral dural ectasia, protrusio acetabuli, kyphoscoliosis, facial features (dolichocephaly, +downslanting palpebral fissures, and malar hypoplasia), skin striae, high myopia, and mitral valve prolapse +(15 points, according to the 2010 revised Ghent nosology5). Furthermore, he had a bifid uvula, hypertelorism, +tortuous cerebral arteries, and cervical spine instability. At the age of 31, his aortic root diameter was 48 mm (Z-score, 8.08), +and his aneurysm was treated using the David valve-sparing root replacement procedure. Extended histological examinations +revealed elastin degradation, cystic medial necrosis, and increased SMAD2 phosphorylation, indicating active TGF-β signaling +in the aortic wall (Fig. 1a, b). \ No newline at end of file diff --git a/docs/cases/PMID_31068971.txt b/docs/cases/PMID_31068971.txt new file mode 100644 index 0000000..1ab78b6 --- /dev/null +++ b/docs/cases/PMID_31068971.txt @@ -0,0 +1,19 @@ +[source] +pmid = PMID:31068971 +title = A Novel Nonsense Mutation in FERMT3 Causes LAD-III in a Pakistani Family +[diagnosis] +disease_id = OMIM:612840 +disease_label = Leukocyte adhesion deficiency, type III +[text] +The index patient is a seven-month-old boy born to first cousins parents, presenting with a prolonged history of +fever and recurrent infections for 4 months. Parents reported intermittent bleeding episodes from the nose, mouth, +and anus that, during patient hospitalization, were unsuccessfully treated with broad-spectrum antibiotics and +packed red cells and platelets transfusion. Examination revealed a failure to thrive in the child, with both height +and body weight below the 3rd percentile. He had severe pallor, bruises all over the body, and there were bilateral +anterior and posterior cervical palpable lymph nodes, which were firm and tender. +The liver was also palpable; it was 9 cm in span, soft and non-tender, while a firm spleen was also palpable 3 cm in +its longitudinal axis. The previous record had shown bicytopenia and leukocytosis, growth of multiple microorganisms +in blood, including Burkholderia cepacia and Staphylococcus aureus, and persistently high inflammatory markers. +Extensive investigations done during this admission confirmed the anemia, thrombocytopenia, and leukocytosis. +Bone marrow aspiration and trephine biopsy showed cellular marrow. Basic primary immunodeficiency workup showed +normal immunoglobulin, while flow cytometry revealed normal CD18 expression. \ No newline at end of file diff --git a/docs/cases/PMID_31213928.txt b/docs/cases/PMID_31213928.txt new file mode 100644 index 0000000..d70dab3 --- /dev/null +++ b/docs/cases/PMID_31213928.txt @@ -0,0 +1,54 @@ +[source] +pmid = PMID:31213928 +title = A novel case report of spinal muscular atrophy with progressive myoclonic epilepsy from Iran +[diagnosis] +disease_id = OMIM: +disease_label = +[text] +A 15-year old female patient was attended to neurology clinic for recent onset tremor, seizure, and +weakness in limbs. She was the first offspring of a family with relative parents; she was born from +normal spontaneous delivery. The psychomotor developmental course was normal. The symptoms initiated +with a resting tremor in both hands since the fifth year of age. When she was seven years old, +new presentations such as staring episodes and myoclonus were added. The latter feature occurred +several times a day lasting for a few seconds. Myoclonus was stimulus-sensitive, sometimes activated by +volitional movement. Five years ago, head drop attacks and multiple episodes of +generalized tonic-clonic seizure (GTCS), were initiated. Also, since the 10th year of age, a +progressive limb weakness was gradually started, especially in attempting for stair-up, standing, +and hand washing. +In physical examination, the patient was cooperative and fully oriented. She had waddling gait pattern +in walking, and her Gower`s sign was positive indicating of proximal weakness. +Muscle forces were evaluated according to the medical research council muscle scale. +Neck extensor and flexor muscles obtained 3/5, and strength of proximal muscles in upper limbs +(shoulder abductors) were 2/5. This pattern was less severe in distal muscles, where elbow and hand +muscles obtained 3/5 and 4/5, respectively. In her lower extremities, the strength was 3/5 for both hip and +knee muscles; and it was again higher in distal muscles of legs (4/5). Also, a mild weakness in +facial muscles was found; while the extra-ocular muscles were spared. +Deep tendon reflexes in Biceps brachii, Triceps brachii, Brachioradialis, and Achilles were 1+ and the +patellar knee jerk was absent. Sensory exam for small and large fibers was not remarkable. +Resting tremor was present in both hands. Patient`s tongue was obviously atrophic with fasciculation movements. +Several staring attacks and myoclonus were observed during the physical examination. +Brain MRI was done, but it did not reveal any pathologic features. Laboratory blood tests including complete +blood count (CBC), creatine phosphokinase (CPK), lactate dehydrogenase (LDH), and ammonia, plus thyroid, +renal, and liver function tests were all within normal ranges. In order to further confirming disease, +the ceramidase-activity level was obtained that revealed about 30% reduction. Moreover, a muscle biopsy of +left Biceps brachii was obtained using an open technique (Figures 1 and and 2); Histo-pathological +examination confirmed a neuropathic pattern with muscle atrophy of mainly type-II fibers, with concomitant +denervation and reinnervation processes. The video EEG monitoring was performed using a standard 10–20 system +with additional electrodes and bipolar settings; no drug was administrated to induce sedation. Both sleep and +awake phases were recorded that has been presented in Figure 3. The patient had a total of frequent epileptic +events during recording, the main features were epileptic poly-myoclonus with generalized 2.5–3 Hz +irregular sharp and slow wave complexes that was accentuated during intermittent photic stimulation (IPS). +H&E stain revealed atrophic fibers of round or angular shapes that arranged in small and large groups with +hypertrophied fibers. Fascicular atrophy was seen. Nuclear clumps were noted. +In needle electromyography (EMG) and nerve conduction study (NCS), three limbs and two +cranial nerves (V, XII) were investigated. The left upper limb was preserved for performing a muscle biopsy. +After ensuring the standard temperature in tested limbs (T=37.0), compound muscle action potential (CMAP) +[for Median, Ulnar, Tibial, and Peroneal nerves], sensory nerve action potential (SNAP) [for Median and Sural nerves], +and F-waves [from Tibial, Median and Ulnar nerves] were recorded. All NCS responses were normal. +Needle-EMG demonstrated a neuropathic pattern with high amplitude and long duration motor unit action potentials (MUAPs), +associated with reduced recruitment and spontaneous potentials such as fibrillation (Fib), +positive sharp waves (PSW), and fasciculation (Fasc). These findings confirmed +a chronic denervation process with ongoing regeneration that was compatible with the category of anterior +horn cell diseases. + +Afterward, the genetic study revealed a homozygous mutation on ASAH-1 gene [ (p. Thr58Met)]; According to Gene Review® database of Washington University, this mutation was a known one; also the parents` genetic study revealed a heterozygous mutation.6 Then, treatment was started; at the first line, Depakin 500 mg/TDS, Ethosuximide 250 mg/BID, and Amantadine 100 m/BID were prescribed for the patient. But she had not a good response on the follow-up visits. We added Clonazepam 1 mg/BID and Sabril 500 mg/QD to her previous medications; however, the patient did not achieve any improvement and the symptoms were progressive. Fortunately, she is alive now and still under therapeutic regimen of the recombinant enzyme. \ No newline at end of file diff --git a/docs/cases/PMID_31251474.txt b/docs/cases/PMID_31251474.txt new file mode 100644 index 0000000..454718d --- /dev/null +++ b/docs/cases/PMID_31251474.txt @@ -0,0 +1,49 @@ +[source] +pmid = PMID:31251474 +title = Identification of a novel splice site mutation in the SERAC1 gene responsible for the MEGDHEL syndrome +[diagnosis] +disease_id = OMIM:614739 +disease_label = 3-methylglutaconic aciduria with deafness, encephalopathy, and Leigh-like syndrome +[text] +The proband was the third male child of nonconsanguineous Caucasian healthy parents. +The first child was a healthy girl, and the second a boy with language delay. +The mother reported two spontaneous miscarriages. The patient was born at term following a pregnancy +without abnormalities detected on routine ultrasound, but marked by maternal anorexia. Birth weight +and height were 2,890 g (−1 SD) and 46.5 cm (−1.5 SD), respectively, and head circumference was 35 cm +(+0.5 SD), with Apgar scores of 10 at 1 and 5 min. The first reported clinical manifestations were a +failure to thrive from 5 months old, with developmental delay and hypotonia. At 8 months old, he was +hospitalized for the follow-up of a convulsive encephalopathy. He had an episode of hypoglycemia +(0.36 g/L, 2 mmol/L) under fasting conditions, with lactic acidosis (6.7 mmol/L). After feeding every 4 hr, +there was a rapid recovery of the weight curve and changes in behavior, with a more active state. +A CT-scan (computed tomography) of the brain showed hypodensities of the basal ganglia. + +At 1 year of age, a deltoid muscle biopsy was performed due to suspicion of a mitochondrial disease, +but showed nonspecific changes (diffuse atrophy of type II fibers without ragged red fibers or decrease +of cytochrome c oxidase staining, Figure S1) without structural alteration of mitochondria in electronic +microscopy (data not shown). With the parents’ consent, blood was drawn for DNA extraction, and a skin +biopsy was performed for further investigations. + +At 4 years old, he could hold his head but not sit, had no voluntary grip and did not speak. +Since he did not react to loud sounds, an automated otoacoustic emission test was performed and +confirmed hearing loss, with no reproducible response from the peripheral level. Ophthalmological +assessment showed bilateral optic atrophy. He presented with failure to thrive and microcephaly, +with a height of 98 cm (−2 SD), a weight of 11.380 kg (−3 SD), and a head circumference of 48 cm (−1.5 SD). +Clinical examination revealed major axial hypotonia and mild dystonia. Organic acid analysis in the +urine demonstrated increased excretion of both 3-methylglutaconic acid and 3-methylglutaric acid; +peaks were not quantified but ranged from 100 to 200 mmol/mol of creatinine (normal < 20 mmol/mol of +creatinine). Although this was a significant excretion, it was not enough to suspect a primary 3-MGA-uria +(usually > 400 mmol/mol of creatinine, Wortmann, Kluijtmans, Sequeira, Wevers, & Morava, 2014). +Brain MRI (Figure 1a–d) showed a major and diffuse cortical and subcortical atrophy affecting both the +infratentorial and supratentorial regions, bilateral abnormalities of the putamen and thalami with +hyperintense signals on the T2-, fluid attenuated recovery- and diffusion-weighted images, and +hypointense signals on the T1-weighted images consistent retrospectively with the Leigh-like syndrome. +Brain MR spectroscopy showed increased lactate, with high levels in the putamen, and +reduced N-acetyl-aspartate, a marker of neuronal loss. +At 7 years of age, because of a low weight (−2.5 SD) and feeding difficulties, +he underwent antireflux surgery combined with gastrostomy placement, and salivary gland botulinum +toxin injections for excessive salivation and drooling. It is worthy to note that a minor +hemophilia A was discovered at that time, which required replacement therapy. +At 8 years of age, he underwent general anesthesia for dental extraction and experienced severe +acute respiratory distress syndrome postoperatively. Brain MRI showed major systemic atrophy, +hyperintense T2 signals of the putamen and hyperintense T2 signals of the brain stem, +signing acute brain injury. He was extubated and passed away with no diagnosis. \ No newline at end of file diff --git a/docs/cases/PMID_36970158.txt b/docs/cases/PMID_36970158.txt new file mode 100644 index 0000000..8a72286 --- /dev/null +++ b/docs/cases/PMID_36970158.txt @@ -0,0 +1,24 @@ +[source] +pmid = PMID:36970158 +title = Aortic Dissection in a Patient with Novel Frameshift COL5A1 Variant of Classical Ehlers-Danlos Syndrome +[diagnosis] +disease_id = OMIM:130000 +disease_label = Ehlers-Danlos syndrome, classic type, 1 +[text] +A 39-year-old Caucasian female was referred to our outpatient unit with a 10-year history of back and bilateral hip pain, +chronic easy bruising, episodes of palpitations, dizziness, and light-headedness. Due to the COVID-19 pandemic restrictions, +and the temporal association with the suspension of her global posture re-education (GPR) plan, she experienced additional pain in both wrists, proximal interphalangeal joints, and her left shoulder. +Three months prior to our appointment she had a respiratory infection, with delayed resolution. Due to this infection, +a computed tomography (CT) was carried out, which incidentally revealed a distal aorta artery dissection. +Past medical history included a Senning repair due to transposition of the great arteries at 18 months old, hypertension, +asthma, allergic rhinitis, scoliosis, repeated respiratory infections, two pregnancies, and one abortion. +Current medication included mirtazapine 15 mg, montelukast 10 mg, lisinopril 2.5 mg. No use of tobacco, alcohol, or +streets drugs was reported. +Physical examination revealed a body height of 167 cm, joint hypermobility, with a Beighton score of four out of nine, +bilateral acromioclavicular joint area tenderness, an atrophic cardiac surgery chest scar, and a systolic murmur – previously known. +Based on patient history and clinical findings, a diagnosis of joint hypermobility syndrome was made as per the Brighton criteria. +An electrocardiogram showed findings of right ventricular hypertrophy with overload pattern; an echocardiogram revealed +Senning’s procedure post-surgical findings and normal left ventricular function. Complete blood count showed a mild +thrombocytopenia (127,000/mL). Coagulation tests were unremarkable, as was the extensive immunology workup (Table 1). +Axial CT showed no signs of inflammatory spondyloarthropathy, and MRI excluded sacroiliitis. +Thoracic and abdominal CT angiography revealed distal aortic dissection extended through the left common iliac artery. \ No newline at end of file diff --git a/docs/cases/PMID_7803799.txt b/docs/cases/PMID_7803799.txt new file mode 100644 index 0000000..44c057c --- /dev/null +++ b/docs/cases/PMID_7803799.txt @@ -0,0 +1,23 @@ +[source] +pmid = PMID:7803799 +title = A deletional frameshift mutation in protein 4.2 gene (allele 4.2 Lisboa) associated with hereditary hemolytic anemia +[diagnosis] +disease_id = OMIM:612690 +disease_label = Spherocytosis, type 5 +[text] +The proband was born in 1967, 80 km north of Lisboa (Portugal). She had no major medical history until the age of 20. +Several tests in 1986 failed to show any conspicuous anemia [hemoglobin (Hb) level: 124, 128, and 135 g/L], +suggesting retrospectively that hemolysis was compensated. In 1987, however, the patient was admitted to the hospital +with anemia (RBC count: 3.19 T/L; Hb: 102 g/L; hematocrit (Ht) level: 30%; reticulocyte count: 7.5%), +mild icterus (bilirubin level: 2.6 mg/dL), and splenomegaly. There was no obvious reason for these acute symptoms. +The leukocyte and platelet counts were normal. In 1989, she was readmitted with more severe symptoms: fever (39°C), +abdominal pain, pallor, and icterus, again without any conspicuous cause +(RBC count: 1.45 T/L; Hb level: 43 g/L; Ht level: 12.7%; reticulocyte count: 13%; bilirubin level: 3.29 mg/dL; +leukocyte count: 2.4 G/L; platelet count: 120 G/L). Her spleen was felt 4 cm below the costal margin. +Osmotic resistance was reduced, yet moderately: 50% hemolysis for 0.049 g/L NaCl versus 0.040 to 0.046 g/L in controls. +Incubated osmotic tests yielded more disturbed results: 50% hemolysis for 0.076 g/L NaCl, vs. 0.048-0.059 g/L in controls. +The blood film showed only a few spherocytes. The leukocyte count (3.0 to 5.4 G/L) and the platelet count (150-178 G/L) was normal. +The patient was transfused, but recovery was only partial (Hb level: 90 to 110 g/L: +RBC count: 2.9 to 3.5 T/L; elevated reticulocytes). +During the period from 1988 to 1989, routine hemostasis tests +(bleeding time, prothrombin level. partial thromboplastin time) were always normal. \ No newline at end of file diff --git a/docs/cases/PMID_8755636.txt b/docs/cases/PMID_8755636.txt new file mode 100644 index 0000000..2fed56f --- /dev/null +++ b/docs/cases/PMID_8755636.txt @@ -0,0 +1,16 @@ +[source] +pmid = PMID:8755636 +title = Defective cystathionine beta-synthase regulation by S-adenosylmethionine in a partially pyridoxine responsive homocystinuria patient +[diagnosis] +disease_id = OMIM:236200 +disease_label = Homocystinuria, B6-responsive and nonresponsive types +[text] +The patient is a woman, now 20 y of age, who had been admitted to the hospital at the +age of nine years because of psychomotoric retardation and marfanoid features such as +excessive height, +dolichostenomelia, and arachnodactyly. At present time, i.e., 11 y after diagnosing and start of therapy, she is in a +very good physical condition and her intellectual development has reached an average level. +Her length is 182 cm and weight 75 kg. She has not any physical complaint. +Ectopia lentis, osteoporosis, and vascular complications did +not occur until now. +Hyperhomocysteinemia and hypermethioninemia were observed in our patient when compared to controls. \ No newline at end of file diff --git a/pom.xml b/pom.xml index 383b22f..c5e9e1c 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.monarchinitiative phenopacket2prompt - 0.4.1 + 0.4.3 phenopacket2prompt https://github.com/monarch-initiative/phenopacket2prompt @@ -23,181 +23,237 @@ + + + + org.monarchinitiative.phenol + phenol-core + ${phenol.version} + + + org.monarchinitiative.phenol + phenol-io + ${phenol.version} + + + com.google.guava + guava + + + + + org.monarchinitiative.phenol + phenol-annotations + ${phenol.version} + + + org.monarchinitiative.phenol + phenol-analysis + ${phenol.version} + + + org.monarchinitiative.biodownload + biodownload + 1.1.0 + + + com.googlecode.json-simple + json-simple + 1.1.1 + + + info.picocli + picocli + 4.7.6 + + + org.phenopackets.phenopackettools + phenopacket-tools-builder + ${phenopackettools.version} + + + org.monarchinitiative.fenominal + fenominal-core + ${fenominal.version} + + + org.phenopackets + phenopacket-schema + ${phenopacket.version} + + + com.google.protobuf + protobuf-java + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-annotations + + + com.fasterxml.jackson.dataformat + jackson-dataformat-protobuf + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + + + org.yaml + snakeyaml + + + com.google.guava + guava + + + com.google.errorprone + error_prone_annotations + + + org.slf4j + slf4j-api + + + org.apache.logging.log4j + log4j-slf4j18-impl + + + commons-collections + commons-collections + + + commons-logging + commons-logging + + + -com.google.protobuf + protobuf-java-util + + + + + + + com.google.protobuf + protobuf-java + 3.22.2 + + + com.google.protobuf + protobuf-java-util + 3.22.2 + + + com.google.guava + guava + + + + + org.junit.jupiter + junit-jupiter + 5.9.2 + test + + + org.slf4j + slf4j-api + 2.0.13 + + + org.apache.logging.log4j + log4j-core + 2.23.1 + + + org.apache.logging.log4j + log4j-slf4j-impl + 2.23.1 + + + + + org.monarchinitiative.phenol phenol-core - ${phenol.version} org.monarchinitiative.phenol phenol-io - ${phenol.version} - - - com.google.guava - guava - - - - + + org.monarchinitiative.phenol + phenol-annotations + + + org.monarchinitiative.phenol + phenol-analysis + org.monarchinitiative.biodownload biodownload - 1.1.0 - com.googlecode.json-simple json-simple - 1.1.1 info.picocli picocli - 4.7.6 - org.phenopackets.phenopackettools phenopacket-tools-builder - ${phenopackettools.version} - - org.monarchinitiative.fenominal fenominal-core - ${fenominal.version} - - - - org.monarchinitiative.phenol - phenol-annotations - ${phenol.version} - - - org.monarchinitiative.phenol - phenol-analysis - ${phenol.version} org.phenopackets phenopacket-schema - ${phenopacket.version} - - - com.google.protobuf - protobuf-java - - - com.fasterxml.jackson.core - jackson-databind - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.dataformat - jackson-dataformat-protobuf - - - com.fasterxml.jackson.dataformat - jackson-dataformat-yaml - - - org.yaml - snakeyaml - - - com.google.guava - guava - - - com.google.errorprone - error_prone_annotations - - - org.slf4j - slf4j-api - - - org.apache.logging.log4j - log4j-slf4j18-impl - - - commons-collections - commons-collections - - - commons-logging - commons-logging - - - -com.google.protobuf - protobuf-java-util - - - - com.google.protobuf protobuf-java - 3.22.2 com.google.protobuf protobuf-java-util - 3.22.2 - - - com.google.guava - guava - - org.junit.jupiter junit-jupiter - 5.9.2 test - - org.slf4j slf4j-api - 2.0.13 - - org.apache.logging.log4j log4j-core - 2.23.1 - - org.apache.logging.log4j log4j-slf4j-impl - 2.23.1 - phenopacket2prompt - org.apache.maven.plugins maven-resources-plugin diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/Main.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/Main.java index ca46ef3..726c6d0 100644 --- a/src/main/java/org/monarchinitiative/phenopacket2prompt/Main.java +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/Main.java @@ -5,7 +5,7 @@ import picocli.CommandLine; import java.util.concurrent.Callable; -@CommandLine.Command(name = "phenopacket2promot", mixinStandardHelpOptions = true, version = "0.2.0", +@CommandLine.Command(name = "phenopacket2prompt", mixinStandardHelpOptions = true, version = "0.2.0", description = "Convert phenopacket to prompt for GPT") public class Main implements Callable { @@ -19,6 +19,7 @@ public static void main(String[] args){ .addSubcommand("batch", new GbtTranslateBatchCommand()) .addSubcommand("download", new DownloadCommand()) .addSubcommand("prompt", new PromptCommand()) + .addSubcommand("mine", new TextMineCommand()) .addSubcommand("translate", new GptTranslateCommand()) ; cline.setToggleBooleanFlags(false); diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/cmd/AbstractMineCommand.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/cmd/AbstractMineCommand.java new file mode 100644 index 0000000..97748c2 --- /dev/null +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/cmd/AbstractMineCommand.java @@ -0,0 +1,52 @@ +package org.monarchinitiative.phenopacket2prompt.cmd; + +import org.monarchinitiative.phenol.base.PhenolRuntimeException; +import org.monarchinitiative.phenopacket2prompt.mining.Case; +import org.monarchinitiative.phenopacket2prompt.mining.CaseBundle; +import org.monarchinitiative.phenopacket2prompt.mining.CaseParser; +import org.monarchinitiative.phenopacket2prompt.mining.FenominalParser; +import org.monarchinitiative.phenopacket2prompt.model.PpktIndividual; +import org.monarchinitiative.phenopacket2prompt.output.PromptGenerator; +import org.phenopackets.schema.v2.Phenopacket; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +public class AbstractMineCommand { + private static final Logger LOGGER = LoggerFactory.getLogger(AbstractMineCommand.class); + + + protected List getCaseBundleList(String inputFile, FenominalParser fenominalParser) { + List caseBundleList = new ArrayList<>(); + CaseParser caseParser = new CaseParser(Path.of(inputFile)); + List caseList = caseParser.getCaseList(); + for (Case cs : caseList) { + Phenopacket ppkt = fenominalParser.parse(cs.caseText()); + PpktIndividual individual = new PpktIndividual(ppkt); + caseBundleList.add(new CaseBundle(cs, ppkt, individual)); + } + System.out.printf("Got %d cases.\n", caseBundleList.size()); + return caseBundleList; + } + + + protected void outputPrompt(CaseBundle bundle, String output) { + PpktIndividual individual = bundle.individual(); + PromptGenerator generator = PromptGenerator.english(); + String prompt = generator.createPrompt(individual); + try { + Path path = Path.of(output); + Files.writeString(path, prompt); + } catch (IOException e) { + LOGGER.error("Could not write prompt: {}", e.getMessage()); + throw new PhenolRuntimeException(e); + } + } + + +} diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/cmd/GbtTranslateBatchCommand.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/cmd/GbtTranslateBatchCommand.java index 67ad96f..7dfab15 100644 --- a/src/main/java/org/monarchinitiative/phenopacket2prompt/cmd/GbtTranslateBatchCommand.java +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/cmd/GbtTranslateBatchCommand.java @@ -141,7 +141,7 @@ private void outputPromptsInternational(List ppktFiles, Ontology hpo, Stri String errmsg = String.format("[ERROR] Got %d diseases for %s.\n", diseaseList.size(), individual.getPhenopacketId()); throw new PhenolRuntimeException(errmsg); } - PhenopacketDisease pdisease = diseaseList.get(0); + PhenopacketDisease pdisease = diseaseList.getFirst(); String promptFileName = getFileName( individual.getPhenopacketId(), languageCode); String diagnosisLine = String.format("%s\t%s\t%s\t%s", pdisease.getDiseaseId(), pdisease.getLabel(), promptFileName, f.getAbsolutePath()); try { @@ -174,7 +174,7 @@ private List outputPromptsEnglish(List ppktFiles, Ontology System.err.printf("[ERROR] Got %d diseases for %s.\n", diseaseList.size(), individual.getPhenopacketId()); continue; } - PhenopacketDisease pdisease = diseaseList.get(0); + PhenopacketDisease pdisease = diseaseList.getFirst(); String promptFileName = getFileName( individual.getPhenopacketId(), "en"); String diagnosisLine = String.format("%s\t%s\t%s\t%s", pdisease.getDiseaseId(), pdisease.getLabel(), promptFileName, f.getAbsolutePath()); try { diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/cmd/TextMineCommand.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/cmd/TextMineCommand.java new file mode 100644 index 0000000..18b8bc7 --- /dev/null +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/cmd/TextMineCommand.java @@ -0,0 +1,58 @@ +package org.monarchinitiative.phenopacket2prompt.cmd; + +import org.monarchinitiative.phenopacket2prompt.mining.CaseBundle; +import org.monarchinitiative.phenopacket2prompt.mining.FenominalParser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import picocli.CommandLine; + +import java.io.File; +import java.util.List; +import java.util.concurrent.Callable; + +@CommandLine.Command(name = "mine", aliases = {"M"}, + mixinStandardHelpOptions = true, + description = "Text mine and output phenopacket and prompt") +public class TextMineCommand extends AbstractMineCommand implements Callable { + private final static Logger LOGGER = LoggerFactory.getLogger(TextMineCommand.class); + + @CommandLine.Option(names={"-d","--data"}, description ="directory to download data (default: ${DEFAULT-VALUE})" ) + public String datadir="data"; + + @CommandLine.Option(names={"-i","--input"}, description ="input file (text)" ) + public String input = "docs/cases/PMID_8755636.txt"; // provide path for testing TODO REMOVE ME + + @CommandLine.Option(names = { "-o", "--output"}, description = "Path to output file (default: ${DEFAULT-VALUE})") + private String output = "fenominal-mined.txt"; + + @CommandLine.Option(names = {"-e", "--exact"}, description = "Use exact matching algorithm") + private boolean useExactMatching = false; + + @CommandLine.Option(names = {"--verbose"}, description = "show results in shell (default is to just write to file)") + private boolean verbose; + + + @Override + public Integer call() throws Exception { + + + + + LOGGER.info("TextMine command, input = {}", input); + File hpoJsonFile = new File(datadir + File.separator + "hp.json"); + if (! hpoJsonFile.isFile()) { + System.out.printf("[ERROR] Could not find hp.json file at %s\nRun download command first\n", hpoJsonFile.getAbsolutePath()); + } + FenominalParser parser = new FenominalParser(hpoJsonFile, useExactMatching); + List caseBundleList = getCaseBundleList(input, parser); + if (caseBundleList.isEmpty()) { + System.err.println("Could not extract cases from " + input); + } + // for now, just output one case + outputPrompt(caseBundleList.getFirst(), output); + + return 0; + + + } +} diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/international/HpInternationalOboParser.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/international/HpInternationalOboParser.java index e674af7..2bd1120 100644 --- a/src/main/java/org/monarchinitiative/phenopacket2prompt/international/HpInternationalOboParser.java +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/international/HpInternationalOboParser.java @@ -93,9 +93,7 @@ public HpInternationalOboParser(File file) { System.err.printf("[ERROR] Could not extract language for %s.\n", line); } } - } - } // System.out.println(line); } diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/mining/Case.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/mining/Case.java new file mode 100644 index 0000000..d52e046 --- /dev/null +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/mining/Case.java @@ -0,0 +1,8 @@ +package org.monarchinitiative.phenopacket2prompt.mining; + +public record Case(String pmid, + String title, + String disease_id, + String disease_label, + String caseText) { +} diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/mining/CaseBundle.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/mining/CaseBundle.java new file mode 100644 index 0000000..72e8f75 --- /dev/null +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/mining/CaseBundle.java @@ -0,0 +1,7 @@ +package org.monarchinitiative.phenopacket2prompt.mining; + +import org.monarchinitiative.phenopacket2prompt.model.PpktIndividual; +import org.phenopackets.schema.v2.Phenopacket; + +public record CaseBundle(Case caseReport, Phenopacket phenopacket, PpktIndividual individual) { +} diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/mining/CaseParser.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/mining/CaseParser.java new file mode 100644 index 0000000..c9f60f2 --- /dev/null +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/mining/CaseParser.java @@ -0,0 +1,139 @@ +package org.monarchinitiative.phenopacket2prompt.mining; + +import org.monarchinitiative.phenol.base.PhenolRuntimeException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +public class CaseParser { + private static final Logger LOGGER = LoggerFactory.getLogger(CaseParser.class); + + private final List caseList; + + public CaseParser(Path path) { + try { + List lines = Files.readAllLines(path); + if (lines.isEmpty()) { + LOGGER.error("Could not read case file from {} (EMPTY)", path.toFile().getAbsolutePath()); + } + String line = lines.getFirst().trim(); + if (! line.equals("[source]")) { + throw new PhenolRuntimeException("Malformed first case line:" + line); + } + if (lines.size() < 8) { + throw new PhenolRuntimeException("Case report too short"); + } + String pmid = getPMID(lines.get(1)); + String title = getTitle(lines.get(2)); + line = lines.get(3).trim(); + if (! line.equals("[diagnosis]")) { + throw new PhenolRuntimeException("Malformed [diagnosis] line:" + line); + } + String disease_id = getDiseaseId (lines.get(4)); + String disease_label = getDiseaseLabel(lines.get(5)); + line = lines.get(6).trim(); + if (! line.equals("[text]")) { + throw new PhenolRuntimeException("Malformed first [text] line:" + line); + } + List vignetteList = new ArrayList<>(); + StringBuilder sb = new StringBuilder(); + int i = 7; + while (i < lines.size()) { + line = lines.get(i); + if (line.contains("[text]")) { + vignetteList.add(sb.toString()); + sb = new StringBuilder(); + } else { + sb.append(line).append(" "); + } + i++; + } + if (! sb.isEmpty()) { + vignetteList.add(sb.toString()); + } + caseList = new ArrayList<>(); + for (String vignette : vignetteList ) { + caseList.add(new Case(pmid, title, disease_id, disease_label, vignette)); + } + + } catch (IOException e) { + LOGGER.error("Could not read case file from {}", path.toFile().getAbsolutePath()); + throw new PhenolRuntimeException(e); + } + + } + + public List getCaseList() { + return caseList; + } + + private String getPMID(String line) { + String err = String.format("Malformed PMID line: \"%s\"", line); + if (!line.startsWith("pmid")) { + throw new PhenolRuntimeException(err); + } + String [] fields = line.split("="); + if (fields.length != 2) { + throw new PhenolRuntimeException(err); + } + String pmid = fields[1].trim(); + if (! pmid.startsWith("PMID:")) { + throw new PhenolRuntimeException(err); + } + return pmid; + } + + private String getTitle(String line) { + String err = String.format("Malformed Title line: \"%s\"", line); + if (!line.startsWith("title")) { + throw new PhenolRuntimeException(err); + } + String[] fields = line.split("="); + if (fields.length != 2) { + throw new PhenolRuntimeException(err); + } + String title = fields[1].trim(); + if (title.length() < 5) { + throw new PhenolRuntimeException(err); + } + return title; + } + + private String getDiseaseId(String line) { + String err = String.format("Malformed disease_id line: \"%s\"", line); + if (!line.startsWith("disease_id")) { + throw new PhenolRuntimeException(err); + } + String[] fields = line.split("="); + if (fields.length != 2) { + throw new PhenolRuntimeException(err); + } + String disease_id = fields[1].trim(); + if (! disease_id.startsWith("OMIM:") ||disease_id.startsWith("MONDO:")) { + throw new PhenolRuntimeException(err); + } + return disease_id; + } + + private String getDiseaseLabel(String line) { + String err = String.format("Malformed disease_label line: \"%s\"", line); + if (!line.startsWith("disease_label")) { + throw new PhenolRuntimeException(err); + } + String[] fields = line.split("="); + if (fields.length != 2) { + throw new PhenolRuntimeException(err); + } + String disease_label = fields[1].trim(); + if (disease_label.length() < 5) { + throw new PhenolRuntimeException(err); + } + return disease_label; + } + +} diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/mining/FenominalParser.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/mining/FenominalParser.java new file mode 100644 index 0000000..a2bb9e0 --- /dev/null +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/mining/FenominalParser.java @@ -0,0 +1,128 @@ +package org.monarchinitiative.phenopacket2prompt.mining; + +import org.monarchinitiative.fenominal.core.TermMiner; +import org.monarchinitiative.fenominal.model.MinedSentence; +import org.monarchinitiative.fenominal.model.MinedTermWithMetadata; +import org.monarchinitiative.phenol.io.OntologyLoader; + + +import org.monarchinitiative.phenol.ontology.data.Ontology; +import org.monarchinitiative.phenol.ontology.data.TermId; +import org.phenopackets.phenopackettools.builder.PhenopacketBuilder; +import org.phenopackets.phenopackettools.builder.builders.IndividualBuilder; +import org.phenopackets.phenopackettools.builder.builders.MetaDataBuilder; +import org.phenopackets.phenopackettools.builder.builders.PhenotypicFeatureBuilder; +import org.phenopackets.schema.v2.Phenopacket; +import org.phenopackets.schema.v2.core.Individual; +import org.phenopackets.schema.v2.core.MetaData; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.util.*; + +public class FenominalParser { + private static final Logger LOGGER = LoggerFactory.getLogger(FenominalParser.class); + private final TermMiner miner; + protected final Ontology ontology; + + + private final String pmid = "PMID:123"; + private final String title = "title"; + + + + public FenominalParser(File hpoJsonFile, boolean exact) { + this.ontology = OntologyLoader.loadOntology(hpoJsonFile); + if (exact) { + this.miner = TermMiner.defaultNonFuzzyMapper(this.ontology); + } else { + this.miner = TermMiner.defaultFuzzyMapper(this.ontology); + } + } + + private final static MetaData metadata = MetaDataBuilder.builder("curator").build(); + + + private Collection getMappedSentences (String content) { + return miner.mineSentences(content); + } + + + + private List parseHpoTerms(String text) { + List simpleTermList = new ArrayList<>(); + + Collection mappedSentences = getMappedSentences(text); + + for (var mp : mappedSentences) { + Collection minedTerms = mp.getMinedTerms(); + for (var mt : minedTerms) { + TermId tid = mt.getTermId(); + + var opt = ontology.getTermLabel(tid); + if (opt.isEmpty()) { + // should never happen + System.err.println("[ERROR] Could not find label for " + tid.getValue()); + continue; + } + String label = opt.get(); + simpleTermList.add(new SimpleTerm(tid.getValue(), label, (! mt.isPresent()))); + } + } + return simpleTermList; + } + + + private static final Set MALE = Set.of("male", "man", "boy"); + private static final Set FEMALE = Set.of("female", "woman", "girl"); + + + + private String getSex(String content) { + String[] sentences = content.split("\\."); + for (var s: sentences) { + String ls = s.toLowerCase(); + if (ls.contains("patient")||ls.contains("proband") ||ls.contains("individual")) { + if (MALE.stream().anyMatch(ls::contains)) { + return "male"; + } else if (FEMALE.stream().anyMatch(ls::contains)) { + return "female"; + } + } + } + return null; + } + + + private Phenopacket generatePhenopacket(List simpleTermList , String sex) { + PhenopacketBuilder builder = PhenopacketBuilder.create(this.pmid, metadata); + Individual subject; + if (sex != null && sex.equals("male")) { + subject = IndividualBuilder.builder("individual").male().build(); + } else if (sex != null && sex.equals("female")) { + subject = IndividualBuilder.builder("individual").female().build(); + } else { + subject = IndividualBuilder.builder("individual").build(); + } + builder.individual(subject); + for (var st : simpleTermList) { + PhenotypicFeatureBuilder pfb = PhenotypicFeatureBuilder.builder(st.tid(), st.label()); + if (st.excluded()) { + pfb.excluded(); + } + builder.addPhenotypicFeature(pfb.build()); + } + return builder.build(); + + } + + + public Phenopacket parse(String content) { + List simpleTermList = parseHpoTerms(content); + String optSex = getSex(content); + return generatePhenopacket(simpleTermList, optSex); + } + + +} diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/mining/SimpleTerm.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/mining/SimpleTerm.java new file mode 100644 index 0000000..07147c7 --- /dev/null +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/mining/SimpleTerm.java @@ -0,0 +1,7 @@ +package org.monarchinitiative.phenopacket2prompt.mining; + +public record SimpleTerm(String tid, String label, boolean excluded) { + + + +} diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/model/AgeNotSpecified.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/model/AgeNotSpecified.java index 2a36f9a..2f37003 100644 --- a/src/main/java/org/monarchinitiative/phenopacket2prompt/model/AgeNotSpecified.java +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/model/AgeNotSpecified.java @@ -43,6 +43,21 @@ public boolean isCongenital() { return false; } + @Override + public boolean isYoungAdult() { + return false; + } + + @Override + public boolean isMiddleAge() { + return false; + } + + @Override + public boolean isLateAdultAge() { + return false; + } + @Override public boolean isAdult() { return false; diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/model/HpoOnsetAge.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/model/HpoOnsetAge.java index 8a393bc..ec252d8 100644 --- a/src/main/java/org/monarchinitiative/phenopacket2prompt/model/HpoOnsetAge.java +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/model/HpoOnsetAge.java @@ -15,6 +15,22 @@ public final class HpoOnsetAge implements PhenopacketAge { private final int totalDays; + /** Late onset Late onset HP:0003584 */ + private final static TermId lateAgeOnset = TermId.of("HP:0003584"); + + /* Middle age onset HP:0003596 */ + private final static TermId middleAgeOnset = TermId.of("HP:0003596"); + + /** Young adult onset; Early young adult onset HP:0025708; Intermediate young adult onset HP:0025709; + * Late young adult onset HP:0025710 */ + private final static Set youngAdultIds = Set.of(TermId.of("HP:0011462"), + TermId.of("HP:0025708"), + TermId.of("HP:0025709"), + TermId.of("HP:0025710")); + /** All other adult terms, e.g., Adult onset HP:0003581 */ + public final static Set otherAdult = Set.of(middleAgeOnset, lateAgeOnset, + TermId.of("HP:0003581")); + /** * One of Antenatal onset HP:0030674; Fetal onset HP:0011461; Late first trimester onset HP:0034199; * Third trimester onset HP:0034197; Second trimester onset HP:0034198; Embryonal onset HP:0011460 @@ -106,6 +122,19 @@ public boolean isCongenital() { @Override public boolean isAdult() { return adultTermIds.contains(tid); + + public boolean isYoungAdult() { + return youngAdultIds.contains(tid); + } + + @Override + public boolean isMiddleAge() { + return tid.equals(middleAgeOnset); + } + + @Override + public boolean isLateAdultAge() { + return tid.equals(lateAgeOnset); } @Override diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/model/Iso8601Age.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/model/Iso8601Age.java index 7936e78..f8771cd 100644 --- a/src/main/java/org/monarchinitiative/phenopacket2prompt/model/Iso8601Age.java +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/model/Iso8601Age.java @@ -108,6 +108,21 @@ public boolean isCongenital() { return years == 0 && months == 0 && days == 0; } + @Override + public boolean isYoungAdult() { + return years >15 && years < 40; + } + + @Override + public boolean isMiddleAge() { + return years > 39 && years < 60; + } + + @Override + public boolean isLateAdultAge() { + return years >= 60; + } + @Override public boolean isAdult() { return years >= 16; diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/model/PhenopacketAge.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/model/PhenopacketAge.java index b36ee11..5de104b 100644 --- a/src/main/java/org/monarchinitiative/phenopacket2prompt/model/PhenopacketAge.java +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/model/PhenopacketAge.java @@ -17,6 +17,12 @@ public sealed interface PhenopacketAge permits AgeNotSpecified, HpoOnsetAge, Iso boolean isCongenital(); + boolean isYoungAdult(); + + boolean isMiddleAge(); + + boolean isLateAdultAge(); + boolean isAdult(); int totalDays(); diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/model/PpktIndividual.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/model/PpktIndividual.java index 7abd403..35658cd 100644 --- a/src/main/java/org/monarchinitiative/phenopacket2prompt/model/PpktIndividual.java +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/model/PpktIndividual.java @@ -15,6 +15,7 @@ import java.io.FileReader; import java.io.IOException; import java.util.*; +import java.util.function.Predicate; public class PpktIndividual { private static final Logger LOGGER = LoggerFactory.getLogger(PpktIndividual.class); @@ -23,10 +24,32 @@ public class PpktIndividual { private final String phenopacketId; + private final List phenotypicFeaturesAtOnset; + /** features that were observed after the onset but at a specified age. We output a separate vignette for + * each of these ages. + */ + private final Map> phenotypicFeaturesAtSpecifiedAge; + + private final List phenotypicFeaturesAtOnsetWithoutSpecifiedAge; + public PpktIndividual(Phenopacket ppkt) { this.ppkt = ppkt; this.phenopacketId = ppkt.getId(); + phenotypicFeaturesAtSpecifiedAge = extractSpecifiedAgePhenotypicFeatures(); + List onsetTerms = extractPhenotypicFeaturesAtOnset(); + List unspecifiedTerms = extractPhenotypicFeaturesWithNoSpecifiedAge(); + if (onsetTerms.isEmpty()) { + phenotypicFeaturesAtOnset = List.copyOf(unspecifiedTerms); + phenotypicFeaturesAtOnsetWithoutSpecifiedAge = List.of(); + } else { + // For now, we will put all unspecified terms at the onset + onsetTerms.addAll(unspecifiedTerms); + phenotypicFeaturesAtOnset = List.copyOf(onsetTerms); + phenotypicFeaturesAtOnsetWithoutSpecifiedAge = List.of(); + } + + } public static PpktIndividual fromFile(File ppktJsonFile) { @@ -74,7 +97,6 @@ private Optional getAgeFromTimeElement(TimeElement telem) { } else { return Optional.empty(); } - } public Optional getAgeAtLastExamination() { @@ -109,7 +131,7 @@ public List getDiseases() { - public List getPhenotypicFeaturesWithNoSpecifiedAge() { + private List extractPhenotypicFeaturesWithNoSpecifiedAge() { List unspecifiedFeatures = new ArrayList<>(); for (var pf : ppkt.getPhenotypicFeaturesList()) { OntologyClass clz = pf.getType(); @@ -147,8 +169,10 @@ private boolean agesEqual(PhenopacketAge ageOne, PhenopacketAge ageTwo) { return false; } - - public List getPhenotypicFeaturesAtOnset() { + /** + * @return List of Phenotypic features that were observed at the age of onset. + */ + private List extractPhenotypicFeaturesAtOnset() { Optional opt = getAgeAtOnset(); if (opt.isEmpty()) { return new ArrayList<>(); // @@ -178,11 +202,13 @@ public List getPhenotypicFeaturesAtOnset() { return onsetFeatures; } + + /** * This code does not include features with unspecified onset (for that, use {@code getPhenotypicFeaturesWithNoSpecifiedAge}) or terms at the age of onset * @return map of phenotypic features with specified onset after the age of onset */ - public Map> getSpecifiedAgePhenotypicFeatures() { + public Map> extractSpecifiedAgePhenotypicFeatures() { Map> ageToFeatureMap = new HashMap<>(); Optional onsetOpt = getAgeAtOnset(); for (var pf : ppkt.getPhenotypicFeaturesList()) { @@ -217,4 +243,32 @@ public Map> getSpecifiedAgePhenotypicFeatures public int annotationCount() { return ppkt.getPhenotypicFeaturesCount(); } + + public List getPhenotypicFeaturesAtOnset() { + return phenotypicFeaturesAtOnset; + } + + public List getObservedPhenotypicFeaturesAtOnset() { + return phenotypicFeaturesAtOnset.stream().filter(Predicate.not(OntologyTerm::isExcluded)).toList(); + } + + public List getExcludedPhenotypicFeaturesAtOnset() { + return phenotypicFeaturesAtOnset.stream().filter(OntologyTerm::isExcluded).toList(); + } + + public boolean hasObservedPhenotypeFeatureAtOnset() { + return phenotypicFeaturesAtOnset.stream().anyMatch(Predicate.not(OntologyTerm::isExcluded)); + } + + public boolean hasExcludedPhenotypeFeatureAtOnset() { + return phenotypicFeaturesAtOnset.stream().anyMatch(OntologyTerm::isExcluded); + } + + public Map> getPhenotypicFeaturesAtSpecifiedAge() { + return phenotypicFeaturesAtSpecifiedAge; + } + + public List getPhenotypicFeaturesAtOnsetWithoutSpecifiedAge() { + return phenotypicFeaturesAtOnsetWithoutSpecifiedAge; + } } diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/PPKtBuildingBlockGenerator.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/PPKtBuildingBlockGenerator.java new file mode 100644 index 0000000..f5f0d88 --- /dev/null +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/PPKtBuildingBlockGenerator.java @@ -0,0 +1,79 @@ +package org.monarchinitiative.phenopacket2prompt.output; + + +/** + * Provide the "building blocks" (i.e., text fragments) needed to generate the + * texts in the various languages. + */ +public interface PPKtBuildingBlockGenerator { + + // days, months, years -- format singular and plural forms + String days(int d); + String months(int m); + String years(int y); + + + // Ages + String yearsOld(int y); + String monthsOld(int m); + String daysOld(int d); + String monthDayOld(int m, int d); + String yearsMonthsDaysOld(int y, int m, int d); + + // Phrases + String asNewborn(); + String atTheAgeOf(); + + + // HPO Terms + String inFetalPeriod(); + String isCongenital(); + String asInfant(); + String inChildhood(); + String asAdolescent(); + String inAdulthoold(); + + // sexxage + String she(); + String he(); + String theProband(); + String woman(); + String man(); + String individual(); + String theIndividual(); + String girl(); + String boy(); + String child(); + String adolescentGirl(); + String adolescentBoy(); + String adolescentChild(); + String maleInfant(); + String femaleInfant(); + String infant(); + String newbornBoy(); + String newbornGirl(); + String newborn(); + String maleFetus(); + String femaleFetus(); + String fetus(); + String female(); + String male(); + String adult(); + // general + String probandWasA(); + String whoPresented(); + String presented(); + String probandNoAgePresented(); + String probandNoAgePresentedWith(); + String probandMaleNoAgePresentedWith(); + String probandFemaleNoAgePresentedWith(); + String presentedWith(); + String with(); + + String probandFemaleNoAgeExcludedOnly(); + String probandMaleNoAgeExcludedOnly(); + String probandNoAgeExcludedOnly(); + + String inWhomManifestationsWereExcluded(); + +} diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/PpktPhenotypicFeatureGenerator.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/PpktPhenotypicFeatureGenerator.java index c8df74c..7533caa 100644 --- a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/PpktPhenotypicFeatureGenerator.java +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/PpktPhenotypicFeatureGenerator.java @@ -10,6 +10,11 @@ public interface PpktPhenotypicFeatureGenerator { String formatFeatures(List ontologyTerms); + default String featuresAtEncounter(List ontologyTerms) { + return ""; //TODO + } + + default List getObservedFeaturesAsStr(List oterms) { return oterms.stream() diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/PromptGenerator.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/PromptGenerator.java index 7586ccd..7b44767 100644 --- a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/PromptGenerator.java +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/PromptGenerator.java @@ -63,8 +63,8 @@ static PromptGenerator italian(HpInternational international) { default String createPrompt(PpktIndividual individual) { String individualInfo = getIndividualInformation(individual); List onsetTerms = individual.getPhenotypicFeaturesAtOnset(); - List unspecifiedAgeTerms = individual.getPhenotypicFeaturesWithNoSpecifiedAge(); - Map> pfMap = individual.getSpecifiedAgePhenotypicFeatures(); + List unspecifiedAgeTerms = individual.getPhenotypicFeaturesAtOnsetWithoutSpecifiedAge(); + Map> pfMap = individual.extractSpecifiedAgePhenotypicFeatures(); // For creating the prompt, we first report the onset and the unspecified terms together, and then // report the rest onsetTerms.addAll(unspecifiedAgeTerms); diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/dutch/PpktIndividualDutch.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/dutch/PpktIndividualDutch.java index ac0f553..6a8a711 100644 --- a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/dutch/PpktIndividualDutch.java +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/dutch/PpktIndividualDutch.java @@ -252,7 +252,7 @@ private String iso8601AtAgeOf(Iso8601Age isoAge) { if (components.isEmpty()) { return "als pasgeborene"; } else if (components.size() == 1) { - return "op de leeftijd van " + components.get(0); + return "op de leeftijd van " + components.getFirst(); } else if (components.size() == 2) { return "op de leeftijd van " + components.get(0) + " en " + components.get(1); } else { @@ -432,7 +432,7 @@ private String onsetAvailable(PhenopacketSex psex, PhenopacketAge onsetAge) { // should never happen throw new PhenolRuntimeException("Did not recognize onset age type " + onsetAge.ageType()); } - return String.format("De proband presenteerde %s met", onsetDescription, onsetDescription); + return String.format("De proband presenteerde %s met", onsetDescription); } private String ageNotAvailable(PhenopacketSex psex) { diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/dutch/PpktPhenotypicfeatureDutch.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/dutch/PpktPhenotypicfeatureDutch.java index 5e635fd..5e18c13 100644 --- a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/dutch/PpktPhenotypicfeatureDutch.java +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/dutch/PpktPhenotypicfeatureDutch.java @@ -38,7 +38,7 @@ private List getTranslations(List ontologyTerms) { private String getOxfordCommaList(List items) { if (items.size() == 1) { - return items.get(0); + return items.getFirst(); } if (items.size() == 2) { // no comma if we just have two items. diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/english/PPKtEnglishBuildingBlocks.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/english/PPKtEnglishBuildingBlocks.java new file mode 100644 index 0000000..a69f7f2 --- /dev/null +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/english/PPKtEnglishBuildingBlocks.java @@ -0,0 +1,291 @@ +package org.monarchinitiative.phenopacket2prompt.output.impl.english; + +import org.monarchinitiative.phenopacket2prompt.output.PPKtBuildingBlockGenerator; + +public class PPKtEnglishBuildingBlocks implements PPKtBuildingBlockGenerator { + + + @Override + public String days(int d) { + return d>1 ? "days" : "day"; + } + + @Override + public String months(int m) { + return m>1 ? "months" : "month"; + } + + @Override + public String years(int y) { + return y>1 ? "years" : "year"; + } + + @Override + public String yearsOld(int y) { + return String.format("%d-year-old", y); + } + + @Override + public String monthsOld(int m) { + return String.format("%d-month-old", m); + } + + @Override + public String daysOld(int d) { + return String.format("%d-%s old", d, days(d)); + } + + @Override + public String monthDayOld(int m, int d) { + if (m==0) { + return daysOld(d); + } else if (d==0) { + return monthsOld(m); + } + return String.format("%d-%s, %d-%s old", m, months(m), d, days(d)); + } + + @Override + public String yearsMonthsDaysOld(int y, int m, int d) { + if (y==0) { + return monthDayOld(m,d); + } + if (d==0) { + return String.format("%d-%s, %d-%s old", y, years(y), m, months(m)); + } + return String.format("%d-%s, %d-%s, %d-%s old", y, years(y), m, months(m), d, days(d)); + } + + @Override + public String asNewborn() { + return "as a newborn"; + } + + @Override + public String atTheAgeOf() { + return "at the age of"; + } + + + @Override + public String inFetalPeriod() { + return "in the fetal period"; + } + + @Override + public String isCongenital() { + return "at birth"; + } + + @Override + public String asInfant() { + return "as an infant"; + } + + @Override + public String inChildhood() { + return "in childhood"; + } + + @Override + public String asAdolescent() { + return "as an adolescent"; + } + + @Override + public String inAdulthoold() { + return "in adulthood"; + } + + @Override + public String she() { + return "she"; + } + + @Override + public String he() { + return "he"; + } + + @Override + public String theProband() { + return "the proband"; + } + + @Override + public String woman() { + return "woman"; + } + + @Override + public String man() { + return "man"; + } + + @Override + public String individual() { + return "individual"; + } + + @Override + public String theIndividual() { + return "the individual"; + } + + @Override + public String girl() { + return "girl"; + } + + @Override + public String boy() { + return "boy"; + } + + @Override + public String child() { + return "child"; + } + + @Override + public String adolescentGirl() { + return "adolescent girl"; + } + + @Override + public String adolescentBoy() { + return "adolescent boy"; + } + + @Override + public String adolescentChild() { + return "adolescent child"; + } + + @Override + public String maleInfant() { + return "male infant"; + } + + @Override + public String femaleInfant() { + return "female infant"; + } + + @Override + public String infant() { + return "infant"; + } + + @Override + public String newbornBoy() { + return "newborn boy"; + } + + @Override + public String newbornGirl() { + return "newborn girl"; + } + + @Override + public String newborn() { + return "newborn"; + } + + @Override + public String maleFetus() { + return "male fetus"; + } + + @Override + public String femaleFetus() { + return "female fetus"; + } + + @Override + public String fetus() { + return "fetus"; + } + + @Override + public String female() { + return "female"; + } + + @Override + public String male() { + return "male"; + } + + @Override + public String adult() { + return "adult"; + } + + @Override + public String probandWasA() { + return "The proband was a"; + } + + @Override + public String whoPresented() { + return "who presented"; + } + + @Override + public String presented() { + return "presented"; + } + + @Override + public String probandNoAgePresented() { + return "The proband presented"; + } + + @Override + public String probandNoAgePresentedWith() { + return "The proband presented with"; + } + + @Override + public String probandMaleNoAgePresentedWith() { + return "The proband was a male who presented with"; + } + + @Override + public String probandFemaleNoAgePresentedWith() { + return "The proband was a female who presented with"; + } + + @Override + public String presentedWith() { + return "presented with"; + } + + @Override + public String with() { + return "with"; + } + + @Override + public String probandFemaleNoAgeExcludedOnly() { + return "The proband was a female in whom the following clinical manifestations were excluded"; + } + + @Override + public String probandMaleNoAgeExcludedOnly() { + return "The proband was a male in whom the following clinical manifestations were excluded"; + } + + @Override + public String probandNoAgeExcludedOnly() { + return "The proband was a person in whom the following clinical manifestations were excluded"; + } + + @Override + public String inWhomManifestationsWereExcluded() { + return "in whom the following clinical manifestations were excluded"; + } + + +} diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/english/PpktIndividualEnglish.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/english/PpktIndividualEnglish.java index 03f7214..67c7f7b 100644 --- a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/english/PpktIndividualEnglish.java +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/english/PpktIndividualEnglish.java @@ -2,16 +2,36 @@ import org.monarchinitiative.phenol.base.PhenolRuntimeException; import org.monarchinitiative.phenopacket2prompt.model.*; +import org.monarchinitiative.phenopacket2prompt.output.PPKtBuildingBlockGenerator; import org.monarchinitiative.phenopacket2prompt.output.PPKtIndividualInfoGenerator; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.Set; + +/** + * This class produces the very first sentence of the prompt, e.g., + *
+ * "The proband was a 22-year-old woman who presented at the age of 13 years with ..."
+ * 
+ *

+ * There are eight possible cases to take into account, depending on whether we have the age of onset and + * the age at last presentation (this makes 2^2=4 cases), and whether there are observed HPO terms at onset, + * which influences whether we can write "who presented with" or + * "in whom the "following clinical manifestations were excluded". + *

+ *

+ * The entry point to the generation of this sentence is the function {@code #getIndividualDescription}. + *

+ */ public class PpktIndividualEnglish implements PPKtIndividualInfoGenerator { - public PpktIndividualEnglish() { + private final PPKtBuildingBlockGenerator buildBlocks; + public PpktIndividualEnglish() { + buildBlocks = new PPKtEnglishBuildingBlocks(); } @@ -19,53 +39,42 @@ public String getIndividualDescription(PpktIndividual individual) { if (individual.annotationCount() == 0) { throw new PhenolRuntimeException("No HPO annotations"); } + boolean hasObservedHPO = individual.hasObservedPhenotypeFeatureAtOnset(); Optional lastExamOpt = individual.getAgeAtLastExamination(); Optional onsetOpt = individual.getAgeAtOnset(); PhenopacketSex psex = individual.getSex(); if (lastExamOpt.isPresent() && onsetOpt.isPresent()) { - return onsetAndLastEncounterAvailable(psex, lastExamOpt.get(), onsetOpt.get()); + return onsetAndLastEncounterAvailable(psex, lastExamOpt.get(), onsetOpt.get(), hasObservedHPO); } else if (lastExamOpt.isPresent()) { - return lastEncounterAvailable(psex, lastExamOpt.get()); + return lastEncounterAvailable(psex, lastExamOpt.get(), hasObservedHPO); } else if (onsetOpt.isPresent()) { - return onsetAvailable(psex, onsetOpt.get()); + return onsetAvailable(psex, onsetOpt.get(), hasObservedHPO); } else { - return ageNotAvailable(psex); + return ageNotAvailable(psex, hasObservedHPO); } } + + /** + * NOTE THIS SHOULD BE REMOVED + * @param psex + * @return + */ @Override public String heSheIndividual(PhenopacketSex psex) { return switch (psex) { - case FEMALE -> "she"; - case MALE -> "he"; - default -> "the individual"; + case FEMALE -> buildBlocks.she(); + case MALE -> buildBlocks.he(); + default -> buildBlocks.theIndividual(); }; } - private String iso8601ToYear(Iso8601Age iso8601Age) { - return String.format("%d-year old", iso8601Age.getYears()); - } - - private String iso8601ToYearMonth(Iso8601Age iso8601Age) { - if (iso8601Age.getMonths() == 0) { - return String.format("%d-year old", iso8601Age.getYears()); - } else { - return String.format("%d-year, %d-month old", iso8601Age.getYears(), iso8601Age.getMonths()); - } - } - +/* private String iso8601ToMonthDay(Iso8601Age iso8601Age) { - int m = iso8601Age.getMonths(); - int d = iso8601Age.getDays(); - if (m == 0) { - return String.format("%d-day old", d); - } else if (d>0){ - return String.format("%d-month, %d-day old", m, d); - } else { - return String.format("%d-month old", m); - } + return buildBlocks.monthDayOld(iso8601Age.getMonths(), iso8601Age.getDays()); } + */ /** * Create a phrase such as "at the age of 7 years, 4 months, and 2 days" @@ -77,38 +86,35 @@ private String iso8601AtAgeOf(Iso8601Age isoAge) { List components = new ArrayList<>(); if (isoAge.getYears()>0) { - String ystring = isoAge.getYears() == 1 ? "year" : "years"; - components.add(String.format("%d %s", isoAge.getYears(), ystring)); + components.add(buildBlocks.years(isoAge.getYears())); } if (isoAge.getMonths() > 0) { - String mstring = isoAge.getMonths() == 1 ? "month" : "months"; - components.add(String.format("%d %s", isoAge.getMonths(), mstring)); + components.add(buildBlocks.months(isoAge.getMonths())); } if (isoAge.getDays()>0) { - String dstring = isoAge.getDays() == 1 ? "day" : "days"; - components.add(String.format("%d %s", isoAge.getDays(), dstring)); + components.add(buildBlocks.months(isoAge.getDays())); } if (components.isEmpty()) { - return "as a newborn"; + return buildBlocks.asNewborn(); } else if (components.size() == 1) { - return "at the age of " + components.get(0); + return buildBlocks.atTheAgeOf() + " " + components.getFirst(); } else if (components.size() == 2) { - return "at the age of " + components.get(0) + " and " + components.get(1); + return buildBlocks.atTheAgeOf() + " " + components.get(0) + " and " + components.get(1); } else { - return "at the age of " + components.get(0) + "m " + components.get(1) + + return buildBlocks.atTheAgeOf() + " " + components.get(0) + ", " + components.get(1) + ", and " + components.get(2); } } private String onsetTermAtAgeOf(HpoOnsetAge hpoOnsetTermAge) { if (hpoOnsetTermAge.isFetus()) { - return "in the fetal period"; + return buildBlocks.inFetalPeriod(); } else if (hpoOnsetTermAge.isCongenital()) { - return "at birth"; + return buildBlocks.isCongenital(); } else if (hpoOnsetTermAge.isInfant()) { - return "as an infant"; + return buildBlocks.asInfant(); } else if (hpoOnsetTermAge.isChild()) { - return "in childhood"; + return buildBlocks.inChildhood(); } else if (hpoOnsetTermAge.isJuvenile()) { return "as an adolescent"; } else if (hpoOnsetTermAge.isNeonate()){ @@ -127,87 +133,110 @@ private String iso8601individualDescription(PhenopacketSex psex, Iso8601Age iso8 int d = iso8601Age.getDays(); // if older if (y>17) { + String age = buildBlocks.yearsOld(y); return switch (psex) { - case FEMALE -> String.format("%d-year old woman", y); - case MALE -> String.format("%d-year old man", y); - default -> String.format("%d-year old individual", y); + case FEMALE -> String.format("%s %s", age, buildBlocks.woman()); + case MALE -> String.format("%s %s", age, buildBlocks.man()); + default -> String.format("%s %s", age, buildBlocks.individual()); }; } else if (y>9) { + String age = buildBlocks.yearsOld(y); return switch (psex) { - case FEMALE -> String.format("%d-year old adolescent female", y); - case MALE -> String.format("%d-year old adolescent male", y); - default -> String.format("%d-year old adolescent", y); + case FEMALE -> String.format("%s %s", age, buildBlocks.adolescentGirl()); + case MALE -> String.format("%s %s", age, buildBlocks.adolescentBoy()); + default -> String.format("%s %s", age, buildBlocks.adolescentChild()); }; } else if (y>0) { + String age = buildBlocks.yearsMonthsDaysOld(y, m, d); return switch (psex) { - case FEMALE -> String.format("%s girl", iso8601ToYearMonth(iso8601Age)); - case MALE -> String.format("%s boy", iso8601ToYearMonth(iso8601Age)); - default -> String.format("%s child", iso8601ToYearMonth(iso8601Age)); + case FEMALE -> String.format("%s %s", age, buildBlocks.girl()); + case MALE -> String.format("%s %s", age, buildBlocks.boy()); + default -> String.format("%s %s", age, buildBlocks.child()); }; } else if (m>0 || d> 0) { + String age = buildBlocks.monthDayOld(m, d); return switch (psex) { - case FEMALE -> String.format("%s female infant", iso8601ToMonthDay(iso8601Age)); - case MALE -> String.format("%s male infant", iso8601ToMonthDay(iso8601Age)); - default -> String.format("%s infant", iso8601ToMonthDay(iso8601Age)); + case FEMALE -> String.format("%s %s", age, buildBlocks.femaleInfant()); + case MALE -> String.format("%s %s", age, buildBlocks.maleInfant()); + default -> String.format("%s %s", age, buildBlocks.infant()); }; } else { return switch (psex) { - case FEMALE -> "newborn girl"; - case MALE -> "newborn boy"; - default -> "newborn"; + case FEMALE -> buildBlocks.newbornGirl(); + case MALE -> buildBlocks.newbornBoy(); + default -> buildBlocks.newborn(); }; } } + + private String iso8601individualDescriptionAsA(PhenopacketSex psex, Iso8601Age iAge){ + String onsetWithSex = iso8601individualDescription(psex, iAge); + return String.format("as a %s", onsetWithSex); + } + + private String hpoOnsetAsA(PhenopacketSex psex, HpoOnsetAge hpoOnsetTermAge){ + String onsetWithSex = hpoOnsetIndividualDescription(psex, hpoOnsetTermAge); + final Set vowels = Set.of('A', 'E', 'I', 'O', 'U'); + if (vowels.contains(onsetWithSex.charAt(0))) { + return String.format("as an %s", onsetWithSex); + } else { + return String.format("as a %s", onsetWithSex); + } + } + private String hpoOnsetIndividualDescription(PhenopacketSex psex, HpoOnsetAge hpoOnsetTermAge) { if (hpoOnsetTermAge.isFetus()) { return switch (psex) { - case FEMALE -> "female fetus"; - case MALE -> "male fetus"; - default -> "fetus"; + case FEMALE -> buildBlocks.femaleFetus(); + case MALE -> buildBlocks.maleFetus(); + default -> buildBlocks.fetus(); }; } else if (hpoOnsetTermAge.isCongenital()) { return switch (psex) { - case FEMALE -> "female newborn"; - case MALE -> "male newborn"; - default -> "newborn"; + case FEMALE -> buildBlocks.newbornGirl(); + case MALE -> buildBlocks.newbornBoy(); + default -> buildBlocks.newborn(); }; } else if (hpoOnsetTermAge.isInfant()) { return switch (psex) { - case FEMALE -> "female infant"; - case MALE -> "male infant"; - default -> "infant"; + case FEMALE -> buildBlocks.femaleInfant(); + case MALE -> buildBlocks.maleInfant(); + default -> buildBlocks.infant(); }; } else if (hpoOnsetTermAge.isChild()) { return switch (psex) { - case FEMALE -> "girl"; - case MALE -> "boy"; - default -> "child"; + case FEMALE -> buildBlocks.girl(); + case MALE -> buildBlocks.boy(); + default -> buildBlocks.child(); }; } else if (hpoOnsetTermAge.isJuvenile()) { return switch (psex) { - case FEMALE -> "female adolescent"; - case MALE -> "male adolescent"; - default -> "adolescent"; + case FEMALE -> buildBlocks.adolescentGirl(); + case MALE -> buildBlocks.adolescentBoy(); + default -> buildBlocks.adolescentChild(); }; }else { return switch (psex) { - case FEMALE -> "woman"; - case MALE -> "man"; - default -> "adult"; + case FEMALE -> buildBlocks.woman(); + case MALE -> buildBlocks.male(); + default -> buildBlocks.adult(); }; } } /** - * A sentence such as The proband was a 39-year old woman who presented at the age of 12 years with + * A sentence such as The proband was a 39-year-old woman who presented at the age of 12 years with * HPO1, HPO2, and HPO3. HPO4 and HPO5 were excluded. This method returns the phrase that ends with "with" * @param psex * @param lastExamAge * @param onsetAge * @return */ - private String onsetAndLastEncounterAvailable(PhenopacketSex psex, PhenopacketAge lastExamAge, PhenopacketAge onsetAge) { + private String onsetAndLastEncounterAvailable(PhenopacketSex psex, + PhenopacketAge lastExamAge, + PhenopacketAge onsetAge, + boolean hasObservedHPO) { String individualDescription; String onsetDescription; if (lastExamAge.ageType().equals(PhenopacketAgeType.ISO8601_AGE_TYPE)) { @@ -215,7 +244,7 @@ private String onsetAndLastEncounterAvailable(PhenopacketSex psex, PhenopacketAg individualDescription = iso8601individualDescription(psex, isoAge); } else if (lastExamAge.ageType().equals(PhenopacketAgeType.HPO_ONSET_AGE_TYPE)) { HpoOnsetAge hpoOnsetTermAge = (HpoOnsetAge) lastExamAge; - individualDescription = hpoOnsetIndividualDescription(psex,hpoOnsetTermAge); + individualDescription = hpoOnsetAsA(psex,hpoOnsetTermAge); } else { // should never happen throw new PhenolRuntimeException("Did not recognize last exam age type " + lastExamAge.ageType()); @@ -230,17 +259,31 @@ private String onsetAndLastEncounterAvailable(PhenopacketSex psex, PhenopacketAg // should never happen throw new PhenolRuntimeException("Did not recognize onset age type " + onsetAge.ageType()); } - return String.format("The proband was a %s who presented %s with", individualDescription, onsetDescription); + if (hasObservedHPO) { + return String.format("%s %s who presented %s with", + buildBlocks.probandWasA(), + individualDescription, + onsetDescription); + } else { + // i.e., we only have excluded HPO terms at onset + return String.format("%s %s %s %s:", + buildBlocks.probandWasA(), + individualDescription, + buildBlocks.inWhomManifestationsWereExcluded(), + onsetDescription); + } } /** * Age at last examination available but age of onset not available - * The proband was a 39-year old woman who presented with HPO1, HPO2, and HPO3. HPO4 and HPO5 were excluded. + * The proband was a 39-year-old woman who presented with HPO1, HPO2, and HPO3. HPO4 and HPO5 were excluded. * @param psex * @param lastExamAge */ - private String lastEncounterAvailable(PhenopacketSex psex, PhenopacketAge lastExamAge) { + private String lastEncounterAvailable(PhenopacketSex psex, + PhenopacketAge lastExamAge, + boolean hasObservedHPO) { String individualDescription; if (lastExamAge.ageType().equals(PhenopacketAgeType.ISO8601_AGE_TYPE)) { Iso8601Age isoAge = (Iso8601Age) lastExamAge; @@ -252,39 +295,80 @@ private String lastEncounterAvailable(PhenopacketSex psex, PhenopacketAge lastEx // should never happen throw new PhenolRuntimeException("Did not recognize last exam age type " + lastExamAge.ageType()); } - return String.format("The proband was a %s who presented with", individualDescription); + if (hasObservedHPO) { + return String.format("%s %s %s", + buildBlocks.probandWasA(), + individualDescription, + buildBlocks.whoPresented()); + } else { + return String.format("%s %s %s", + buildBlocks.probandWasA(), + individualDescription, + buildBlocks.inWhomManifestationsWereExcluded()); + } } /** * Age at last examination not available but age of onset available * The proband presented at the age of 12 years with HPO1, HPO2, and HPO3. HPO4 and HPO5 were excluded. - * @param psex - * @param onsetAge + * @param psex sex of the proband + * @param onsetAge age at onset of disease + * @param hasObservedHPO whether the proband has HPO annotations for the onset of disease * @return */ - private String onsetAvailable(PhenopacketSex psex, PhenopacketAge onsetAge) { + private String onsetAvailable(PhenopacketSex psex, + PhenopacketAge onsetAge, + boolean hasObservedHPO) { String onsetDescription; + String individualDescription; if (onsetAge.ageType().equals(PhenopacketAgeType.ISO8601_AGE_TYPE)) { Iso8601Age isoAge = (Iso8601Age) onsetAge; - onsetDescription = iso8601AtAgeOf(isoAge); + individualDescription = iso8601individualDescriptionAsA(psex, isoAge); } else if (onsetAge.ageType().equals(PhenopacketAgeType.HPO_ONSET_AGE_TYPE)) { HpoOnsetAge hpoOnsetTermAge = (HpoOnsetAge) onsetAge; - onsetDescription = onsetTermAtAgeOf(hpoOnsetTermAge); + individualDescription = hpoOnsetAsA(psex,hpoOnsetTermAge); } else { // should never happen throw new PhenolRuntimeException("Did not recognize onset age type " + onsetAge.ageType()); } - return String.format("The proband presented %s with", onsetDescription, onsetDescription); + if (hasObservedHPO) { + // e.g., "The proband presented in childhood with" + return String.format("%s %s %s", + buildBlocks.probandNoAgePresented(), + individualDescription, + buildBlocks.with()); + } else { + return String.format("%s %s %s", + buildBlocks.probandNoAgePresented(), + individualDescription, + buildBlocks.inWhomManifestationsWereExcluded()); + } + } - private String ageNotAvailable(PhenopacketSex psex) { - return switch (psex) { - case FEMALE -> "The proband was a female who presented with"; - case MALE -> "The proband was a male who presented with"; - default -> "The proband presented with"; - }; + /** + * This method is called if we have no information at all about the age of the proband + * @param psex Sex of the proband + * @return A string such as "The proband was a female who presented with"; + */ + private String ageNotAvailable(PhenopacketSex psex, + boolean hasObservedHPO) { + if (hasObservedHPO) { + return switch (psex) { + case FEMALE -> buildBlocks.probandFemaleNoAgePresentedWith(); + case MALE -> buildBlocks.probandMaleNoAgePresentedWith(); + default -> buildBlocks.probandNoAgePresentedWith(); + }; + } else { + return switch (psex) { + case FEMALE -> buildBlocks.probandFemaleNoAgeExcludedOnly(); + case MALE -> buildBlocks.probandMaleNoAgeExcludedOnly(); + default -> buildBlocks.probandNoAgeExcludedOnly(); + }; + } } + /* private String individualName(PpktIndividual individual) { PhenopacketSex psex = individual.getSex(); Optional ageOpt = individual.getAgeAtLastExamination(); @@ -301,9 +385,9 @@ private String individualName(PpktIndividual individual) { PhenopacketAge age = ageOpt.get();; if (age.isChild()) { return switch (psex) { - case FEMALE -> "girl"; - case MALE -> "boy"; - default -> "child"; + case FEMALE -> buildBlocks.girl(); + case MALE -> buildBlocks.boy(); + default -> buildBlocks.child(); }; } else if (age.isCongenital()) { return switch (psex) { @@ -325,34 +409,16 @@ private String individualName(PpktIndividual individual) { }; } else { return switch (psex) { - case FEMALE -> "woman"; - case MALE -> "man"; - default -> "individual"; + case FEMALE -> buildBlocks.woman(); + case MALE -> buildBlocks.man(); + default -> buildBlocks.inAdulthoold(); }; } } +*/ - /* @Override - public String individualWithAge(PhenopacketAge ppktAge) { - if (ppktAge.ageType().equals(PhenopacketAgeType.ISO8601_AGE_TYPE)) { - return ppktAge.age() + " old"; - } else if (ppktAge.ageType().equals(PhenopacketAgeType.HPO_ONSET_AGE_TYPE)) { - String label = ppktAge.age(); // something like "Infantile onset" - return switch (label) { - case "Infantile onset" -> "infant"; - case "Childhood onset" -> "child"; - case "Neonatal onset" -> "neonate"; - case "Congenital onset" -> "born"; - case "Adult onset" -> "adult"; - default-> String.format("During the %s", label.replace(" onset", "")); - }; - } else { - return ""; // should never get here - } - }*/ - @Override public String atAge(PhenopacketAge ppktAge) { if (ppktAge.ageType().equals(PhenopacketAgeType.ISO8601_AGE_TYPE)) { diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/english/PpktPhenotypicFeatureEnglish.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/english/PpktPhenotypicFeatureEnglish.java index 683afbd..1066ad8 100644 --- a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/english/PpktPhenotypicFeatureEnglish.java +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/english/PpktPhenotypicFeatureEnglish.java @@ -1,5 +1,6 @@ package org.monarchinitiative.phenopacket2prompt.output.impl.english; +import org.monarchinitiative.phenol.base.PhenolRuntimeException; import org.monarchinitiative.phenopacket2prompt.model.OntologyTerm; import org.monarchinitiative.phenopacket2prompt.output.PpktPhenotypicFeatureGenerator; @@ -7,6 +8,63 @@ public class PpktPhenotypicFeatureEnglish implements PpktPhenotypicFeatureGenerator { + /** + * This method is called right after the demographic information are given, e.g., + * The proband was a 32-year-old female who presented at the age of 2 years[...]" + * @param ontologyTerms + * @return + */ + public String featuresAtPresentation(List ontologyTerms) { + List observed = getObservedFeaturesAsStr(ontologyTerms); + List excluded = getExcludedFeaturesAsStr(ontologyTerms); + if (! observed.isEmpty() && ! excluded.isEmpty()) { + return String.format("with %s. In contrast, %s %s excluded. ", + getOxfordCommaList(observed), + getOxfordCommaList(excluded), + excluded.size() > 1 ? "were" : "was"); + + } else if (!excluded.isEmpty()) { + return String.format(" with %s. ", + getOxfordCommaList(observed)); + } else if (!observed.isEmpty()) { + return String.format(". %s %s excluded. ", + getOxfordCommaList(excluded), + excluded.size() > 1 ? "were" : "was"); + } else { + throw new PhenolRuntimeException("No phenotypic features passed"); + } + } + + + /** + * This method is called right after each subsequent age. For instance, + * At the age of 7 years, she[...]" + * @param ontologyTerms + * @return + */ + public String featuresForVignette(List ontologyTerms) { + List observed = getObservedFeaturesAsStr(ontologyTerms); + List excluded = getExcludedFeaturesAsStr(ontologyTerms); + if (! observed.isEmpty() && ! excluded.isEmpty()) { + return String.format(" presented with %s. In contrast, %s %s excluded. ", + getOxfordCommaList(observed), + getOxfordCommaList(excluded), + excluded.size() > 1 ? "were" : "was"); + + } else if (!excluded.isEmpty()) { + return String.format(" presented with %s. ", + getOxfordCommaList(observed)); + } else if (!observed.isEmpty()) { + return String.format(" . %s %s excluded. ", + getOxfordCommaList(excluded), + excluded.size() > 1 ? "were" : "was"); + } else { + throw new PhenolRuntimeException("No phenotypic features passed"); + } + } + + + private String getOxfordCommaList(List items) { if (items.size() == 1) { diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/german/GermanPromptGenerator.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/german/GermanPromptGenerator.java index 25c2ace..d80869f 100644 --- a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/german/GermanPromptGenerator.java +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/german/GermanPromptGenerator.java @@ -1,6 +1,5 @@ package org.monarchinitiative.phenopacket2prompt.output.impl.german; -import org.monarchinitiative.phenol.ontology.data.Ontology; import org.monarchinitiative.phenopacket2prompt.model.OntologyTerm; import org.monarchinitiative.phenopacket2prompt.model.PhenopacketAge; import org.monarchinitiative.phenopacket2prompt.model.PhenopacketSex; diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/italian/ItalianPromptGenerator.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/italian/ItalianPromptGenerator.java index 6016570..5842f24 100644 --- a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/italian/ItalianPromptGenerator.java +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/italian/ItalianPromptGenerator.java @@ -1,6 +1,5 @@ package org.monarchinitiative.phenopacket2prompt.output.impl.italian; -import org.monarchinitiative.phenol.ontology.data.Ontology; import org.monarchinitiative.phenopacket2prompt.model.OntologyTerm; import org.monarchinitiative.phenopacket2prompt.model.PhenopacketAge; import org.monarchinitiative.phenopacket2prompt.model.PhenopacketSex; diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/italian/PpktIndividualItalian.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/italian/PpktIndividualItalian.java index c0868b4..7b761d0 100644 --- a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/italian/PpktIndividualItalian.java +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/italian/PpktIndividualItalian.java @@ -213,7 +213,7 @@ private String iso8601AtAgeOf(Iso8601Age isoAge) { if (components.isEmpty()) { return "nel periodo neonatale"; } else if (components.size() == 1) { - return "all'età di " + components.get(0); + return "all'età di " + components.getFirst(); } else if (components.size() == 2) { return "all'età di " + components.get(0) + " e " + components.get(1); } else { diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/italian/PpktPhenotypicfeatureItalian.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/italian/PpktPhenotypicfeatureItalian.java index 909a42f..9d81889 100644 --- a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/italian/PpktPhenotypicfeatureItalian.java +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/italian/PpktPhenotypicfeatureItalian.java @@ -41,7 +41,7 @@ private List getTranslations(List ontologyTerms) { private String getOxfordCommaList(List items) { if (items.size() == 1) { - return items.get(0); + return items.getFirst(); } if (items.size() == 2) { // no comma if we just have two items. @@ -78,7 +78,7 @@ public String formatFeatures(List ontologyTerms) { if (excludedLabels.size() > 1) { return String.format("E' stata esclusa la presenza dei seguenti sintomi: %s.", getOxfordCommaList(excludedLabels)); } else { - return String.format("E' stata esclusa la presenza del seguente sintomo: %s.",excludedLabels.get(0)); + return String.format("E' stata esclusa la presenza del seguente sintomo: %s.",excludedLabels.getFirst()); } } else { String exclusion; diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/spanish/PpktIndividualSpanish.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/spanish/PpktIndividualSpanish.java index 060eaa0..5d19791 100644 --- a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/spanish/PpktIndividualSpanish.java +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/spanish/PpktIndividualSpanish.java @@ -213,7 +213,7 @@ private String iso8601AtAgeOf(Iso8601Age isoAge) { if (components.isEmpty()) { return "en el período neonatal"; } else if (components.size() == 1) { - return "a la edad de " + components.get(0); + return "a la edad de " + components.getFirst(); } else if (components.size() == 2) { return "a la edad de " + components.get(0) + " y " + components.get(1); } else { diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/spanish/PpktPhenotypicfeatureSpanish.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/spanish/PpktPhenotypicfeatureSpanish.java index 629ccb0..476ff09 100644 --- a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/spanish/PpktPhenotypicfeatureSpanish.java +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/spanish/PpktPhenotypicfeatureSpanish.java @@ -40,7 +40,7 @@ String getConnector(String nextWord) { if (nextWord.length() < 2) { return "y"; // should never happen but do not want to crash } - Character letter = nextWord.charAt(0); + char letter = nextWord.charAt(0); if (vowels.contains(letter)) { return " i "; } diff --git a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/spanish/SpanishPromptGenerator.java b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/spanish/SpanishPromptGenerator.java index 39ddb33..75df8cc 100644 --- a/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/spanish/SpanishPromptGenerator.java +++ b/src/main/java/org/monarchinitiative/phenopacket2prompt/output/impl/spanish/SpanishPromptGenerator.java @@ -1,6 +1,5 @@ package org.monarchinitiative.phenopacket2prompt.output.impl.spanish; -import org.monarchinitiative.phenol.ontology.data.Ontology; import org.monarchinitiative.phenopacket2prompt.model.OntologyTerm; import org.monarchinitiative.phenopacket2prompt.model.PhenopacketAge; import org.monarchinitiative.phenopacket2prompt.model.PhenopacketSex; diff --git a/src/test/java/org/monarchinitiative/phenopacket2prompt/model/PpktIndividualTest.java b/src/test/java/org/monarchinitiative/phenopacket2prompt/model/PpktIndividualTest.java index 0bc9242..3d86f11 100644 --- a/src/test/java/org/monarchinitiative/phenopacket2prompt/model/PpktIndividualTest.java +++ b/src/test/java/org/monarchinitiative/phenopacket2prompt/model/PpktIndividualTest.java @@ -68,7 +68,7 @@ public void testPhenopacketOnset() { public void testPhenopacketDisease() { List diseases = ppktIndividual.getDiseases(); assertEquals(1, diseases.size()); - PhenopacketDisease disease = diseases.get(0); + PhenopacketDisease disease = diseases.getFirst(); TermId expectedId = TermId.of("OMIM:231670"); String expectedLabel = "Glutaricaciduria, type I"; assertEquals(expectedId, disease.getDiseaseId()); @@ -77,7 +77,7 @@ public void testPhenopacketDisease() { @Test public void testPhenotypicFeatures() { - Map> ppktFeatureMap = ppktIndividual.getSpecifiedAgePhenotypicFeatures(); + Map> ppktFeatureMap = ppktIndividual.extractSpecifiedAgePhenotypicFeatures(); assertFalse(ppktFeatureMap.isEmpty()); Predicate termPredicate = term -> term.getLabel().equals("Cerebral atrophy"); List otlist = new ArrayList<>(); diff --git a/src/test/java/org/monarchinitiative/phenopacket2prompt/output/impl/english/PpktIndividualEnglishTest.java b/src/test/java/org/monarchinitiative/phenopacket2prompt/output/impl/english/PpktIndividualEnglishTest.java index 533d9d0..692facb 100644 --- a/src/test/java/org/monarchinitiative/phenopacket2prompt/output/impl/english/PpktIndividualEnglishTest.java +++ b/src/test/java/org/monarchinitiative/phenopacket2prompt/output/impl/english/PpktIndividualEnglishTest.java @@ -21,15 +21,15 @@ public class PpktIndividualEnglishTest extends PPKtIndividualBase{ private static Stream testGetIndividualDescription() { return Stream.of( new TestIndividual("46 year olf female, infantile onset", - female46yearsInfantileOnset(), new TestOutcome.Ok("The proband was a 46-year old woman who presented as an infant with")), + female46yearsInfantileOnset(), new TestOutcome.Ok("The proband was a 46-year-old woman who presented as an infant with")), new TestIndividual("male 4 months, congenital onset", - male4monthsCongenitalOnset(), new TestOutcome.Ok("The proband was a 4-month old male infant who presented at birth with")), + male4monthsCongenitalOnset(), new TestOutcome.Ok("The proband was a 4-month-old male infant who presented at birth with")), new TestIndividual("female, no onset", femaleNoAge(), new TestOutcome.Ok("The proband was a female who presented with")), new TestIndividual("female, no HPOs", femaleNoHPOs(), new TestOutcome.Error(() -> new PhenolRuntimeException("No HPO annotations"))), new TestIndividual("unknown sex, no 4yo", - unknownSex4YearsOnset(), new TestOutcome.Ok("The proband presented in childhood with")) + unknownSex4YearsOnset(), new TestOutcome.Ok("The proband presented as a child with")) ); } diff --git a/src/test/java/org/monarchinitiative/phenopacket2prompt/output/impl/english/PpktPhenotypicFeatureEnglishTest.java b/src/test/java/org/monarchinitiative/phenopacket2prompt/output/impl/english/PpktPhenotypicFeatureEnglishTest.java index 33d8f37..ae2a366 100644 --- a/src/test/java/org/monarchinitiative/phenopacket2prompt/output/impl/english/PpktPhenotypicFeatureEnglishTest.java +++ b/src/test/java/org/monarchinitiative/phenopacket2prompt/output/impl/english/PpktPhenotypicFeatureEnglishTest.java @@ -22,7 +22,7 @@ public class PpktPhenotypicFeatureEnglishTest { private static Stream testGetIndividualPhenotypicFeatures() { return Stream.of( new PPKtIndividualBase.TestIndividual("46 year olf female, infantile onset", - female46yearsInfantileOnset(), new PPKtIndividualBase.TestOutcome.Ok("Cerebellar atrophy and Ataxia. ")), + female46yearsInfantileOnset(), new PPKtIndividualBase.TestOutcome.Ok("Cerebellar atrophy and Ataxia. However, Bradyphrenia was excluded.")), new PPKtIndividualBase.TestIndividual("male 4 months, congenital onset", male4monthsCongenitalOnset(), new PPKtIndividualBase.TestOutcome.Ok("Postaxial polydactyly. ")) );