#include "TDOMParser.h"
#include "RooStats/HistFactory/ConfigParser.h"
#include "RooStats/HistFactory/HistFactoryException.h"
#include "RooStats/HistFactory/Measurement.h"
#include "Helper.h"
using namespace RooStats;
using namespace HistFactory;
using namespace std;
std::vector< RooStats::HistFactory::Measurement > ConfigParser::GetMeasurementsFromXML( string input ) {
std::vector< HistFactory::Measurement > measurement_list;
try {
TDOMParser xmlparser;
Int_t parseError = xmlparser.ParseFile( input.c_str() );
if( parseError ) {
std::cerr << "Loading of xml document \"" << input
<< "\" failed" << std::endl;
throw hf_exc();
}
cout << "reading input : " << input << endl;
TXMLDocument* xmldoc = xmlparser.GetXMLDocument();
TXMLNode* rootNode = xmldoc->GetRootNode();
if( rootNode->GetNodeName() != TString( "Combination" ) ){
std::cout << "Error: Driver DOCTYPE not equal to 'Combination'" << std::endl;
throw hf_exc();
}
std::string OutputFilePrefix;
TListIter attribIt = rootNode->GetAttributes();
TXMLAttr* curAttr = 0;
while( ( curAttr = dynamic_cast< TXMLAttr* >( attribIt() ) ) != 0 ) {
TString attrName = curAttr->GetName();
std::string attrVal = curAttr->GetValue();
if( attrName == TString( "" ) ) {
std::cout << " Error: Attribute for 'Combination' with no name found" << std::endl;
throw hf_exc();
}
else if( attrName == TString( "OutputFilePrefix" ) ) {
OutputFilePrefix = string(curAttr->GetValue());
std::cout << "output file prefix is : " << OutputFilePrefix << endl;
}
else {
std::cout << " Error: Unknown attribute for 'Combination' encountered: "
<< attrName << std::endl;
throw hf_exc();
}
}
TXMLNode* node = NULL;
std::vector< std::string > xml_channel_files;
node = rootNode->GetChildren();
while( node != 0 ) {
if( node->GetNodeName() == TString( "Input" ) ) {
if( node->GetText() == NULL ) {
std::cout << "Error: node: " << node->GetName()
<< " has no text." << std::endl;
throw hf_exc();
}
xml_channel_files.push_back(node->GetText());
}
node = node->GetNextNode();
}
if(xml_channel_files.empty()){
cerr << "no input channels found" << endl;
throw hf_exc();
}
else {
std::cout << "Found Channels: ";
for( unsigned int i=0; i < xml_channel_files.size(); ++i ) std::cout << " " << xml_channel_files.at(i);
std::cout << std::endl;
}
std::vector< RooStats::HistFactory::PreprocessFunction > functionObjects;
node = rootNode->GetChildren();
while( node != 0 ) {
if( node->GetNodeName() == TString( "Function" ) ) {
RooStats::HistFactory::PreprocessFunction Func = ParseFunctionConfig( node );
functionObjects.push_back( Func );
}
node = node->GetNextNode();
}
std::cout << std::endl;
node = rootNode->GetChildren();
while( node != 0 ) {
if( node->GetNodeName() == TString( "" ) ) {
std::cout << "Error: Node found in Measurement Driver XML with no name" << std::endl;
throw hf_exc();
}
else if( node->GetNodeName() == TString( "Measurement" ) ) {
HistFactory::Measurement measurement = CreateMeasurementFromDriverNode( node );
measurement.SetOutputFilePrefix( OutputFilePrefix );
measurement_list.push_back( measurement );
}
else if( node->GetNodeName() == TString( "Function" ) ) {
;
}
else if( node->GetNodeName() == TString( "Input" ) ) {
;
}
else if( IsAcceptableNode( node ) ) { ; }
else {
std::cout << "Error: Unknown node found in Measurement Driver XML: "
<< node->GetNodeName() << std::endl;
throw hf_exc();
}
node = node->GetNextNode();
}
std::cout << "Done Processing Measurements" << std::endl;
if( measurement_list.size() == 0 ) {
std::cout << "Error: No Measurements found in XML Driver File" << std::endl;
throw hf_exc();
}
else {
std::cout << "Found Measurements: ";
for( unsigned int i=0; i < measurement_list.size(); ++i ) std::cout << " " << measurement_list.at(i).GetName();
std::cout << std::endl;
}
for( unsigned int i = 0; i < measurement_list.size(); ++i) {
measurement_list.at(i).SetFunctionObjects( functionObjects );
}
std::vector< HistFactory::Channel > channel_list;
for( unsigned int i = 0; i < xml_channel_files.size(); ++i ) {
std::string channel_xml = xml_channel_files.at(i);
std::cout << "Parsing Channel: " << channel_xml << std::endl;
HistFactory::Channel channel = ParseChannelXMLFile( channel_xml );
channel_list.push_back( channel );
}
for( unsigned int i = 0; i < measurement_list.size(); ++i) {
HistFactory::Measurement& measurement = measurement_list.at(i);
for( unsigned int j = 0; j < channel_list.size(); ++j ) {
measurement.GetChannels().push_back( channel_list.at(j) );
}
}
}
catch(std::exception& e)
{
std::cout << e.what() << std::endl;
throw hf_exc();
}
return measurement_list;
}
HistFactory::Measurement ConfigParser::CreateMeasurementFromDriverNode( TXMLNode* node ) {
HistFactory::Measurement measurement;
measurement.SetLumi( 1.0 );
measurement.SetLumiRelErr( .10 );
measurement.SetBinLow( 0 );
measurement.SetBinHigh( 1 );
measurement.SetExportOnly( false );
std::cout << "Creating new measurement: " << std::endl;
TListIter attribIt = node->GetAttributes();
TXMLAttr* curAttr = 0;
while( ( curAttr = dynamic_cast< TXMLAttr* >( attribIt() ) ) != 0 ) {
if( curAttr->GetName() == TString( "" ) ) {
std::cout << "Found XML attribute in Measurement with no name" << std::endl;
throw hf_exc();
}
else if( curAttr->GetName() == TString( "Name" ) ) {
measurement.SetName( curAttr->GetValue() );
}
else if( curAttr->GetName() == TString( "Lumi" ) ) {
measurement.SetLumi( atof(curAttr->GetValue()) );
}
else if( curAttr->GetName() == TString( "LumiRelErr" ) ) {
measurement.SetLumiRelErr( atof(curAttr->GetValue()) );
}
else if( curAttr->GetName() == TString( "BinLow" ) ) {
measurement.SetBinLow( atoi(curAttr->GetValue()) );
}
else if( curAttr->GetName() == TString( "BinHigh" ) ) {
measurement.SetBinHigh( atoi(curAttr->GetValue()) );
}
else if( curAttr->GetName() == TString( "Mode" ) ) {
cout <<"\n INFO: Mode attribute is deprecated, will ignore\n"<<endl;
}
else if( curAttr->GetName() == TString( "ExportOnly" ) ) {
measurement.SetExportOnly( CheckTrueFalse(curAttr->GetValue(),"Measurement") );
}
else {
std::cout << "Found unknown XML attribute in Measurement: " << curAttr->GetName()
<< std::endl;
throw hf_exc();
}
}
TXMLNode* child = node->GetChildren();
while( child != 0 ) {
if( child->GetNodeName() == TString( "" ) ) {
std::cout << "Found XML child node of Measurement with no name" << std::endl;
throw hf_exc();
}
else if( child->GetNodeName() == TString( "POI" ) ) {
if( child->GetText() == NULL ) {
std::cout << "Error: node: " << child->GetName()
<< " has no text." << std::endl;
throw hf_exc();
}
AddSubStrings( measurement.GetPOIList(), child->GetText() );
}
else if( child->GetNodeName() == TString( "ParamSetting" ) ) {
TListIter paramIt = child->GetAttributes();
TXMLAttr* curParam = 0;
while( ( curParam = dynamic_cast< TXMLAttr* >( paramIt() ) ) != 0 ) {
if( curParam->GetName() == TString( "" ) ) {
std::cout << "Error: Found tag attribute with no name in ParamSetting" << std::endl;
throw hf_exc();
}
else if( curParam->GetName() == TString( "Const" ) ) {
if(curParam->GetValue()==TString("True")){
if( child->GetText() == NULL ) {
std::cout << "Error: node: " << child->GetName()
<< " has no text." << std::endl;
throw hf_exc();
}
AddSubStrings( measurement.GetConstantParams(), child->GetText() );
}
}
else if( curParam->GetName() == TString( "Val" ) ) {
double val = atof(curParam->GetValue());
if( child->GetText() == NULL ) {
std::cout << "Error: node: " << child->GetName()
<< " has no text." << std::endl;
throw hf_exc();
}
std::vector<std::string> child_nodes = GetChildrenFromString(child->GetText());
for(unsigned int i = 0; i < child_nodes.size(); ++i) {
measurement.SetParamValue( child_nodes.at(i), val);
}
}
else {
std::cout << "Found tag attribute with unknown name in ParamSetting: "
<< curAttr->GetName() << std::endl;
throw hf_exc();
}
}
}
else if( child->GetNodeName() == TString( "Asimov" ) ) {
RooStats::HistFactory::Asimov asimov;
std::string ParamFixString;
attribIt = child->GetAttributes();
curAttr = 0;
while( ( curAttr = dynamic_cast< TXMLAttr* >( attribIt() ) ) != 0 ) {
if( curAttr->GetName() == TString( "" ) ) {
std::cout << "Error: Found tag attribute with no name in ConstraintTerm" << std::endl;
throw hf_exc();
}
else if( curAttr->GetName() == TString( "Name" ) ) {
std::string name = curAttr->GetValue();
asimov.SetName( name );
}
else if( curAttr->GetName() == TString( "FixParams" ) ) {
ParamFixString = curAttr->GetValue();
}
else {
std::cout << "Found tag attribute with unknown name in ConstraintTerm: "
<< curAttr->GetName() << std::endl;
throw hf_exc();
}
}
if( ParamFixString=="" ) {
std::cout << "Warning: Asimov Dataset with name: " << asimov.GetName()
<< " added, but no parameters are set to be fixed" << std::endl;
}
else {
AddParamsToAsimov( asimov, ParamFixString );
}
measurement.AddAsimovDataset( asimov );
}
else if( child->GetNodeName() == TString( "ConstraintTerm" ) ) {
vector<string> syst;
string type = "";
double rel = 0;
map<string,double> gammaSyst;
map<string,double> uniformSyst;
map<string,double> logNormSyst;
if( child->GetText() == NULL ) {
std::cout << "Error: node: " << child->GetName()
<< " has no text." << std::endl;
throw hf_exc();
}
AddSubStrings(syst, child->GetText());
attribIt = child->GetAttributes();
curAttr = 0;
while( ( curAttr = dynamic_cast< TXMLAttr* >( attribIt() ) ) != 0 ) {
if( curAttr->GetName() == TString( "" ) ) {
std::cout << "Error: Found tag attribute with no name in ConstraintTerm" << std::endl;
throw hf_exc();
}
else if( curAttr->GetName() == TString( "Type" ) ) {
type = curAttr->GetValue();
}
else if( curAttr->GetName() == TString( "RelativeUncertainty" ) ) {
rel = atof(curAttr->GetValue());
}
else {
std::cout << "Found tag attribute with unknown name in ConstraintTerm: "
<< curAttr->GetName() << std::endl;
throw hf_exc();
}
}
if( ! (type=="Gamma" || type=="Uniform" ||
type=="LogNormal" || type=="NoConstraint") ) {
std::cout << "Error: Encountered unknown type for ConstraintTerm: " << type << std::endl;
throw hf_exc();
}
if (type=="Gamma" && rel!=0) {
for (vector<string>::const_iterator it=syst.begin(); it!=syst.end(); it++) {
measurement.GetGammaSyst()[(*it).c_str()] = rel;
}
}
if (type=="Uniform" && rel!=0) {
for (vector<string>::const_iterator it=syst.begin(); it!=syst.end(); it++) {
measurement.GetUniformSyst()[(*it).c_str()] = rel;
}
}
if (type=="LogNormal" && rel!=0) {
for (vector<string>::const_iterator it=syst.begin(); it!=syst.end(); it++) {
measurement.GetLogNormSyst()[(*it).c_str()] = rel;
}
}
if (type=="NoConstraint") {
for (vector<string>::const_iterator it=syst.begin(); it!=syst.end(); it++) {
measurement.GetNoSyst()[(*it).c_str()] = 1.0;
}
}
}
else if( IsAcceptableNode( child ) ) { ; }
else {
std::cout << "Found XML child of Measurement with unknown name: " << child->GetNodeName()
<< std::endl;
throw hf_exc();
}
child = child->GetNextNode();
}
measurement.PrintTree();
std::cout << std::endl;
return measurement;
}
HistFactory::Channel ConfigParser::ParseChannelXMLFile( string filen ) {
std::cout << "Parsing file: " << filen ;
TDOMParser xmlparser;
Int_t parseError = xmlparser.ParseFile( filen.c_str() );
if( parseError ) {
std::cout << "Loading of xml document \"" << filen
<< "\" failed" << std::endl;
throw hf_exc();
}
TXMLDocument* xmldoc = xmlparser.GetXMLDocument();
TXMLNode* rootNode = xmldoc->GetRootNode();
if( rootNode->GetNodeName() != TString( "Channel" ) ){
std::cout << "Error: In parsing a Channel XML, "
<< "Encounterd XML with DOCTYPE: " << rootNode->GetNodeName()
<< std::endl;
std::cout << " DOCTYPE for channels must be 'Channel' "
<< " Check that your XML is properly written" << std::endl;
throw hf_exc();
}
HistFactory::Channel channel;
channel.SetInputFile( "" );
channel.SetHistoPath( "" );
TListIter attribIt = rootNode->GetAttributes();
TXMLAttr* curAttr = 0;
while( ( curAttr = dynamic_cast< TXMLAttr* >( attribIt() ) ) != 0 ) {
TString attrName = curAttr->GetName();
std::string attrVal = curAttr->GetValue();
if( attrName == TString( "" ) ) {
std::cout << " Error: Attribute for 'Channel' with no name found" << std::endl;
throw hf_exc();
}
else if( attrName == TString( "Name" ) ) {
channel.SetName( attrVal );
std::cout << " : creating a channel named " << channel.GetName() << std::endl;
}
else if( attrName == TString( "InputFile" ) ) {
std::cout << "Setting InputFile for this channel: " << attrVal << std::endl;
channel.SetInputFile( attrVal );
m_currentInputFile = attrVal;
}
else if( curAttr->GetName() == TString( "HistoPath" ) ) {
std::cout << "Setting HistoPath for this channel: " << attrVal << std::endl;
channel.SetHistoPath( attrVal );
m_currentHistoPath = attrVal;
}
else if( curAttr->GetName() == TString( "HistoName" ) ) {
std::cout << "Use of HistoName in Channel is deprecated" << std::endl;
std::cout << "This will be ignored" << std::endl;
}
else {
std::cout << " Error: Unknown attribute for 'Channel' encountered: "
<< attrName << std::endl;
throw hf_exc();
}
}
if( channel.GetName() == "" ) {
std::cout << "Error: Channel created with no name" << std::endl;
throw hf_exc();
}
m_currentChannel = channel.GetName();
TXMLNode* node = rootNode->GetChildren();
bool firstData=true;
while( node != 0 ) {
m_currentInputFile = channel.GetInputFile();
m_currentHistoPath = channel.GetHistoPath();
if( node->GetNodeName() == TString( "" ) ) {
std::cout << "Error: Encountered node in Channel with no name" << std::endl;
throw hf_exc();
}
else if( node->GetNodeName() == TString( "Data" ) ) {
if( firstData ) {
RooStats::HistFactory::Data data = CreateDataElement(node);
if( data.GetName() != "" ) {
std::cout << "Error: You can only rename the datasets of additional data sets. "
<< " Remove the 'Name=" << data.GetName() << "' tag"
<< " from channel: " << channel.GetName() << std::endl;
throw hf_exc();
}
channel.SetData( data );
firstData=false;
}
else {
channel.AddAdditionalData( CreateDataElement(node) );
}
}
else if( node->GetNodeName() == TString( "StatErrorConfig" ) ) {
channel.SetStatErrorConfig( CreateStatErrorConfigElement(node) );
}
else if( node->GetNodeName() == TString( "Sample" ) ) {
channel.GetSamples().push_back( CreateSampleElement(node) );
}
else if( IsAcceptableNode( node ) ) { ; }
else {
std::cout << "Error: Encountered node in Channel with unknown name: " << node->GetNodeName() << std::endl;
throw hf_exc();
}
node = node->GetNextNode();
}
std::cout << "Created Channel: " << std::endl;
channel.Print();
return channel;
}
HistFactory::Data ConfigParser::CreateDataElement( TXMLNode* node ) {
std::cout << "Creating Data Element" << std::endl;
HistFactory::Data data;
data.SetInputFile( m_currentInputFile );
data.SetHistoPath( m_currentHistoPath );
TListIter attribIt = node->GetAttributes();
TXMLAttr* curAttr = 0;
while( ( curAttr = dynamic_cast< TXMLAttr* >( attribIt() ) ) != 0 ) {
TString attrName = curAttr->GetName();
std::string attrVal = curAttr->GetValue();
if( attrName == TString( "" ) ) {
std::cout << " Error: Attribute for 'Data' with no name found" << std::endl;
throw hf_exc();
}
else if( attrName == TString( "Name" ) ) {
data.SetName( attrVal );
}
else if( attrName == TString( "InputFile" ) ) {
data.SetInputFile( attrVal );
}
else if( attrName == TString( "HistoName" ) ) {
data.SetHistoName( attrVal );
}
else if( attrName == TString( "HistoPath" ) ) {
data.SetHistoPath( attrVal );
}
else if( IsAcceptableNode( node ) ) { ; }
else {
std::cout << " Error: Unknown attribute for 'Data' encountered: " << attrName << std::endl;
throw hf_exc();
}
}
if( data.GetInputFile() == "" ) {
std::cout << "Error: Data Node has no InputFile" << std::endl;
throw hf_exc();
}
if( data.GetHistoName() == "" ) {
std::cout << "Error: Data Node has no HistoName" << std::endl;
throw hf_exc();
}
std::cout << "Created Data Node with"
<< " InputFile: " << data.GetInputFile()
<< " HistoName: " << data.GetHistoName()
<< " HistoPath: " << data.GetHistoPath();
if( data.GetName() != "") std::cout << " Name: " << data.GetName();
std::cout << std::endl;
return data;
}
HistFactory::StatErrorConfig ConfigParser::CreateStatErrorConfigElement( TXMLNode* node ) {
std::cout << "Creating StatErrorConfig Element" << std::endl;
HistFactory::StatErrorConfig config;
config.SetConstraintType( Constraint::Gaussian );
config.SetRelErrorThreshold( 0.05 );
TListIter attribIt = node->GetAttributes();
TXMLAttr* curAttr = 0;
while( ( curAttr = dynamic_cast< TXMLAttr* >( attribIt() ) ) != 0 ) {
TString attrName = curAttr->GetName();
std::string attrVal = curAttr->GetValue();
if( attrName == TString( "RelErrorThreshold" ) ) {
config.SetRelErrorThreshold( atof(attrVal.c_str()) );
}
if( attrName == TString( "ConstraintType" ) ) {
if( attrVal == "" ) {
std::cout << "Error: Bad Value for StatErrorConfig Constraint Type Found" << std::endl;
throw hf_exc();
}
else if( attrVal=="Gaussian" || attrVal=="Gauss" ) {
config.SetConstraintType( Constraint::Gaussian );
}
else if( attrVal=="Poisson" || attrVal=="Pois" ) {
config.SetConstraintType( Constraint::Poisson );
}
else if( IsAcceptableNode( node ) ) { ; }
else {
cout << "Invalid Stat Constraint Type: " << curAttr->GetValue() << endl;
throw hf_exc();
}
}
}
std::cout << "Created StatErrorConfig Element with"
<< " Constraint type: " << config.GetConstraintType()
<< " RelError Threshold: " << config.GetRelErrorThreshold()
<< std::endl;
return config;
}
HistFactory::Sample ConfigParser::CreateSampleElement( TXMLNode* node ) {
std::cout << "Creating Sample Element" << std::endl;
HistFactory::Sample sample;
sample.SetInputFile( m_currentInputFile );
sample.SetHistoPath( m_currentHistoPath );
sample.SetChannelName( m_currentChannel );
sample.SetNormalizeByTheory( true );
TListIter attribIt = node->GetAttributes();
TXMLAttr* curAttr = 0;
while( ( curAttr = dynamic_cast< TXMLAttr* >( attribIt() ) ) != 0 ) {
TString attrName = curAttr->GetName();
std::string attrVal = curAttr->GetValue();
if( attrName == TString( "" ) ) {
std::cout << " Error: Attribute for 'Sample' with no name found" << std::endl;
throw hf_exc();
}
else if( attrName == TString( "Name" ) ) {
sample.SetName( attrVal );
}
else if( attrName == TString( "InputFile" ) ) {
sample.SetInputFile( attrVal );
m_currentInputFile = attrVal;
}
else if( attrName == TString( "HistoName" ) ) {
sample.SetHistoName( attrVal );
}
else if( attrName == TString( "HistoPath" ) ) {
sample.SetHistoPath( attrVal );
m_currentHistoPath = attrVal;
}
else if( attrName == TString( "NormalizeByTheory" ) ) {
sample.SetNormalizeByTheory( CheckTrueFalse(attrVal,"Sample") );
}
else {
std::cout << " Error: Unknown attribute for 'Sample' encountered: " << attrName << std::endl;
throw hf_exc();
}
}
if( sample.GetName() == "" ) {
std::cout << "Error: Sample Node has no Name" << std::endl;
throw hf_exc();
}
if( sample.GetInputFile() == "" ) {
std::cout << "Error: Sample Node has no InputFile" << std::endl;
throw hf_exc();
}
if( sample.GetHistoName() == "" ) {
std::cout << "Error: Sample Node has no HistoName" << std::endl;
throw hf_exc();
}
TXMLNode* child = node->GetChildren();
while( child != 0 ) {
if( child->GetNodeName() == TString( "" ) ) {
std::cout << "Error: Encountered node in Sample with no name" << std::endl;
throw hf_exc();
}
else if( child->GetNodeName() == TString( "NormFactor" ) ) {
sample.GetNormFactorList().push_back( MakeNormFactor( child ) );
}
else if( child->GetNodeName() == TString( "OverallSys" ) ) {
sample.GetOverallSysList().push_back( MakeOverallSys( child ) );
}
else if( child->GetNodeName() == TString( "HistoSys" ) ) {
sample.GetHistoSysList().push_back( MakeHistoSys( child ) );
}
else if( child->GetNodeName() == TString( "HistoFactor" ) ) {
std::cout << "WARNING: HistoFactor not yet supported" << std::endl;
}
else if( child->GetNodeName() == TString( "ShapeSys" ) ) {
sample.GetShapeSysList().push_back( MakeShapeSys( child ) );
}
else if( child->GetNodeName() == TString( "ShapeFactor" ) ) {
sample.GetShapeFactorList().push_back( MakeShapeFactor( child ) );
}
else if( child->GetNodeName() == TString( "StatError" ) ) {
sample.SetStatError( ActivateStatError(child) );
}
else if( IsAcceptableNode( child ) ) { ; }
else {
std::cout << "Error: Encountered node in Sample with unknown name: " << child->GetNodeName() << std::endl;
throw hf_exc();
}
child=child->GetNextNode();
}
std::cout << "Created Sample Node with"
<< " Name: " << sample.GetName()
<< " InputFile: " << sample.GetInputFile()
<< " HistoName: " << sample.GetHistoName()
<< " HistoPath: " << sample.GetHistoPath()
<< std::endl;
return sample;
}
HistFactory::NormFactor ConfigParser::MakeNormFactor( TXMLNode* node ) {
std::cout << "Making NormFactor:" << std::endl;
HistFactory::NormFactor norm;
TListIter attribIt = node->GetAttributes();
TXMLAttr* curAttr = 0;
while( ( curAttr = dynamic_cast< TXMLAttr* >( attribIt() ) ) != 0 ) {
TString attrName = curAttr->GetName();
std::string attrVal = curAttr->GetValue();
if( attrName == TString( "" ) ){
std::cout << "Error: Encountered Element in NormFactor with no name" << std::endl;
throw hf_exc();
}
else if( curAttr->GetName() == TString( "Name" ) ) {
norm.SetName( attrVal );
}
else if( curAttr->GetName() == TString( "Val" ) ) {
norm.SetVal( atof(attrVal.c_str()) );
}
else if( curAttr->GetName() == TString( "Low" ) ) {
norm.SetLow( atof(attrVal.c_str()) );
}
else if( curAttr->GetName() == TString( "High" ) ) {
norm.SetHigh( atof(attrVal.c_str()) );
}
else if( curAttr->GetName() == TString( "Const" ) ) {
norm.SetConst( CheckTrueFalse(attrVal,"NormFactor") );
}
else {
std::cout << "Error: Encountered Element in NormFactor with unknown name: "
<< attrName << std::endl;
throw hf_exc();
}
}
if( norm.GetName() == "" ) {
std::cout << "Error: NormFactor Node has no Name" << std::endl;
throw hf_exc();
}
if( norm.GetLow() >= norm.GetHigh() ) {
std::cout << "Error: NormFactor: " << norm.GetName()
<< " has lower limit >= its upper limit: "
<< " Lower: " << norm.GetLow()
<< " Upper: " << norm.GetHigh()
<< ". Please Fix" << std::endl;
throw hf_exc();
}
if( norm.GetVal() > norm.GetHigh() || norm.GetVal() < norm.GetLow() ) {
std::cout << "Error: NormFactor: " << norm.GetName()
<< " has initial value not within its range: "
<< " Val: " << norm.GetVal()
<< " Lower: " << norm.GetLow()
<< " Upper: " << norm.GetHigh()
<< ". Please Fix" << std::endl;
throw hf_exc();
}
norm.Print();
return norm;
}
HistFactory::HistoFactor ConfigParser::MakeHistoFactor( TXMLNode* ) {
std::cout << "Making HistoFactor" << std::endl;
HistFactory::HistoFactor dummy;
dummy.SetInputFileLow( m_currentInputFile );
dummy.SetHistoPathLow( m_currentHistoPath );
dummy.SetInputFileHigh( m_currentInputFile );
dummy.SetHistoPathHigh( m_currentHistoPath );
std::cout << "Made HistoFactor" << std::endl;
return dummy;
}
HistFactory::HistoSys ConfigParser::MakeHistoSys( TXMLNode* node ) {
std::cout << "Making HistoSys:" << std::endl;
HistFactory::HistoSys histoSys;
histoSys.SetInputFileLow( m_currentInputFile );
histoSys.SetHistoPathLow( m_currentHistoPath );
histoSys.SetInputFileHigh( m_currentInputFile );
histoSys.SetHistoPathHigh( m_currentHistoPath );
TListIter attribIt = node->GetAttributes();
TXMLAttr* curAttr = 0;
while( ( curAttr = dynamic_cast< TXMLAttr* >( attribIt() ) ) != 0 ) {
TString attrName = curAttr->GetName();
std::string attrVal = curAttr->GetValue();
if( attrName == TString( "" ) ){
std::cout << "Error: Encountered Element in HistoSys with no name" << std::endl;
throw hf_exc();
}
else if( curAttr->GetName() == TString( "Name" ) ) {
histoSys.SetName( attrVal );
}
else if( curAttr->GetName() == TString( "HistoFileHigh" ) ) {
histoSys.SetInputFileHigh( attrVal );
}
else if( curAttr->GetName() == TString( "HistoPathHigh" ) ) {
histoSys.SetHistoPathHigh( attrVal );
}
else if( curAttr->GetName() == TString( "HistoNameHigh" ) ) {
histoSys.SetHistoNameHigh( attrVal );
}
else if( curAttr->GetName() == TString( "HistoFileLow" ) ) {
histoSys.SetInputFileLow( attrVal );
}
else if( curAttr->GetName() == TString( "HistoPathLow" ) ) {
histoSys.SetHistoPathLow( attrVal );
}
else if( curAttr->GetName() == TString( "HistoNameLow" ) ) {
histoSys.SetHistoNameLow( attrVal );
}
else {
std::cout << "Error: Encountered Element in HistoSys with unknown name: "
<< attrName << std::endl;
throw hf_exc();
}
}
if( histoSys.GetName() == "" ) {
std::cout << "Error: HistoSys Node has no Name" << std::endl;
throw hf_exc();
}
if( histoSys.GetInputFileHigh() == "" ) {
std::cout << "Error: HistoSysSample Node has no InputFileHigh" << std::endl;
throw hf_exc();
}
if( histoSys.GetInputFileLow() == "" ) {
std::cout << "Error: HistoSysSample Node has no InputFileLow" << std::endl;
throw hf_exc();
}
if( histoSys.GetHistoNameHigh() == "" ) {
std::cout << "Error: HistoSysSample Node has no HistoNameHigh" << std::endl;
throw hf_exc();
}
if( histoSys.GetHistoNameLow() == "" ) {
std::cout << "Error: HistoSysSample Node has no HistoNameLow" << std::endl;
throw hf_exc();
}
histoSys.Print();
return histoSys;
}
HistFactory::OverallSys ConfigParser::MakeOverallSys( TXMLNode* node ) {
std::cout << "Making OverallSys:" << std::endl;
HistFactory::OverallSys overallSys;
TListIter attribIt = node->GetAttributes();
TXMLAttr* curAttr = 0;
while( ( curAttr = dynamic_cast< TXMLAttr* >( attribIt() ) ) != 0 ) {
TString attrName = curAttr->GetName();
std::string attrVal = curAttr->GetValue();
if( attrName == TString( "" ) ){
std::cout << "Error: Encountered Element in OverallSys with no name" << std::endl;
throw hf_exc();
}
else if( attrName == TString( "Name" ) ) {
overallSys.SetName( attrVal );
}
else if( attrName == TString( "High" ) ) {
overallSys.SetHigh( atof(attrVal.c_str()) );
}
else if( attrName == TString( "Low" ) ) {
overallSys.SetLow( atof(attrVal.c_str()) );
}
else {
std::cout << "Error: Encountered Element in OverallSys with unknown name: "
<< attrName << std::endl;
throw hf_exc();
}
}
if( overallSys.GetName() == "" ) {
std::cout << "Error: Encountered OverallSys with no name" << std::endl;
throw hf_exc();
}
overallSys.Print();
return overallSys;
}
HistFactory::ShapeFactor ConfigParser::MakeShapeFactor( TXMLNode* node ) {
std::cout << "Making ShapeFactor" << std::endl;
HistFactory::ShapeFactor shapeFactor;
TListIter attribIt = node->GetAttributes();
TXMLAttr* curAttr = 0;
std::string ShapeInputFile = m_currentInputFile;
std::string ShapeInputPath = m_currentHistoPath;
while( ( curAttr = dynamic_cast< TXMLAttr* >( attribIt() ) ) != 0 ) {
TString attrName = curAttr->GetName();
std::string attrVal = curAttr->GetValue();
if( attrName == TString( "" ) ){
std::cout << "Error: Encountered Element in ShapeFactor with no name" << std::endl;
throw hf_exc();
}
else if( attrName == TString( "Name" ) ) {
shapeFactor.SetName( attrVal );
}
else if( attrName == TString( "Const" ) ) {
shapeFactor.SetConstant( CheckTrueFalse(attrVal, "ShapeFactor" ) );
}
else if( attrName == TString( "HistoName" ) ) {
shapeFactor.SetHistoName( attrVal );
}
else if( attrName == TString( "InputFile" ) ) {
ShapeInputFile = attrVal;
}
else if( attrName == TString( "HistoPath" ) ) {
ShapeInputPath = attrVal;
}
else {
std::cout << "Error: Encountered Element in ShapeFactor with unknown name: "
<< attrName << std::endl;
throw hf_exc();
}
}
if( shapeFactor.GetName() == "" ) {
std::cout << "Error: Encountered ShapeFactor with no name" << std::endl;
throw hf_exc();
}
if( shapeFactor.HasInitialShape() ) {
if( shapeFactor.GetHistoName() == "" ) {
std::cout << "Error: ShapeFactor: " << shapeFactor.GetName()
<< " is configured to have an initial shape, but "
<< "its histogram doesn't have a name"
<< std::endl;
throw hf_exc();
}
shapeFactor.SetHistoPath( ShapeInputPath );
shapeFactor.SetInputFile( ShapeInputFile );
}
shapeFactor.Print();
return shapeFactor;
}
HistFactory::ShapeSys ConfigParser::MakeShapeSys( TXMLNode* node ) {
std::cout << "Making ShapeSys" << std::endl;
HistFactory::ShapeSys shapeSys;
shapeSys.SetConstraintType( Constraint::Gaussian );
shapeSys.SetInputFile( m_currentInputFile );
shapeSys.SetHistoPath( m_currentHistoPath );
TListIter attribIt = node->GetAttributes();
TXMLAttr* curAttr = 0;
while( ( curAttr = dynamic_cast< TXMLAttr* >( attribIt() ) ) != 0 ) {
TString attrName = curAttr->GetName();
std::string attrVal = curAttr->GetValue();
if( attrName == TString( "" ) ){
std::cout << "Error: Encountered Element in ShapeSys with no name" << std::endl;
throw hf_exc();
}
else if( attrName == TString( "Name" ) ) {
shapeSys.SetName( attrVal );
}
else if( attrName == TString( "HistoName" ) ) {
shapeSys.SetHistoName( attrVal );
}
else if( attrName == TString( "HistoPath" ) ) {
shapeSys.SetHistoPath( attrVal );
}
else if( attrName == TString( "InputFile" ) ) {
shapeSys.SetInputFile( attrVal );
}
else if( attrName == TString( "ConstraintType" ) ) {
if( attrVal=="" ) {
std::cout << "Error: ShapeSys Constraint type is empty" << std::endl;
throw hf_exc();
}
else if( attrVal=="Gaussian" || attrVal=="Gauss" ) {
shapeSys.SetConstraintType( Constraint::Gaussian );
}
else if( attrVal=="Poisson" || attrVal=="Pois" ) {
shapeSys.SetConstraintType( Constraint::Poisson );
}
else {
cout << "Error: Encountered unknown ShapeSys Constraint type: " << attrVal << endl;
throw hf_exc();
}
}
else {
std::cout << "Error: Encountered Element in ShapeSys with unknown name: "
<< attrName << std::endl;
throw hf_exc();
}
}
if( shapeSys.GetName() == "" ) {
std::cout << "Error: Encountered ShapeSys with no Name" << std::endl;
throw hf_exc();
}
if( shapeSys.GetInputFile() == "" ) {
std::cout << "Error: Encountered ShapeSys with no InputFile" << std::endl;
throw hf_exc();
}
if( shapeSys.GetHistoName() == "" ) {
std::cout << "Error: Encountered ShapeSys with no HistoName" << std::endl;
throw hf_exc();
}
shapeSys.Print();
return shapeSys;
}
HistFactory::StatError ConfigParser::ActivateStatError( TXMLNode* node ) {
std::cout << "Activating StatError" << std::endl;
HistFactory::StatError statError;
statError.Activate( false );
statError.SetUseHisto( false );
statError.SetHistoName( "" );
TListIter attribIt = node->GetAttributes();
TXMLAttr* curAttr = 0;
while( ( curAttr = dynamic_cast< TXMLAttr* >( attribIt() ) ) != 0 ) {
TString attrName = curAttr->GetName();
std::string attrVal = curAttr->GetValue();
if( attrName == TString( "" ) ){
std::cout << "Error: Encountered Element in ActivateStatError with no name" << std::endl;
throw hf_exc();
}
else if( attrName == TString( "Activate" ) ) {
statError.Activate( CheckTrueFalse(attrVal,"ActivateStatError") );
}
else if( attrName == TString( "HistoName" ) ) {
statError.SetHistoName( attrVal );
}
else if( attrName == TString( "HistoPath" ) ) {
statError.SetHistoPath( attrVal );
}
else if( attrName == TString( "InputFile" ) ) {
statError.SetInputFile( attrVal );
}
else {
std::cout << "Error: Encountered Element in ActivateStatError with unknown name: "
<< attrName << std::endl;
throw hf_exc();
}
}
if( statError.GetHistoName() != "" ) {
statError.SetUseHisto( true );
if( statError.GetInputFile() == "" ) {
statError.SetInputFile( m_currentInputFile );
}
if( statError.GetHistoPath() == "" ) {
statError.SetHistoPath( m_currentHistoPath );
}
}
statError.Print();
return statError;
}
RooStats::HistFactory::PreprocessFunction ConfigParser::ParseFunctionConfig( TXMLNode* functionNode ){
std::cout << "Parsing FunctionConfig" << std::endl;
TListIter attribIt = functionNode->GetAttributes();
TXMLAttr* curAttr = 0;
std::string Name = "";
std::string Expression = "";
std::string Dependents = "";
while( ( curAttr = dynamic_cast< TXMLAttr* >( attribIt() ) ) != 0 ) {
if( curAttr->GetName() == TString( "Name" ) ) {
Name = curAttr->GetValue();
}
if( curAttr->GetName() == TString( "Expression" ) ) {
Expression = curAttr->GetValue();
}
if( curAttr->GetName() == TString( "Dependents" ) ) {
Dependents = curAttr->GetValue();
}
}
if( Name=="" ){
std::cout << "Error processing PreprocessFunction: Name attribute is empty" << std::endl;
throw hf_exc();
}
if( Expression=="" ){
std::cout << "Error processing PreprocessFunction: Expression attribute is empty" << std::endl;
throw hf_exc();
}
if( Dependents=="" ){
std::cout << "Error processing PreprocessFunction: Dependents attribute is empty" << std::endl;
throw hf_exc();
}
RooStats::HistFactory::PreprocessFunction func(Name, Expression, Dependents);
std::cout << "Created Preprocess Function: " << func.GetCommand() << std::endl;
return func;
}
bool ConfigParser::IsAcceptableNode( TXMLNode* node ) {
if( node->GetNodeName() == TString( "text" ) ) {
return true;
}
if( node->GetNodeName() == TString( "comment" ) ) {
return true;
}
return false;
}
bool ConfigParser::CheckTrueFalse( std::string attrVal, std::string NodeTitle ) {
if( attrVal == "" ) {
std::cout << "Error: In " << NodeTitle
<< " Expected either 'True' or 'False' but found empty" << std::endl;
throw hf_exc();
}
else if ( attrVal == "True" || attrVal == "true" ) return true;
else if ( attrVal == "False" || attrVal == "false" ) return false;
else {
std::cout << "Error: In " << NodeTitle
<< " Expected either 'True' or 'False' but found: " << attrVal << std::endl;
throw hf_exc();
}
return false;
}