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

Last change on this file since 754 was 754, checked in by keesvb, 12 years ago

big refactoring / change of the data model: implemented belongsTo everywhere where it should be, added comments to the domain classes, changed BootStrap? accordingly

File size: 16.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                ).with { if (!validate()) { errors.each { println it} } else save()}
170
171                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." )
172                mouseStudy.save()
173
174                def evLF = new Event(
175                        startTime: 3600,
176                        endTime: 3600 +7 * 24 * 3600,
177                        template: dietTreatmentTemplate
178                )
179                .setFieldValue( 'Diet','low fat')
180
181                def evHF = new Event(
182                        startTime: 3600,
183                        endTime: 3600 +7 * 24 * 3600,
184                        template: dietTreatmentTemplate
185                )
186                .setFieldValue( 'Diet','high fat' )
187
188                def evBV = new Event(
189                        startTime: 3600,
190                        endTime: 3600 +7 * 24 * 3600,
191                        template: boostTreatmentTemplate
192                )
193                .setFieldValue( 'Control','true' )
194
195                def evBL = new Event(
196                        startTime: 3600,
197                        endTime: 3600 +7 * 24 * 3600,
198                        template: boostTreatmentTemplate
199                )
200                .setFieldValue( 'Control','false' )
201
202                def evLF4 = new Event(
203                        startTime: 3600,
204                        endTime: 3600 + 4 * 7 * 24 * 3600,
205                        template: dietTreatmentTemplate
206                )
207                .setFieldValue( 'Diet','low fat')
208
209                def evHF4 = new Event(
210                        startTime: 3600,
211                        endTime: 3600 + 4 * 7 * 24 * 3600,
212                        template: dietTreatmentTemplate
213                )
214                .setFieldValue( 'Diet','high fat' )
215
216                def evBV4 = new Event(
217                        startTime: 3600,
218                        endTime: 3600 + 4 * 7 * 24 * 3600,
219                        template: boostTreatmentTemplate
220                )
221                .setFieldValue( 'Control','true' )
222
223                def evBL4 = new Event(
224                        startTime: 3600,
225                        endTime: 3600 + 4 * 7 * 24 * 3600,
226                        template: boostTreatmentTemplate
227                )
228                .setFieldValue( 'Control','false' )
229
230                def evS = new SamplingEvent(
231                        startTime: 3600 +7 * 24 * 3600,
232                        endTime: 3600 +7 * 24 * 3600,
233                        template: liverSamplingEventTemplate)
234                .setFieldValue('Sample weight',5F)
235
236                def evS4 = new SamplingEvent(
237                        startTime: 3600 +7 * 24 * 3600,
238                        endTime: 3600 +7 * 24 * 3600,
239                        template: liverSamplingEventTemplate)
240                .setFieldValue('Sample weight',5F)
241
242                // Add events to study
243                mouseStudy
244                .addToEvents(evLF)
245                .addToEvents(evHF)
246                .addToEvents(evBV)
247                .addToEvents(evBL)
248                .addToEvents(evLF4)
249                .addToEvents(evHF4)
250                .addToEvents(evBV4)
251                .addToEvents(evBL4)
252                .addToSamplingEvents(evS)
253                .addToSamplingEvents(evS4)
254                .with { if (!validate()) { errors.each { println it} } else save()}
255
256                // Extra check if the SamplingEvents are saved correctly
257                evS.with { if (!validate()) { errors.each { println it} } else save()}
258                evS4.with { if (!validate()) { errors.each { println it} } else save()}
259
260                def LFBV1 = new EventGroup(name:"10% fat + vehicle for 1 week")
261                .addToEvents(evLF)
262                .addToEvents(evBV)
263                .addToSamplingEvents(evS)
264
265                def LFBL1 = new EventGroup(name:"10% fat + leptin for 1 week")
266                .addToEvents(evLF)
267                .addToEvents(evBL)
268                .addToSamplingEvents(evS)
269
270                def HFBV1 = new EventGroup(name:"45% fat + vehicle for 1 week")
271                .addToEvents(evHF)
272                .addToEvents(evBV)
273                .addToSamplingEvents(evS)
274
275                def HFBL1 = new EventGroup(name:"45% fat + leptin for 1 week")
276                .addToEvents(evHF)
277                .addToEvents(evBL)
278                .addToSamplingEvents(evS)
279
280                def LFBV4 = new EventGroup(name:"10% fat + vehicle for 4 weeks")
281                .addToEvents(evLF4)
282                .addToEvents(evBV4)
283                .addToSamplingEvents(evS4)
284
285                def LFBL4 = new EventGroup(name:"10% fat + leptin for 4 weeks")
286                .addToEvents(evLF4)
287                .addToEvents(evBL4)
288                .addToSamplingEvents(evS4)
289
290                def HFBV4 = new EventGroup(name:"45% fat + vehicle for 4 weeks")
291                .addToEvents(evHF4)
292                .addToEvents(evBV4)
293                .addToSamplingEvents(evS4)
294
295                def HFBL4 = new EventGroup(name:"45% fat + leptin for 4 weeks")
296                .addToEvents(evHF4)
297                .addToEvents(evBL4)
298                .addToSamplingEvents(evS4)
299               
300        // Add subjects and samples and compose EventGroups
301                def x=1
302                80.times {
303                        def currentSubject = new Subject(
304                                name: "A" + x++,
305                                species: mouseTerm,
306                                template: mouseTemplate,
307                        )
308                        .setFieldValue("Gender", "Male")
309                        .setFieldValue("Genotype", c57bl6Term)
310                        .setFieldValue("Age", 17)
311                        .setFieldValue("Cage", "" + (int)(x/2))
312
313                        mouseStudy.addToSubjects(currentSubject)
314                        .with { if (!validate()) { errors.each { println it} } else save()}
315
316                        // Add subject to appropriate EventGroup
317                        if (x > 70) { HFBL4.addToSubjects(currentSubject).save() }
318                        else if (x > 60) { HFBV4.addToSubjects(currentSubject).save() }
319                        else if (x > 50) { LFBL4.addToSubjects(currentSubject).save() }
320                        else if (x > 40) { LFBV4.addToSubjects(currentSubject).save() }
321                        else if (x > 30) { HFBL1.addToSubjects(currentSubject).save() }
322                        else if (x > 20) { HFBV1.addToSubjects(currentSubject).save() }
323                        else if (x > 10) { LFBL1.addToSubjects(currentSubject).save() }
324                        else             { LFBV1.addToSubjects(currentSubject).save() }
325
326                        // Create sample
327                        def currentSample = new Sample(
328                                name: currentSubject.name + '_B',
329                                material: bloodTerm,
330                                template: humanBloodSampleTemplate,
331                                parentSubject: currentSubject,
332                                parentEvent: x > 40 ? evS4 : evS
333                        );
334                        currentSample.setFieldValue( "Text on vial", "T" + (Math.random() * 100L) )
335                        mouseStudy.addToSamples(currentSample).with { if (!validate()) { errors.each { println it} } else save()}
336                }
337
338                // Add EventGroups to study
339                mouseStudy
340                .addToEventGroups(LFBV1)
341                .addToEventGroups(LFBL1)
342                .addToEventGroups(HFBV1)
343                .addToEventGroups(HFBL1)
344                .addToEventGroups(LFBV4)
345                .addToEventGroups(LFBL4)
346                .addToEventGroups(HFBV4)
347                .addToEventGroups(HFBL4)
348                .with { if (!validate()) { errors.each { println it} } else save()}
349
350                // Add persons and publications to study
351                def studyperson1 = new StudyPerson( person: person1, role: role1 )
352                def studyperson2 = new StudyPerson( person: person2, role: role2 )
353
354                mouseStudy
355                .addToPersons( studyperson1 )
356                .addToPersons( studyperson2 )
357        .addToPublications( publication1 )
358        .addToPublications( publication2 )
359                .with { if (!validate()) { errors.each { println it} } else save()}
360
361                // Add example human study
362                println ".adding NuGO PPSH example study..."
363
364                def humanStudy = new Study(
365                        template: studyTemplate,
366                        title:"NuGO PPS human study",
367                        code:"PPSH",
368                        researchQuestion:"How much are fasting plasma and urine metabolite levels affected by prolonged fasting ?",
369                        description:"Human study",
370                        ecCode:"unknown",
371                        startDate: Date.parse('yyyy-MM-dd','2008-01-14'),
372                )
373                .setFieldValue( 'Description', "Human study performed at RRI; centres involved: RRI, IFR, TUM, Maastricht U." )
374                .with { if (!validate()) { errors.each { println it} } else save()}
375
376                def rootGroup = new EventGroup(name: 'Root group');
377
378                def fastingEvent = new Event(
379                        startTime: 3 * 24 * 3600 + 22 * 3600,
380                        endTime: 3 * 24 * 3600 + 30 * 3600,
381                        template: fastingTreatmentTemplate)
382                .setFieldValue('Fasting period','8h');
383
384
385                def bloodSamplingEvent = new SamplingEvent(
386                        startTime: 3 * 24 * 3600 + 30 * 3600,
387                        endTime: 3 * 24 * 3600 + 30 * 3600,
388                        template: bloodSamplingEventTemplate)
389                .setFieldValue('Sample volume',4.5F);
390
391                rootGroup.addToEvents fastingEvent
392                rootGroup.addToSamplingEvents bloodSamplingEvent
393                rootGroup.save()
394
395                def y = 1
396                11.times {
397                        def currentSubject = new Subject(
398                                name: "" + y++,
399                                species: humanTerm,
400                                template: humanTemplate
401                        )
402                        .setFieldValue("Gender", (Math.random() > 0.5) ? "Male" : "Female")
403                        .setFieldValue("DOB", new java.text.SimpleDateFormat("dd-mm-yy").parse("01-02-19" + (10 + (int) (Math.random() * 80))))
404                        .setFieldValue("Age", 30)
405                        .setFieldValue("Height", Math.random() * 2F)
406                        .setFieldValue("Weight", Math.random() * 150F)
407                        .setFieldValue("BMI", 20 + Math.random() * 10F)
408
409                        rootGroup.addToSubjects currentSubject
410                        rootGroup.save()
411
412                        def currentSample = new Sample(
413                                name: currentSubject.name + '_B',
414                                material: bloodTerm,
415                                template: humanBloodSampleTemplate,
416                                parentSubject: currentSubject,
417                                parentEvent: bloodSamplingEvent
418                        );
419                        currentSample.setFieldValue( "Text on vial", "T" + (Math.random() * 100L) )
420
421                        humanStudy.addToSubjects(currentSubject).addToSamples(currentSample)
422                        .with { if (!validate()) { errors.each { println it} } else save()}
423                }
424
425                humanStudy.addToEvents(fastingEvent)
426                humanStudy.addToSamplingEvents(bloodSamplingEvent)
427                humanStudy.addToEventGroups rootGroup
428
429
430                // Add persons to study
431                def studyperson3 = new StudyPerson( person: person1, role: role2 )
432
433                humanStudy
434                .addToPersons( studyperson3 )
435                .addToPublications( publication2 )
436                .with { if (!validate()) { errors.each { println it} } else save()}
437
438                // Add clinical data       ==> to be moved to SAM
439
440                def lipidAssay = new dbnp.clinicaldata.ClinicalAssay(
441                        name: 'Lipid profile',
442                        approved: true
443                ).with { if (!validate()) { errors.each { println it} } else save()}
444
445                def ldlMeasurement = new dbnp.clinicaldata.ClinicalMeasurement(
446                        name: 'LDL',
447                        unit: 'mg/dL',
448                        type: dbnp.data.FeatureType.QUANTITATIVE,
449                        referenceValues: '100 mg/dL',
450                        detectableLimit: 250,
451                        isDrug: false, isIntake: true, inSerum: true
452                ).with { if (!validate()) { errors.each { println it} } else save()}
453
454                def hdlMeasurement = new dbnp.clinicaldata.ClinicalMeasurement(
455                        name: 'HDL',
456                        unit: 'mg/dL',
457                        type: dbnp.data.FeatureType.QUANTITATIVE,
458                        referenceValues: '50 mg/dL',
459                        detectableLimit: 100,
460                        isDrug: false, isIntake: true, inSerum: true
461                ).with { if (!validate()) { errors.each { println it} } else save()}
462
463                lipidAssay.addToMeasurements ldlMeasurement
464                lipidAssay.addToMeasurements hdlMeasurement
465
466                def lipidAssayInstance = new dbnp.clinicaldata.ClinicalAssayInstance(
467                        assay: lipidAssay
468                ).with { if (!validate()) { errors.each { println it} } else save()}
469
470                humanStudy.samples*.each {
471                        new dbnp.clinicaldata.ClinicalFloatData(
472                                assay: lipidAssayInstance,
473                                measurement: ldlMeasurement,
474                                sample: it.name,
475                                value: Math.round(Math.random()*ldlMeasurement.detectableLimit)
476                        ).with { if (!validate()) { errors.each { println it} } else save()}
477
478                        new dbnp.clinicaldata.ClinicalFloatData(
479                                assay: lipidAssayInstance,
480                                measurement: hdlMeasurement,
481                                sample: it.name,
482                                value: Math.round(Math.random()*hdlMeasurement.detectableLimit)
483                        ).with { if (!validate()) { errors.each { println it} } else save()}
484                }
485
486                // Add assay to study capture module
487
488                def clinicalModule = new AssayModule(
489                        name: 'SAM module for clinical data',
490                        type: AssayType.SIMPLE_ASSAY,
491                        platform: 'clinical measurements',
492                        url: 'http://localhost:8182/sam'
493                ).with { if (!validate()) { errors.each { println it} } else save()}
494
495                def lipidAssayRef = new Assay(
496                        name: 'Lipid profiling',
497                        module: clinicalModule,
498                        externalAssayID: 1
499                )
500
501                mouseStudy.samples*.each {
502                        lipidAssayRef.addToSamples(it)
503                }
504
505                mouseStudy.addToAssays(lipidAssayRef);
506                mouseStudy.save()
507
508                lipidAssayRef.with { if (!validate()) { errors.each { println it} } else save()}
509
510                def  glucoseAssay2Ref = new Assay(
511                        name: 'Glucose assay 2',
512                        module: clinicalModule,
513                        externalAssayID: 2
514                )
515
516                def  glucoseAssay3Ref = new Assay(
517                        name: 'Glucose assay 3',
518                        module: clinicalModule,
519                        externalAssayID: 3
520                )
521
522                humanStudy.addToAssays(glucoseAssay2Ref)
523                humanStudy.addToAssays(glucoseAssay3Ref)
524                humanStudy.save()
525
526                humanStudy.samples*.each {
527                        glucoseAssay2Ref.addToSamples(it)
528                        glucoseAssay3Ref.addToSamples(it)
529                }
530
531                glucoseAssay2Ref.with { if (!validate()) { errors.each { println it} } else save()}
532                glucoseAssay3Ref.with { if (!validate()) { errors.each { println it} } else save()}
533
534        }
535
536}
Note: See TracBrowser for help on using the repository browser.