diff --git a/src/THcExtTarCor.cxx b/src/THcExtTarCor.cxx index a4599db95016fcc34933fe8d5127d8adbd077859..9cf2fd38371efe7ac878e72237c8af0b76c7d7ff 100644 --- a/src/THcExtTarCor.cxx +++ b/src/THcExtTarCor.cxx @@ -138,7 +138,7 @@ Int_t THcExtTarCor::Process( const THaEvData& ) THaTrack* theTrack = static_cast<THaTrack*>( tracks->At(i) ); if( theTrack == spectro->GetGoldenTrack() ) { // Calculate corrections & recalculate ,,,track parameters - Double_t x_tg = -vertex[1]+pointing_off[0]; // units of cm, beam position in spectrometer coordinate system + Double_t x_tg = -vertex[1]-pointing_off[0]; // units of cm, beam position in spectrometer coordinate system spectro->CalculateTargetQuantities(theTrack,x_tg,xptar,ytar,yptar,delta); p = spectro->GetPcentral() * ( 1.0+delta ); spectro->TransportToLab( p, xptar, yptar, pvect ); diff --git a/src/THcReactionPoint.cxx b/src/THcReactionPoint.cxx new file mode 100644 index 0000000000000000000000000000000000000000..b37e2b3c5d2de7c2bf8bbe038662452cbfe946a8 --- /dev/null +++ b/src/THcReactionPoint.cxx @@ -0,0 +1,119 @@ +//*-- Author : Ole Hansen 13-Mar-03 + +#include "THcReactionPoint.h" +#include "THaSpectrometer.h" +#include "THaTrack.h" +#include "THaBeam.h" +#include "TMath.h" +#include <cstring> +#include <cstdio> +#include <cstdlib> +#include <iostream> +#include <fstream> + + +using namespace std; + +ClassImp(THcReactionPoint) + +//_____________________________________________________________________________ +THcReactionPoint::THcReactionPoint( const char* name, const char* description, + const char* spectro, const char* beam ) : + THaPhysicsModule(name,description), fSpectroName(spectro), + fBeamName(beam), fSpectro(NULL), fBeam(NULL) +{ + // Normal constructor. + +} + +//_____________________________________________________________________________ +THcReactionPoint::~THcReactionPoint() +{ + // Destructor + + DefineVariables( kDelete ); +} + +//_____________________________________________________________________________ +void THcReactionPoint::Clear( Option_t* opt ) +{ + // Clear all event-by-event variables. + + THaPhysicsModule::Clear(opt); + VertexClear(); +} + +//_____________________________________________________________________________ +Int_t THcReactionPoint::DefineVariables( EMode mode ) +{ + // Define/delete analysis variables + + if( mode == kDefine && fIsSetup ) return kOK; + fIsSetup = ( mode == kDefine ); + + return DefineVarsFromList( THaVertexModule::GetRVarDef(), mode ); +} + +//_____________________________________________________________________________ +THaAnalysisObject::EStatus THcReactionPoint::Init( const TDatime& run_time ) +{ + // Initialize the module. + // Locate the spectrometer apparatus named in fSpectroName and save + // pointer to it. + + // Standard initialization. Calls this object's DefineVariables(). + if( THaPhysicsModule::Init( run_time ) != kOK ) + return fStatus; + + fSpectro = static_cast<THaSpectrometer*> + ( FindModule( fSpectroName.Data(), "THaSpectrometer")); + if( !fSpectro ) + return fStatus; + + if( fBeamName.Length() > 0 ) + fBeam = static_cast<THaBeam*>( FindModule( fBeamName.Data(), "THaBeam") ); + + return fStatus; +} + +//_____________________________________________________________________________ +Int_t THcReactionPoint::Process( const THaEvData& ) +{ + // Calculate the vertex coordinates. + + if( !IsOK() ) return -1; + + Int_t ntracks = fSpectro->GetNTracks(); + if( ntracks == 0 ) return 0; + + TClonesArray* tracks = fSpectro->GetTracks(); + if( !tracks ) return -2; + + TVector3 beam_org, beam_ray( 0.0, 0.0, 1.0 ); + if( fBeam ) { + beam_org = fBeam->GetPosition(); + beam_ray = fBeam->GetDirection(); + } + TVector3 v; + + for( Int_t i = 0; i<ntracks; i++ ) { + THaTrack* theTrack = static_cast<THaTrack*>( tracks->At(i) ); + // Ignore junk tracks + if( !theTrack || !theTrack->HasTarget() ) + continue; + TVector3 pointing_off=fSpectro->GetPointingOffset(); + Double_t costheta=TMath::Cos(fSpectro->GetThetaSph()); + Double_t sintheta=TMath::Cos(fSpectro->GetPhiSph())*TMath::Sin(fSpectro->GetThetaSph()); + Double_t ytar_off=theTrack->GetTY()+pointing_off(1); + Double_t yptar = theTrack->GetTPhi(); + Double_t ztarg=(ytar_off-beam_org(0)*(costheta-yptar*sintheta))/(-sintheta-yptar*costheta); + v.SetXYZ(beam_org(0),beam_org(1),ztarg); + theTrack->SetVertex(v); + if( theTrack == fSpectro->GetGoldenTrack() ) { + fVertex = theTrack->GetVertex(); + fVertexOK = kTRUE; + } + } + return 0; +} + diff --git a/src/THcReactionPoint.h b/src/THcReactionPoint.h new file mode 100644 index 0000000000000000000000000000000000000000..d4d1e5263454f03951c73dfe5b17ca59007003df --- /dev/null +++ b/src/THcReactionPoint.h @@ -0,0 +1,55 @@ +#ifndef ROOT_THcReactionPoint +#define ROOT_THcReactionPoint + +////////////////////////////////////////////////////////////////////////// +// +// THcReactionPoint +// +////////////////////////////////////////////////////////////////////////// + +#include "THaPhysicsModule.h" +#include "THaVertexModule.h" +#include "TString.h" + +class THaSpectrometer; +class THaBeam; + +class THcReactionPoint : public THaPhysicsModule, public THaVertexModule { + +public: + THcReactionPoint( const char* name, const char* description, + const char* spectro="", const char* beam="" ); + virtual ~THcReactionPoint(); + + virtual void Clear( Option_t* opt="" ); + + virtual EStatus Init( const TDatime& run_time ); + virtual Int_t Process( const THaEvData& ); + void SetSpectrometer( const char* name ); + void SetBeam( const char* name ); + +protected: + + TString fSpectroName; // Name of spectrom. to consider + TString fBeamName; // Name of beam position apparatus + THaSpectrometer* fSpectro; // Pointer to spectrometer object + THaBeam* fBeam; // Pointer to beam position apparatus + + virtual Int_t DefineVariables( EMode mode = kDefine ); + + ClassDef(THcReactionPoint,0) //Single arm track-beam vertex module +}; + +//_________ inlines __________________________________________________________ +inline +void THcReactionPoint::SetSpectrometer( const char* name ) { + fSpectroName = name; +} + +//_____________________________________________________________________________ +inline +void THcReactionPoint::SetBeam( const char* name ) { + fBeamName = name; +} + +#endif