docs: protected HashMap readObvData(HashMap brMap) throws IOException {
  
          HashMap files = new HashMap();
          HashMap file = new HashMap();
          String line;
          HashMap mapA;
          BufferedReader brA;
          Object buf;
          LinkedHashMap formats = new LinkedHashMap();
          ArrayList titles = new ArrayList();
          ArrayList obvData;
          DssatObservedData obvDataList = DssatObservedData.INSTANCE;    // Varibale list definition
          String pdate;
  
          mapA = (HashMap) brMap.get("A");
  
          // If AFile File is no been found
          if (mapA.isEmpty()) {
              return file;
          }
  
          for (Object keyA : mapA.keySet()) {
  
              buf = mapA.get(keyA);
              String fileName = (String) keyA;
  //            String exname = fileName.replaceAll("\\.", "").replaceAll("A$", "");
              String exname = fileName.replaceAll("\\.\\w\\wA$", "");
              String crid = fileName.replaceAll("\\w+\\.", "").replaceAll("A$", "");
              if (buf instanceof char[]) {
                  brA = new BufferedReader(new CharArrayReader((char[]) buf));
              } else {
                  brA = (BufferedReader) buf;
              }
  
              file = new HashMap();
              obvData = new ArrayList();
  
              while ((line = brA.readLine()) != null) {
  
                  // Get content type of line
                  judgeContentType(line);
  
                  // Read Observed data
                  if (flg[2].equals("data")) {
  
                      // Read meta info
                      if (flg[0].equals("meta") && flg[1].equals("")) {
  
                          // Set variables' formats
                          line = line.replaceAll(".*:", "").trim();
                          formats.clear();
                          formats.put("null", 10);  // P.S. Since exname in top line is not reliable, read from file name
                          formats.put("local_name", line.length());
                          // Read line and save into return holder
                          file.putAll(readLine(line, formats));
                          file.put("exname", exname);
                          file.put("crid", DssatCRIDHelper.get3BitCrid(crid));
  
                      } // Read data info 
                      else {
                          // Set variables' formats
                          formats.clear();
                          for (Object title : titles) {
                              formats.put(title, 6);
                          }
                          // Read line and save into return holder
                          HashMap tmp = readLine(line, formats);
                          pdate = getPdate(brMap, (String) tmp.get("trno_a"), fileName.replaceAll("A$", "X"));
                          for (Object title : titles) {
                              if (obvDataList.isDateType(title)) {
                                  translateDateStrForDOY(tmp, (String) title, pdate, "");
  //                            String val = (String) tmp.get(title);
  //                            if (val != null && val.length() > 3) {
  //                                tmp.put(title, val.substring(val.length() - 3, val.length()));
  //                            }
                              }
                          }
                          addToArray(obvData, tmp, "trno_a");
                      }
  
                  } // Read Observed title
                  else if (flg[2].equals("title")) {
  
                      titles = new ArrayList();
                      line = line.replaceFirst("@", " ");
                      for (int i = 0; i < line.length(); i += 6) {
                          String titleStr = line.substring(i, Math.min(i + 6, line.length())).trim().toLowerCase();
                          if (titleStr.equals("")) {
                              titles.add("null" + i);
                          } else if (titleStr.equals("trno")) {
                              titles.add(titleStr + "_a");
                          } else {
                              titles.add(titleStr);
                          }
                      }
  
                  } else {
                  }
              }
              file.put(obvDataKey, obvData);
              files.put(exname, file);
              brA.close();
          }