#include "THaBeamEloss.h"
#include "THaBeam.h"
#include "THaVertexModule.h"
#include "TMath.h"
#include "TVector3.h"
using namespace std;
THaBeamEloss::THaBeamEloss( const char* name, const char* description,
const char* input_beam ) :
THaElossCorrection(name,description,input_beam), fBeamModule(NULL)
{
Clear();
}
THaBeamEloss::~THaBeamEloss()
{
DefineVariables( kDelete );
}
void THaBeamEloss::CalcEloss( THaBeamInfo* beamifo )
{
Double_t p0 = beamifo->GetP();
Double_t beta = p0 / TMath::Sqrt(p0*p0 + fM*fM);
if( fElectronMode ) {
fEloss = ElossElectron( beta, fZmed, fAmed,
fDensity, fPathlength );
} else {
fEloss = ElossHadron( fZ, beta, fZmed, fAmed,
fDensity, fPathlength );
}
}
void THaBeamEloss::Clear( Option_t* opt )
{
THaElossCorrection::Clear(opt);
BeamIfoClear();
}
THaAnalysisObject::EStatus THaBeamEloss::Init( const TDatime& run_time )
{
static const char* const here = "Init()";
fBeamModule = dynamic_cast<THaBeamModule*>
( FindModule( fInputName.Data(), "THaBeamModule"));
if( !fBeamModule )
return fStatus;
THaBeamInfo* beamifo = fBeamModule->GetBeamInfo();
THaBeam* beam = beamifo->GetBeam();
if( !beam ) {
Error( Here(here), "Oops. Input beam module has no pointer to "
"a beam apparatus?!?" );
return fStatus = kInitError;
}
fBeamIfo.SetBeam(beam);
SetMass( beamifo->GetM() );
fZ = TMath::Abs(beamifo->GetQ());
THaElossCorrection::Init( run_time );
return fStatus;
}
Int_t THaBeamEloss::DefineVariables( EMode mode )
{
if( mode == kDefine && fIsSetup ) return kOK;
THaElossCorrection::DefineVariables( mode );
return DefineVarsFromList( THaBeamModule::GetRVarDef(), mode );
}
Int_t THaBeamEloss::Process( const THaEvData& )
{
if( !IsOK() ) return -1;
THaBeamInfo* beamifo = fBeamModule->GetBeamInfo();
if( !beamifo->IsOK() ) return 2;
fBeamIfo = *beamifo;
Double_t p_in = fBeamIfo.GetP();
if( p_in <= 0.0 ) return 4;
Double_t E_in = TMath::Sqrt(p_in*p_in + fM*fM);
if( !fTestMode ) {
if( fExtPathMode ) {
if( !fVertexModule->HasVertex() )
return 1;
fPathlength =
TMath::Abs(fVertexModule->GetVertex().Z() - fZref) * fScale;
}
CalcEloss(beamifo);
}
Double_t p_out = TMath::Sqrt(p_in*p_in + fEloss*fEloss - 2.0*E_in*fEloss);
fBeamIfo.SetP(p_out);
fDataValid = true;
return 0;
}
ClassImp(THaBeamEloss)
Last change: Sat Nov 7 21:26:43 2009
Last generated: 2009-11-07 21:26
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.