docs: def extractColumns(TableName,SourceParameterName,ParameterFormats,ParameterNames=None,FixCol=False):
      """
      INPUT PARAMETERS: 
          TableName:             name of source table              (required)
          SourceParameterName:   name of source column to process  (required)
          ParameterFormats:      c formats of unpacked parameters  (required)
          ParameterNames:        list of resulting parameter names (optional)
          FixCol:      column-fixed (True) format of source column (optional)
      OUTPUT PARAMETERS: 
          none
      ---
      DESCRIPTION:
          Note, that this function is aimed to do some extra job on
          interpreting string parameters which is normally supposed
          to be done by the user.
      ---
      EXAMPLE OF USAGE:
          extractColumns('sampletab',SourceParameterName='p5',
                          ParameterFormats=('%d','%d','%d'),
                          ParameterNames=('p5_1','p5_2','p5_3'))
          This example extracts three integer parameters from
          a source column 'p5' and puts results in ('p5_1','p5_2','p5_3').
      ---
      """
      # ParameterNames = just the names without expressions
      # ParFormats contains python formats for par extraction
      # Example: ParameterNames=('v1','v2','v3')
      #          ParameterFormats=('%1s','%1s','%1s')
      # By default the format of parameters is column-fixed
      if type(LOCAL_TABLE_CACHE[TableName]['header']['default'][SourceParameterName]) not in set([str,unicode]):
         raise Exception('Source parameter must be a string')
      i=-1
      # bug when (a,) != (a)
      if ParameterNames and type(ParameterNames) not in set([list,tuple]):
         ParameterNames = [ParameterNames]
      if ParameterFormats and type(ParameterFormats) not in set([list,tuple]):
         ParameterFormats = [ParameterFormats]
      # if ParameterNames is empty, fill it with #1-2-3-...
      if not ParameterNames:
         ParameterNames = []
         # using naming convension #i, i=0,1,2,3...
         for par_format in ParameterFormats:
             while True:
                   i+=1
                   par_name = '#%d' % i
                   fmt = LOCAL_TABLE_CACHE[TableName]['header']['format'].get(par_name,None)
                   if not fmt: break
             ParameterNames.append(par_name)
      # check if ParameterNames are valid
      Intersection = set(ParameterNames).intersection(LOCAL_TABLE_CACHE[TableName]['header']['order'])
      if Intersection:
         raise Exception('Parameters %s already exist' % str(list(Intersection)))
      # loop over ParameterNames to prepare LOCAL_TABLE_CACHE
      i=0
      for par_name in ParameterNames:  
          par_format = ParameterFormats[i]     
          LOCAL_TABLE_CACHE[TableName]['header']['format'][par_name]=par_format
          LOCAL_TABLE_CACHE[TableName]['data'][par_name]=[] 
          i+=1
      # append new parameters in order list
      LOCAL_TABLE_CACHE[TableName]['header']['order'] += ParameterNames
      # cope with default values
      i=0
      format_regex = []
      format_types = []
      #print 'ParameterNames='+str(ParameterNames)
      for par_format in ParameterFormats:
          par_name = ParameterNames[i]
          regex = FORMAT_PYTHON_REGEX
          #print 'par_name: '+par_name
          #print 'par_format: '+par_format
          (lng,trail,lngpnt,ty) = re.search(regex,par_format).groups()
          ty = ty.lower()
          if ty == 'd':
             par_type = int
             if FixCol:
                format_regex_part = REGEX_INTEGER_FIXCOL(lng)
             else:
                format_regex_part = REGEX_INTEGER
          elif ty == 's':
             par_type = str
             if FixCol:
                format_regex_part = REGEX_STRING_FIXCOL(lng)
             else:
                format_regex_part = REGEX_STRING
          elif ty == 'f':
             par_type = float
             if FixCol:
                format_regex_part = REGEX_FLOAT_F_FIXCOL(lng)
             else:
                format_regex_part = REGEX_FLOAT_F
          elif ty == 'e':
             par_type = float
             if FixCol:
                format_regex_part = REGEX_FLOAT_E_FIXCOL(lng)
             else:
                format_regex_part = REGEX_FLOAT_E
          else:
             raise Exception('Unknown data type')
          format_regex.append('('+format_regex_part+')')
          format_types.append(par_type)
          def_val = getDefaultValue(par_type)
          LOCAL_TABLE_CACHE[TableName]['header']['default'][par_name]=def_val
          i+=1
      format_regex = '\s*'.join(format_regex)
      #print 'format_regex='+str(format_regex)
      #return format_regex
      # loop through values of SourceParameter
      for SourceParameterString in LOCAL_TABLE_CACHE[TableName]['data'][SourceParameterName]:
          try:
             ExtractedValues = list(re.search(format_regex,SourceParameterString).groups())
          except:
             raise Exception('Error with line \"%s\"' % SourceParameterString)
          i=0
          # loop through all parameters which are supposed to be extracted
          for par_name in ParameterNames:
              #print 'ExtractedValues[i]='+ExtractedValues[i]
              #print 'par_name='+par_name
              par_value = format_types[i](ExtractedValues[i])
              LOCAL_TABLE_CACHE[TableName]['data'][par_name].append(par_value)
              i+=1
      # explicitly check that number of rows are equal
      number_of_rows = LOCAL_TABLE_CACHE[TableName]['header']['number_of_rows']
      number_of_rows2 = len(LOCAL_TABLE_CACHE[TableName]['data'][SourceParameterName])
      number_of_rows3 = len(LOCAL_TABLE_CACHE[TableName]['data'][ParameterNames[0]])
      if not (number_of_rows == number_of_rows2 == number_of_rows3):
         raise Exception('Error while extracting parameters: check your regexp')