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

Last change on this file since 976 was 976, checked in by robert@…, 10 years ago

Authentication and authorization for studies is added, according to ticket 118

  • 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: 976 $
7 * $Author: robert@isdat.nl $
8 * $Date: 2010-10-21 15:28:04 +0000 (do, 21 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.