Universita' di GenovaINFN Sezione di Genova  
AIRWATCH / EUSO Genova

EusoDetector - source file

// class EusoDetector
// $Id: EusoDetector.cc,v 1.39 2005/11/12 12:00:22 naumov Exp $
// M. Pallavicini - created 08-02-2002
//
#include "EusoDetector.hh"
#include "DetectorGeometry.hh"
#include "DetectorTransportManager.hh"
#include "EEvent.hh"
#include "ElectronicsFactory.hh"
#include "ERunParameters.hh" 
#include "ERunParsPixelMapFiller.hh" 
#include "ERunParsPmtsFiller.hh" 
#include "EusoElectronics.hh"
#include "EusoMapping.hh"
#include "OpticsFactory.hh"
#include "ParentPhoton.hh"
#include "Photomultiplier.hh"
#include "Photon.hh"
#include "PhotonsOnPupil.hh"
#include "Pupil.hh"

#include <TStopwatch.h>
#include <TMath.h>
#include <zlib.h>

using namespace sou;

ClassImp(EusoDetector)

// global variable 
EusoDetector *gEusoDetector = NULL;

//______________________________________________________________________________
 EusoDetector::EusoDetector() : fElectronics(0), fDetectorTransporter(0) {
    // 
    // Constructor
    // 

    // FIXME: call the factories to get the right associate child and parent
    // classes in config
    ElectronicsFactory::Get();
    OpticsFactory::Get();
    EusoMapping::Get();
    Build();
    gEusoDetector = this;
}


//______________________________________________________________________________
 EusoDetector::~EusoDetector() {
    //
    // Destructor
    //

    if ( gEusoDetector == this ) gEusoDetector = 0;
}

//______________________________________________________________________________
 void EusoDetector::Build() {
    // 
    // Build or re-build the detector
    // 

    fGeometry = new DetectorGeometry;
    fGeometry->SetFoV(Pi()/6.);

    fElectronics = ElectronicsFactory::Get()->Build();
    fDetectorTransporter = OpticsFactory::Get()->GetTransportManager();

    Double_t radius = fDetectorTransporter->GetOuterRadius();
    Double_t scale = Conf()->GetNum("EusoDetector.fScaleFactor");

    if ( Conf()->GetBool("EusoDetector.fFixMaxRadius") )
        radius = Conf()->GetNum("EusoDetector.fMaxRadius"); 

    fGeometry->SetRadius(scale*radius);
    fDetectorTransporter->SetScaleFactor(scale);

    // save runparameters
    if ( EEvent::GetCurrent() && EEvent::GetCurrent()->GetRunPars() ) {
        ERunParameters *runpars = EEvent::GetCurrent()->GetRunPars();

        fElectronics->SetDetectorScaleFactor(scale);
        fElectronics->BuildBackgroundChipDist();

        if ( runpars ) {
            // get from EusoMapping the config
            ERunParsPixelMapFiller pxfiller;
            runpars->Fill(pxfiller);

            ERunParsPmtsFiller pmtfiller( fElectronics );
            runpars->Fill(pmtfiller);
        }
    }

    fDetectorTransporter->GetFocalPlane()->SetElectronics(fElectronics);
}

//______________________________________________________________________________
 void EusoDetector::Reset() {
    // 
    // Reset electronics
    //

    if ( fElectronics )
        fElectronics->Reset();
}

//______________________________________________________________________________
 Telemetry* EusoDetector::Get( PhotonsOnPupil* photons ) {
    //
    // Simulate one event and return a pointer to a Telemetry object
    //
    
    // reset previous event 
    Reset();

    // wrapper to track the photons onto the real pupil
    Pupil pupil( photons, GetGeometry());
    
    // transport photons from pupil to pmts
    fDetectorTransporter->Go( &pupil );
   
    Double_t tBegin = fDetectorTransporter->GetTimeFirstPhoton();
    Double_t tEnd = fDetectorTransporter->GetTimeLastPhoton();
 
    MsgForm(EsafMsg::Info,"Photon Time interval (ns):t\tSTART=%ld  END=%ld",
		    (long int)(tBegin), (long int)tEnd);
    
    // simulate electronics and trigger
    if ( !fElectronics->Simulate( tBegin, tEnd ) )
        return (Telemetry*)0;
    
    // return telemetry object
    return fElectronics->Data();
    
}
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