@@ -70,11 +70,11 @@ public class CramIterator extends BamIterator {
7070
7171 public final static String KEY_GENERATEMISSINGATTRIBUTES = "gor.driver.cram.generatemissingattributes" ;
7272 public final static String KEY_FASTAREFERENCESOURCE = "gor.driver.cram.fastareferencesource" ;
73- public final static String KEY_REFERENCE_FORCE_FOLDER = "gor.driver.cram.reference.force.folder. " ;
73+ public final static String KEY_REFERENCE_PREFER_FOLDER = "gor.driver.cram.reference.preferfolder " ;
7474
7575 private static final Logger log = LoggerFactory .getLogger (CramIterator .class );
7676
77- private CramFile cramFile ;
77+ private final CramFile cramFile ;
7878 private int [] columns ;
7979 ChromoLookup lookup ;
8080 private String fileName ;
@@ -164,7 +164,7 @@ public void init(GorSession session) {
164164
165165 fileName = cramFile .getFileSource ().getSourceReference ().getUrl ();
166166
167- referenceSource = createReferenceSource (getInitialReferenceFile (), session .getProjectContext ().getRealProjectRoot ());
167+ referenceSource = createReferenceSource (session .getProjectContext ().getRealProjectRoot ());
168168
169169 SeekableBufferedStream cramStream = new SeekableBufferedStream (new StreamSourceSeekableStream (cramFile .getFileSource ()));
170170
@@ -191,14 +191,9 @@ public void init(GorSession session) {
191191 *
192192 * @return initial reference file
193193 */
194- private String getInitialReferenceFile () {
194+ private String getSourceReferenceFile () {
195195 StreamSource ref = cramFile .getReferenceSource ();
196- String referenceFileName = "" ;
197-
198- if (ref != null ) {
199- referenceFileName = ref .getSourceReference ().getUrl ();
200- }
201- return referenceFileName ;
196+ return ref != null ? ref .getSourceReference ().getUrl () : null ;
202197 }
203198
204199 private void closeReferenceFile () {
@@ -211,74 +206,99 @@ private void closeReferenceFile() {
211206 }
212207 }
213208
214- private CRAMReferenceSource createReferenceSource (String ref , String root ) {
209+ private CRAMReferenceSource createReferenceSource (String root ) {
210+ File file = null ;
211+ boolean forceFolder = false ;
212+
213+ String sourceRef = getSourceReferenceFile ();
214+ if (!Strings .isNullOrEmpty (sourceRef )) {
215+ file = new File (sourceRef );
216+ }
217+
218+ if (file == null ) {
219+ file = getReferenceFromReferenceLinkFile ();
220+ }
221+
222+ if (file == null ) {
223+ file = getReferenceFromGorConfig (root );
224+ forceFolder = Boolean .parseBoolean (System .getProperty (KEY_REFERENCE_PREFER_FOLDER , "true" ));
225+ }
215226
216- File file = new File (ref );
217- file = getReferenceFromReferenceLinkFile (file );
218- file = getReferenceFromGorConfig (file , root );
219- file = getReferenceFromGorOptions (file );
227+ if (file == null ) {
228+ file = getReferenceFromGorOptions ();
229+ forceFolder = Boolean .parseBoolean (System .getProperty (KEY_REFERENCE_PREFER_FOLDER , "true" ));
220230
221- if (!file .exists ()) {
222- throw new GorResourceException ("Reference does not exist." , file .toString ());
231+ }
232+ if (file == null || !file .exists ()) {
233+ throw new GorResourceException ("No cram reference found: %s" .formatted (file ), file != null ? file .getPath () : "null" );
223234 }
224235
225236 // This reference should be fasta but we let the htsjdk library decide
226- return createFileReference (file );
237+ return createFileReference (file , forceFolder );
227238 }
228239
229- private File getReferenceFromGorOptions (File file ) {
230- if (!file .exists ()) {
231- String refPath = System .getProperty (KEY_FASTAREFERENCESOURCE , "" );
240+ private File getReferenceFromGorOptions () {
241+ String refPath = System .getProperty (KEY_FASTAREFERENCESOURCE , "" );
232242
233- if (!StringUtils .isEmpty (refPath )) {
234- return new File (refPath );
235- }
243+ if (!StringUtils .isEmpty (refPath )) {
244+ return new File (refPath );
236245 }
237- return file ;
246+
247+ return null ;
238248 }
239249
240- private File getReferenceFromGorConfig (File file , String root ) {
241- if (!file . exists () && ! Strings .isNullOrEmpty (projectCramReferencePath )) {
250+ private File getReferenceFromGorConfig (String root ) {
251+ if (!Strings .isNullOrEmpty (projectCramReferencePath )) {
242252 return PathUtils .resolve (Paths .get (root ), Paths .get (projectCramReferencePath )).toFile ();
243253 }
244- return file ;
254+ return null ;
245255 }
246256
247- private File getReferenceFromReferenceLinkFile (File file ) {
248- if (!file .exists ()) {
249- File refLinkFile = new File (this .fileName + ".ref" );
257+ private File getReferenceFromReferenceLinkFile () {
258+ File refLinkFile = new File (this .fileName + ".ref" );
250259
251- if (refLinkFile .exists ()) {
252- try {
253- List <String > lines = FileUtils .readLines (refLinkFile , Charset .defaultCharset ());
260+ if (refLinkFile .exists ()) {
261+ try {
262+ List <String > lines = FileUtils .readLines (refLinkFile , Charset .defaultCharset ());
254263
255- if (lines .size () > 0 ) {
256- return new File (lines .get (0 ));
257- }
258- } catch (IOException e ) {
259- /*Do Nothing*/
264+ if (lines .size () > 0 ) {
265+ return new File (lines .get (0 ));
260266 }
267+ } catch (IOException e ) {
268+ /*Do Nothing*/
261269 }
262270 }
263- return file ;
271+
272+ return null ;
264273 }
265274
266- private CRAMReferenceSource createFileReference (File refFile ) {
275+ private CRAMReferenceSource createFileReference (File refFile , boolean preferFolder ) {
267276 if (refFile .isDirectory ()) {
268- return new CompositeReferenceSource (List .of (
269- new FolderReferenceSource (refFile .getPath ()),
270- new EBIReferenceSource (refFile .getPath ())));
271- } else if (Boolean .getBoolean (System .getProperty (KEY_REFERENCE_FORCE_FOLDER , "true" ))) {
272- return new CompositeReferenceSource (List .of (
273- new FolderReferenceSource (refFile .getParent ()),
274- new EBIReferenceSource (refFile .getParent ())));
277+ return createCompositeReferenceSource (refFile );
278+ } else if (preferFolder ) {
279+ try {
280+ return createCompositeReferenceSource (refFile .getParentFile ());
281+ } catch (Exception e ) {
282+ // Fallback to single file, in case none of the files contains proper meta.
283+ return createSharedFastaReferenceSource (refFile );
284+ }
275285 } else {
276- referenceSequenceFile = ReferenceSequenceFileFactory .getReferenceSequenceFile (refFile );
277-
278- String referenceKey = FilenameUtils .removeExtension (refFile .getName ());
279- var referenceFile = ReferenceSequenceFileFactory .getReferenceSequenceFile (refFile );
280- return new SharedFastaReferenceSource (referenceFile , referenceKey );
286+ return createSharedFastaReferenceSource (refFile );
281287 }
282288 }
283289
290+ private CRAMReferenceSource createSharedFastaReferenceSource (File refFile ) {
291+ log .debug ("Using fasta reference file for CRAM: {}" , refFile .getPath ());
292+ referenceSequenceFile = ReferenceSequenceFileFactory .getReferenceSequenceFile (refFile );
293+
294+ String referenceKey = FilenameUtils .removeExtension (refFile .getName ());
295+ var referenceFile = ReferenceSequenceFileFactory .getReferenceSequenceFile (refFile );
296+ return new SharedFastaReferenceSource (referenceFile , referenceKey );
297+ }
298+ private CRAMReferenceSource createCompositeReferenceSource (File refFolder ) {
299+ log .debug ("Using folder reference for CRAM: {}" , refFolder .getPath ());
300+ return new CompositeReferenceSource (List .of (
301+ new FolderReferenceSource (refFolder .getPath ()),
302+ new EBIReferenceSource (refFolder .getPath ())));
303+ }
284304}
0 commit comments