root/trunk/grails-app/conf/BootStrapStudies.groovy @ 662

Revision 662, 16.4 KB (checked in by keesvb, 4 years ago)

restructured BootStrap?, it should now run faster because there are no BioPortal? connections, and it adds sample studies in development mode (outcomment the addExampleStudies call in the BootStrap? if you don't want that). Renamed TemplateEntity?.getFieldType to giveFieldType and added tests to SampleTests? for the method.

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                }
343
344                // Add EventGroups to study
345                mouseStudy
346                .addToEventGroups(LFBV1)
347                .addToEventGroups(LFBL1)
348                .addToEventGroups(HFBV1)
349                .addToEventGroups(HFBL1)
350                .addToEventGroups(LFBV4)
351                .addToEventGroups(LFBL4)
352                .addToEventGroups(HFBV4)
353                .addToEventGroups(HFBL4)
354
355                // Add persons and publications to study
356                def studyperson1 = new StudyPerson( person: person1, role: role1 ).save();
357                def studyperson2 = new StudyPerson( person: person2, role: role2 ).save();
358
359                mouseStudy
360                .addToPersons( studyperson1 )
361                .addToPersons( studyperson2 )
362        .addToPublications( publication1 )
363        .addToPublications( publication2 )
364                .save()
365
366                // Add example human study
367                println ".adding NuGO PPSH example study..."
368
369                def humanStudy = new Study(
370                        template: studyTemplate,
371                        title:"NuGO PPS human study",
372                        code:"PPSH",
373                        researchQuestion:"How much are fasting plasma and urine metabolite levels affected by prolonged fasting ?",
374                        description:"Human study",
375                        ecCode:"unknown",
376                        startDate: Date.parse('yyyy-MM-dd','2008-01-14'),
377                )
378                .setFieldValue( 'Description', "Human study performed at RRI; centres involved: RRI, IFR, TUM, Maastricht U." )
379                .with { if (!validate()) { errors.each { println it} } else save()}
380
381                def rootGroup = new EventGroup(name: 'Root group');
382
383                def fastingEvent = new Event(
384                        startTime: 3 * 24 * 3600 + 22 * 3600,
385                        endTime: 3 * 24 * 3600 + 30 * 3600,
386                        template: fastingTreatmentTemplate)
387                .setFieldValue('Fasting period','8h');
388
389
390                def bloodSamplingEvent = new SamplingEvent(
391                        startTime: 3 * 24 * 3600 + 30 * 3600,
392                        endTime: 3 * 24 * 3600 + 30 * 3600,
393                        template: bloodSamplingEventTemplate)
394                .setFieldValue('Sample volume',4.5F);
395
396                rootGroup.addToEvents fastingEvent
397                rootGroup.addToEvents bloodSamplingEvent
398                rootGroup.save()
399
400                def y = 1
401                11.times {
402                        def currentSubject = new Subject(
403                                name: "" + y++,
404                                species: humanTerm,
405                                template: humanTemplate
406                        )
407                        .setFieldValue("Gender", (Math.random() > 0.5) ? "Male" : "Female")
408                        .setFieldValue("DOB", new java.text.SimpleDateFormat("dd-mm-yy").parse("01-02-19" + (10 + (int) (Math.random() * 80))))
409                        .setFieldValue("Age", 30)
410                        .setFieldValue("Height", Math.random() * 2F)
411                        .setFieldValue("Weight", Math.random() * 150F)
412                        .setFieldValue("BMI", 20 + Math.random() * 10F)
413                        .with { if (!validate()) { errors.each { println it} } else save()}
414
415                        rootGroup.addToSubjects currentSubject
416                         rootGroup.save()
417
418                        def currentSample = new Sample(
419                                name: currentSubject.name + '_B',
420                                material: bloodTerm,
421                                        template: humanBloodSampleTemplate,
422                                parentSubject: currentSubject,
423                                parentEvent: bloodSamplingEvent
424                        );
425                                currentSample.setFieldValue( "Text on vial", "T" + (Math.random() * 100L) )
426
427                        humanStudy.addToSubjects(currentSubject).addToSamples(currentSample).with { if (!validate()) { errors.each { println it} } else save()}
428                }
429
430                humanStudy.addToEvents(fastingEvent)
431                humanStudy.addToSamplingEvents(bloodSamplingEvent)
432                humanStudy.addToEventGroups rootGroup
433
434
435                // Add persons to study
436                def studyperson3 = new StudyPerson( person: person1, role: role2 ).save();
437
438                humanStudy
439                .addToPersons( studyperson3 )
440                        .addToPublications( publication2 )
441                .save()
442
443                // Add clinical data       ==> to be moved to SAM
444
445                def lipidAssay = new dbnp.clinicaldata.ClinicalAssay(
446                        name: 'Lipid profile',
447                        approved: true
448                ).with { if (!validate()) { errors.each { println it} } else save()}
449
450                def ldlMeasurement = new dbnp.clinicaldata.ClinicalMeasurement(
451                        name: 'LDL',
452                        unit: 'mg/dL',
453                        type: dbnp.data.FeatureType.QUANTITATIVE,
454                        referenceValues: '100 mg/dL',
455                        detectableLimit: 250,
456                        isDrug: false, isIntake: true, inSerum: true
457                ).with { if (!validate()) { errors.each { println it} } else save()}
458
459                def hdlMeasurement = new dbnp.clinicaldata.ClinicalMeasurement(
460                        name: 'HDL',
461                        unit: 'mg/dL',
462                        type: dbnp.data.FeatureType.QUANTITATIVE,
463                        referenceValues: '50 mg/dL',
464                        detectableLimit: 100,
465                        isDrug: false, isIntake: true, inSerum: true
466                ).with { if (!validate()) { errors.each { println it} } else save()}
467
468                lipidAssay.addToMeasurements ldlMeasurement
469                lipidAssay.addToMeasurements hdlMeasurement
470
471                def lipidAssayInstance = new dbnp.clinicaldata.ClinicalAssayInstance(
472                        assay: lipidAssay
473                ).with { if (!validate()) { errors.each { println it} } else save()}
474
475                humanStudy.samples*.each {
476                        new dbnp.clinicaldata.ClinicalFloatData(
477                                assay: lipidAssayInstance,
478                                measurement: ldlMeasurement,
479                                sample: it.name,
480                                value: Math.round(Math.random()*ldlMeasurement.detectableLimit)
481                        ).with { if (!validate()) { errors.each { println it} } else save()}
482
483                        new dbnp.clinicaldata.ClinicalFloatData(
484                                assay: lipidAssayInstance,
485                                measurement: hdlMeasurement,
486                                sample: it.name,
487                                value: Math.round(Math.random()*hdlMeasurement.detectableLimit)
488                        ).with { if (!validate()) { errors.each { println it} } else save()}
489                }
490
491                // Add assay to study capture module
492
493                def clinicalModule = new AssayModule(
494                        name: 'SAM module for clinical data',
495                        type: AssayType.SIMPLE_ASSAY,
496                        platform: 'clinical measurements',
497                        url: 'http://sam.dbnp.org'
498                ).with { if (!validate()) { errors.each { println it} } else save()}
499
500                def lipidAssayRef = new Assay(
501                        name: 'Lipid profiling',
502                        module: clinicalModule,
503                        externalAssayId: 0
504                ).with { if (!validate()) { errors.each { println it} } else save()}
505
506                humanStudy.samples*.each {
507                        lipidAssayRef.addToSamples(it)
508                }
509                lipidAssayRef.save()
510
511                humanStudy.addToAssays(lipidAssayRef);
512                humanStudy.save()
513
514                mouseStudy.addToAssays(lipidAssayRef);
515                mouseStudy.save()
516        }
517
518}
Note: See TracBrowser for help on using the browser.