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

Revision 944, 17.6 KB (checked in by j.saito@…, 4 years ago)

Slightly modified Bootstrap for TEST_ENV.

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