source: trunk/grails-app/conf/BootStrapStudies.groovy @ 1178

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