#include "THaExtTarCor.h"
#include "THaVertexModule.h"
#include "THaSpectrometer.h"
#include "THaTrack.h"
#include "THaTrackInfo.h"
#include "TMath.h"
#include "TVector3.h"
#include "VarDef.h"
THaExtTarCor::THaExtTarCor( const char* name, const char* description,
const char* spectro, const char* vertex ) :
THaPhysicsModule(name,description), fThetaCorr(0.0), fDeltaCorr(0.0),
fSpectroName(spectro), fVertexName(vertex),
fTrackModule(NULL), fVertexModule(NULL)
{
Clear();
}
THaExtTarCor::~THaExtTarCor()
{
DefineVariables( kDelete );
}
void THaExtTarCor::Clear( Option_t* opt )
{
THaPhysicsModule::Clear(opt);
TrkIfoClear();
fDeltaTh = fDeltaDp = fDeltaP = 0.0;
}
THaAnalysisObject::EStatus THaExtTarCor::Init( const TDatime& run_time )
{
fTrackModule = dynamic_cast<THaTrackingModule*>
( FindModule( fSpectroName.Data(), "THaTrackingModule"));
if( !fTrackModule )
return fStatus;
fTrkIfo.SetSpectrometer( fTrackModule->GetTrackInfo()->GetSpectrometer() );
if( fVertexName.IsNull()) fVertexName = fSpectroName;
fVertexModule = dynamic_cast<THaVertexModule*>
( FindModule( fVertexName.Data(), "THaVertexModule" ));
if( !fVertexModule )
return fStatus;
THaPhysicsModule::Init( run_time );
return fStatus;
}
Int_t THaExtTarCor::DefineVariables( EMode mode )
{
if( mode == kDefine && fIsSetup ) return kOK;
fIsSetup = ( mode == kDefine );
DefineVarsFromList( THaTrackingModule::GetRVarDef(), mode );
const RVarDef var2[] = {
{ "delta_p", "Size of momentum correction", "fDeltaP" },
{ "delta_dp", "Size of delta correction", "fDeltaDp" },
{ "delta_th", "Size of theta correction (rad)", "fDeltaTh" },
{ 0 }
};
DefineVarsFromList( var2, mode );
return 0;
}
Int_t THaExtTarCor::Process( const THaEvData& )
{
if( !IsOK() ) return -1;
THaTrackInfo* trkifo = fTrackModule->GetTrackInfo();
if( !trkifo->IsOK() ) return 2;
THaSpectrometer* spectro = trkifo->GetSpectrometer();
if( !spectro ) return 3;
Double_t ray[6];
spectro->LabToTransport( fVertexModule->GetVertex(),
trkifo->GetPvect(), ray );
if( TMath::Abs(ray[0]) > 0.1 || TMath::Abs(ray[1]) > 1.0 ||
TMath::Abs(ray[2]) > 0.1 || TMath::Abs(ray[3]) > 1.0 ||
TMath::Abs(ray[5]) > 1.0 )
return 3;
TVector3 pvect;
Double_t x_tg = ray[0];
fDeltaTh = fThetaCorr * x_tg;
fDeltaDp = x_tg / fDeltaCorr;
Double_t theta = trkifo->GetTheta() + fDeltaTh;
Double_t dp = trkifo->GetDp() + fDeltaDp;
Double_t p = spectro->GetPcentral() * ( 1.0+dp );
fDeltaP = p - trkifo->GetP();
spectro->TransportToLab( p, theta, trkifo->GetPhi(), pvect );
spectro->LabToTransport( fVertexModule->GetVertex(), pvect, ray );
fTrkIfo.Set( p, dp, ray[0], trkifo->GetY(), theta, trkifo->GetPhi(), pvect );
fDataValid = true;
return 0;
}
Int_t THaExtTarCor::ReadRunDatabase( const TDatime& date )
{
Int_t err = THaPhysicsModule::ReadRunDatabase( date );
if( err ) return err;
FILE* f = OpenRunDBFile( date );
if( !f ) return kFileError;
const Double_t DEL_COR = 5.18;
fThetaCorr = 0.61;
fDeltaCorr = DEL_COR;
TString name(fPrefix), tag("theta_corr"); name += tag;
Int_t st = LoadDBvalue( f, date, name.Data(), fThetaCorr );
if( st )
LoadDBvalue( f, date, tag.Data(), fThetaCorr );
name = fPrefix; tag = "delta_corr"; name += tag;
st = LoadDBvalue( f, date, name.Data(), fDeltaCorr );
if( st )
LoadDBvalue( f, date, tag.Data(), fDeltaCorr );
if( TMath::Abs(fDeltaCorr) < 1e-6 ) {
Warning(Here("ReadRunDatabase()"),
"delta_corr parameter from database too small (%e).\n"
"Using default.", fDeltaCorr );
fDeltaCorr = DEL_COR;
}
fclose(f);
return kOK;
}
ClassImp(THaExtTarCor)
Last change: Sat Nov 7 21:26:46 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.