def get_inpxml_file_structure():
    """
    This routine returns the structure/layout of the 'inp.xml' file.

    Basicly the plug-in should know from this routine, what things are allowed
    to be set and where, i.e all attributes and their xpaths.
    As a developer make sure to use this routine always of you need information
    about the inp.xml file structure.
    Therefore, this plug-in should be easy to adjust to other codes with xml
    files as input files. Just rewrite this routine.

    For now the structure of the xmlinp file for fleur is hardcoded.
    If big changes are in the 'inp.xml' file, maintain this routine.
    TODO: Maybe this is better done, by reading the xml schema datei instead.
    And maybe it should also work without the schema file, do we want this?

    :param Nothing: TODO xml schema

    :return all_switches_once: list of all switches ('T' or 'F') which are allowed to be set
    :return all_switches_several: list of all switches ('T' or 'F') which are allowed to be set
    :return other_attributes_once: list of all attributes, which occur just once (can be tested)
    :return other_attributes_several: list of all attributes, which can occur more then once
    :return all_text: list of all text of tags, which can be set
    :return all_attrib_xpath:
                              dictonary (attrib, xpath), of all possible attributes
                              with their xpath expression for the xmp inp

    :return expertkey:
                       keyname (should not be in any other list), which can be
                       used to set anything in the file, by hand,
                       (for experts, and that plug-in does not need to be directly maintained if
                       xmlinp gets a new switch)
    """
    all_switches_once = ('dos', 'band', 'secvar', 'ctail', 'frcor',
        'l_noco', 'ctail', 'swsp', 'lflip', 'off', 'spav', 'l_soc', 'soc66',
        'pot8', 'eig66', 'gamma', 'gauss', 'tria', 'invs', 'invs2', 'zrfs',
        'vchk', 'cdinf', 'disp', 'vacdos', 'integ', 'star', 'score',
        'plplot', 'slice', 'pallst', 'form66', 'eonly', 'bmt',
        'relativisticCorrections', 'l_J', 'l_f', 'l_ss')
    all_switches_several = 'calculate', 'flipSpin'
    int_attributes_once = ('numbands', 'itmax', 'maxIterBroyd', 'kcrel',
        'jspins', 'gw', 'isec1', 'nx', 'ny', 'nz', 'ndir', 'layers',
        'nstars', 'nstm', 'iplot', 'numkpt', 'nnne', 'lpr', 'count', 'qfix')
    float_attributes_once = ('Kmax', 'Gmax', 'GmaxXC', 'alpha', 'spinf',
        'minDistance', 'theta', 'phi', 'epsdisp', 'epsforce',
        'valenceElectrons', 'fermiSmearingEnergy', 'ellow', 'elup', 'scale',
        'dTilda', 'dVac', 'minEnergy', 'maxEnergy', 'sigma', 'locx1',
        'locy1', 'locx2', 'locy2', 'tworkf', 'minEigenval', 'maxEigenval',
        'forcealpha', 'force_converged')
    string_attributes_once = ('imix', 'mode', 'filename', 'latnam', 'spgrp',
        'xcFunctional', 'fleurInputVersion', 'species', 'forcemix')
    other_attributes_once = tuple(list(int_attributes_once) + list(
        float_attributes_once) + list(string_attributes_once))
    other_attributes_once1 = ('isec1', 'Kmax', 'Gmax', 'GmaxXC', 'numbands',
        'itmax', 'maxIterBroyd', 'imix', 'alpha', 'spinf', 'minDistance',
        'kcrel', 'jspins', 'theta', 'phi', 'gw', 'lpr', 'epsdisp',
        'epsforce', 'valenceElectrons', 'mode', 'gauss',
        'fermiSmearingEnergy', 'nx', 'ny', 'nz', 'ellow', 'elup',
        'filename', 'scale', 'dTilda', 'dVac', 'ndir', 'minEnergy',
        'maxEnergy', 'sigma', 'layers', 'nstars', 'locx1', 'locy1', 'locx2',
        'locy2', 'nstm', 'tworkf', 'numkpt', 'minEigenval', 'maxEigenval',
        'nnne')
    int_attributes_several = ('atomicNumber', 'gridPoints', 'lmax',
        'lnonsphr', 's', 'p', 'd', 'f', 'l', 'n', 'eDeriv', 'coreStates')
    float_attributes_several = 'value', 'magMom', 'radius', 'logIncrement'
    string_attributes_several = ('name', 'element', 'coreStates', 'type',
        'relaxXYZ')
    other_attributes_several = ('name', 'value', 'element', 'atomicNumber',
        'coreStates', 'magMom', 'radius', 'gridPoints', 'logIncrement',
        'lmax', 'lnonsphr', 's', 'p', 'd', 'f', 'species', 'type',
        'coreStates', 'l', 'n', 'eDeriv', 'relaxXYZ')
    tags_several = ('atomGroup', 'relPos', 'absPos', 'filmPos', 'species',
        'kPoint', 'lo', 'stateOccupation')
    all_text = {'comment': 1, 'relPos': 3, 'filmPos': 3, 'absPos': 3,
        'row-1': 3, 'row-2': 3, 'row-3': 3, 'a1': 1, 'qss': 3}
    all_attrib_xpath = {'comment': '/fleurInput/comment', 'relPos':
        '/fleurInput/atomGroups/atomGroup/relPos', 'filmPos':
        '/fleurInput/atomGroups/atomGroup/filmPos', 'absPos':
        '/fleurInput/atomGroups/atomGroup/absPos', 'qss':
        '/fleurInput/calculationSetup/nocoParams/qss', 'l_ss':
        '/fleurInput/calculationSetup/nocoParams', 'row-1':
        '/fleurInput/cell/bulkLattice/bravaisMatrix', 'row-2':
        '/fleurInput/cell/bulkLattice/bravaisMatrix', 'row-3':
        '/fleurInput/cell/bulkLattice/bravaisMatrix', 'a1':
        '/fleurInput/cell/filmLattice/a1', 'dos': '/fleurInput/output',
        'band': '/fleurInput/output', 'secvar':
        '/fleurInput/calculationSetup/expertModes', 'ctail':
        '/fleurInput/calculationSetup/coreElectrons', 'frcor':
        '/fleurInput/calculationSetup/coreElectrons', 'l_noco':
        '/fleurInput/calculationSetup/magnetism', 'l_J':
        '/fleurInput/calculationSetup/magnetism', 'swsp':
        '/fleurInput/calculationSetup/magnetism', 'lflip':
        '/fleurInput/calculationSetup/magnetism', 'off':
        '/fleurInput/calculationSetup/soc', 'spav':
        '/fleurInput/calculationSetup/soc', 'l_soc':
        '/fleurInput/calculationSetup/soc', 'soc66':
        '/fleurInput/calculationSetup/soc', 'pot8':
        '/fleurInput/calculationSetup/expertModes', 'eig66':
        '/fleurInput/calculationSetup/expertModes', 'l_f':
        '/fleurInput/calculationSetup/geometryOptimization', 'gamma':
        '/fleurInput/calculationSetup/bzIntegration/kPointMesh', 'vchk':
        '/fleurInput/output/checks', 'cdinf': '/fleurInput/output/checks',
        'disp': '/fleurInput/output/checks', 'vacdos': '/fleurInput/output',
        'integ': '/fleurInput/output/vacuumDOS', 'star':
        '/fleurInput/output/vacuumDOS', 'iplot':
        '/fleurInput/output/plotting', 'score':
        '/fleurInput/output/plotting', 'plplot':
        '/fleurInput/output/plotting', 'slice': '/fleurInput/output',
        'pallst': '/fleurInput/output/chargeDensitySlicing', 'form66':
        '/fleurInput/output/specialOutput', 'eonly':
        '/fleurInput/output/specialOutput', 'bmt':
        '/fleurInput/output/specialOutput', 'relativisticCorrections':
        '/fleurInput/xcFunctional', 'calculate':
        '/fleurInput/atomGroups/atomGroup/force', 'flipSpin':
        '/fleurInput/atomSpecies/species', 'Kmax':
        '/fleurInput/calculationSetup/cutoffs', 'Gmax':
        '/fleurInput/calculationSetup/cutoffs', 'GmaxXC':
        '/fleurInput/calculationSetup/cutoffs', 'numbands':
        '/fleurInput/calculationSetup/cutoffs', 'itmax':
        '/fleurInput/calculationSetup/scfLoop', 'minDistance':
        '/fleurInput/calculationSetup/scfLoop', 'maxIterBroyd':
        '/fleurInput/calculationSetup/scfLoop', 'imix':
        '/fleurInput/calculationSetup/scfLoop', 'alpha':
        '/fleurInput/calculationSetup/scfLoop', 'spinf':
        '/fleurInput/calculationSetup/scfLoop', 'kcrel':
        '/fleurInput/calculationSetup/coreElectrons', 'jspins':
        '/fleurInput/calculationSetup/magnetism', 'theta':
        '/fleurInput/calculationSetup/soc', 'phi':
        '/fleurInput/calculationSetup/soc', 'gw':
        '/fleurInput/calculationSetup/expertModes', 'lpr':
        '/fleurInput/calculationSetup/expertModes', 'isec1':
        '/fleurInput/calculationSetup/expertModes', 'forcemix':
        '/fleurInput/calculationSetup/geometryOptimization', 'forcealpha':
        '/fleurInput/calculationSetup/geometryOptimization',
        'force_converged':
        '/fleurInput/calculationSetup/geometryOptimization', 'qfix':
        '/fleurInput/calculationSetup/geometryOptimization', 'epsdisp':
        '/fleurInput/calculationSetup/geometryOptimization', 'epsforce':
        '/fleurInput/calculationSetup/geometryOptimization',
        'valenceElectrons': '/fleurInput/calculationSetup/bzIntegration',
        'mode': '/fleurInput/calculationSetup/bzIntegration',
        'fermiSmearingEnergy': '/fleurInput/calculationSetup/bzIntegration',
        'nx': '/fleurInput/calculationSetup/bzIntegration/kPointMesh', 'ny':
        '/fleurInput/calculationSetup/bzIntegration/kPointMesh', 'nz':
        '/fleurInput/calculationSetup/bzIntegration/kPointMesh', 'count':
        '/ fleurInput/calculationSetup/bzIntegration/kPointList', 'ellow':
        '/fleurInput/calculationSetup/energyParameterLimits', 'elup':
        '/fleurInput/calculationSetup/energyParameterLimits', 'scale':
        '/fleurInput/cell/bulkLattice', 'ndir':
        '/fleurInput/output/densityOfStates', 'minEnergy':
        '/fleurInput/output/densityOfStates', 'maxEnergy':
        '/fleurInput/output/densityOfStates', 'sigma':
        ' /fleurInput/output/densityOfStates', 'layers':
        '/fleurInput/output/vacuumDOS', 'nstars':
        '/fleurInput/output/vacuumDOS', 'locx1':
        '/fleurInput/output/vacuumDOS', 'locy1':
        '/fleurInput/output/vacuumDOS', 'locx2':
        '/fleurInput/output/vacuumDOS', 'locy2':
        '/fleurInput/output/vacuumDOS', 'nstm':
        '/fleurInput/output/vacuumDOS', 'tworkf':
        '/fleurInput/output/vacuumDOS', 'numkpt':
        '/fleurInput/output/chargeDensitySlicing', 'minEigenval':
        '/fleurInput/output/chargeDensitySlicing', 'maxEigenval':
        '/fleurInput/output/chargeDensitySlicing', 'nnne':
        '/fleurInput/output/chargeDensitySlicing', 'dVac':
        '/fleurInput/cell/filmLattice', 'dTilda':
        '/fleurInput/cell/filmLattice', 'xcFunctional':
        '/fleurInput/xcFunctional', 'element':
        '/fleurInput/atomSpecies/species', 'atomicNumber':
        '/fleurInput/atomSpecies/species', 'coreStates':
        '/fleurInput/atomSpecies/species', 'magMom':
        '/fleurInput/atomSpecies/species', 'radius':
        '/fleurInput/atomSpecies/species/mtSphere', 'gridPoints':
        '/fleurInput/atomSpecies/species/mtSphere', 'logIncrement':
        '/fleurInput/atomSpecies/species/mtSphere', 'lmax':
        '/fleurInput/atomSpecies/species/atomicCutoffs', 'lnonsphr':
        '/fleurInput/atomSpecies/species/atomicCutoffs', 's':
        '/fleurInput/atomSpecies/species/energyParameters', 'p':
        '/fleurInput/atomSpecies/species/energyParameters', 'd':
        '/fleurInput/atomSpecies/species/energyParameters', 'f':
        '/fleurInput/atomSpecies/species/energyParameters', 'type':
        '/fleurInput/atomSpecies/species/lo', 'l':
        '/fleurInput/atomSpecies/species/lo', 'n':
        '/fleurInput/atomSpecies/species/lo', 'eDeriv':
        '/fleurInput/atomSpecies/species/lo', 'species':
        '/fleurInput/atomGroups/atomGroup', 'relaxXYZ':
        '/fleurInput/atomGroups/atomGroup/force'}
    all_tag_xpaths = ('/fleurInput/constantDefinitions',
        '/fleurInput/calculationSetup',
        '/fleurInput/calculationSetup/cutoffs',
        '/fleurInput/calculationSetup/scfLoop',
        '/fleurInput/calculationSetup/coreElectrons',
        '/fleurInput/calculationSetup/magnetism',
        '/fleurInput/calculationSetup/soc',
        '/fleurInput/calculationSetup/expertModes',
        '/fleurInput/calculationSetup/geometryOptimization',
        '/fleurInput/calculationSetup/bzIntegration',
        '/fleurInput/calculationSetup/kPointMesh',
        '/fleurInput/cell/symmetry', '/fleurInput/cell/bravaisMatrix',
        '/fleurInput/calculationSetup/nocoParams',
        '/fleurInput/xcFunctional', '/fleurInput/xcFunctional/xcParams',
        '/fleurInput/atomSpecies/species',
        '/fleurInput/atomSpecies/species/mtSphere',
        '/fleurInput/atomSpecies/species/atomicCutoffs',
        '/fleurInput/atomSpecies/species/energyParameters',
        '/fleurInput/atomSpecies/species/coreConfig',
        '/fleurInput/atomSpecies/species/coreOccupation',
        '/fleurInput/atomGroups/atomGroup',
        '/fleurInput/atomGroups/atomGroup/relPos',
        '/fleurInput/atomGroups/atomGroup/absPos',
        '/fleurInput/atomGroups/atomGroup/filmPos',
        '/fleurInput/output/checks', '/fleurInput/output/densityOfStates',
        '/fleurInput/output/vacuumDOS', '/fleurInput/output/plotting',
        '/fleurInput/output/chargeDensitySlicing',
        '/fleurInput/output/specialOutput')
    expertkey = 'other'
    returnlist = (all_switches_once, all_switches_several,
        other_attributes_once, int_attributes_once, float_attributes_once,
        string_attributes_once, other_attributes_several,
        int_attributes_several, float_attributes_several,
        string_attributes_several, tags_several, all_text, all_attrib_xpath,
        expertkey)
    return returnlist
