119     cppBaseStartstring = 
"/*\n*This file was automatically created by XMLtoHeader.py\n* Created on:             {creationTime}\n* Created with config:    {xmlFile}\n*\n* Author: Ruth Poettgen\n* Contact: ruth.poettgen@cern.ch\n**Brief: Defines class for different CTP versions.\n*/\n\n\n#include <inttypes.h>\n#include <assert.h>\n#include <iostream>\n#include <stdlib.h>\n#include <map>\n#include <iomanip>\n#include <sstream>\n\n" 
  120     start = cppBaseStartstring.format(creationTime = time, xmlFile = inputXMLname)
 
  122     baseNameRoot = os.path.basename(outputNames)
 
  123     baseName = baseNameRoot + 
'Version' 
  124     fileName = outputNames + 
'Version' 
  125     baseHeader = 
open(fileName+
'.h',
'w')
 
  126     baseHeader.write(start)
 
  129     baseHeader.write(
'#ifndef '+baseName.upper() + 
'_H\n')
 
  130     baseHeader.write(
'#define '+baseName.upper() + 
'_H\n')
 
  131     baseHeader.write(
'\nclass '+baseName + 
'{\n\n')
 
  133     protectedString = 
"\nprotected:\n" 
  134     protectedString += 
"    //---------------------------------------------------------------------------------------------------\n" 
  135     protectedString += 
"    //  For explanation of the variables and there values in different versions see config XML file.\n" 
  136     protectedString += 
"    //---------------------------------------------------------------------------------------------------\n" 
  140     publicString = 
"\npublic: \n" 
  141     publicString += 
'\n    ' + baseName + 
'(unsigned int version) {\n' 
  143     dumpString = 
'\n    std::string dump() const {\n';
 
  144     dumpString += 
'\n        std::ostringstream s;\n';
 
  145     dumpString += 
'\n        std::ostringstream tmp;\n\n';
 
  146     dumpString += 
'        s << \"For a description of the parameters for different CTP version, see schema/L1CoreSpecifications.xml in L1CommonCore.\" << std::endl;\n\n';
 
  147     dumpString += 
'        s << \"|-------------------------------------------------------------|\" << std::endl;\n';
 
  148     dumpString += 
'        s << \"|                    Name                 |       Value       |\" << std::endl;\n';
 
  149     dumpString += 
'        s << \"|-------------------------------------------------------------|\" << std::endl;\n';
 
  155     changedValuesDict = {}
 
  161     pyStartstring = 
"#!/usr/bin/env python\n\n#This file was automatically created by XMLtoHeader.py\n# Created on:             {creationTime}\n# Created with config:    {xmlFile}\n# \n# Author: Ruth Poettgen\n# Contact: ruth.poettgen@cern.ch\n\n\n\nimport sys\n\nclass {classname}(object):\n    def __init__(self):\n" 
  169     for v 
in versionDict:
 
  172             changedValuesDict[v] = []
 
  174         pyStartstring = pyStartstring.format(creationTime = time,version = versionDict[v], xmlFile = inputXMLname, classname=baseNameRoot)
 
  175         headerName = outputNames + 
"_" + v + 
".py" 
  176         pyHeader = 
open(headerName,
'w')
 
  177         pyHeader.write(pyStartstring)
 
  190             childIndex=childIndex+1
 
  193             if child.attrib[
'ns'] 
not in versionDict:
 
  198             if child.find(
'name') 
is None:
 
  201             if child.find(
'type') 
is None:
 
  204             if child.find(
'value') 
is None:
 
  210             if child.find(
'name').text[1:-1] 
in nameList:
 
  226             while tmp_v 
not in nameVersionsDict[child.find(
'name').text[1:-1]]:
 
  229                 tmp_v = 
list(versionDict)[index-1]
 
  235             if child.attrib[
'ns']!=tmp_v:
 
  244             typeText = child.find(
'type').text
 
  245             nameText = child.find(
'name').text[1:-1]
 
  246             valueText = child.find(
'value').text
 
  249             pyHeader.write(
'        self.'+nameText.ljust(30)+
'= ')
 
  251             if 'mult' in typeText:  
 
  257                 pyHeader.write( (
'[ ' + valueText +  
' ]').ljust(50) )
 
  260                 listOfElements = valueText.split(
',')
 
  261                 numberOfElements = len(listOfElements)
 
  265                     protectedString += 
'    ' 
  266                     protectedString += typeDictCpp[typeText[0:-5]] + 
' ' 
  267                     protectedString += (nameText+ 
'['+ 
str(numberOfElements) + 
']').ljust(20)+ 
'=' 
  268                     protectedString += 
'{ ' + valueText + 
'};' 
  271                     functionString += 
'\n    const '+typeDictCpp[typeText[0:-5]] + 
'* get' 
  272                     functionString += nameText + 
'() const { return ' + nameText + 
'; }' 
  275                     dumpString += 
'\n        s << \"|\" << std::left  << std::setw(40)  << \"  ' + nameText + 
'\" << \" | \";\n' 
  276                     dumpString += 
'        tmp.clear(); tmp.str(\"\");\n        tmp<< \"[\";\n' 
  277                     dumpString += 
'        for (int i=0; i <' + 
str(numberOfElements) + 
'; i++) {\n' 
  278                     dumpString += 
'            if (i) tmp<<\",\";\n' 
  279                     dumpString += 
'            tmp << this->' + nameText + 
'[i];\n        }\n        tmp<<\"]\";\n' 
  280                     dumpString += 
'        s <<        std::right << std::setw(17)  << tmp.str()  << \" | \" << std::endl;\n\n' 
  290                     changedValuesDict[v].
append([nameText,valueText])
 
  297                 if (valueText)[0] 
not in [
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9']:
 
  299                     pyHeader.write( (
'self.' + val.replace(
'+',
' + self.')).ljust(10))
 
  301                     pyHeader.write(valueText.ljust(10))
 
  305                     functionString += 
'\n    '+typeDictCpp[typeText] + 
' get' 
  306                     functionString += nameText + 
'() const { return ' + nameText + 
'; }' 
  308                     protectedString += 
'    ' + typeDictCpp[typeText] + 
' ' 
  309                     protectedString += nameText 
 
  310                     protectedString += 
' = ' + valueText + 
';' 
  312                     dumpString += 
'        s << \"|\" << std::left  << std::setw(40)  << \"  ' + nameText + 
'\" << \" | \";\n' 
  313                     dumpString += 
'        s <<        std::right << std::setw(17)  << this->'  + nameText +  
'  << \" | \" << std::endl;\n\n' 
  322                     changedValuesDict[v].
append([nameText,valueText])
 
  327             if child.find(
'comment') 
is None:
 
  331                 pyHeader.write( 
'    # ' + child.find(
'comment').text[1:-1] + 
'\n')
 
  333                 protectedString += 
'\n' 
  335             nameList.append(nameText)
 
  344         pyHeader.write(
'\n\n' + baseNameRoot + 
'_' + v + 
' = ' + baseNameRoot + 
'()'+
'\n\n' + 
'del ' + baseNameRoot)
 
  347     dumpString += 
'        s << \"|-------------------------------------------------------------|\" << std::endl;\n\n';
 
  349     dumpString += 
'        return s.str();\n\n    }' 
  351     nVersions = len(versionDict)
 
  354     selection= 
'        if (version>=' + 
str(nVersions)+
') {\n';
 
  355     selection+= 
'            std::cerr << \"ERROR: invalid CTP version requested (\" << version << \"). Should be in [0,'+ 
str(nVersions-1)+ 
'].Setting it to the latest version ('+
str(nVersions-1)+
'). \" << std::endl;\n' 
  356     selection += 
'            version='+
str(nVersions-1)+
';\n' 
  361     for v 
in changedValuesDict:
 
  362         selection += 
'        if (version==' + 
str(versionInt) + 
' ) {\n' 
  363         for pair 
in changedValuesDict[v]:
 
  365                 listOfValues = pair[1].
split(
',')
 
  366                 numValues = len(listOfElements)
 
  369                 for val 
in listOfValues:
 
  370                     selection+= 
'            ' + pair[0] + 
'[' + 
str(valIndex) + 
'] = ' + val + 
';\n' 
  373                 selection+=
'            ' + pair[0] + 
' =  ' +  pair[1] + 
';\n' 
  375         selection += 
'        }\n\n' 
  377         numberOfChanges = len(changedValuesDict)
 
  380     baseHeader.write(protectedString+
'\n\n')
 
  381     baseHeader.write(publicString +
'\n\n')
 
  382     baseHeader.write(selection)
 
  383     baseHeader.write(
'    };\n\n')
 
  384     baseHeader.write(functionString+
'\n\n')
 
  385     baseHeader.write(dumpString+
'\n\n')
 
  386     baseHeader.write(
'\n};\n\n')
 
  387     baseHeader.write(
'#endif //' + baseName.upper() + 
'_H')