source: trunk/grails-app/conf/BootStrapStudies.groovy @ 703

Last change on this file since 703 was 703, checked in by keesvb, 14 years ago

added example assays to PPSH in BootStrap? in line with the example data in the SAM bootstrap

File size: 17.4 KB
Line 
1/**
2 * @Author kees
3 * @Since Jun 25, 2010
4 *
5 * Revision information:
6 * $Rev: $
7 * $Author: $
8 * $Date: $
9 */
10
11import dbnp.studycapturing.*
12import dbnp.data.Term
13import dbnp.data.Ontology
14
15class BootStrapStudies {
16
17        /**
18         * Add example studies. This function is meant to be called only in development mode
19         */
20
21        public static void addExampleStudies() {
22
23                // Look up the used ontologies which should be in the database by now
24                def speciesOntology = Ontology.getOrCreateOntologyByNcboId(1132)
25                def brendaOntology = Ontology.getOrCreateOntologyByNcboId(1005)
26                def nciOntology = Ontology.getOrCreateOntologyByNcboId(1032)
27                def chebiOntology = Ontology.getOrCreateOntologyByNcboId(1007)
28
29                // Look up the used templates which should also be in the database by now
30                def studyTemplate = Template.findByName("Academic study")
31                def mouseTemplate = Template.findByName("Mouse")
32                def humanTemplate = Template.findByName("Human")
33                def dietTreatmentTemplate = Template.findByName("Diet treatment")
34                def boostTreatmentTemplate = Template.findByName("Compound challenge")
35                def liverSamplingEventTemplate = Template.findByName("Liver extraction")
36                def fastingTreatmentTemplate = Template.findByName("Fasting treatment")
37                def bloodSamplingEventTemplate = Template.findByName("Blood extraction")
38                def humanBloodSampleTemplate = Template.findByName("Human blood sample")
39               
40
41                // Add terms manually, to avoid having to do many HTTP requests to the BioPortal website
42                println ".adding terms"
43
44
45                def mouseTerm = new Term(
46                        name: 'Mus musculus',
47                        ontology: speciesOntology,
48                        accession: '10090'
49                ).with { if (!validate()) { errors.each { println it} } else save()}
50
51                def humanTerm = new Term(
52                        name: 'Homo sapiens',
53                        ontology: speciesOntology,
54                        accession: '9606'
55                ).with { if (!validate()) { errors.each { println it} } else save()}
56
57                def arabTerm = new Term(
58                        name: 'Arabidopsis thaliana',
59                        ontology: speciesOntology,
60                        accession: '3702'
61                ).with { if (!validate()) { errors.each { println it} } else save()}
62
63                def tomatoTerm = new Term(
64                        name: 'Solanum lycopersicum',
65                        ontology: speciesOntology,
66                        accession: '4081'
67                ).with { if (!validate()) { errors.each { println it} } else save()}
68
69                def potatoTerm = new Term(
70                        name: 'Solanum tuberosum',
71                        ontology: speciesOntology,
72                        accession: '0000'
73                ).with { if (!validate()) { errors.each { println it} } else save()}
74
75                def bloodTerm = new Term(
76                        name: 'blood plasma',
77                        ontology: brendaOntology,
78                        accession: 'BTO:0000131'
79                ).with { if (!validate()) { errors.each { println it} } else save()}
80
81                def c57bl6Term = new Term(
82                        name: 'C57BL/6 Mouse',
83                        ontology: nciOntology,
84                        accession: 'C14424'
85                ).with { if (!validate()) { errors.each { println it} } else save()}
86
87                def glucoseTerm = new Term(
88                        name: 'Glucose',
89                        ontology: chebiOntology,
90                        accession: 'CHEBI:17234'
91                ).with { if (!validate()) { errors.each { println it} } else save()}
92
93                // Create a few persons, roles and Affiliations
94                println ".adding persons, roles and affiliations"
95                def affiliation1 = new PersonAffiliation(
96                        institute: "Science Institute NYC",
97                        department: "Department of Mathematics"
98                ).save();
99                def affiliation2 = new PersonAffiliation(
100                        institute: "InfoStats GmbH, Hamburg",
101                        department: "Life Sciences"
102                ).save();
103                def role1 = new PersonRole(
104                        name: "Principal Investigator"
105                ).save();
106                def role2 = new PersonRole(
107                        name: "Statician"
108                ).save();
109
110                // Create persons
111                def person1 = new Person(
112                        lastName: "Scientist",
113                        firstName: "John",
114                        gender: "Male",
115                        initials: "J.R.",
116                        email: "john@scienceinstitute.com",
117                        phone: "1-555-3049",
118                        address: "First street 2,NYC"
119                )
120                .addToAffiliations( affiliation1 )
121                .addToAffiliations( affiliation2 )
122                .save();
123
124                def person2 = new Person(
125                        lastName: "Statician",
126                        firstName: "Jane",
127                        gender: "Female",
128                        initials: "W.J.",
129                        email: "jane@statisticalcompany.de",
130                        phone: "49-555-8291",
131                        address: "Dritten strasse 38, Hamburg, Germany"
132                )
133                .addToAffiliations( affiliation2 )
134                .save();
135
136                // Create 30 persons to test pagination
137                def personCounter = 1;
138                30.times { new Person( firstName: "Person #${personCounter}", lastName: "Testperson", email: "email${personCounter++}@testdomain.com" ).save() }
139
140                // Create a few publications
141                println ".adding publications"
142                def publication1 = new Publication(
143                        title: "Postnatal development of hypothalamic leptin receptors",
144                        authorsList: "Cottrell EC, Mercer JG, Ozanne SE.",
145                        pubMedID: "20472140",
146                        comments: "Not published yet",
147                        DOI: "unknown"
148                )
149                .save();
150
151                def publication2 = new Publication(
152                        title: "Induction of regulatory T cells decreases adipose inflammation and alleviates insulin resistance in ob/ob mice",
153                        authorsList: "Ilan Y, Maron R, Tukpah AM, Maioli TU, Murugaiyan G, Yang K, Wu HY, Weiner HL.",
154                        pubMedID: "20445103",
155                        comments: "",
156                        DOI: ""
157                )
158                .save();
159
160                // Add example mouse study
161                println ".adding NuGO PPS3 leptin example study..."
162                def mouseStudy = new Study(
163                        template: studyTemplate,
164                        title:"NuGO PPS3 mouse study leptin module",
165                        code:"PPS3_leptin_module",
166                        researchQuestion:"Leptin etc.",
167                        ecCode:"2007117.c",
168                        startDate: Date.parse('yyyy-MM-dd','2008-01-02'),
169                )
170                .with { if (!validate()) { errors.each { println it} } else save()}
171
172                mouseStudy.setFieldValue('Description', "C57Bl/6 mice were fed a high fat (45 en%) or low fat (10 en%) diet after a four week run-in on low fat diet.");// After 1 week 10 mice that received a low fat diet were given an IP leptin challenge and 10 mice of the low-fat group received placebo injections. The same procedure was performed with mice that were fed the high-fat diet. After 4 weeks the procedure was repeated. In total 80 mice were culled." )
173                mouseStudy.save()
174
175                def evLF = new Event(
176                        startTime: 3600,
177                        endTime: 3600 +7 * 24 * 3600,
178                        template: dietTreatmentTemplate
179                )
180                .setFieldValue( 'Diet','low fat')
181                .with { if (!validate()) { errors.each { println it} } else save()}
182
183                def evHF = new Event(
184                        startTime: 3600,
185                        endTime: 3600 +7 * 24 * 3600,
186                        template: dietTreatmentTemplate
187                )
188                .setFieldValue( 'Diet','high fat' )
189                .with { if (!validate()) { errors.each { println it} } else save()}
190
191                def evBV = new Event(
192                        startTime: 3600,
193                        endTime: 3600 +7 * 24 * 3600,
194                        template: boostTreatmentTemplate
195                )
196                .setFieldValue( 'Control','true' )
197                .with { if (!validate()) { errors.each { println it} } else save()}
198
199                def evBL = new Event(
200                        startTime: 3600,
201                        endTime: 3600 +7 * 24 * 3600,
202                        template: boostTreatmentTemplate
203                )
204                .setFieldValue( 'Control','false' )
205                .with { if (!validate()) { errors.each { println it} } else save()}
206
207                def evLF4 = new Event(
208                        startTime: 3600,
209                        endTime: 3600 + 4 * 7 * 24 * 3600,
210                        template: dietTreatmentTemplate
211                )
212                .setFieldValue( 'Diet','low fat')
213                .with { if (!validate()) { errors.each { println it} } else save()}
214
215                def evHF4 = new Event(
216                        startTime: 3600,
217                        endTime: 3600 + 4 * 7 * 24 * 3600,
218                        template: dietTreatmentTemplate
219                )
220                .setFieldValue( 'Diet','high fat' )
221                .with { if (!validate()) { errors.each { println it} } else save()}
222
223                def evBV4 = new Event(
224                        startTime: 3600,
225                        endTime: 3600 + 4 * 7 * 24 * 3600,
226                        template: boostTreatmentTemplate
227                )
228                .setFieldValue( 'Control','true' )
229                .with { if (!validate()) { errors.each { println it} } else save()}
230
231                def evBL4 = new Event(
232                        startTime: 3600,
233                        endTime: 3600 + 4 * 7 * 24 * 3600,
234                        template: boostTreatmentTemplate
235                )
236                .setFieldValue( 'Control','false' )
237                .with { if (!validate()) { errors.each { println it} } else save()}
238
239                def evS = new SamplingEvent(
240                        startTime: 3600 +7 * 24 * 3600,
241                        endTime: 3600 +7 * 24 * 3600,
242                        template: liverSamplingEventTemplate)
243                .setFieldValue('Sample weight',5F)
244                .with { if (!validate()) { errors.each { println it} } else save()}
245
246                def evS4 = new SamplingEvent(
247                        startTime: 3600 +7 * 24 * 3600,
248                        endTime: 3600 +7 * 24 * 3600,
249                        template: liverSamplingEventTemplate)
250                .setFieldValue('Sample weight',5F)
251                .with { if (!validate()) { errors.each { println it} } else save()}
252
253                // Add events to study
254                mouseStudy
255                .addToEvents(evLF)
256                .addToEvents(evHF)
257                .addToEvents(evBV)
258                .addToEvents(evBL)
259                .addToEvents(evLF4)
260                .addToEvents(evHF4)
261                .addToEvents(evBV4)
262                .addToEvents(evBL4)
263                .addToSamplingEvents(evS)
264                .addToSamplingEvents(evS4)
265                .save()
266
267                def LFBV1 = new EventGroup(name:"10% fat + vehicle for 1 week")
268                .addToEvents(evLF)
269                .addToEvents(evBV)
270                .addToEvents(evS)
271                .with { if (!validate()) { errors.each { println it} } else save()}
272
273                def LFBL1 = new EventGroup(name:"10% fat + leptin for 1 week")
274                .addToEvents(evLF)
275                .addToEvents(evBL)
276                .addToEvents(evS)
277                .with { if (!validate()) { errors.each { println it} } else save()}
278
279                def HFBV1 = new EventGroup(name:"45% fat + vehicle for 1 week")
280                .addToEvents(evHF)
281                .addToEvents(evBV)
282                .addToEvents(evS)
283                .with { if (!validate()) { errors.each { println it} } else save()}
284
285                def HFBL1 = new EventGroup(name:"45% fat + leptin for 1 week")
286                .addToEvents(evHF)
287                .addToEvents(evBL)
288                .addToEvents(evS)
289                .with { if (!validate()) { errors.each { println it} } else save()}
290
291                def LFBV4 = new EventGroup(name:"10% fat + vehicle for 4 weeks")
292                .addToEvents(evLF4)
293                .addToEvents(evBV4)
294                .addToEvents(evS4)
295                .with { if (!validate()) { errors.each { println it} } else save()}
296
297                def LFBL4 = new EventGroup(name:"10% fat + leptin for 4 weeks")
298                .addToEvents(evLF4)
299                .addToEvents(evBL4)
300                .addToEvents(evS4)
301                .with { if (!validate()) { errors.each { println it} } else save()}
302
303                def HFBV4 = new EventGroup(name:"45% fat + vehicle for 4 weeks")
304                .addToEvents(evHF4)
305                .addToEvents(evBV4)
306                .addToEvents(evS4)
307                .with { if (!validate()) { errors.each { println it} } else save()}
308
309                def HFBL4 = new EventGroup(name:"45% fat + leptin for 4 weeks")
310                .addToEvents(evHF4)
311                .addToEvents(evBL4)
312                .addToEvents(evS4)
313                .with { if (!validate()) { errors.each { println it} } else save()}
314
315        // Add subjects and samples and compose EventGroups
316                def x=1
317                20.times {
318                        def currentSubject = new Subject(
319                                name: "A" + x++,
320                                species: mouseTerm,
321                                template: mouseTemplate,
322                        )
323                        .setFieldValue("Gender", "Male")
324                        .setFieldValue("Genotype", c57bl6Term)
325                        .setFieldValue("Age", 17)
326                        .setFieldValue("Cage", "" + (int)(x/2))
327                        .with { if (!validate()) { errors.each { println it} } else save(flush:true)}
328
329                        mouseStudy.addToSubjects(currentSubject)
330                        .with { if (!validate()) { errors.each { println it} } else save()}
331
332                        // Add subject to appropriate EventGroup
333                        if (x > 70) { HFBL4.addToSubjects(currentSubject).save() }
334                        else if (x > 60) { HFBV4.addToSubjects(currentSubject).save() }
335                        else if (x > 50) { LFBL4.addToSubjects(currentSubject).save() }
336                        else if (x > 40) { LFBV4.addToSubjects(currentSubject).save() }
337                        else if (x > 30) { HFBL1.addToSubjects(currentSubject).save() }
338                        else if (x > 20) { HFBV1.addToSubjects(currentSubject).save() }
339                        else if (x > 10) { LFBL1.addToSubjects(currentSubject).save() }
340                        else             { LFBV1.addToSubjects(currentSubject).save() }
341
342                        // Create sample
343                        def currentSample = new Sample(
344                                name: currentSubject.name + '_B',
345                                material: bloodTerm,
346                                        template: humanBloodSampleTemplate,
347                                parentSubject: currentSubject,
348                                parentEvent: x > 40 ? evS4 : evS
349                        );
350                        currentSample.setFieldValue( "Text on vial", "T" + (Math.random() * 100L) )
351
352                        mouseStudy.addToSamples(currentSample).with { if (!validate()) { errors.each { println it} } else save()}
353                }
354
355                // Add EventGroups to study
356                mouseStudy
357                .addToEventGroups(LFBV1)
358                .addToEventGroups(LFBL1)
359                .addToEventGroups(HFBV1)
360                .addToEventGroups(HFBL1)
361                .addToEventGroups(LFBV4)
362                .addToEventGroups(LFBL4)
363                .addToEventGroups(HFBV4)
364                .addToEventGroups(HFBL4)
365
366                // Add persons and publications to study
367                def studyperson1 = new StudyPerson( person: person1, role: role1 ).save();
368                def studyperson2 = new StudyPerson( person: person2, role: role2 ).save();
369
370                mouseStudy
371                .addToPersons( studyperson1 )
372                .addToPersons( studyperson2 )
373        .addToPublications( publication1 )
374        .addToPublications( publication2 )
375                .save()
376
377                // Add example human study
378                println ".adding NuGO PPSH example study..."
379
380                def humanStudy = new Study(
381                        template: studyTemplate,
382                        title:"NuGO PPS human study",
383                        code:"PPSH",
384                        researchQuestion:"How much are fasting plasma and urine metabolite levels affected by prolonged fasting ?",
385                        description:"Human study",
386                        ecCode:"unknown",
387                        startDate: Date.parse('yyyy-MM-dd','2008-01-14'),
388                )
389                .setFieldValue( 'Description', "Human study performed at RRI; centres involved: RRI, IFR, TUM, Maastricht U." )
390                .with { if (!validate()) { errors.each { println it} } else save()}
391
392                def rootGroup = new EventGroup(name: 'Root group');
393
394                def fastingEvent = new Event(
395                        startTime: 3 * 24 * 3600 + 22 * 3600,
396                        endTime: 3 * 24 * 3600 + 30 * 3600,
397                        template: fastingTreatmentTemplate)
398                .setFieldValue('Fasting period','8h');
399
400
401                def bloodSamplingEvent = new SamplingEvent(
402                        startTime: 3 * 24 * 3600 + 30 * 3600,
403                        endTime: 3 * 24 * 3600 + 30 * 3600,
404                        template: bloodSamplingEventTemplate)
405                .setFieldValue('Sample volume',4.5F);
406
407                rootGroup.addToEvents fastingEvent
408                rootGroup.addToEvents bloodSamplingEvent
409                rootGroup.save()
410
411                def y = 1
412                11.times {
413                        def currentSubject = new Subject(
414                                name: "" + y++,
415                                species: humanTerm,
416                                template: humanTemplate
417                        )
418                        .setFieldValue("Gender", (Math.random() > 0.5) ? "Male" : "Female")
419                        .setFieldValue("DOB", new java.text.SimpleDateFormat("dd-mm-yy").parse("01-02-19" + (10 + (int) (Math.random() * 80))))
420                        .setFieldValue("Age", 30)
421                        .setFieldValue("Height", Math.random() * 2F)
422                        .setFieldValue("Weight", Math.random() * 150F)
423                        .setFieldValue("BMI", 20 + Math.random() * 10F)
424                        .with { if (!validate()) { errors.each { println it} } else save()}
425
426                        rootGroup.addToSubjects currentSubject
427                         rootGroup.save()
428
429                        def currentSample = new Sample(
430                                name: currentSubject.name + '_B',
431                                material: bloodTerm,
432                                        template: humanBloodSampleTemplate,
433                                parentSubject: currentSubject,
434                                parentEvent: bloodSamplingEvent
435                        );
436                                currentSample.setFieldValue( "Text on vial", "T" + (Math.random() * 100L) )
437
438                        humanStudy.addToSubjects(currentSubject).addToSamples(currentSample).with { if (!validate()) { errors.each { println it} } else save()}
439                }
440
441                humanStudy.addToEvents(fastingEvent)
442                humanStudy.addToSamplingEvents(bloodSamplingEvent)
443                humanStudy.addToEventGroups rootGroup
444
445
446                // Add persons to study
447                def studyperson3 = new StudyPerson( person: person1, role: role2 ).save();
448
449                humanStudy
450                .addToPersons( studyperson3 )
451                        .addToPublications( publication2 )
452                .save()
453
454                // Add clinical data       ==> to be moved to SAM
455
456                def lipidAssay = new dbnp.clinicaldata.ClinicalAssay(
457                        name: 'Lipid profile',
458                        approved: true
459                ).with { if (!validate()) { errors.each { println it} } else save()}
460
461                def ldlMeasurement = new dbnp.clinicaldata.ClinicalMeasurement(
462                        name: 'LDL',
463                        unit: 'mg/dL',
464                        type: dbnp.data.FeatureType.QUANTITATIVE,
465                        referenceValues: '100 mg/dL',
466                        detectableLimit: 250,
467                        isDrug: false, isIntake: true, inSerum: true
468                ).with { if (!validate()) { errors.each { println it} } else save()}
469
470                def hdlMeasurement = new dbnp.clinicaldata.ClinicalMeasurement(
471                        name: 'HDL',
472                        unit: 'mg/dL',
473                        type: dbnp.data.FeatureType.QUANTITATIVE,
474                        referenceValues: '50 mg/dL',
475                        detectableLimit: 100,
476                        isDrug: false, isIntake: true, inSerum: true
477                ).with { if (!validate()) { errors.each { println it} } else save()}
478
479                lipidAssay.addToMeasurements ldlMeasurement
480                lipidAssay.addToMeasurements hdlMeasurement
481
482                def lipidAssayInstance = new dbnp.clinicaldata.ClinicalAssayInstance(
483                        assay: lipidAssay
484                ).with { if (!validate()) { errors.each { println it} } else save()}
485
486                humanStudy.samples*.each {
487                        new dbnp.clinicaldata.ClinicalFloatData(
488                                assay: lipidAssayInstance,
489                                measurement: ldlMeasurement,
490                                sample: it.name,
491                                value: Math.round(Math.random()*ldlMeasurement.detectableLimit)
492                        ).with { if (!validate()) { errors.each { println it} } else save()}
493
494                        new dbnp.clinicaldata.ClinicalFloatData(
495                                assay: lipidAssayInstance,
496                                measurement: hdlMeasurement,
497                                sample: it.name,
498                                value: Math.round(Math.random()*hdlMeasurement.detectableLimit)
499                        ).with { if (!validate()) { errors.each { println it} } else save()}
500                }
501
502                // Add assay to study capture module
503
504                def clinicalModule = new AssayModule(
505                        name: 'SAM module for clinical data',
506                        type: AssayType.SIMPLE_ASSAY,
507                        platform: 'clinical measurements',
508                        url: 'http://localhost:8182/sam'
509                ).with { if (!validate()) { errors.each { println it} } else save()}
510
511                def lipidAssayRef = new Assay(
512                        name: 'Lipid profiling',
513                        module: clinicalModule,
514                        externalAssayID: 1
515                )
516
517                mouseStudy.samples*.each {
518                        lipidAssayRef.addToSamples(it)
519                }
520
521                mouseStudy.addToAssays(lipidAssayRef);
522                mouseStudy.save()
523
524                lipidAssayRef.with { if (!validate()) { errors.each { println it} } else save()}
525
526                def  glucoseAssay2Ref = new Assay(
527                        name: 'Glucose assay 2',
528                        module: clinicalModule,
529                        externalAssayID: 2
530                )
531
532                def  glucoseAssay3Ref = new Assay(
533                        name: 'Glucose assay 3',
534                        module: clinicalModule,
535                        externalAssayID: 3
536                )
537
538                humanStudy.addToAssays(glucoseAssay2Ref)
539                humanStudy.addToAssays(glucoseAssay3Ref)
540                humanStudy.save()
541
542                humanStudy.samples*.each {
543                        glucoseAssay2Ref.addToSamples(it)
544                        glucoseAssay3Ref.addToSamples(it)
545                }
546
547                glucoseAssay2Ref.with { if (!validate()) { errors.each { println it} } else save()}
548                glucoseAssay3Ref.with { if (!validate()) { errors.each { println it} } else save()}
549
550        }
551
552}
Note: See TracBrowser for help on using the repository browser.