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

Last change on this file since 1581 was 1581, checked in by work@…, 9 years ago

set keyword expansion

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