Universita' di GenovaINFN Sezione di Genova  
AIRWATCH / EUSO Genova

ModuleFactory - source file

// ESAF : Euso Simulation and Analysis Framework
// $Id: ModuleFactory.cc,v 1.21 2005/10/12 19:43:41 naumov Exp $
// Marco Pallavicini created Oct, 16 2003


#include "utils.hh"
#include "ModuleFactory.hh"
#include "TestRecoModule.hh"
#include "TestInputModule.hh"
#include "RootInputModule.hh"
#include "HoughModule.hh"
#include "BaseClusteringModule.hh"
#include "ClusterAnalysisModule.hh"
#include "GTUClusteringModule.hh"
#include "TrackDirection2Module.hh"
#include "TrackDetectorPlaneModule.hh"
#include "TrackDirectionModule.hh"
#include "HmaxByShapeMethodModule.hh"
#include "HmaxForProtonModule.hh"
#include "EnergyModule.hh"
#include "XmaxModule.hh"
#include "ProfileModule.hh"

#include <fstream>
#include <TMinuit.h>
#include <TVector3.h>

ClassImp(ModuleFactory)

// constructor
 ModuleFactory::ModuleFactory(const string& sName) {
  
    fCurrent = 0;
    fInputModule = 0;

    ifstream in( sName.c_str() );
    if (!in) {
        throw runtime_error("Cannot find ModuleFileName in EusoRecoFramework");
    }
    
    string dummy;
    
    // parse file
    while ( getline(in,dummy) ) {
        // erase comments
        size_t pos = dummy.find('#');
        if ( pos != string::npos ) 
	    dummy.erase( pos );
        
        // swallow spaces
        dummy = swallow_spaces( dummy );

        // skip blank lines
        if ( dummy.empty() ) continue;

	// each line must be a key=value pair
	// key can be : InputModule, Module, Sequence
	// InputModule: specifies the unique input module; 
	// Module: normal module
	// Sequence: list of connected modules (not implemented yet)
	
	// get identifier
	string identifier = dummy.substr( 0, dummy.find('=') );
	identifier = r_swallow_spaces( identifier );
        if ( identifier.find_first_of("t ") != string::npos) {
	    throw runtime_error("Syntax error in file "+sName+" line "+dummy);
	}

	// get module name
	string name = dummy.substr( dummy.find('=')+1, string::npos);
	name = swallow_spaces( name );
	name = r_swallow_spaces( name );

	// build modules
	if ( identifier == "InputModule" ) {
	    MakeInputModule(name);
	}
	else if ( identifier == "Module" ) {
            MakeModule( name );
	}
	else if ( identifier == "Sequence" ) {
	    MakeSequence( name );
	}
	else {
	    throw runtime_error("Syntax error in file"+sName+" line "+dummy);
	}
	
    }
}

// destructor
 ModuleFactory::~ModuleFactory() {
}

// returns a module until the list is over
 RecoModule* ModuleFactory::GetModule() {
    if ( fCurrent < fModules.size() )
        return fModules[fCurrent++];
    else
        return (RecoModule*)0;
}

// physically build objects and store into a vector
 void ModuleFactory::MakeModule( const string& name) {
    if ( name == "Test1" )
        fModules.push_back( new TestRecoModule( name ) );
    else if ( name == "Test2" )
        fModules.push_back( new TestRecoModule( name ) );
    else if ( name == "Test3" )
        fModules.push_back( new TestRecoModule( name ) );
    // real modules begin here!!
    else if ( name == "HoughTransform" )
        fModules.push_back( new HoughModule() );
    else if ( name == "BaseClustering" )
        fModules.push_back( new BaseClusteringModule() );
    else if ( name == "ClusterAnalysis" )
        fModules.push_back( new ClusterAnalysisModule() );
    else if ( name == "GTUClustering" )
        fModules.push_back( new GTUClusteringModule() );
    else if ( name == "TrackDirection2" )
        fModules.push_back( new TrackDirection2Module() );
    else if ( name == "TrackDetectorPlane" )
        fModules.push_back( new TrackDetectorPlaneModule() );
    else if ( name == "TrackDirection" )
        fModules.push_back( new TrackDirectionModule() );
    else if ( name == "HmaxByShapeMethod" )
        fModules.push_back( new HmaxByShapeMethodModule() );
    else if ( name == "HmaxForProton" )
        fModules.push_back( new HmaxForProtonModule() );
    else if ( name == "Xmax" )
        fModules.push_back( new XmaxModule() );
    else if ( name == "Energy" )
        fModules.push_back( new EnergyModule() );
    else if ( name == "Profile" )
        fModules.push_back( new ProfileModule() );
    else
        throw runtime_error("Unknown Module:"+name);
}

// physically build objects and store into a vector
 void ModuleFactory::MakeInputModule( const string& name) {
    if ( name == "Test" )
        fInputModule = new TestInputModule( name );
    else if ( name == "Root" )
        fInputModule = new RootInputModule();
    else
        throw runtime_error("Unknown Input Module:"+name);
}

// sequences: to be done
 void ModuleFactory::MakeSequence( const string& name) {
}
About Us | EUSO Official Website | Web pages created by Roberto Pesce and Alessandro Thea - Last Update Wed Nov 16 16:57:39 2005 Wed Nov 16 16:29:22 2005