root/trunk/grails-app/conf/dbnp/configuration/ExampleStudies.groovy @ 1635

Revision 1635, 19.0 KB (checked in by work@…, 3 years ago)

- added checks to Grom calls if Grom is available so we can uninstall the plugin on packaging time... resolves issue #359

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