private void readFileToFillCounter(final String inputFile, final boolean isZoneBW27To42) {
    try (BufferedReader reader = IOUtils.getBufferedReader(inputFile)) {
      String line = reader.readLine();
      List<String> labels = new ArrayList<>();

      while (line != null) {
        String row[] = line.split("\t");
        List<String> strs = Arrays.asList(row);

        if (row[0].substring(0, 1).matches("[A-Za-z]") // labels
            && !row[0].startsWith("NA") // "NA" could also be inside the data
        ) {
          for (String s : strs) {
            labels.add(s);
          }
        } else { // main data

          String mode = strs.get(labels.indexOf(PatnaDemandLabels.mode.toString()));
          String monthlyIncome =
              strs.get(labels.indexOf(PatnaDemandLabels.monthlyIncome.toString()));
          String dailyExpenditure =
              strs.get(labels.indexOf(PatnaDemandLabels.dailyTransportCost.toString()));

          String tripPurpose = strs.get(labels.indexOf(PatnaDemandLabels.tripPurpose.toString()));

          if (tripPurpose.equals("9999") && isZoneBW27To42) {
            tripPurpose = PatnaUrbanActivityTypes.work.toString();
          } else tripPurpose = PatnaCalibrationUtils.getTripPurpose(tripPurpose);

          // --
          if (PatnaUtils.ALL_MODES.contains(mode))
            ; // one of non-slum file have modes instead of codes.
          else if (Integer.valueOf(mode) <= 9)
            mode = PatnaCalibrationUtils.getTravelModeFromCode(mode);
          else mode = "NA";

          if (tripPurpose.equalsIgnoreCase(
              PatnaUrbanActivityTypes.work
                  .toString())) { // only work trips; distri is also taken for work trips
            if (pdc.mode2counter.containsKey(mode))
              pdc.mode2counter.put(mode, pdc.mode2counter.get(mode) + 1);
            else pdc.mode2counter.put(mode, 1);
          }
          // --

          // --
          if (!monthlyIncome.equals("a") && !monthlyIncome.equals("99999"))
            monthlyIncome = String.valueOf(PatnaCalibrationUtils.getIncomeInterval(monthlyIncome));
          else monthlyIncome = "NA";

          if (pdc.inc2counter.containsKey(monthlyIncome))
            pdc.inc2counter.put(monthlyIncome, pdc.inc2counter.get(monthlyIncome) + 1);
          else pdc.inc2counter.put(monthlyIncome, 1);
          // --

          // --
          if (!dailyExpenditure.equals("a")
              && !dailyExpenditure.equals("")
              && !dailyExpenditure.equals("9999")) {
            dailyExpenditure =
                String.valueOf(PatnaCalibrationUtils.getDailyExpenditureInterval(dailyExpenditure));
          } else dailyExpenditure = "NA";

          if (pdc.dailyExp2counter.containsKey(dailyExpenditure))
            pdc.dailyExp2counter.put(
                dailyExpenditure, pdc.dailyExp2counter.get(dailyExpenditure) + 1);
          else pdc.dailyExp2counter.put(dailyExpenditure, 1);
          // --
        }
        line = reader.readLine();
      }
    } catch (IOException e) {
      throw new RuntimeException(". Reason " + e);
    }
  }
  public void readZonesFileAndWriteData(
      final String inputFile,
      final boolean isZoneBW27To42 // only HBW trips are available for 27 to 42; rest is imputed.
      ) {

    BufferedReader reader = IOUtils.getBufferedReader(inputFile);

    String line;
    try {
      line = reader.readLine();
    } catch (IOException e1) {
      throw new RuntimeException(". Reason " + e1);
    }

    List<String> labels = new ArrayList<>();

    while (line != null) {
      String row[] = line.split("\t");
      List<String> strs = Arrays.asList(row);

      if (row[0].substring(0, 1).matches("[A-Za-z]") // labels
          && !row[0].startsWith("NA") // "NA" could also be inside the data
      ) {
        for (String s : strs) {
          labels.add(s);
        }
      } else { // main data

        String ward = strs.get(labels.indexOf(PatnaDemandLabels.ward.toString()));
        String member = strs.get(labels.indexOf(PatnaDemandLabels.member.toString()));
        String sex = strs.get(labels.indexOf(PatnaDemandLabels.sex.toString()));
        String age = strs.get(labels.indexOf(PatnaDemandLabels.age.toString()));
        String occupation = strs.get(labels.indexOf(PatnaDemandLabels.occupation.toString()));

        String originWard = strs.get(labels.indexOf(PatnaDemandLabels.originZone.toString()));
        String destinationWard =
            strs.get(labels.indexOf(PatnaDemandLabels.destinationZone.toString()));
        String tripPurpose = strs.get(labels.indexOf(PatnaDemandLabels.tripPurpose.toString()));
        String mode = strs.get(labels.indexOf(PatnaDemandLabels.mode.toString()));
        String monthlyIncome =
            strs.get(labels.indexOf(PatnaDemandLabels.monthlyIncome.toString())); // Rs or na
        String dailyExpenditure =
            strs.get(labels.indexOf(PatnaDemandLabels.dailyTransportCost.toString())); // Rs or na

        String tripFreq = strs.get(labels.indexOf(PatnaDemandLabels.tripFrequency.toString()));

        if (tripPurpose.equals("9999") && isZoneBW27To42) {
          tripPurpose = PatnaUrbanActivityTypes.work.toString();
        } else tripPurpose = PatnaCalibrationUtils.getTripPurpose(tripPurpose);

        if (mode.equals("9999")) {
          mode = pdc.randomModes.remove(0); // always take what is on top.
        } else if (PatnaUtils.ALL_MODES.contains(mode)) {
          // nothing to do.
        } else if (Integer.valueOf(mode) <= 9) {
          mode = PatnaCalibrationUtils.getTravelModeFromCode(mode);
        }

        if (monthlyIncome.equals("a") || monthlyIncome.equals("99999")) {
          monthlyIncome = pdc.monthlyIncInterval.remove(0); // interval and NOT actual income
          monthlyIncome = String.valueOf(PatnaUtils.getAverageIncome(monthlyIncome));
        }

        if (dailyExpenditure.equals("a")) {
          dailyExpenditure = pdc.dailyCostInterval.remove(0); // interval and NOT actual cost
          dailyExpenditure =
              String.valueOf(PatnaUtils.getAverageDailyTranportCost(dailyExpenditure));
        }

        monthlyIncome = String.valueOf(PatnaCalibrationUtils.getIncomeInterval(monthlyIncome));
        dailyExpenditure =
            String.valueOf(PatnaCalibrationUtils.getDailyExpenditureInterval(dailyExpenditure));

        try {
          writer.write(
              ward
                  + "\t"
                  + member
                  + "\t"
                  + sex
                  + "\t"
                  + age
                  + "\t"
                  + occupation
                  + "\t"
                  + monthlyIncome
                  + "\t"
                  + dailyExpenditure
                  + "\t"
                  + originWard
                  + "\t"
                  + destinationWard
                  + "\t"
                  + tripPurpose
                  + "\t"
                  + // all of entries in this file is HBW trips
                  mode
                  + "\t"
                  + tripFreq
                  + "\n");
        } catch (IOException e) {
          throw new RuntimeException(". Reason " + e);
        }
      }
      try {
        line = reader.readLine();
      } catch (IOException e) {
        throw new RuntimeException(". Reason " + e);
      }
    }
  }