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

Last change on this file since 997 was 997, checked in by j.a.m.wesbeek@…, 10 years ago

This bug is caused by the Ontology being updated on the ncbo side. We already have one version in the database (1.71) which has only one term linked (glucose). When you tried to add other terms, these terms came from a newer version of the Ontology (1.72) which did not yet exist in the database so a new Ontology was created. The Terms benzo[a]pyrene, benzene and benzenediols were added to this Ontology.

Resolution: before adding a new ontology, a lookup is performed on name. If this returns an existing ontology, the existing ontology is updated with the updated information of the new version of the ontology. This sollution is not ideal, but good enough for now...

  • Property svn:keywords set to Author Date Rev
File size: 17.9 KB
Line 
1/**
2 * @Author kees
3 * @Since Jun 25, 2010
4 *
5 * Revision information:
6 * $Rev: 997 $
7 * $Author: j.a.m.wesbeek@umail.leidenuniv.nl $
8 * $Date: 2010-10-26 14:33:21 +0000 (di, 26 okt 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
16
17class BootStrapStudies {
18
19        /**
20         * Add example studies. This function is meant to be called only in development mode
21         */
22
23        public static void addExampleStudies(dbnp.authentication.SecUser owner, dbnp.authentication.SecUser otherUser ) {
24
25                // Look up the used ontologies which should be in the database by now
26                def speciesOntology = Ontology.getOrCreateOntologyByNcboId(1132)
27                def brendaOntology = Ontology.getOrCreateOntologyByNcboId(1005)
28                def nciOntology = Ontology.getOrCreateOntologyByNcboId(1032)
29                def chebiOntology = Ontology.getOrCreateOntologyByNcboId(1007)
30
31                // Look up the used templates which should also be in the database by now
32                def studyTemplate = Template.findByName("Academic study")
33                def mouseTemplate = Template.findByName("Mouse")
34                def humanTemplate = Template.findByName("Human")
35                def dietTreatmentTemplate = Template.findByName("Diet treatment")
36                def boostTreatmentTemplate = Template.findByName("Compound challenge")
37                def liverSamplingEventTemplate = Template.findByName("Liver extraction")
38                def fastingTreatmentTemplate = Template.findByName("Fasting treatment")
39                def bloodSamplingEventTemplate = Template.findByName("Blood extraction")
40                def humanTissueSampleTemplate = Template.findByName("Human tissue sample")
41                def humanBloodSampleTemplate = Template.findByName("Human blood sample")
42                def ccAssayTemplate = Template.findByName("Clinical chemistry assay")
43                def metAssayTemplate = Template.findByName("Metabolomics assay")
44
45                // Add terms manually, to avoid having to do many HTTP requests to the BioPortal website
46                println ".adding terms"
47
48
49                def mouseTerm = new Term(
50                        name: 'Mus musculus',
51                        ontology: speciesOntology,
52                        accession: '10090'
53                ).with { if (!validate()) { errors.each { println it} } else save()}
54
55                def humanTerm = new Term(
56                        name: 'Homo sapiens',
57                        ontology: speciesOntology,
58                        accession: '9606'
59                ).with { if (!validate()) { errors.each { println it} } else save()}
60
61                def arabTerm = new Term(
62                        name: 'Arabidopsis thaliana',
63                        ontology: speciesOntology,
64                        accession: '3702'
65                ).with { if (!validate()) { errors.each { println it} } else save()}
66
67                def tomatoTerm = new Term(
68                        name: 'Solanum lycopersicum',
69                        ontology: speciesOntology,
70                        accession: '4081'
71                ).with { if (!validate()) { errors.each { println it} } else save()}
72
73                def potatoTerm = new Term(
74                        name: 'Solanum tuberosum',
75                        ontology: speciesOntology,
76                        accession: '0000'
77                ).with { if (!validate()) { errors.each { println it} } else save()}
78
79                def bloodTerm = new Term(
80                        name: 'blood plasma',
81                        ontology: brendaOntology,
82                        accession: 'BTO:0000131'
83                ).with { if (!validate()) { errors.each { println it} } else save()}
84
85                def c57bl6Term = new Term(
86                        name: 'C57BL/6 Mouse',
87                        ontology: nciOntology,
88                        accession: 'C14424'
89                ).with { if (!validate()) { errors.each { println it} } else save()}
90
91                def glucoseTerm = new Term(
92                        name: 'glucose',
93                        ontology: chebiOntology,
94                        accession: 'CHEBI:17234'
95                ).with { if (!validate()) { errors.each { println it} } else save()}
96
97                // Create a few persons, roles and Affiliations
98                println ".adding persons, roles and affiliations"
99                def affiliation1 = new PersonAffiliation(
100                        institute: "Science Institute NYC",
101                        department: "Department of Mathematics"
102                ).save();
103                def affiliation2 = new PersonAffiliation(
104                        institute: "InfoStats GmbH, Hamburg",
105                        department: "Life Sciences"
106                ).save();
107                def role1 = new PersonRole(
108                        name: "Principal Investigator"
109                ).save();
110                def role2 = new PersonRole(
111                        name: "Statician"
112                ).save();
113
114                // Create persons
115                def person1 = new Person(
116                        lastName: "Scientist",
117                        firstName: "John",
118                        gender: "Male",
119                        initials: "J.R.",
120                        email: "john@scienceinstitute.com",
121                        phone: "1-555-3049",
122                        address: "First street 2,NYC"
123                )
124                .addToAffiliations( affiliation1 )
125                .addToAffiliations( affiliation2 )
126                .save();
127
128                def person2 = new Person(
129                        lastName: "Statician",
130                        firstName: "Jane",
131                        gender: "Female",
132                        initials: "W.J.",
133                        email: "jane@statisticalcompany.de",
134                        phone: "49-555-8291",
135                        address: "Dritten strasse 38, Hamburg, Germany"
136                )
137                .addToAffiliations( affiliation2 )
138                .save();
139
140                // Create 30 persons to test pagination
141                def personCounter = 1;
142                30.times { new Person( firstName: "Person #${personCounter}", lastName: "Testperson", email: "email${personCounter++}@testdomain.com" ).save() }
143
144                // Create a few publications
145                println ".adding publications"
146                def publication1 = new Publication(
147                        title: "Postnatal development of hypothalamic leptin receptors",
148                        authorsList: "Cottrell EC, Mercer JG, Ozanne SE.",
149                        pubMedID: "20472140",
150                        comments: "Not published yet",
151                        DOI: "unknown"
152                )
153                .save();
154
155                def publication2 = new Publication(
156                        title: "Induction of regulatory T cells decreases adipose inflammation and alleviates insulin resistance in ob/ob mice",
157                        authorsList: "Ilan Y, Maron R, Tukpah AM, Maioli TU, Murugaiyan G, Yang K, Wu HY, Weiner HL.",
158                        pubMedID: "20445103",
159                        comments: "",
160                        DOI: ""
161                )
162                .save();
163
164                // Add example mouse study
165                println ".adding NuGO PPS3 leptin example study..."
166                def mouseStudy = new Study(
167                        template: studyTemplate,
168                        title:"NuGO PPS3 mouse study leptin module",
169                        code:"PPS3_leptin_module",
170                        researchQuestion:"Leptin etc.",
171                        ecCode:"2007117.c",
172                        startDate: Date.parse('yyyy-MM-dd','2008-01-02'),
173                        owner: owner,
174                        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                // Add example human study
371                println ".adding NuGO PPSH example study..."
372
373                def humanStudy = new Study(
374                        template: studyTemplate,
375                        title:"NuGO PPS human study",
376                        code:"PPSH",
377                        researchQuestion:"How much are fasting plasma and urine metabolite levels affected by prolonged fasting ?",
378                        description:"Human study",
379                        ecCode:"unknown",
380                        startDate: Date.parse('yyyy-MM-dd','2008-01-14'),
381                        owner: owner,
382                        writers: [otherUser]
383                )
384                .setFieldValue( 'Description', "Human study performed at RRI; centres involved: RRI, IFR, TUM, Maastricht U." )
385                .with { if (!validate()) { errors.each { println it} } else save()}
386
387                def rootGroup = new EventGroup(name: 'Root group');
388
389                def fastingEvent = new Event(
390                        startTime: 3 * 24 * 3600 + 22 * 3600,
391                        endTime: 3 * 24 * 3600 + 30 * 3600,
392                        template: fastingTreatmentTemplate)
393                .setFieldValue('Fasting period','8h');
394
395                def bloodSamplingEventBefore = new SamplingEvent(
396                        startTime: 0,
397                        template: bloodSamplingEventTemplate,
398                        sampleTemplate: humanBloodSampleTemplate)
399                .setFieldValue('Sample volume',4.5F);
400
401                def bloodSamplingEventAfter = new SamplingEvent(
402                        startTime: 3 * 24 * 3600 + 30 * 3600,
403                        template: bloodSamplingEventTemplate,
404                        sampleTemplate: humanBloodSampleTemplate)
405                .setFieldValue('Sample volume',4.5F);
406
407                rootGroup.addToEvents fastingEvent
408                rootGroup.addToSamplingEvents bloodSamplingEventBefore
409                rootGroup.addToSamplingEvents bloodSamplingEventAfter
410                rootGroup.save()
411
412                humanStudy.addToEvents(fastingEvent)
413                humanStudy.addToSamplingEvents(bloodSamplingEventBefore)
414                humanStudy.addToSamplingEvents(bloodSamplingEventAfter)
415                humanStudy.addToEventGroups rootGroup
416
417                humanStudy.save()               
418
419                def y = 1
420                11.times {
421                        def currentSubject = new Subject(
422                                name: "" + y++,
423                                species: humanTerm,
424                                template: humanTemplate
425                        )
426                        .setFieldValue("Gender", (Math.random() > 0.5) ? "Male" : "Female")
427                        //.setFieldValue("DOB", new java.text.SimpleDateFormat("dd-mm-yy").parse("01-02-19" + (10 + (int) (Math.random() * 80))))
428                        .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))) ))
429                        .setFieldValue("Age", 30)
430                        .setFieldValue("Height", Math.random() * 2F)
431                        .setFieldValue("Weight", Math.random() * 150F)
432                        .setFieldValue("BMI", 20 + Math.random() * 10F)
433
434                        humanStudy.addToSubjects(currentSubject)
435                        currentSubject.with { if (!validate()) { errors.each { println it} } else save()}
436
437                        rootGroup.addToSubjects currentSubject
438                        rootGroup.save()
439
440                        def currentSample = new Sample(
441                                name: currentSubject.name + '_B',
442                                material: bloodTerm,
443                                template: humanBloodSampleTemplate,
444                                parentSubject: currentSubject,
445                                parentEvent: bloodSamplingEventBefore
446                        );
447
448                        humanStudy.addToSamples(currentSample)
449                        currentSample.with { if (!validate()) { errors.each { println it} } else save()}
450                        currentSample.setFieldValue( "Text on vial", "T" + (Math.random() * 100L) )
451
452                        currentSample = new Sample(
453                                name: currentSubject.name + '_A',
454                                material: bloodTerm,
455                                template: humanBloodSampleTemplate,
456                                parentSubject: currentSubject,
457                                parentEvent: bloodSamplingEventAfter
458                        );
459
460                        humanStudy.addToSamples(currentSample)
461                        currentSample.with { if (!validate()) { errors.each { println it} } else save()}
462                        currentSample.setFieldValue( "Text on vial", "T" + (Math.random() * 100L) )
463                }
464
465                println ".adding persons and saving PPSH study..."
466                // Add persons to study
467                def studyperson3 = new StudyPerson( person: person1, role: role2 )
468                humanStudy
469                .addToPersons( studyperson3 )
470                .addToPublications( publication2 )
471                .with { if (!validate()) { errors.each { println it} } else save()}
472
473                println ".adding assay references to mouse example study..."
474
475                def samURL = GrailsUtil.environment == GrailsApplication.ENV_PRODUCTION ? 'http://sam.nmcdsp.org' : 'http://localhost:8182/sam'
476                def nmcdspURL = GrailsUtil.environment == GrailsApplication.ENV_PRODUCTION ? 'http://nmcdsp.nmcdsp.org' : 'http://localhost:8183/nmcdsp'
477
478                // Add SAM assay reference
479                def clinicalModule = new AssayModule(
480                        name: 'SAM module for clinical data',
481                        platform: 'clinical measurements',
482                        url: samURL
483                ).with { if (!validate()) { errors.each { println it} } else save()}
484
485                // Add metabolomics assay reference
486                def metabolomicsModule = new AssayModule(
487                        name: 'Metabolomics module',
488                        platform: 'GCMS/LCMS',
489                        url: nmcdspURL
490                ).with { if (!validate()) { errors.each { println it} } else save()}
491
492                def lipidAssayRef = new Assay(
493                        name: 'Lipid profiling',
494                        template: ccAssayTemplate,
495                        module: clinicalModule,
496                        externalAssayID: 'PPS3_SAM'
497                )
498
499                def metAssayRef = new Assay(
500                        name: 'Lipidomics profile',
501                        template: metAssayTemplate,
502                        module: metabolomicsModule,
503                        externalAssayID: 'PPS3_Lipidomics'
504                )
505                .setFieldValue('Spectrometry technique','LC/MS')
506
507                mouseStudy.samples*.each {
508                        lipidAssayRef.addToSamples(it)
509                        metAssayRef.addToSamples(it)
510                }
511
512                mouseStudy.addToAssays(lipidAssayRef);
513                mouseStudy.addToAssays(metAssayRef);
514                mouseStudy.save()
515
516                println ".adding assay references to human example study..."
517
518                def  glucoseAssayBRef = new Assay(
519                        name: 'Glucose assay before',
520                        template: ccAssayTemplate,
521                        module: clinicalModule,
522                        externalAssayID: 'PPSH-Glu-B'
523                )
524
525                def  glucoseAssayARef = new Assay(
526                        name: 'Glucose assay after',
527                        template: ccAssayTemplate,
528                        module: clinicalModule,
529                        externalAssayID: 'PPSH-Glu-A'
530                )
531
532                def metAssayRefB = new Assay(
533                        name: 'Lipidomics profile before',
534                        template: metAssayTemplate,
535                        module: metabolomicsModule,
536                        externalAssayID: 'PPSH_Lipidomics_start'
537                )
538                .setFieldValue('Spectrometry technique','GC/MS')
539
540                def metAssayRefA = new Assay(
541                        name: 'Lipidomics profile after',
542                        template: metAssayTemplate,
543                        module: metabolomicsModule,
544                        externalAssayID: 'PPSH_Lipidomics_end'
545                )
546                .setFieldValue('Spectrometry technique','GC/MS')
547
548                humanStudy.samples*.each {
549                        if (it.parentEvent.startTime == 0) {
550                                glucoseAssayBRef.addToSamples(it)
551                                metAssayRefB.addToSamples(it)
552                        }
553                        else {
554                                glucoseAssayARef.addToSamples(it)
555                                metAssayRefA.addToSamples(it)
556                        }
557                }
558
559
560                humanStudy.addToAssays(glucoseAssayARef)
561                humanStudy.addToAssays(glucoseAssayBRef)
562                humanStudy.addToAssays(metAssayRefA)
563                humanStudy.addToAssays(metAssayRefB)
564                humanStudy.save()
565
566        }
567
568}
Note: See TracBrowser for help on using the repository browser.