Back to index

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;    
} 
 
 
 
 
 
 
 
 
 

Back to index