CDeflection.C
//-----------------------------------------------------------------------------
// $Header: /cool/project/RCS/CDeflection.C,v 1.3 1997/02/24 11:19:23 lenkeit Exp $
//
// COOL Program Library
// Copyright (C) CERES collaboration, 1996
//
// Implementation of class CDeflection
//
//-----------------------------------------------------------------------------
#include "CDeflection.h"
#include "CPadChamber.h"
#include "CVertex.h"
#include "CCoordinate.h"
#include <iostream.h>
CDeflection::CDeflection()
{
zDeflectionPlane = 110; // cm !!
deflectionPoint.setZ(zDeflectionPlane);
padcWindowSize = 2.5;
pcEdgeA.setX(-padcWindowSize);
pcEdgeA.setY(padcWindowSize);
pcEdgeB.setX(padcWindowSize);
pcEdgeB.setY(padcWindowSize);
}
CDeflection::~CDeflection()
{
}
CDeflection::CDeflection(const CDeflection &)
{
}
CDeflection & CDeflection::operator = (const CDeflection &)
{
return *this;
}
CBoolean CDeflection::calculatePCPrediction( double thetaPreField, double phiPreField,
double thetaPostField, double phiPostField,
CPadChamber& padc, CVertex& vtx)
{
thetaPreField /= 1000.; // back to rad
thetaPostField /= 1000.;
// calculate the prediction in the deflection plane
deflectionPoint.setX( vtx.getX()+
cos(phiPreField)*tan(thetaPreField)*
(deflectionPoint.getZ()+fabs(vtx.getZ())) );
deflectionPoint.setY( vtx.getY()+
sin(phiPreField)*tan(thetaPreField)*
(deflectionPoint.getZ()+fabs(vtx.getZ())) );
// calculate the prediction for the padchamber plane
double deltaZ = padc.getSetup()->getZPosition()-deflectionPoint.getZ();
CLabXYZCoord pc( deflectionPoint.getX()+
(cos(phiPostField)*tan(thetaPostField)*deltaZ),
deflectionPoint.getY()+
(sin(phiPostField)*tan(thetaPostField)*deltaZ),
padc.getSetup()->getZPosition());
padc.transform(padcPredictor, pc);
pcUpperLeft = padcPredictor+pcEdgeA;
pcUpperRight = padcPredictor+pcEdgeB;
pcLowerLeft = padcPredictor-pcEdgeB;
pcLowerRight = padcPredictor-pcEdgeA;
return True;
}
CBoolean CDeflection::calculateRich2Prediction(double thetaPreField, double phiPreField,
double thetaPadC, double phiPadC,
double &rich2Theta, CAngle &rich2Phi,
CVertex *vertex, CPadChamber *pc)
{
CEventXYZCoord deflectionPointEXYZ, PadCHitEXYZ;
CLabXYZCoord PadCHitXYZ;
CEventCoord Rich2ECoord;
const CEventCoord PadCECoord(thetaPadC, phiPadC,
pc->getSetup()->getZPosition()+fabs(vertex->getZ()));
//
// calculate deflection point
//
const CEventCoord deflectionPointEC(thetaPreField,phiPreField,
deflectionPoint.getZ()+fabs(vertex->getZ()));
transform(deflectionPointEXYZ, deflectionPointEC);
//
// calculate PadC hit in XYZ Event Coordinates
//
transform(PadCHitEXYZ, PadCECoord);
//
// calculate position in Rich2
//
CEventXYZCoord postFieldVector = PadCHitEXYZ - deflectionPointEXYZ;
transform(Rich2ECoord, postFieldVector);
rich2Theta = Rich2ECoord.getTheta(); // in mrad
rich2Phi = Rich2ECoord.getPhi(); // in rad
return True;
}