code: public void getTableStructure (int cc, TableCandidate tc, ArrayList<TextPiece> wordsOfAPage) {
      	float minGapBtwColumns = 1000.0f;
  		float[] leftX_tableColumns = tc.getLeftX_tableColumns();
  		float[] rightX_tableColumns = tc.getRightX_tableColumns();
  		int YNum = tc.getRows().size();
  		
  		for (int zz=1; zz<cc; zz++) {
  			float thisColumnGap = leftX_tableColumns[zz]-rightX_tableColumns[zz-1];
  			if (thisColumnGap<minGapBtwColumns)
  				minGapBtwColumns = thisColumnGap;
  		}
  		double columnGapThreshold = 0.0;
  		//if (withoutKwd==true) columnGapThreshold = parameters.ave_X_Gap_inLine*1.6;	
  		if (minGapBtwColumns>columnGapThreshold) {
  			getEachCellContent(YNum, cc, tc);
  			getRealHeadingBasedOnCells(YNum, cc, tc);
  			getColumnHeading(tc);
  			getRowHeadingBasedOnCells(tc);
  			tc.setMetadataStructureLevel(YNum, cc, wordsOfAPage, m_docInfo); 
  			//tc.setMetaStructureLevelx(YNum, cc, wordsOfAPage, m_docInfo);
  			
  			if ( (tc.getFootnoteBeginRow()>1) & (tc.getMaxColumnNumber()>1) ) {}
  			else tc.setValid(false);
  		}
  		else {
  			m_docInfo.setErrorMsg("Although we detected some tabular structures in page " + (tc.getPageId_thisTable()+1) + ", we do not treat them as tables because the space gaps between columns are not large enough.");
  		}
      }
docs: Implements the table structure decomposition step
  
  @param cc
  the number of the table columns
  @param tc
  the object of the table candidate
  @param wordsOfAPage
  the list of all the words in a document page