extensions/no.uib.cbu.base.magetabexport/trunk/src/main/java/no/uib/cbu/base/magetabexport/SDRFCreator.java

Code
Comments
Other
Rev Date Author Line
1474 29 Nov 11 pawels 1 /*******************************************************************************
1474 29 Nov 11 pawels 2  * Copyright (c) 2011 The Norwegian Microarray Consortium.
1474 29 Nov 11 pawels 3  * All rights reserved. This program and the accompanying materials
1474 29 Nov 11 pawels 4  * are made available under the terms of the GNU Public License v3.0
1474 29 Nov 11 pawels 5  * which accompanies this distribution, and is available at
1474 29 Nov 11 pawels 6  * http://www.gnu.org/licenses/gpl-3.0.html
1474 29 Nov 11 pawels 7  * 
1474 29 Nov 11 pawels 8  * Contributors:
1474 29 Nov 11 pawels 9  *     The Norwegian Microarray Consortium - initial API and implementation
1474 29 Nov 11 pawels 10  ******************************************************************************/
1474 29 Nov 11 pawels 11 package no.uib.cbu.base.magetabexport;
1474 29 Nov 11 pawels 12
1474 29 Nov 11 pawels 13 import java.util.ArrayList;
1474 29 Nov 11 pawels 14 import java.util.Arrays;
1474 29 Nov 11 pawels 15 import java.util.List;
1474 29 Nov 11 pawels 16
1474 29 Nov 11 pawels 17 import net.sf.basedb.core.Annotatable;
1474 29 Nov 11 pawels 18 import net.sf.basedb.core.AnnotationType;
1474 29 Nov 11 pawels 19 import net.sf.basedb.core.ArrayDesign;
1474 29 Nov 11 pawels 20 import net.sf.basedb.core.BioAssaySet;
1474 29 Nov 11 pawels 21 import net.sf.basedb.core.BioMaterialEvent;
1474 29 Nov 11 pawels 22 import net.sf.basedb.core.BioSource;
1474 29 Nov 11 pawels 23 import net.sf.basedb.core.DataFileType;
1474 29 Nov 11 pawels 24 import net.sf.basedb.core.DbControl;
1474 29 Nov 11 pawels 25 import net.sf.basedb.core.Experiment;
1474 29 Nov 11 pawels 26 import net.sf.basedb.core.Extract;
1474 29 Nov 11 pawels 27 import net.sf.basedb.core.FileSetMember;
1474 29 Nov 11 pawels 28 import net.sf.basedb.core.Hybridization;
1474 29 Nov 11 pawels 29 import net.sf.basedb.core.Include;
1474 29 Nov 11 pawels 30 import net.sf.basedb.core.ItemQuery;
1474 29 Nov 11 pawels 31 import net.sf.basedb.core.ItemResultList;
1474 29 Nov 11 pawels 32 import net.sf.basedb.core.LabeledExtract;
1474 29 Nov 11 pawels 33 import net.sf.basedb.core.MeasuredBioMaterial;
1474 29 Nov 11 pawels 34 import net.sf.basedb.core.Protocol;
1474 29 Nov 11 pawels 35 import net.sf.basedb.core.RawBioAssay;
1474 29 Nov 11 pawels 36 import net.sf.basedb.core.Sample;
1474 29 Nov 11 pawels 37 import net.sf.basedb.core.Scan;
1474 29 Nov 11 pawels 38 import net.sf.basedb.core.snapshot.AnnotationSnapshot;
1474 29 Nov 11 pawels 39 import net.sf.basedb.core.snapshot.AnnotationTypeFilter;
1474 29 Nov 11 pawels 40 import net.sf.basedb.core.snapshot.SnapshotManager;
1474 29 Nov 11 pawels 41 import no.uib.cbu.base.magetabexport.ProtocolInfo.TYPE;
1474 29 Nov 11 pawels 42
1474 29 Nov 11 pawels 43 public class SDRFCreator {
1474 29 Nov 11 pawels 44   
1474 29 Nov 11 pawels 45   /**
1474 29 Nov 11 pawels 46    * Experiment to create SDRF for
1474 29 Nov 11 pawels 47    */
1474 29 Nov 11 pawels 48   private Experiment experiment;
1474 29 Nov 11 pawels 49   /**
1474 29 Nov 11 pawels 50    * ArrayExpress accession annotation for array design and protocols
1474 29 Nov 11 pawels 51    */
1474 29 Nov 11 pawels 52   private AnnotationType aeRefAT;
1474 29 Nov 11 pawels 53   /**
1474 29 Nov 11 pawels 54    * Material type annotation for biomaterials 
1474 29 Nov 11 pawels 55    */
1474 29 Nov 11 pawels 56   private AnnotationType materialTypeAT;
1474 29 Nov 11 pawels 57   /**
1474 29 Nov 11 pawels 58    * List of file types that should be reported in SDRF as Array Data Files
1474 29 Nov 11 pawels 59    */
1474 29 Nov 11 pawels 60   private List<DataFileType> dataFileTypes;
1474 29 Nov 11 pawels 61   
1474 29 Nov 11 pawels 62   private SnapshotManager snapMan;
1474 29 Nov 11 pawels 63   
1474 29 Nov 11 pawels 64   public void setArrayExpressRefAnnotationType(AnnotationType aeRefAT) {
1474 29 Nov 11 pawels 65     this.aeRefAT = aeRefAT;
1474 29 Nov 11 pawels 66   }
1474 29 Nov 11 pawels 67
1474 29 Nov 11 pawels 68   public void setMaterialTypeAnnotationType(AnnotationType materialTypeAT) {
1474 29 Nov 11 pawels 69     this.materialTypeAT = materialTypeAT;
1474 29 Nov 11 pawels 70   }
1474 29 Nov 11 pawels 71
1474 29 Nov 11 pawels 72   public void setArrayDataFileTypes(List<DataFileType> dataFileTypes) {
1474 29 Nov 11 pawels 73     this.dataFileTypes = dataFileTypes;
1474 29 Nov 11 pawels 74   }
1474 29 Nov 11 pawels 75
1474 29 Nov 11 pawels 76   public SDRFCreator(Experiment exp) {
1474 29 Nov 11 pawels 77     experiment = exp;
1474 29 Nov 11 pawels 78     snapMan = new SnapshotManager();
1474 29 Nov 11 pawels 79   }
1474 29 Nov 11 pawels 80
1474 29 Nov 11 pawels 81   
1474 29 Nov 11 pawels 82   public SDRF getSDRFForExperiment(DbControl dc) throws MageTabException {
1474 29 Nov 11 pawels 83     
1474 29 Nov 11 pawels 84     SDRF sdrf = new SDRF();
1474 29 Nov 11 pawels 85
1474 29 Nov 11 pawels 86     ItemQuery<AnnotationType> factorsQ = experiment.getExperimentalFactors();
1474 29 Nov 11 pawels 87     factorsQ.include(Include.ALL);
1474 29 Nov 11 pawels 88     ItemResultList<AnnotationType> factors = factorsQ.list(dc);
1474 29 Nov 11 pawels 89     if (factors == null || factors.isEmpty()) {
1474 29 Nov 11 pawels 90       throw new MageTabException("No experimental factors found");
1474 29 Nov 11 pawels 91     }
1474 29 Nov 11 pawels 92     
1474 29 Nov 11 pawels 93     BioAssaySet bioAssaySet = null;
1474 29 Nov 11 pawels 94     ItemQuery<BioAssaySet> basQ = experiment.getBioAssaySets();
1474 29 Nov 11 pawels 95     basQ.include(Include.ALL);
1474 29 Nov 11 pawels 96     List<BioAssaySet> bass = basQ.list(dc);
1474 29 Nov 11 pawels 97     if (bass != null && !bass.isEmpty()) {
1474 29 Nov 11 pawels 98
1474 29 Nov 11 pawels 99       // TODO let the user choose the bioassayset when executing the plugin
1474 29 Nov 11 pawels 100       
1474 29 Nov 11 pawels 101       bioAssaySet = bass.get(0);
1474 29 Nov 11 pawels 102     }
1474 29 Nov 11 pawels 103     
1474 29 Nov 11 pawels 104     String bioAssaySetMatrixFile = "processed_data_file"; 
1474 29 Nov 11 pawels 105     if (bioAssaySet != null && bioAssaySet.hasFileSet()) {        
1474 29 Nov 11 pawels 106         DataFileType dft = DataFileType.getByExternalId(dc, DataFileType.BASEFILE_MATRIX);
1474 29 Nov 11 pawels 107         if (bioAssaySet.getFileSet().hasMember(dft)) {
1474 29 Nov 11 pawels 108           FileSetMember m = bioAssaySet.getFileSet().getMember(dft);
1474 29 Nov 11 pawels 109           bioAssaySetMatrixFile = m.getFile().getName();
1474 29 Nov 11 pawels 110         }
1474 29 Nov 11 pawels 111     }
1474 29 Nov 11 pawels 112     
1474 29 Nov 11 pawels 113     // Assumption is made here that all the rawbioassays in the experiment should be exported,
1474 29 Nov 11 pawels 114     // and that the RawBioAssaySet selected above contains all of them. The basefile_matrix file
1474 29 Nov 11 pawels 115     // linked to it should have the data for all rbas.
1474 29 Nov 11 pawels 116     
1474 29 Nov 11 pawels 117     ItemQuery<RawBioAssay> rbaQ = experiment.getRawBioAssays();
1474 29 Nov 11 pawels 118     rbaQ.include(Include.ALL);
1474 29 Nov 11 pawels 119     ItemResultList<RawBioAssay> rbas = rbaQ.list(dc);
1474 29 Nov 11 pawels 120     for (RawBioAssay rba : rbas) {
1474 29 Nov 11 pawels 121       
1474 29 Nov 11 pawels 122       List<SDRFEntry> ses = getSDRFEntriesForRBA(rba, factors, dc);
1474 29 Nov 11 pawels 123       for (SDRFEntry se : ses) {
1474 29 Nov 11 pawels 124                 
1474 29 Nov 11 pawels 125         // set derived file & data processing protocol
1474 29 Nov 11 pawels 126         ProtocolInfo pi = new ProtocolInfo(ProtocolInfo.TYPE.DATA_PROCESSING, "BASE:data_processing_protocol", null);
1474 29 Nov 11 pawels 127         ItemInfo item = new ItemInfo(ItemInfo.TYPE.DERIVED_ARRAY_DATA_FILE, bioAssaySetMatrixFile);
1474 29 Nov 11 pawels 128         item.setProtocol(pi);
1474 29 Nov 11 pawels 129         se.addItem(item);
1474 29 Nov 11 pawels 130
1474 29 Nov 11 pawels 131         sdrf.addSDRFEntry(se);
1474 29 Nov 11 pawels 132       }
1474 29 Nov 11 pawels 133     }
1474 29 Nov 11 pawels 134     
1474 29 Nov 11 pawels 135     return sdrf;
1474 29 Nov 11 pawels 136   }
1474 29 Nov 11 pawels 137
1474 29 Nov 11 pawels 138   private List<SDRFEntry> getSDRFEntriesForRBA(RawBioAssay rba, List<AnnotationType> factors, DbControl dc)  
1474 29 Nov 11 pawels 139   throws MageTabException {
1474 29 Nov 11 pawels 140     
1474 29 Nov 11 pawels 141     if (rba == null) { return Arrays.asList(new SDRFEntry()); }
1474 29 Nov 11 pawels 142     
1474 29 Nov 11 pawels 143     List<SDRFEntry> sdrfEs = new ArrayList<SDRFEntry>();
1474 29 Nov 11 pawels 144     
1474 29 Nov 11 pawels 145     for (DataFileType dft : dataFileTypes) {
1474 29 Nov 11 pawels 146       
1474 29 Nov 11 pawels 147       
1474 29 Nov 11 pawels 148       /*
1474 29 Nov 11 pawels 149        * TODO 
1474 29 Nov 11 pawels 150        * Check if for 2 rawdata files per sample, two lines should be generated or two columns.
1474 29 Nov 11 pawels 151        * Currently separate lines are created.
1474 29 Nov 11 pawels 152        * 
1474 29 Nov 11 pawels 153        */
1474 29 Nov 11 pawels 154       
1474 29 Nov 11 pawels 155       List<SDRFEntry> ses = getSDRFEntriesForScan(rba.getScan(), rba.getArrayNum(), dc);
1474 29 Nov 11 pawels 156       
1474 29 Nov 11 pawels 157       for (SDRFEntry se : ses) {
1474 29 Nov 11 pawels 158         // set the array/raw data file
1474 29 Nov 11 pawels 159         if (rba.hasFileSet()) {
1474 29 Nov 11 pawels 160           FileSetMember member = rba.getFileSet().getMember(dft);
1474 29 Nov 11 pawels 161           if (member != null) {
1474 29 Nov 11 pawels 162             ItemInfo item = new ItemInfo(ItemInfo.TYPE.ARRAY_DATA_FILE, member.getFile().getName());
1474 29 Nov 11 pawels 163             fillCharacteristicsForItem(item, rba, dc);
1474 29 Nov 11 pawels 164             se.addItem(item);
1474 29 Nov 11 pawels 165           }
1474 29 Nov 11 pawels 166         }
1474 29 Nov 11 pawels 167         
1474 29 Nov 11 pawels 168         if (rba.hasArrayDesign()) {
1474 29 Nov 11 pawels 169           ArrayDesign design = rba.getArrayDesign();
1474 29 Nov 11 pawels 170           String arrayRef = getValueForAnnotationType(design, aeRefAT, dc); 
1474 29 Nov 11 pawels 171           if (arrayRef == null) {
1474 29 Nov 11 pawels 172             arrayRef = "BASE:" + design.getName();
1474 29 Nov 11 pawels 173           }          
1474 29 Nov 11 pawels 174           se.setArrayDesign(arrayRef);
1474 29 Nov 11 pawels 175         }
1474 29 Nov 11 pawels 176         
1590 20 Mar 12 pawels 177         
1474 29 Nov 11 pawels 178         // add experimental factors
1474 29 Nov 11 pawels 179         if (!rba.isAnnotated()) {
1474 29 Nov 11 pawels 180           throw new MageTabException("raw bioassay ["+rba.getName()+"] is not annotated. "+
1474 29 Nov 11 pawels 181                         "Can't retrieve experimental factor(s).");
1474 29 Nov 11 pawels 182         }
1590 20 Mar 12 pawels 183         
1474 29 Nov 11 pawels 184         for (AnnotationType at : factors) {
1590 20 Mar 12 pawels 185           
1474 29 Nov 11 pawels 186           List<AnnotationSnapshot> as = snapMan.findAnnotations(dc, rba, new AnnotationTypeFilter(at), true);
1590 20 Mar 12 pawels 187           
1474 29 Nov 11 pawels 188           if (as == null || as.isEmpty()) {
1474 29 Nov 11 pawels 189             throw new MageTabException("raw bioassay ["+rba.getName()+"] is not annotated with "+
1474 29 Nov 11 pawels 190                 "an experimental factor ["+at.getName()+"].");
1590 20 Mar 12 pawels 191           } 
1590 20 Mar 12 pawels 192           else if (as.size() == 1) {        // one-channel experiment
1590 20 Mar 12 pawels 193             AnnotationSnapshot a = as.get(0);
1590 20 Mar 12 pawels 194             se.addExperimentalFactor(at.getName(), getValueForAnnotation(a));
1590 20 Mar 12 pawels 195           } 
1590 20 Mar 12 pawels 196           else if (as.size() == 2) {        // two-channel experiment
1590 20 Mar 12 pawels 197             // find the correct annotation looking at sample annotation of this SDRFEntry
1590 20 Mar 12 pawels 198             for (AnnotationSnapshot a : as) {    
1590 20 Mar 12 pawels 199               String ann = getValueForAnnotation(a);
1590 20 Mar 12 pawels 200               ItemInfo ii = se.getItems().get(ItemInfo.TYPE.SAMPLE);
1590 20 Mar 12 pawels 201               if (ii != null && ii.getAllCharacteristicsNames().contains(at.getName())) {
1590 20 Mar 12 pawels 202                 if (ann.equals(ii.getCharacteristicValue(at.getName()))) {
1590 20 Mar 12 pawels 203                   se.addExperimentalFactor(at.getName(), ann);
1590 20 Mar 12 pawels 204                   break;
1590 20 Mar 12 pawels 205                 }
1590 20 Mar 12 pawels 206               }
1590 20 Mar 12 pawels 207             }
1590 20 Mar 12 pawels 208           } else { 
1474 29 Nov 11 pawels 209             throw new MageTabException("raw bioassay ["+rba.getName()+"] has multiple annotations "+
1474 29 Nov 11 pawels 210                 "of type ["+at.getName()+"].");
1474 29 Nov 11 pawels 211           }
1590 20 Mar 12 pawels 212           
1590 20 Mar 12 pawels 213           
1474 29 Nov 11 pawels 214         }
1474 29 Nov 11 pawels 215     
1474 29 Nov 11 pawels 216       }
1474 29 Nov 11 pawels 217       sdrfEs.addAll(ses);
1474 29 Nov 11 pawels 218     }
1474 29 Nov 11 pawels 219     
1474 29 Nov 11 pawels 220     return sdrfEs;
1474 29 Nov 11 pawels 221   }
1474 29 Nov 11 pawels 222
1474 29 Nov 11 pawels 223   
1474 29 Nov 11 pawels 224   private List<SDRFEntry> getSDRFEntriesForScan(Scan scan, int arrayNum, DbControl dc) {
1474 29 Nov 11 pawels 225     
1474 29 Nov 11 pawels 226     if (scan == null) { return Arrays.asList(new SDRFEntry()); }
1474 29 Nov 11 pawels 227     
1474 29 Nov 11 pawels 228     List<SDRFEntry> sdrfEs = 
1474 29 Nov 11 pawels 229       getSDRFEntriesForHybridization(scan.getHybridization(), arrayNum, dc);
1474 29 Nov 11 pawels 230     
1474 29 Nov 11 pawels 231     for (SDRFEntry se : sdrfEs) {
1474 29 Nov 11 pawels 232       
1474 29 Nov 11 pawels 233       ItemInfo item = new ItemInfo(ItemInfo.TYPE.SCAN, scan.getName());
1474 29 Nov 11 pawels 234       fillCharacteristicsForItem(item, scan, dc);
1474 29 Nov 11 pawels 235       ProtocolInfo pInfo = createProtocolInfo(scan.getProtocol(), ProtocolInfo.TYPE.SCANNING, dc);
1474 29 Nov 11 pawels 236       item.setProtocol(pInfo);
1474 29 Nov 11 pawels 237       se.addItem(item);
1474 29 Nov 11 pawels 238     }
1474 29 Nov 11 pawels 239     
1474 29 Nov 11 pawels 240     return sdrfEs;
1474 29 Nov 11 pawels 241   }
1474 29 Nov 11 pawels 242
1474 29 Nov 11 pawels 243   
1474 29 Nov 11 pawels 244   private List<SDRFEntry> getSDRFEntriesForHybridization(Hybridization hyb, int arrayNum, DbControl dc) {
1474 29 Nov 11 pawels 245     
1474 29 Nov 11 pawels 246     if (hyb == null) { return Arrays.asList(new SDRFEntry()); }
1474 29 Nov 11 pawels 247     
1474 29 Nov 11 pawels 248     ItemQuery<LabeledExtract> q = hyb.getLabeledExtracts(arrayNum);
1474 29 Nov 11 pawels 249     q.include(Include.ALL);
1474 29 Nov 11 pawels 250     ItemResultList<LabeledExtract> lextracts = q.list(dc);
1474 29 Nov 11 pawels 251     
1474 29 Nov 11 pawels 252     List<SDRFEntry> sdrfEs = new ArrayList<SDRFEntry>();
1474 29 Nov 11 pawels 253     for (LabeledExtract le : lextracts) {
1474 29 Nov 11 pawels 254       //List<SDRFEntry> ses = getSDRFEntriesForLabeledExtract(le, dc);
1474 29 Nov 11 pawels 255       List<SDRFEntry> ses = getSDRFEntriesForMeasuredBioMaterial(le, dc);
1474 29 Nov 11 pawels 256       for (SDRFEntry se : ses) {
1474 29 Nov 11 pawels 257         ItemInfo item = new ItemInfo(ItemInfo.TYPE.HYBRIDIZATION, hyb.getName());
1474 29 Nov 11 pawels 258         fillCharacteristicsForItem(item, hyb, dc);
1474 29 Nov 11 pawels 259         ProtocolInfo pInfo = createProtocolInfo(hyb.getProtocol(), ProtocolInfo.TYPE.HYBRIDIZATION, dc);
1474 29 Nov 11 pawels 260         item.setProtocol(pInfo);
1474 29 Nov 11 pawels 261         se.addItem(item);
1474 29 Nov 11 pawels 262       }
1474 29 Nov 11 pawels 263       sdrfEs.addAll(ses);
1474 29 Nov 11 pawels 264     }
1474 29 Nov 11 pawels 265     
1474 29 Nov 11 pawels 266     return sdrfEs;
1474 29 Nov 11 pawels 267   }
1474 29 Nov 11 pawels 268   
1474 29 Nov 11 pawels 269   
1474 29 Nov 11 pawels 270   private List<SDRFEntry> getSDRFEntriesForMeasuredBioMaterial(MeasuredBioMaterial mbm, DbControl dc) {
1474 29 Nov 11 pawels 271     
1474 29 Nov 11 pawels 272     if (mbm == null) { return Arrays.asList(new SDRFEntry()); }
1474 29 Nov 11 pawels 273   
1474 29 Nov 11 pawels 274     // set correct item and protocol types
1474 29 Nov 11 pawels 275     ItemInfo.TYPE iType = null;
1474 29 Nov 11 pawels 276     ProtocolInfo.TYPE pType = null;
1474 29 Nov 11 pawels 277     if (mbm instanceof LabeledExtract) {
1474 29 Nov 11 pawels 278       iType = mbm.isPooled() ? ItemInfo.TYPE.POOLED_LABELED_EXTRACT : ItemInfo.TYPE.LABELED_EXTRACT;
1474 29 Nov 11 pawels 279       pType = mbm.isPooled() ? ProtocolInfo.TYPE.POOLING : ProtocolInfo.TYPE.LABELING;
1474 29 Nov 11 pawels 280     } else if (mbm instanceof Extract) {
1474 29 Nov 11 pawels 281       iType = mbm.isPooled() ? ItemInfo.TYPE.POOLED_EXTRACT : ItemInfo.TYPE.EXTRACT;
1474 29 Nov 11 pawels 282       pType = mbm.isPooled() ? ProtocolInfo.TYPE.POOLING : ProtocolInfo.TYPE.EXTRACTION;
1474 29 Nov 11 pawels 283     } else {
1474 29 Nov 11 pawels 284       iType = mbm.isPooled() ? ItemInfo.TYPE.POOLED_SAMPLE : ItemInfo.TYPE.SAMPLE;
1474 29 Nov 11 pawels 285       pType = mbm.isPooled() ? ProtocolInfo.TYPE.POOLING : ProtocolInfo.TYPE.SAMPLING;
1474 29 Nov 11 pawels 286     }  
1474 29 Nov 11 pawels 287
1474 29 Nov 11 pawels 288     List<SDRFEntry> sdrfEs = new ArrayList<SDRFEntry>();
1474 29 Nov 11 pawels 289     if (mbm.isPooled()) {
1474 29 Nov 11 pawels 290       BioMaterialEvent event = mbm.getCreationEvent();
1474 29 Nov 11 pawels 291       ItemQuery<MeasuredBioMaterial> parentsQ = (ItemQuery<MeasuredBioMaterial>) event.getSources();
1474 29 Nov 11 pawels 292       parentsQ.include(Include.ALL);
1474 29 Nov 11 pawels 293       List<MeasuredBioMaterial> parents = parentsQ.list(dc);
1474 29 Nov 11 pawels 294       for (MeasuredBioMaterial m : parents) {
1474 29 Nov 11 pawels 295         sdrfEs.addAll(getSDRFEntriesForMeasuredBioMaterial(m, dc));
1474 29 Nov 11 pawels 296       }
1474 29 Nov 11 pawels 297     } else {
1474 29 Nov 11 pawels 298       if (mbm instanceof LabeledExtract) {
1474 29 Nov 11 pawels 299         sdrfEs = getSDRFEntriesForMeasuredBioMaterial(((LabeledExtract)mbm).getExtract(), dc);
1474 29 Nov 11 pawels 300       } else if (mbm instanceof Extract) {
1474 29 Nov 11 pawels 301         sdrfEs = getSDRFEntriesForMeasuredBioMaterial(((Extract)mbm).getSample(), dc);
1474 29 Nov 11 pawels 302       } else {
1474 29 Nov 11 pawels 303         sdrfEs = getSDRFEntriesForBioSource(((Sample)mbm).getBioSource(), dc);
1474 29 Nov 11 pawels 304       }
1474 29 Nov 11 pawels 305     }
1474 29 Nov 11 pawels 306     
1474 29 Nov 11 pawels 307     // add empty entry in case the item was pooled but had no parents
1474 29 Nov 11 pawels 308     if (sdrfEs.isEmpty()) { sdrfEs.add(new SDRFEntry()); }
1474 29 Nov 11 pawels 309         
1474 29 Nov 11 pawels 310     for (SDRFEntry se : sdrfEs) {
1474 29 Nov 11 pawels 311
1474 29 Nov 11 pawels 312       ItemInfo item = new ItemInfo(iType, mbm.getName());
1474 29 Nov 11 pawels 313       item.setMaterialType(getValueForAnnotationType(mbm, materialTypeAT, dc));
1474 29 Nov 11 pawels 314       fillCharacteristicsForItem(item, mbm, dc);
1474 29 Nov 11 pawels 315       ProtocolInfo pInfo = createProtocolInfo(mbm.getProtocol(), pType, dc);
1474 29 Nov 11 pawels 316       item.setProtocol(pInfo);
1474 29 Nov 11 pawels 317       se.addItem(item);
1474 29 Nov 11 pawels 318       
1474 29 Nov 11 pawels 319       // set label if it is a LabeledExtract
1474 29 Nov 11 pawels 320       if (mbm instanceof LabeledExtract) {
1474 29 Nov 11 pawels 321         LabeledExtract le = (LabeledExtract)mbm;
1474 29 Nov 11 pawels 322         if (le.getLabel() != null) {
1474 29 Nov 11 pawels 323           se.setLabel(le.getLabel().getName());
1474 29 Nov 11 pawels 324         }
1474 29 Nov 11 pawels 325       }
1474 29 Nov 11 pawels 326       
1474 29 Nov 11 pawels 327     }
1474 29 Nov 11 pawels 328     
1474 29 Nov 11 pawels 329     return sdrfEs;
1474 29 Nov 11 pawels 330   }
1474 29 Nov 11 pawels 331   
1474 29 Nov 11 pawels 332   /*
1474 29 Nov 11 pawels 333   private List<SDRFEntry> getSDRFEntriesForLabeledExtract(LabeledExtract lextract, DbControl dc) {
1474 29 Nov 11 pawels 334     
1474 29 Nov 11 pawels 335     if (lextract == null) { return Arrays.asList(new SDRFEntry()); }
1474 29 Nov 11 pawels 336       
1474 29 Nov 11 pawels 337     // initiate sdrfEs in case the item is pooled but has no parents
1474 29 Nov 11 pawels 338     List<SDRFEntry> sdrfEs = Arrays.asList(new SDRFEntry());
1474 29 Nov 11 pawels 339     if (lextract.isPooled()) {
1474 29 Nov 11 pawels 340       BioMaterialEvent event = lextract.getCreationEvent();
1474 29 Nov 11 pawels 341       ItemQuery<LabeledExtract> parentsQ = (ItemQuery<LabeledExtract>)event.getSources();
1474 29 Nov 11 pawels 342       parentsQ.include(Include.ALL);
1474 29 Nov 11 pawels 343       List<LabeledExtract> parents = parentsQ.list(dc);
1474 29 Nov 11 pawels 344       for (LabeledExtract le : parents) {
1474 29 Nov 11 pawels 345         sdrfEs = getSDRFEntriesForLabeledExtract(le, dc);
1474 29 Nov 11 pawels 346       }
1474 29 Nov 11 pawels 347     } else {
1474 29 Nov 11 pawels 348       sdrfEs = getSDRFEntriesForExtract(lextract.getExtract(), dc);
1474 29 Nov 11 pawels 349     }
1474 29 Nov 11 pawels 350     
1474 29 Nov 11 pawels 351     for (SDRFEntry se : sdrfEs) {
1474 29 Nov 11 pawels 352       
1474 29 Nov 11 pawels 353       ItemInfo.TYPE leType = lextract.isPooled() ? ItemInfo.TYPE.POOLED_LABELED_EXTRACT : ItemInfo.TYPE.LABELED_EXTRACT;
1474 29 Nov 11 pawels 354       ItemInfo item = new ItemInfo(leType, lextract.getName());
1474 29 Nov 11 pawels 355       item.setMaterialType(getValueForAnnotationType(lextract, materialTypeAT, dc));
1474 29 Nov 11 pawels 356       fillCharacteristicsForItem(item, lextract, dc);
1474 29 Nov 11 pawels 357       se.addItem(item);
1474 29 Nov 11 pawels 358       
1474 29 Nov 11 pawels 359       if (lextract.getLabel() != null) {
1474 29 Nov 11 pawels 360         se.setLabel(lextract.getLabel().getName());
1474 29 Nov 11 pawels 361       }
1474 29 Nov 11 pawels 362       
1474 29 Nov 11 pawels 363       ProtocolInfo.TYPE pType = lextract.isPooled() ? ProtocolInfo.TYPE.POOLING : ProtocolInfo.TYPE.LABELING;
1474 29 Nov 11 pawels 364       ProtocolInfo pInfo = createProtocolInfo(lextract.getProtocol(), pType, dc);
1474 29 Nov 11 pawels 365       se.addProtocol(pInfo); 
1474 29 Nov 11 pawels 366     }
1474 29 Nov 11 pawels 367     
1474 29 Nov 11 pawels 368     return sdrfEs;
1474 29 Nov 11 pawels 369   }
1474 29 Nov 11 pawels 370
1474 29 Nov 11 pawels 371   
1474 29 Nov 11 pawels 372   private List<SDRFEntry> getSDRFEntriesForExtract(Extract extract, DbControl dc) {
1474 29 Nov 11 pawels 373     
1474 29 Nov 11 pawels 374     if (extract == null) { return Arrays.asList(new SDRFEntry()); }
1474 29 Nov 11 pawels 375     
1474 29 Nov 11 pawels 376     // initiate sdrfEs in case the item is pooled but has no parents
1474 29 Nov 11 pawels 377     List<SDRFEntry> sdrfEs = Arrays.asList(new SDRFEntry());
1474 29 Nov 11 pawels 378     if (extract.isPooled()) {
1474 29 Nov 11 pawels 379       BioMaterialEvent event = extract.getCreationEvent();
1474 29 Nov 11 pawels 380       ItemQuery<Extract> parentsQ = (ItemQuery<Extract>)event.getSources();
1474 29 Nov 11 pawels 381       parentsQ.include(Include.ALL);
1474 29 Nov 11 pawels 382       List<Extract> parents = parentsQ.list(dc);
1474 29 Nov 11 pawels 383       for (Extract e : parents) {
1474 29 Nov 11 pawels 384         sdrfEs = getSDRFEntriesForExtract(e, dc);
1474 29 Nov 11 pawels 385       }
1474 29 Nov 11 pawels 386     } else {
1474 29 Nov 11 pawels 387       sdrfEs = getSDRFEntriesForSample(extract.getSample(), dc);
1474 29 Nov 11 pawels 388     }
1474 29 Nov 11 pawels 389
1474 29 Nov 11 pawels 390     for (SDRFEntry se : sdrfEs) {
1474 29 Nov 11 pawels 391       
1474 29 Nov 11 pawels 392       ItemInfo.TYPE eType = extract.isPooled() ? ItemInfo.TYPE.POOLED_EXTRACT : ItemInfo.TYPE.EXTRACT;
1474 29 Nov 11 pawels 393       ItemInfo item = new ItemInfo(eType, extract.getName());
1474 29 Nov 11 pawels 394       item.setMaterialType(getValueForAnnotationType(extract, materialTypeAT, dc));
1474 29 Nov 11 pawels 395       fillCharacteristicsForItem(item, extract, dc);
1474 29 Nov 11 pawels 396       se.addItem(item);
1474 29 Nov 11 pawels 397       
1474 29 Nov 11 pawels 398       ProtocolInfo.TYPE pType = extract.isPooled() ? ProtocolInfo.TYPE.POOLING : ProtocolInfo.TYPE.EXTRACTION;
1474 29 Nov 11 pawels 399       ProtocolInfo pInfo = createProtocolInfo(extract.getProtocol(), pType, dc);
1474 29 Nov 11 pawels 400       se.addProtocol(pInfo); 
1474 29 Nov 11 pawels 401     }
1474 29 Nov 11 pawels 402     
1474 29 Nov 11 pawels 403     return sdrfEs;
1474 29 Nov 11 pawels 404   }
1474 29 Nov 11 pawels 405
1474 29 Nov 11 pawels 406   
1474 29 Nov 11 pawels 407   private List<SDRFEntry> getSDRFEntriesForSample(Sample sample, DbControl dc) {
1474 29 Nov 11 pawels 408     
1474 29 Nov 11 pawels 409     if (sample == null) { return Arrays.asList(new SDRFEntry()); }
1474 29 Nov 11 pawels 410     
1474 29 Nov 11 pawels 411     // initiate sdrfEs in case the item is pooled but has no parents
1474 29 Nov 11 pawels 412     List<SDRFEntry> sdrfEs = Arrays.asList(new SDRFEntry());
1474 29 Nov 11 pawels 413     if (sample.isPooled()) {
1474 29 Nov 11 pawels 414       BioMaterialEvent event = sample.getCreationEvent();
1474 29 Nov 11 pawels 415       ItemQuery<Sample> parentsQ = (ItemQuery<Sample>)event.getSources();
1474 29 Nov 11 pawels 416       parentsQ.include(Include.ALL);
1474 29 Nov 11 pawels 417       List<Sample> parents = parentsQ.list(dc);
1474 29 Nov 11 pawels 418       for (Sample s : parents) {
1474 29 Nov 11 pawels 419         sdrfEs = getSDRFEntriesForSample(s, dc);
1474 29 Nov 11 pawels 420       }
1474 29 Nov 11 pawels 421     } else {
1474 29 Nov 11 pawels 422       sdrfEs = getSDRFEntriesForBioSource(sample.getBioSource(), dc);
1474 29 Nov 11 pawels 423     }
1474 29 Nov 11 pawels 424     
1474 29 Nov 11 pawels 425     for (SDRFEntry se : sdrfEs) {
1474 29 Nov 11 pawels 426       
1474 29 Nov 11 pawels 427       ItemInfo.TYPE sType = sample.isPooled() ? ItemInfo.TYPE.POOLED_SAMPLE : ItemInfo.TYPE.SAMPLE;
1474 29 Nov 11 pawels 428       ItemInfo item = new ItemInfo(sType, sample.getName());
1474 29 Nov 11 pawels 429       item.setMaterialType(getValueForAnnotationType(sample, materialTypeAT, dc));
1474 29 Nov 11 pawels 430       fillCharacteristicsForItem(item, sample, dc);
1474 29 Nov 11 pawels 431       se.addItem(item);
1474 29 Nov 11 pawels 432       
1474 29 Nov 11 pawels 433       ProtocolInfo.TYPE pType = sample.isPooled() ? ProtocolInfo.TYPE.POOLING : ProtocolInfo.TYPE.SAMPLING;
1474 29 Nov 11 pawels 434       ProtocolInfo pInfo = createProtocolInfo(sample.getProtocol(), pType, dc);
1474 29 Nov 11 pawels 435       se.addProtocol(pInfo); 
1474 29 Nov 11 pawels 436     }
1474 29 Nov 11 pawels 437     
1474 29 Nov 11 pawels 438     return sdrfEs;
1474 29 Nov 11 pawels 439   }
1474 29 Nov 11 pawels 440
1474 29 Nov 11 pawels 441   */
1474 29 Nov 11 pawels 442   private List<SDRFEntry> getSDRFEntriesForBioSource(BioSource bioSource, DbControl dc) {
1474 29 Nov 11 pawels 443       
1474 29 Nov 11 pawels 444     SDRFEntry sdrfE = new SDRFEntry();
1474 29 Nov 11 pawels 445     if (bioSource != null) {
1474 29 Nov 11 pawels 446       ItemInfo item = new ItemInfo(ItemInfo.TYPE.SOURCE, bioSource.getName());
1474 29 Nov 11 pawels 447       item.setMaterialType(getValueForAnnotationType(bioSource, materialTypeAT, dc));
1474 29 Nov 11 pawels 448       fillCharacteristicsForItem(item, bioSource, dc);
1474 29 Nov 11 pawels 449       sdrfE.addItem(item);
1474 29 Nov 11 pawels 450     }
1474 29 Nov 11 pawels 451     return Arrays.asList(sdrfE);
1474 29 Nov 11 pawels 452   }
1474 29 Nov 11 pawels 453
1474 29 Nov 11 pawels 454   private ProtocolInfo createProtocolInfo(Protocol protocol, TYPE protocolType, DbControl dc) {
1474 29 Nov 11 pawels 455     
1474 29 Nov 11 pawels 456     if (protocol == null) {
1474 29 Nov 11 pawels 457       return new ProtocolInfo(protocolType, null, null);
1474 29 Nov 11 pawels 458     } 
1474 29 Nov 11 pawels 459     
1474 29 Nov 11 pawels 460     String pRef = getValueForAnnotationType(protocol, aeRefAT, dc);
1474 29 Nov 11 pawels 461     if (pRef == null) {
1474 29 Nov 11 pawels 462       pRef = "BASE:"+protocol.getName();
1474 29 Nov 11 pawels 463     }
1474 29 Nov 11 pawels 464     
1474 29 Nov 11 pawels 465     ProtocolInfo pInfo = new ProtocolInfo(protocolType, pRef, protocol.getDescription());
1474 29 Nov 11 pawels 466     
1474 29 Nov 11 pawels 467     if (protocol.isAnnotated()) {
1474 29 Nov 11 pawels 468       List<AnnotationSnapshot> annotations = snapMan.findAnnotations(dc, protocol, null, false);
1474 29 Nov 11 pawels 469       for (AnnotationSnapshot a : annotations) {
1474 29 Nov 11 pawels 470         AnnotationType at = a.getAnnotationType(dc);
1474 29 Nov 11 pawels 471         if (!at.isProtocolParameter()) {
1474 29 Nov 11 pawels 472           continue;
1474 29 Nov 11 pawels 473         }
1474 29 Nov 11 pawels 474         String paramName = at.getName();
1474 29 Nov 11 pawels 475         String paramValue = getValueForAnnotation(a);            
1474 29 Nov 11 pawels 476         pInfo.addParameter(paramName, paramValue);
1474 29 Nov 11 pawels 477       }      
1474 29 Nov 11 pawels 478     }
1474 29 Nov 11 pawels 479     
1474 29 Nov 11 pawels 480     return pInfo;
1474 29 Nov 11 pawels 481   
1474 29 Nov 11 pawels 482   }
1474 29 Nov 11 pawels 483
1474 29 Nov 11 pawels 484   
1474 29 Nov 11 pawels 485   private void fillCharacteristicsForItem(ItemInfo item, Annotatable annotatable, DbControl dc) {
1474 29 Nov 11 pawels 486     
1474 29 Nov 11 pawels 487     if (!annotatable.isAnnotated()) { return; }
1474 29 Nov 11 pawels 488     List<AnnotationSnapshot> annotations = snapMan.findAnnotations(dc, annotatable, null, false);
1474 29 Nov 11 pawels 489     
1474 29 Nov 11 pawels 490     for (AnnotationSnapshot a : annotations) {
1474 29 Nov 11 pawels 491       AnnotationType at = a.getAnnotationType(dc);
1474 29 Nov 11 pawels 492       if (at.equals(materialTypeAT)) { continue; }
1474 29 Nov 11 pawels 493       
1474 29 Nov 11 pawels 494       String chName = at.getName();
1474 29 Nov 11 pawels 495       String chValue = getValueForAnnotation(a);
1474 29 Nov 11 pawels 496       
1474 29 Nov 11 pawels 497       // 
1474 29 Nov 11 pawels 498       // where should this information be??
1474 29 Nov 11 pawels 499       //
1474 29 Nov 11 pawels 500       String chSourceRef = null;
1474 29 Nov 11 pawels 501       item.addCharacteristic(chName, chValue, chSourceRef);
1474 29 Nov 11 pawels 502     }
1474 29 Nov 11 pawels 503     
1474 29 Nov 11 pawels 504   }
1474 29 Nov 11 pawels 505
1474 29 Nov 11 pawels 506   /**
1474 29 Nov 11 pawels 507    * Returns a value of the annotation on the annotatable. This method does not support multiplicity of annotations of one type, 
1474 29 Nov 11 pawels 508    * and will only return value(s) only of the first one. NUll is returned if annotatable is not annotated with an annotation of type at.
1474 29 Nov 11 pawels 509    * @param annotatable - annotated item that the annotation should be taken from 
1474 29 Nov 11 pawels 510    * @param at - type of the annotation
1474 29 Nov 11 pawels 511    * @param dc
1474 29 Nov 11 pawels 512    * @return value of the at annotation on annotatable, or null if not annotated
1474 29 Nov 11 pawels 513    */
1474 29 Nov 11 pawels 514   private String getValueForAnnotationType(Annotatable annotatable, AnnotationType at, DbControl dc) {
1474 29 Nov 11 pawels 515     if (annotatable == null || !annotatable.isAnnotated() || at == null) {
1474 29 Nov 11 pawels 516       return null;
1474 29 Nov 11 pawels 517     }
1474 29 Nov 11 pawels 518     
1474 29 Nov 11 pawels 519     AnnotationTypeFilter filter = new AnnotationTypeFilter(at);
1474 29 Nov 11 pawels 520     List<AnnotationSnapshot> as = snapMan.findAnnotations(dc, annotatable, filter, false);
1474 29 Nov 11 pawels 521     if (!as.isEmpty()) {
1474 29 Nov 11 pawels 522       return getValueForAnnotation(as.get(0));
1474 29 Nov 11 pawels 523     }
1474 29 Nov 11 pawels 524     return null;
1474 29 Nov 11 pawels 525   }
1474 29 Nov 11 pawels 526   
1474 29 Nov 11 pawels 527   private String getValueForAnnotation(AnnotationSnapshot a) {
1474 29 Nov 11 pawels 528     //
1474 29 Nov 11 pawels 529     // possible conversion problems ?
1474 29 Nov 11 pawels 530     //
1474 29 Nov 11 pawels 531     List<Object> values = (List<Object>)a.getValues();
1474 29 Nov 11 pawels 532     if (values == null) { return null; }
1474 29 Nov 11 pawels 533     
1474 29 Nov 11 pawels 534     String aValue = "";
1474 29 Nov 11 pawels 535     for (Object v : values) {
1474 29 Nov 11 pawels 536       aValue += v.toString()+";";
1474 29 Nov 11 pawels 537     }
1474 29 Nov 11 pawels 538     
1474 29 Nov 11 pawels 539     return Utils.removeTrailingString(aValue, ";");
1474 29 Nov 11 pawels 540   }
1474 29 Nov 11 pawels 541
1474 29 Nov 11 pawels 542 }