source: trunk/grails-app/conf/dbnp/configuration/ExampleStudies.groovy @ 1925

Last change on this file since 1925 was 1925, checked in by business@…, 8 years ago

attempt to fix errors that occur at first ever run-app for gscf

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