source: trunk/grails-app/conf/BootStrap.groovy @ 235

Last change on this file since 235 was 235, checked in by jahn, 9 years ago

The options that protocol parameters can take on are no longer represented by Strings. Instead we created a wrapper Object (ParameterStringListItem?). In this way we avoid problems with multi-user operations. Such problems can arrive as follows: if options are Strings, there is no difference beteween them and their identifier. When instead lists are wrapped, changing the strings does not affect their identifier, and thus simultanious read/write operations become less error prone.

  • Property svn:keywords set to
    Date
    Author
    Rev
File size: 19.5 KB
Line 
1import org.codehaus.groovy.grails.commons.GrailsApplication
2import grails.util.GrailsUtil
3import dbnp.studycapturing.*
4
5import dbnp.data.Ontology
6import dbnp.data.Term
7import java.text.SimpleDateFormat
8
9/**
10 * Application Bootstrapper
11 * @Author Jeroen Wesbeek
12 * @Since 20091021
13 *
14 * Revision information:
15 * $Rev: 235 $
16 * $Author: jahn $
17 * $Date: 2010-03-05 11:32:58 +0000 (vr, 05 mrt 2010) $
18 */
19class BootStrap {
20        def init = {servletContext ->
21                // define timezone
22                System.setProperty('user.timezone', 'CET')     
23
24                if (GrailsUtil.environment == GrailsApplication.ENV_DEVELOPMENT) {
25                        printf("development bootstrapping....\n\n");
26
27                        // ontologies
28                        def speciesOntology = new Ontology(
29                                name: 'NCBI Taxonomy',
30                                shortName: 'Taxon',
31                                url: 'http://www.obofoundry.org/cgi-bin/detail.cgi?id=ncbi_taxonomy'
32                        ).with { if (!validate()) { errors.each { println it} } else save()}
33
34                        def humanBodyOntology = new Ontology(
35                                name: 'Foundational Model of Anatomy',
36                                shortName: 'HumanBody',
37                                url: 'http://bioportal.bioontology.org/ontologies/39966'
38                        ).with { if (!validate()) { errors.each { println it} } else save()}
39
40                        // terms
41                        def mouseTerm = new Term(
42                                name: 'Mus musculus',
43                                ontology: speciesOntology,
44                                accession: '10090'
45                        ).with { if (!validate()) { errors.each { println it} } else save()}
46                        def humanTerm = new Term(
47                                name: 'Homo sapiens',
48                                ontology: speciesOntology,
49                                accession: '9606'
50                        ).with { if (!validate()) { errors.each { println it} } else save()}
51
52                        def bloodTerm = new Term(
53                                name: 'Portion of blood',
54                                ontology: humanBodyOntology,
55                                accession: '9670'
56                        ).with { if (!validate()) { errors.each { println it} } else save()}
57
58                        def madmaxOntology = new Ontology(
59                                name: 'Madmax ontology',
60                                shortName: 'MDMX',
61                                url: 'madmax.bioinformatics.nl'
62                        ).with { if (!validate()) { errors.each { println it} } else save()}
63
64                        def treatmentTerm = new Term(
65                                name: 'ExperimentalProtocol',
66                                ontology: madmaxOntology,
67                                accession: 'P-MDMXGE-264'
68                        ).with { if (!validate()) { errors.each { println it} } else save()}
69
70                        def dietProtocol = new Protocol(
71                                name: 'Diet treatment Protocol NuGO PPS3 leptin module',
72                                reference: treatmentTerm
73                        ).with { if (!validate()) { errors.each { println it} } else save()}
74
75                        def boostProtocol = new Protocol(
76                                name: 'Boost treatment Protocol NuGO PPS3 leptin module',
77                                reference: treatmentTerm
78                        ).with { if (!validate()) { errors.each { println it} } else save()}
79
80                        def fastingProtocol = new Protocol(
81                                name: 'Fasting',
82                                reference: treatmentTerm
83                        ).with { if (!validate()) { errors.each { println it} } else save()}
84
85
86                        // ParameterStringListItems
87                        def oil10= new ParameterStringListItem(
88                                name: '10% fat (palm oil)'
89                        ).with { if (!validate()) { errors.each { println it} } else save()}
90                        def oil45= new ParameterStringListItem(
91                                name: '45% fat (palm oil)'
92                        ).with { if (!validate()) { errors.each { println it} } else save()}
93                        def vehicle= new ParameterStringListItem(
94                                name: 'Vehicle'
95                        ).with { if (!validate()) { errors.each { println it} } else save()}
96                        def leptin= new ParameterStringListItem(
97                                name: 'Leptin'
98                        ).with { if (!validate()) { errors.each { println it} } else save()}
99
100
101                        dietProtocol
102                        .addToParameters(new ProtocolParameter(
103                                name: 'Diet',
104                                type: ProtocolParameterType.STRINGLIST,
105                                listEntries: [oil10,oil45]))
106                        .save()
107
108                        boostProtocol
109                        .addToParameters(new ProtocolParameter(
110                                name: 'Compound',
111                                type: ProtocolParameterType.STRINGLIST,
112                                listEntries: [vehicle,leptin]))
113                        .save()
114
115                        fastingProtocol
116                        .addToParameters(new ProtocolParameter(
117                                name: 'Fasting period',
118                                type: ProtocolParameterType.STRING))
119                        .save()
120
121
122                        // sampling event protocols
123
124                        def liverSamplingProtocol = new Protocol(
125                                name: 'Liver sampling'
126                        ).with { if (!validate()) { errors.each { println it} } else save()}
127
128                        liverSamplingProtocol
129                        .addToParameters(new ProtocolParameter(
130                                name: 'Sample weight',
131                                unit: 'mg',
132                                type: ProtocolParameterType.FLOAT))
133                        .save()
134
135                        def bloodSamplingProtocol = new Protocol(
136                                name: 'Liver sampling'
137                        ).with { if (!validate()) { errors.each { println it} } else save()}
138
139                        bloodSamplingProtocol
140                        .addToParameters(new ProtocolParameter(
141                                name: 'Sample volume',
142                                unit: 'ml',
143                                type: ProtocolParameterType.FLOAT))
144                        .save()
145
146                        // create system user
147
148                        /*def systemUser = userService.createUser(InstanceGenerator.user(
149                                username: 'system',
150                                pass: 'system',
151                                passConfirm: 'system',
152                                enabled: true
153                        ))*/
154                       
155
156                        def genderField = new TemplateField(
157                                name: 'Gender',type: TemplateFieldType.STRINGLIST,
158                                listEntries: [new TemplateFieldListItem(name:'Male'),new TemplateFieldListItem(name: 'Female')])
159                        .with { if (!validate()) { errors.each { println it} } else save()}
160                                               
161                        def ageField = new TemplateField(
162                                name: 'Age',type: TemplateFieldType.INTEGER)
163                        .with { if (!validate()) { errors.each { println it} } else save()}
164
165                        // Nutritional study template
166
167                        def studyTemplate = new Template(
168                                name: 'Nutritional study', entity: dbnp.studycapturing.Study
169                        ).addToFields(new TemplateField(
170                                name: 'NuGO Code',type: TemplateFieldType.STRING)
171                        ).with { if (!validate()) { errors.each { println it} } else save()}
172
173
174                        // Mouse template
175                        def mouseTemplate = new Template(
176                                name: 'Mouse', entity: dbnp.studycapturing.Subject
177                        ).addToFields(new TemplateField(
178                                name: 'Genotype',type: TemplateFieldType.STRINGLIST,
179                                listEntries: [new TemplateFieldListItem(name:'C57/Bl6j'),new TemplateFieldListItem(name:'wild type')]))
180                        .addToFields(genderField)
181                        .addToFields(ageField)
182                        .addToFields(new TemplateField(
183                                name: 'Cage',type: TemplateFieldType.INTEGER))
184                        .addToFields(new TemplateField(
185                                name: 'Some double', type: TemplateFieldType.DOUBLE))
186                        .addToFields(new TemplateField(
187                                name: 'Some ontology', type: TemplateFieldType.ONTOLOGYTERM))
188                        .with { if (!validate()) { errors.each { println it} } else save()}
189
190                        // Human template
191                        def humanTemplate = new Template(
192                                name: 'Human', entity: dbnp.studycapturing.Subject)
193                        .addToFields(genderField)
194                        .addToFields(ageField)
195                        .addToFields(new TemplateField(
196                                name: 'DOB',type: TemplateFieldType.DATE))
197                        .addToFields(new TemplateField(
198                                name: 'Height',type: TemplateFieldType.DOUBLE))
199                        .addToFields(new TemplateField(
200                                name: 'Weight',type: TemplateFieldType.DOUBLE))
201                        .addToFields(new TemplateField(
202                                name: 'BMI',type: TemplateFieldType.DOUBLE))
203                        .with { if (!validate()) { errors.each { println it} } else save()}
204
205                        //events
206                        def eventDiet = new EventDescription(
207                                name: 'Diet treatment',
208                                description: 'Diet treatment (fat percentage)',
209                                classification: treatmentTerm,
210                                protocol: dietProtocol,
211                                isSamplingEvent: false
212                        ).with { if (!validate()) { errors.each { println it} } else save()}
213
214                        def eventBoost = new EventDescription(
215                                name: 'Boost treatment',
216                                description: 'Boost treatment (leptin or vehicle)',
217                                classification: treatmentTerm,
218                                protocol: boostProtocol,
219                                isSamplingEvent: false
220                        ).with { if (!validate()) { errors.each { println it} } else save()}
221
222                        def samplingEvent = new EventDescription(
223                                name: 'Liver extraction',
224                                description: 'Liver sampling for transcriptomics arrays',
225                                protocol: liverSamplingProtocol,
226                                isSamplingEvent: true
227                        ).with { if (!validate()) { errors.each { println it} } else save()}
228
229                        def bloodSamplingEventDescription = new EventDescription(
230                                name: 'Blood extraction',
231                                description: 'Blood extraction targeted at lipid assays',
232                                protocol: bloodSamplingProtocol,
233                                isSamplingEvent: true
234                        ).with { if (!validate()) { errors.each { println it} } else save()}
235
236
237                        def fastingTreatment = new EventDescription(
238                                name: 'Fasting treatment',
239                                description: 'Fasting Protocol NuGO PPSH',
240                                protocol: fastingProtocol,
241                                isSamplingEvent: false
242                        ).with { if (!validate()) { errors.each { println it} } else save()}
243
244                        println('Adding PPS3 study...')
245
246                        // studies
247                        def exampleStudy = new Study(
248                                template: studyTemplate,
249                                title:"NuGO PPS3 mouse study leptin module",
250                                code:"PPS3_leptin_module",
251                                researchQuestion:"Leptin etc.",
252                                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.",
253                                ecCode:"2007117.c",
254                                startDate: Date.parse('yyyy-MM-dd','2007-12-11')
255                        ).with { if (!validate()) { errors.each { println it} } else save()}
256
257                        def evLF = new Event(
258                                startTime: Date.parse('yyyy-MM-dd','2008-01-07'),
259                                endTime: Date.parse('yyyy-MM-dd','2008-01-14'),
260                                eventDescription: eventDiet,
261                                parameterStringValues: ['Diet':'10% fat (palm oil)']
262                        ).with { if (!validate()) { errors.each { println it} } else save()}
263
264                        def evHF = new Event(
265                                startTime: Date.parse('yyyy-MM-dd','2008-01-07'),
266                                endTime: Date.parse('yyyy-MM-dd','2008-01-14'),
267                                eventDescription: eventDiet,
268                                parameterStringValues: ['Diet':'45% fat (palm oil)']
269                        ).with { if (!validate()) { errors.each { println it} } else save()}
270
271                        def evBV = new Event(
272                                startTime: Date.parse('yyyy-MM-dd','2008-01-07'),
273                                endTime: Date.parse('yyyy-MM-dd','2008-01-14'),
274                                eventDescription: eventBoost,
275                                parameterStringValues: ['Compound':'Vehicle']
276                        ).with { if (!validate()) { errors.each { println it} } else save()}
277
278                        def evBL = new Event(
279                                startTime: Date.parse('yyyy-MM-dd','2008-01-07'),
280                                endTime: Date.parse('yyyy-MM-dd','2008-01-14'),
281                                eventDescription: eventBoost,
282                                parameterStringValues: ['Compound':'Leptin']
283                        ).with { if (!validate()) { errors.each { println it} } else save()}
284
285                        def evLF4 = new Event(
286                                startTime: Date.parse('yyyy-MM-dd','2008-01-07'),
287                                endTime: Date.parse('yyyy-MM-dd','2008-02-04'),
288                                eventDescription: eventDiet,
289                                parameterStringValues: ['Diet':'10% fat (palm oil)']
290                        ).with { if (!validate()) { errors.each { println it} } else save()}
291
292                        def evHF4 = new Event(
293                                startTime: Date.parse('yyyy-MM-dd','2008-01-07'),
294                                endTime: Date.parse('yyyy-MM-dd','2008-02-04'),
295                                eventDescription: eventDiet,
296                                parameterStringValues: ['Diet':'45% fat (palm oil)']
297                        ).with { if (!validate()) { errors.each { println it} } else save()}
298
299                        def evBV4 = new Event(
300                                startTime: Date.parse('yyyy-MM-dd','2008-01-07'),
301                                endTime: Date.parse('yyyy-MM-dd','2008-02-04'),
302                                eventDescription: eventBoost,
303                                parameterStringValues: ['Compound':'Vehicle']
304                        ).with { if (!validate()) { errors.each { println it} } else save()}
305
306                        def evBL4 = new Event(
307                                startTime: Date.parse('yyyy-MM-dd','2008-01-07'),
308                                endTime: Date.parse('yyyy-MM-dd','2008-02-04'),
309                                eventDescription: eventBoost,
310                                parameterStringValues: ['Compound':'Leptin']
311                        ).with { if (!validate()) { errors.each { println it} } else save()}
312
313                        def evS = new SamplingEvent(
314                                        startTime: Date.parse('yyyy-MM-dd','2008-01-14'),
315                                        endTime: Date.parse('yyyy-MM-dd','2008-01-14'),
316                                        eventDescription: samplingEvent,
317                                        parameterFloatValues: ['Sample weight':5F]
318                        ).with { if (!validate()) { errors.each { println it} } else save()}
319
320                        def evS4 = new SamplingEvent(
321                                        startTime: Date.parse('yyyy-MM-dd','2008-02-04'),
322                                        endTime: Date.parse('yyyy-MM-dd','2008-02-04'),
323                                        eventDescription: samplingEvent,
324                                        parameterFloatValues: ['Sample weight':5F]
325                        ).with { if (!validate()) { errors.each { println it} } else save()}
326
327                        // Add events to study
328                        exampleStudy
329                        .addToEvents(evLF)
330                        .addToEvents(evHF)
331                        .addToEvents(evBV)
332                        .addToEvents(evBL)
333                        .addToEvents(evLF4)
334                        .addToEvents(evHF4)
335                        .addToEvents(evBV4)
336                        .addToEvents(evBL4)
337                        .addToSamplingEvents(evS)
338                        .addToSamplingEvents(evS4)
339                        .save()
340
341                        def LFBV1 = new EventGroup(name:"10% fat + vehicle for 1 week")
342                        .addToEvents(evLF)
343                        .addToEvents(evBV)
344                        .with { if (!validate()) { errors.each { println it} } else save()}
345
346                        def LFBL1 = new EventGroup(name:"10% fat + leptin for 1 week")
347                        .addToEvents(evLF)
348                        .addToEvents(evBL)
349                        .with { if (!validate()) { errors.each { println it} } else save()}
350
351                        def HFBV1 = new EventGroup(name:"45% fat + vehicle for 1 week")
352                        .addToEvents(evHF)
353                        .addToEvents(evBV)
354                        .with { if (!validate()) { errors.each { println it} } else save()}
355
356                        def HFBL1 = new EventGroup(name:"45% fat + leptin for 1 week")
357                        .addToEvents(evHF)
358                        .addToEvents(evBL)
359                        .with { if (!validate()) { errors.each { println it} } else save()}
360
361                        def LFBV4 = new EventGroup(name:"10% fat + vehicle for 4 weeks")
362                        .addToEvents(evLF4)
363                        .addToEvents(evBV4)
364                        .with { if (!validate()) { errors.each { println it} } else save()}
365
366                        def LFBL4 = new EventGroup(name:"10% fat + leptin for 4 weeks")
367                        .addToEvents(evLF4)
368                        .addToEvents(evBL4)
369                        .with { if (!validate()) { errors.each { println it} } else save()}
370
371                        def HFBV4 = new EventGroup(name:"45% fat + vehicle for 4 weeks")
372                        .addToEvents(evHF4)
373                        .addToEvents(evBV4)
374                        .with { if (!validate()) { errors.each { println it} } else save()}
375
376                        def HFBL4 = new EventGroup(name:"45% fat + leptin for 4 weeks")
377                        .addToEvents(evHF4)
378                        .addToEvents(evBL4)
379                        .with { if (!validate()) { errors.each { println it} } else save()}
380
381
382
383                        def x=1
384                        80.times {
385                                def currentSubject = new Subject(
386                                        name: "A" + x++,
387                                        species: mouseTerm,
388                                        template: mouseTemplate,
389                                        templateStringFields: ["Genotype" : "C57/Bl6j", "Gender" : "Male"],
390                                        templateIntegerFields: ["Age" : 17, "Cage" : (int)(x/2)]
391                                ).with { if (!validate()) { errors.each { println it} } else save()}
392
393                                exampleStudy.addToSubjects(currentSubject)
394                                .with { if (!validate()) { errors.each { println it} } else save()}
395
396                                // Add subject to appropriate EventGroup
397                                if (x > 70) { HFBL4.addToSubjects(currentSubject).save() }
398                                else if (x > 60) { HFBV4.addToSubjects(currentSubject).save() }
399                                else if (x > 50) { LFBL4.addToSubjects(currentSubject).save() }
400                                else if (x > 40) { LFBV4.addToSubjects(currentSubject).save() }
401                                else if (x > 30) { HFBL1.addToSubjects(currentSubject).save() }
402                                else if (x > 20) { HFBV1.addToSubjects(currentSubject).save() }
403                                else if (x > 10) { LFBL1.addToSubjects(currentSubject).save() }
404                                else             { LFBV1.addToSubjects(currentSubject).save() }
405
406                        }
407
408                        println 'Adding PPSH study'
409
410                        def humanStudy = new Study(
411                                template: studyTemplate,
412                                title:"NuGO PPS human study",
413                                code:"PPSH",
414                                researchQuestion:"How much are fasting plasma and urine metabolite levels affected by prolonged fasting ?",
415                                description:"Human study",
416                                ecCode:"unknown",
417                                startDate: Date.parse('yyyy-MM-dd','2009-01-01')
418                        ).with { if (!validate()) { errors.each { println it} } else save()}
419
420                        def fastingEvent = new Event(
421                                        startTime: Date.parse('yyyy-MM-dd','2008-01-14'),
422                                        endTime: Date.parse('yyyy-MM-dd','2008-01-14'),
423                                        eventDescription: fastingTreatment,
424                                        parameterStringValues: ['Fasting period':'8h']);
425
426                        def bloodSamplingEvent = new SamplingEvent(
427                                        startTime: Date.parse('yyyy-MM-dd','2008-01-14'),
428                                        endTime: Date.parse('yyyy-MM-dd','2008-01-14'),
429                                        eventDescription: bloodSamplingEventDescription,
430                                        parameterFloatValues: ['Sample volume':4.5F]);
431
432                        def rootGroup = new EventGroup(name: 'Root group');
433                        rootGroup.addToEvents fastingEvent
434                        rootGroup.addToEvents bloodSamplingEvent
435                        rootGroup.save()
436
437                        def y=1
438                        11.times {
439                                def currentSubject = new Subject(
440                                        name: "" + y++,
441                                        species: humanTerm,
442                                        template: humanTemplate,
443                                        templateStringFields: [
444                                                "Gender" : (boolean)(x/2) ? "Male" : "Female"
445                                                ],
446                                        templateDateFields: [
447                                                "DOB" : new java.text.SimpleDateFormat("dd-mm-yy").parse("01-02-19"+(10+(int)(Math.random()*80)))
448                                        ],
449                                        templateIntegerFields: [
450                                                "Age" : 30
451                                        ],
452                                        templateDoubleFields: [
453                                                "Height" : Math.random()*2F,
454                                                "Weight" : Math.random()*150F,
455                                                "BMI" : 20 + Math.random()*10F
456                                        ]
457                                ).with { if (!validate()) { errors.each { println it} } else save()}
458
459                                def currentSample = new Sample(
460                                        name: currentSubject.name + '_B',
461                                        material: bloodTerm,
462                                        parentSubject: currentSubject,
463                                        parentEvent: bloodSamplingEvent);
464
465                                rootGroup.addToSubjects currentSubject
466                                rootGroup.save()
467
468                                humanStudy.addToSubjects(currentSubject)
469                                .addToSamples(currentSample)
470                                .addToEventGroups rootGroup
471                                .with { if (!validate()) { errors.each { println it} } else save()}
472                        }
473
474//                        new Study(title:"example",code:"Excode",researchQuestion:"ExRquestion",description:"Exdescription",ecCode:"ExecCode",dateCreated:new Date(),lastUpdated:new Date(),startDate:new Date()).save()
475//                        new Study(title:"testAgain",code:"testcode",researchQuestion:"testRquestion",description:"testdescription",ecCode:"testCode",dateCreated:new Date(),lastUpdated:new Date(),startDate:new Date()).save()
476//                        new Study(title:"Exampletest",code:"Examplecode",researchQuestion:"ExampleRquestion",description:"Exampledescription",ecCode:"ExampleecCode",dateCreated:new Date(),lastUpdated:new Date(),startDate:new Date()).save()
477
478                        // Add clinical data
479
480                        def lipidAssay = new dbnp.clinicaldata.ClinicalAssay(
481                                name: 'Lipid profile',
482                                approved: true
483                        ).with { if (!validate()) { errors.each { println it} } else save()}
484
485                        def ldlMeasurement = new dbnp.clinicaldata.ClinicalMeasurement(
486                                name: 'LDL',
487                                unit: 'mg/dL',
488                                type: dbnp.data.FeatureType.QUANTITATIVE,
489                                referenceValues: '100 mg/dL',
490                                detectableLimit: 250,
491                                isDrug: false, isIntake: true, inSerum: true
492                        ).with { if (!validate()) { errors.each { println it} } else save()}
493
494                        def hdlMeasurement = new dbnp.clinicaldata.ClinicalMeasurement(
495                                name: 'HDL',
496                                unit: 'mg/dL',
497                                type: dbnp.data.FeatureType.QUANTITATIVE,
498                                referenceValues: '50 mg/dL',
499                                detectableLimit: 100,
500                                isDrug: false, isIntake: true, inSerum: true
501                        ).with { if (!validate()) { errors.each { println it} } else save()}
502
503                        lipidAssay.addToMeasurements ldlMeasurement
504                        lipidAssay.addToMeasurements hdlMeasurement
505
506                        def lipidAssayInstance = new dbnp.clinicaldata.ClinicalAssayInstance(
507                                assay: lipidAssay
508                        ).with { if (!validate()) { errors.each { println it} } else save()}
509
510                        humanStudy.samples*.each {
511                                new dbnp.clinicaldata.ClinicalFloatData(
512                                        assay: lipidAssayInstance,
513                                        measurement: ldlMeasurement,
514                                        sample: it.name,
515                                        value: Math.round(Math.random()*ldlMeasurement.detectableLimit)
516                                ).with { if (!validate()) { errors.each { println it} } else save()}
517
518                                new dbnp.clinicaldata.ClinicalFloatData(
519                                        assay: lipidAssayInstance,
520                                        measurement: hdlMeasurement,
521                                        sample: it.name,
522                                        value: Math.round(Math.random()*hdlMeasurement.detectableLimit)
523                                ).with { if (!validate()) { errors.each { println it} } else save()}
524                        }
525
526                        // Add assay to study capture module
527
528                        def clinicalModule = new AssayModule(
529                                name: 'Clinical data',
530                                type: AssayType.CLINICAL_DATA,
531                                platform: 'clinical measurements',
532                                url: 'http://localhost:8080/gscf'
533                        ).with { if (!validate()) { errors.each { println it} } else save()}
534
535                        def lipidAssayRef = new Assay(
536                                name: 'Lipid profiling',
537                                module: clinicalModule,
538                                externalAssayId: lipidAssayInstance.id
539                        ).with { if (!validate()) { errors.each { println it} } else save()}
540
541                        humanStudy.samples*.each {
542                                lipidAssayRef.addToSamples(it)
543                        }
544                        lipidAssayRef.save()
545
546                        humanStudy.addToAssays(lipidAssayRef);
547                        humanStudy.save()
548
549                }
550        }
551
552        def destroy = {
553        }
554} 
Note: See TracBrowser for help on using the repository browser.