public void loadIndexRatesTsv(Reader input) {
    SortedMap<String, SortedMap<Integer, Double>> historicRates = new TreeMap<String, SortedMap<Integer, Double>>();
    Set<String> unmappedLchIndices = new TreeSet<String>();
    try {
      CSVReader reader = new CSVReader(input, '\t');
      reader.readNext(); // dump header row
      int rowNum = 1;
      String[] line;
      DateWithDayCount closeDate = null;
      while((line = reader.readNext()) != null) {
        rowNum++;
        if(line.length == 8) {
//          Currency	Indexname	Tenorunit	Tenorperiod	Fixingdate	Effectivedate	Indexrate	regulatoryBody
//          AUD	LIBOR	1	M	04/10/2010 00:00:00	06/10/2010 00:00:00	4.71250	BBA
          String currency = line[0];
          String indexName = line[1];
          int tenorPeriodMultiplier = Integer.parseInt(line[2]);
          PeriodEnum tenorPeriod = PeriodEnum.valueOf(line[3]);
          int fixingDate = DateUtil.dateToDayCount(new short[]{Short.parseShort(line[4].substring(6, 10)), Short.parseShort(line[4].substring(3, 5)), Short.parseShort(line[4].substring(0, 2))});
          double indexRate = Double.parseDouble(line[6]);
          String regulatoryBody = line[7];
          String lchIndexKey = currency + ' ' + indexName + ' ' + regulatoryBody + ' ' + tenorPeriodMultiplier + tenorPeriod.name();
          String indexKey = unmappedLchIndices.contains(lchIndexKey) ? null : lchToFpmlCurveNameMapping.get(lchIndexKey);
          if(indexKey == null) {
            unmappedLchIndices.add(lchIndexKey);
          } else {
            SortedMap<Integer, Double> ratesForIndex = historicRates.get(indexKey);
            if(ratesForIndex == null) {
              ratesForIndex = new TreeMap<Integer, Double>();
              historicRates.put(indexKey, ratesForIndex);
            }
            ratesForIndex.put(fixingDate, indexRate);
          }
        } else {
          log.debug("Ignoring index rate TSV line " + rowNum + " of length " + line.length + " (expected 8)");
        }
      }
      if(!unmappedLchIndices.isEmpty()) {
        log.debug(unmappedLchIndices.size() + " unmapped LCH indices have historic rates that haven't been loaded: " + unmappedLchIndices);
      }
    } catch(Exception e) {
      throw new PricerException("Failed to read in tab separated holiday calendar file", e);
    } finally {
      IOUtils.closeQuietly(input);
    }
    historicIndexRates = historicRates;
  }