@Deprecated
  private ArrayList<FSFile> getFileList(AlgorithmDTO algorithm, List<FSFile> subFiles) {
    ArrayList<FSFile> retFiles = new ArrayList<FSFile>();
    String needExtentions = "";
    if (algorithm.getType() == null) {
      needExtentions = ".hea.dat.xyz";
    } else {
      switch (algorithm.getType()) {
        case ANN2RR:
        case NGUESS:
        case PNNLIST:
        case TACH:
          needExtentions = ".atr.qrs.wqrs.hea.dat.xyz";
          break;
        case SQRS:
        case WQRS:
        case RDSAMP:
        case SIGAAMP:
        case CHESNOKOV:
        case SQRS4IHR:
        case WQRS4IHR:
        case SQRS4PNNLIST:
        case WQRS4PNNLIST:
          needExtentions = ".hea.dat.xyz";
          break;
        case WRSAMP:
          needExtentions = ".txt";
          break;
        default:
          needExtentions = ".hea.dat.xyz";
          break;
      }
    }

    for (FSFile file : subFiles) {
      if (needExtentions.contains(file.getExtension())) {
        retFiles.add(file);
      }
    }

    return retFiles;
  }
  /**
   * Initialize the analysis thread group
   *
   * @param selectedNodes Selected documents to be analyzed
   * @param userId Logged user ID
   * @param selectedAlgorithms Selected algorithms
   * @return
   */
  public boolean performAnalysis(
      List<DocumentDragVO> selectedNodes, long userId, AlgorithmDTO[] selectedAlgorithms) {

    try {
      Connection dbUtility = ConnectionFactory.createConnection();

      Set<AnalysisThread> threadSet = new HashSet<AnalysisThread>();

      ThreadGroup analysisGroup = ThreadController.createSubGroup("AnalysisGroup");

      String[] args = {
        String.valueOf(ResourceUtility.getCurrentGroupId()),
        String.valueOf(ResourceUtility.getCurrentUserId()),
        String.valueOf(ResourceUtility.getCurrentCompanyId())
      };
      FileStorer fileStorer =
          FileStoreFactory.returnFileStore(ResourceUtility.getFileStorageType(), args);

      for (DocumentDragVO node : selectedNodes) {

        List<FileInfoDTO> files =
            dbUtility.getAllFilesByDocumentRecordId(node.getDocumentRecord().getDocumentRecordId());
        FSFile headerFile = fileStorer.getFile(files.get(0).getFileEntryId(), true);

        FileType originalFileType = node.getDocumentRecord().getOriginalFormat();
        long docId = node.getDocumentRecord().getDocumentRecordId();
        String timeseriesId = node.getDocumentRecord().getTimeSeriesId();
        String name = node.getDocumentRecord().getRecordName();
        String age = node.getDocumentRecord().getAge().toString();
        String sex = node.getDocumentRecord().getGender();
        String channels = String.valueOf(node.getDocumentRecord().getLeadCount());
        String scalingFactor = String.valueOf(node.getDocumentRecord().getAduGain());
        String samplesPerChannel = String.valueOf(node.getDocumentRecord().getSamplesPerChannel());
        String samplingRate = String.valueOf(node.getDocumentRecord().getSamplingRate());

        ThreadGroup fileGroup = new ThreadGroup(analysisGroup, docId + "Group");
        List<Long> analysisIds = new ArrayList<Long>();

        for (AlgorithmDTO algorithm : selectedAlgorithms) {

          Map<String, Object> parameterMap = new HashMap<String, Object>();

          parameterMap.put("userID", String.valueOf(userId));
          parameterMap.put("groupID", String.valueOf(ResourceUtility.getCurrentGroupId()));
          parameterMap.put("folderID", String.valueOf(headerFile.getParentId()));
          parameterMap.put("subjectID", node.getDocumentRecord().getSubjectId());
          parameterMap.put("durationSec", node.getDocumentRecord().getDurationSec());
          parameterMap.put("channels", channels);
          parameterMap.put("leadNames", node.getDocumentRecord().getLeadNames());
          parameterMap.put("scalingFactor", scalingFactor);
          parameterMap.put("samplesPerChannel", samplesPerChannel);
          parameterMap.put("samplingRate", samplingRate);
          parameterMap.put("timeseriesId", timeseriesId);

          LinkedHashMap<String, String> parameterlistMap = new LinkedHashMap<String, String>();
          if ((originalFileType.getLabel().equals("Schiller"))
              && (algorithm.getDisplayShortName().contentEquals("QRS-Score"))) {
            List<AnnotationDTO> magellanAnnot =
                getMagellanLeadAnnotationList(userId, docId, "Schiller Upload", "ECGT");
            List<AnnotationDTO> magellanRecAnnot =
                getMagellanRecordAnnotationList(userId, docId, "Schiller Upload", "ECGT");
            String qrsd = null, qrsax = null;

            if (magellanRecAnnot.get(0) != null) {
              qrsd = magellanRecAnnot.get(0).getValue();
            }
            if (magellanRecAnnot.get(1) != null) {
              qrsax = magellanRecAnnot.get(1).getValue();
            }
            parameterlistMap =
                buildQRS_ScoreParameterListMap(docId, name, age, sex, qrsd, qrsax, magellanAnnot);
          }

          parameterMap.put("parameterlist", parameterlistMap);
          parameterMap.put("method", algorithm.getServiceMethod());
          parameterMap.put("serviceName", algorithm.getServiceName());
          parameterMap.put("URL", algorithm.getAnalysisServiceURL());
          parameterMap.put("openTsdbHost", ResourceUtility.getOpenTsdbHost());
          parameterMap.put("openTsdbStrategy", ResourceUtility.getOpenTsdStrategy());

          AnalysisJobDTO analysisJobDTO =
              dbUtility.storeAnalysisJob(
                  node.getFileNode().getDocumentRecordId(),
                  0,
                  0,
                  algorithm.getAnalysisServiceURL(),
                  algorithm.getServiceName(),
                  algorithm.getServiceMethod(),
                  new Date(),
                  ResourceUtility.getCurrentUserId());

          String jobID = "job_" + analysisJobDTO.getAnalysisJobId();

          parameterMap.put("jobID", jobID);

          AnalysisThread t =
              new AnalysisThread(
                  parameterMap,
                  node.getDocumentRecord(),
                  ResourceUtility.getCurrentUserId(),
                  dbUtility,
                  fileGroup,
                  fileStorer,
                  algorithm.getResultType());

          threadSet.add(t);

          analysisIds.add(analysisJobDTO.getAnalysisJobId());
        }
        AnalysisStatusDTO dto =
            new AnalysisStatusDTO(
                node.getDocumentRecord().getDocumentRecordId(),
                node.getDocumentRecord().getRecordName(),
                analysisIds.size(),
                0,
                0);
        dto.setAnalysisIds(analysisIds);
        this.addToBackgroundQueue(dto);
      }

      tController = new ThreadController(threadSet);
      tController.start();

      return true;
    } catch (FSException e) {
      e.printStackTrace();
    } catch (DataStorageException e) {
      e.printStackTrace();
    }

    return false;
  }