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

Revision 1118, 17.8 KB (checked in by work@…, 3 years ago)

- cleaned up the Bootstrap

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