#include "THaSpectrometer.h"
#include "THaTrack.h"
#include "THaBeam.h"
#include "THaUnRasteredBeam.h"
#include "VarDef.h"
#include <iostream>
#include "TClass.h"
#include "TMath.h"
#include "TList.h"
using namespace std;
#include "THaOptics.h"
THaOptics::THaOptics(const char* name, const char* desc,
THaSpectrometer *pspec, TString strBeamDetectorName)
:THaAnalysisObject(name, desc), fSpec(pspec), fDefBeamName(strBeamDetectorName)
{
DEBUG_LEVEL_RELATED_PERFORMACE_CHECKER;
DEBUG_HALL_A_ANALYZER_DEBUGER_INIT;
assert(fSpec.IsValid());
}
THaOptics::~THaOptics() {}
Int_t THaOptics::ReadDatabase(const TDatime& date)
{
const char * here="ReadDatabase";
FILE* file = OpenFile( date );
if( !file ) return kFileError;
#if DEBUG_LEVEL>=3//start show info
Info(Here(here),"\tDB File open OK" );
#endif//#if DEBUG_LEVEL>=3
if( fDefBeamName.IsNull() or
(dynamic_cast<THaBeam *>( FindModuleNoCheck(fDefBeamName.Data(),"THaBeam") ))==NULL)
{
#if DEBUG_LEVEL>=3//start show info
Info(Here(here),"\tTrying to find beam detector info..." );
#endif//#if DEBUG_LEVEL>=3
Int_t err =LoadDBvalue( file, date,"BeamDetectorName", fDefBeamName );
if( err ){
fDefBeamName="";
#if DEBUG_LEVEL>=3//start show info
Info(Here(here),"\tNot Found" );
#endif//#if DEBUG_LEVEL>=3
}
else
{
#if DEBUG_LEVEL>=3//start show info
Info(Here(here),
"\tFound. Will set default beam detector to be %s",
fDefBeamName.Data());
#endif//#if DEBUG_LEVEL>=3 #endif
}
}
if( !fDefBeamName.IsNull() )
{
fBeam = (( FindModuleNoCheck(fDefBeamName.Data(),"THaBeam") ));
if (fBeam.IsValid())
{
#if DEBUG_LEVEL>=3//start show info
Info(Here(here),
"\tTHaOptics is set to use beam detector : %s",
fDefBeamName.Data());
#endif//#if DEBUG_LEVEL>=3
}
else
{
#if DEBUG_LEVEL>=1//start show warning
Warning(Here(here),
"\tbeam detector with following name can not be found: %s" ,
fDefBeamName.Data());
#endif//#if DEBUG_LEVEL>=1
}
}
else
{
fBeam = NULL;
}
Double_t trans_x=0.0, trans_y=0.0, trans_z=0.0;
Double_t trans_rot_x=0.0, trans_rot_y = 0.0, trans_rot_z = 0.0;
static const Double_t degrad = TMath::Pi()/180.0;
fThShift=fPhShift=fPShift=fPathLenShift=0;
const TagDef tags[]={
{"trans_rot_x", &trans_rot_x ,1},
{"trans_rot_y", &trans_rot_y ,2},
{"trans_rot_z", &trans_rot_z ,3},
{"trans_x", &trans_x ,4},
{"trans_y", &trans_y ,5},
{"trans_z", &trans_z ,6},
{"ThShift", &fThShift },
{"PhShift", &fPhShift },
{"PShift", &fPShift },
{"PathLenShift", &fPathLenShift },
{ 0 }
};
Int_t err =LoadDB( file, date,tags, "" );
if( err ){
Error(Here(here), "Required tag %s missing in the "
"run databse. \nBigBite initialization failed.",
tags[err-1].name );
fclose(file);
return kInitError;
}
#if DEBUG_LEVEL>=3//start show info
TString sDebugOutput;
sDebugOutput=GetName();
sDebugOutput+=" Database read in successfully with:";
sDebugOutput+="\n \ttrans_rot_x\t= "; sDebugOutput+=trans_rot_x;
sDebugOutput+="\n \ttrans_rot_y\t= "; sDebugOutput+=trans_rot_y;
sDebugOutput+="\n \ttrans_rot_z\t= "; sDebugOutput+=trans_rot_z;
sDebugOutput+="\n \ttrans_x\t= ";sDebugOutput+=trans_x;
sDebugOutput+="\n \ttrans_y\t= ";sDebugOutput+=trans_y;
sDebugOutput+="\n \ttrans_z\t= ";sDebugOutput+=trans_z;
sDebugOutput+="\n \t fThShift\t= ";sDebugOutput+=fThShift;
sDebugOutput+="\n \t fPhShift\t= ";sDebugOutput+=fPhShift;
sDebugOutput+="\n \t fPShift\t= ";sDebugOutput+=fPShift;
sDebugOutput+="\n \t fPathLenShift\t= ";sDebugOutput+=fPathLenShift;
sDebugOutput+="\n";
Info(Here(here),sDebugOutput.Data());
#endif
fTRCSOffSetInTCS.SetXYZ(trans_x,trans_y,trans_z);
assert(fSpec.IsValid());
fHCS2TCS=((THaSpectrometer *)fSpec.GetObject())->GetToTraRot();
fTCS2HCS=((THaSpectrometer *)fSpec.GetObject())->GetToLabRot();
fTRCS2TCS.SetToIdentity();
fTRCS2TCS.RotateX(trans_rot_x*degrad)
.RotateY(trans_rot_y*degrad)
.RotateZ(trans_rot_z*degrad);
fTCS2TRCS=fTRCS2TCS.Inverse();
fclose(file);
return THaAnalysisObject::ReadDatabase(date);
}
Int_t THaOptics::ReadRunDatabase( const TDatime& date )
{
Int_t err = THaAnalysisObject::ReadRunDatabase( date );
if( err ) return err;
FILE* file = OpenRunDBFile( date );
if( !file ) return kFileError;
DEBUG_INFO(Here("ReadRunDatabase()"),"database opened.");
Double_t off_x = 0.0, off_y = 0.0, off_z = 0.0;
const TagDef tags[] = {
{ "off_x", &off_x, 1},
{ "off_y", &off_y, 2},
{ "off_z", &off_z, 3},
{ "current", &fCurrent, 4 },
{ 0 }
};
err = LoadDB( file, date, tags, ((THaSpectrometer *)(fSpec.GetObject()))->GetPrefix() );
if( err ) {
if (err==4) fCurrent=-1;
else if( err>0 )
Error( Here("ReadRunDatabase()"), "Required tag %s%s missing in the "
"run database.\nSpectrometer initialization failed.",
fPrefix, tags[err-1].name );
fclose(file);
return kInitError;
}
fTCSOffSetInHCS.SetXYZ( off_x, off_y, off_z );
fclose(file);
#if DEBUG_LEVEL>=3//start show info
TString sDebugOutput;
sDebugOutput=GetName();
sDebugOutput+=" ReadRunDatabase finish in successfully with:";
sDebugOutput+="\n \t off_x\t= "; sDebugOutput+=off_x;
sDebugOutput+="\n \t off_y\t= "; sDebugOutput+=off_y;
sDebugOutput+="\n \t off_z\t= "; sDebugOutput+=off_z;
sDebugOutput+="\n \t fCurrent\t= "; sDebugOutput+=fCurrent;
sDebugOutput+="\n";
Info(Here("ReadRunDatabase()"),sDebugOutput.Data());
#endif
return kOK;
}
Int_t THaOptics::ApplyOptics(THaTrack *track)
{
TVector3 beampos(0.0, 0.0, 0.0);
TVector3 beamdir(0.0, 0.0, 1.0);
if( fBeam.IsValid() ) {
beampos = ((THaBeam *)(fBeam.GetObject())) ->GetPosition();
beamdir = ((THaBeam *)(fBeam.GetObject())) ->GetDirection();
}
else
{
#if DEBUG_LEVEL>=1//start show warning
Warning(Here("ApplyOptics"),"\t No beam detector setting. Assuming a beam on exact center line of the hall." );
#endif//#if DEBUG_LEVEL>=1
}
return ApplyOptics(track,beampos,beamdir);
}
Int_t THaOptics::ApplyOptics(THaTrack *track, TVector3 beampos, TVector3 beamdir)
{
if( !track ) {
#if DEBUG_LEVEL>=1//start show warning
Warning(Here("ApplyOptics"),"\tEmpty track input");
return kInitError;
#endif//#if DEBUG_LEVEL>=1
}
Double_t TargetX;
Double_t TargetY;
Double_t TargetTheta;
Double_t TargetPhi;
Double_t p=0, PathLen=0;
TVector3 vertex, vp;
Int_t statustmp;
statustmp=ApplyOptics(
track->GetX(),
track->GetY(),
track->GetTheta(),
track->GetPhi(),
beampos,
beamdir,
vp,
vertex,
TargetX,
TargetY,
TargetTheta,
TargetPhi,
PathLen
);
if (statustmp!=kOK) return statustmp;
p=vp.Mag();
track->SetTarget(
TargetX,
TargetY,
TargetTheta,
TargetPhi
);
track->SetPathLen( PathLen );
track->SetVertex( vertex );
track->SetPvect( vp );
track->SetMomentum( p );
track->SetDp( p/GetPcentral()-1 );
return kOK;
}
Int_t THaOptics::ApplyOptics(
Double_t trackX,
Double_t trackY,
Double_t trackTheta,
Double_t trackPhi,
TVector3 beamPos,
TVector3 beamDir,
TVector3 &P,
TVector3 &Vertex,
Double_t &TargetX,
Double_t &TargetY,
Double_t &TargetTheta,
Double_t &TargetPhi,
Double_t &PathLen
)
{
DEBUG_LINE_INFO(AbstractMethod("ApplyOptics"));
TOpticsDir pcentral(TOpticsDir::kTCS,this,0,0,GetPcentral());
pcentral.TransCoordSys(TOpticsDir::kHCS);
P=pcentral.GetVector();
TOpticsPos vertexcentral(TOpticsDir::kTCS,this,0,0,0);
vertexcentral.TransCoordSys(TOpticsDir::kHCS);
Vertex=vertexcentral.GetVector();
TargetX=TargetY=TargetTheta=TargetPhi=0;
PathLen=2*GetCollDist();
return kOK;
}
THaAnalysisObject* THaOptics::FindModuleNoCheck( const char* name,
const char* classname )
{
return FindModule(name,classname,false);
}
void THaOptics::MakePrefix()
{
const char* basename = NULL;
if( fSpec.IsValid() )
basename = ((THaSpectrometer *)(fSpec.GetObject()))->GetName();
THaAnalysisObject::MakePrefix( basename );
}
Bool_t THaOptics::SetBeamName(const char* name)
{
fDefBeamName=name;
fBeam = (( FindModuleNoCheck(name,"THaBeam") ));
return fBeam.IsValid();
}
Double_t THaOptics::GetPcentral() const
{
assert(fSpec.IsValid());
return ((THaSpectrometer *)(fSpec.GetObject())) ->GetPcentral();
}
Double_t THaOptics::GetCollDist() const
{
assert(fSpec.IsValid());
return ((THaSpectrometer *)(fSpec.GetObject())) ->GetCollDist();
}
TVector2 THaOptics::CrossingLineLine2D(TVector2 o1,TVector2 d1,TVector2 o2,TVector2 d2)
{
Double_t x1=o1.X();
Double_t y1=o1.Y();
Double_t d1x=d1.X();
Double_t d1y=d1.Y();
Double_t x2=o2.X();
Double_t y2=o2.Y();
Double_t d2x=d2.X();
Double_t d2y=d2.Y();
if (-(d1y*d2x) + d1x*d2y==0)
{
DEBUG_WARNING(Here("Crossing"),"the two input line have crossing.");
return TVector2(0,0);
}
return TVector2(
-((d1y*d2x*x1 - d1x*d2y*x2 - d1x*d2x*y1 + d1x*d2x*y2)/(-(d1y*d2x) + d1x*d2y)),
-((-(d1y*d2y*x1) + d1y*d2y*x2 + d1x*d2y*y1 - d1y*d2x*y2)/(d1y*d2x - d1x*d2y))
);
}
TVector3 THaOptics::CrossingSurfLine3D
(TVector3 OSurf,TVector3 NSurf,TVector3 OLine,TVector3 DLine)
{
Double_t x,y,z;
x=(DLine.Y()*NSurf.Y()*OLine.X() + DLine.Z()*NSurf.Z()*OLine.X() +
DLine.X()*(NSurf.X()*OSurf.X() + NSurf.Y()*(-OLine.Y() + OSurf.Y()) +
NSurf.Z()*(-OLine.Z() + OSurf.Z())))/
(DLine.X()*NSurf.X() + DLine.Y()*NSurf.Y() + DLine.Z()*NSurf.Z());
y=((DLine.X()*NSurf.X() + DLine.Z()*NSurf.Z())*OLine.Y() +
DLine.Y()*(NSurf.X()*(-OLine.X() + OSurf.X()) + NSurf.Y()*OSurf.Y() +
NSurf.Z()*(-OLine.Z() + OSurf.Z())))/
(DLine.X()*NSurf.X() + DLine.Y()*NSurf.Y() + DLine.Z()*NSurf.Z());
z=((DLine.X()*NSurf.X() + DLine.Y()*NSurf.Y())*OLine.Z() +
DLine.Z()*(NSurf.X()*(-OLine.X() + OSurf.X()) + NSurf.Y()*(-OLine.Y() + OSurf.Y()) +
NSurf.Z()*OSurf.Z()))/(DLine.X()*NSurf.X() + DLine.Y()*NSurf.Y() + DLine.Z()*NSurf.Z());
return TVector3(x,y,z);
}
ClassImp(THaOptics);
THaOptics::TOpticsDir & THaOptics::TOpticsDir::TransCoordSys(ECoordSys coordsys,bool dorecurent)
{
#if DEBUG_LEVEL>=4//massive info
Info("TransCoordSys","\tSetCoordSys called to set to coord %d with current state:",coordsys );
Print();
#endif//#if DEBUG_LEVEL>=4
if (coordsys>fCoordSys)
{
switch (fCoordSys)
{
case kHCS:
Transform(((THaOptics *)(fOptics.GetObject()))->fHCS2TCS);
break;
case kTCS:
Transform(((THaOptics *)(fOptics.GetObject()))->fTCS2TRCS);
break;
case kTRCS:
TRCS2FCS();
break;
default:
#if DEBUG_LEVEL>=1//start show warning
Warning("TOpticsDir::TransCoordSys","\tUnexpected coordinate type encountered. Coordinate Transform request ignored." );
#endif//#if DEBUG_LEVEL>=1
return *this;
break;
}
fCoordSys=(ECoordSys)(fCoordSys+1);
}
else if (coordsys<fCoordSys)
{
switch (fCoordSys)
{
case kTCS:
Transform(((THaOptics *)(fOptics.GetObject()))->fTCS2HCS);
break;
case kTRCS:
Transform(((THaOptics *)(fOptics.GetObject()))->fTRCS2TCS);
break;
case kFCS:
FCS2TRCS();
break;
default:
#if DEBUG_LEVEL>=1//start show warning
Warning("TOpticsDir::TransCoordSys","\tUnexpected coordinate type encountered. Coordinate Transform request ignored." );
#endif//#if DEBUG_LEVEL>=1
return *this;
break;
}
fCoordSys=(ECoordSys)(fCoordSys-1);
}
else return *this;
if (dorecurent) return TransCoordSys(coordsys);
else return *this;
}
void THaOptics::TOpticsDir::TRCS2FCS()
{
#if DEBUG_LEVEL>=1//start show warning
Warning("TRCS2FCS","\tFunction TRCS2FCS has not been implemented. Please Reload THaOptics::TOpticsDir::TRCS2FCS()" );
#endif//#if DEBUG_LEVEL>=1
}
void THaOptics::TOpticsDir::FCS2TRCS()
{
#if DEBUG_LEVEL>=1//start show warning
Warning("FCS2TRCS","\tFunction FCS2TRCS has not been implemented. Please Reload THaOptics::TOpticsDir::FCS2TRCS()" );
#endif//#if DEBUG_LEVEL>=1
}
THaOptics::TOpticsDir & THaOptics::TOpticsDir::operator += (const THaOptics::TOpticsDir & p)
{
assert(fCoordSys==p.fCoordSys);
assert(GetOptics()==p.GetOptics());
SetXYZ(X()+p.X(),Y()+p.Y(),Z()+p.Z());
return *this;
}
THaOptics::TOpticsDir & THaOptics::TOpticsDir::operator -= (const THaOptics::TOpticsDir & p)
{
assert(fCoordSys==p.fCoordSys);
assert(GetOptics()==p.GetOptics());
SetXYZ(X()-p.X(),Y()-p.Y(),Z()-p.Z());
return *this;
}
THaOptics::TOpticsDir operator + (const THaOptics::TOpticsDir & a, const THaOptics::TOpticsDir & b)
{
assert(a.GetOptics()==b.GetOptics());
assert(a.GetCoordSys()==b.GetCoordSys());
return THaOptics::TOpticsDir(a.GetCoordSys(),a.GetOptics(),
a.X() + b.X(), a.Y() + b.Y(), a.Z() + b.Z());
}
THaOptics::TOpticsDir operator - (const THaOptics::TOpticsDir & a, const THaOptics::TOpticsDir & b)
{
assert(a.GetOptics()==b.GetOptics());
assert(a.GetCoordSys()==b.GetCoordSys());
return THaOptics::TOpticsDir(a.GetCoordSys(),a.GetOptics(),
a.X() - b.X(), a.Y() - b.Y(), a.Z() - b.Z());
}
THaOptics::TOpticsDir operator + (const THaOptics::TOpticsDir & a, const TVector3 & b)
{
return THaOptics::TOpticsDir(a.GetCoordSys(),a.GetOptics(),
a.X() + b.X(), a.Y() + b.Y(), a.Z() + b.Z());
}
THaOptics::TOpticsDir operator - (const THaOptics::TOpticsDir & a, const TVector3 & b)
{
return THaOptics::TOpticsDir(a.GetCoordSys(),a.GetOptics(),
a.X() - b.X(), a.Y() - b.Y(), a.Z() - b.Z());
}
Double_t operator * (const THaOptics::TOpticsDir &a, const THaOptics::TOpticsDir &b)
{
assert(a.GetOptics()==b.GetOptics());
assert(a.GetCoordSys()==b.GetCoordSys());
return a.Dot(b);
}
Double_t operator * (const THaOptics::TOpticsDir &a, const TVector3 &b)
{
return a.Dot(b);
}
THaOptics::TOpticsDir operator * (const THaOptics::TOpticsDir & p, Double_t a) {
return THaOptics::TOpticsDir(p.GetCoordSys(),p.GetOptics(),
a*p.X(), a*p.Y(), a*p.Z());
}
THaOptics::TOpticsDir operator * (Double_t a, const THaOptics::TOpticsDir & p) {
return THaOptics::TOpticsDir(p.GetCoordSys(),p.GetOptics(),
a*p.X(), a*p.Y(), a*p.Z());
}
void THaOptics::TOpticsDir::Print( Option_t* opt ) const
{
Printf("%s %s (x,y,z)=(%f,%f,%f) (rho,theta,phi)=(%f,%f,%f) fCoordSys=%d",
GetName(),GetTitle(),X(),Y(),Z(),
Mag(),Theta()*TMath::RadToDeg(),Phi()*TMath::RadToDeg(),
fCoordSys);
return;
}
THaOptics::TOpticsPos & THaOptics::TOpticsPos::TransCoordSys(ECoordSys coordsys,bool dorecurent)
{
if (coordsys>fCoordSys)
{
switch (fCoordSys)
{
case kHCS:
*this-=((THaOptics *)(fOptics.GetObject()))->fTCSOffSetInHCS;
break;
case kTCS:
*this-=((THaOptics *)(fOptics.GetObject()))->fTRCSOffSetInTCS;
break;
case kTRCS:
break;
default:
#if DEBUG_LEVEL>=1//start show warning
Warning("TOpticsPos::TransCoordSys","\tUnexpected coordinate type encountered. Coordinate Transform request ignored." );
#endif//#if DEBUG_LEVEL>=1
return *this;
break;
}
TOpticsDir::TransCoordSys(coordsys,false);
}
else if (coordsys<fCoordSys)
{
TOpticsDir::TransCoordSys(coordsys,false);
switch (fCoordSys+1)
{
case kTCS:
*this+=((THaOptics *)(fOptics.GetObject()))->fTCSOffSetInHCS;
break;
break;
case kTRCS:
*this+=((THaOptics *)(fOptics.GetObject()))->fTRCSOffSetInTCS;
break;
case kFCS:
break;
default:
#if DEBUG_LEVEL>=1//start show warning
Warning("TOpticsPos::TransCoordSys","\tUnexpected coordinate type encountered. Coordinate Transform request ignored." );
#endif//#if DEBUG_LEVEL>=1
return *this;
break;
}
}
else return *this;
if (dorecurent) return TransCoordSys(coordsys);
else return *this;
}
ClassImp(THaOptics::TOpticsPos);
ClassImp(THaOptics::TOpticsDir);
Last update: Tue Jul 7 19:26:17 2009
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.