#ifndef HPARTICLEBTANGLETRAFO_H
#define HPARTICLEBTANGLETRAFO_H
#include "TObject.h"
#include <TMath.h>
class HParticleBtAngleTrafo : public TObject {
protected:
    const static Int_t yParMax=6, thetaParMax=7, xParMax=2, xPadParMax=5, zParMax=6;
    Float_t yThetaPar[yParMax], yPadThetaPar[yParMax], yPadYPar[yParMax];
    Float_t thetaYPar[thetaParMax], thetaYPadPar[yParMax], yYPadPar[yParMax];
    Float_t xPar[xParMax], xPadPar[xPadParMax];
    Float_t dzPar[zParMax], dz2Par[zParMax], dzPadPar[zParMax], dz2PadPar[zParMax];
    Float_t dzYPar[zParMax], dz2YPar[zParMax];
    Float_t dzThetaPar[zParMax], dz2ThetaPar[zParMax],dzThetaPhiPar[2], dz2ThetaPhiPar[2];
    Float_t thetaOffset[3];     
    Float_t phiOffset;          
    Float_t thetaSlope[2];      
    Float_t thetaPadSlope[6];   
    Float_t dyPadSlope[4];      
    Float_t phiSlope[2];        
    Float_t phiPadSlope[4];     
    Float_t phiThetaSlope[5];   
    Float_t padThetaSlope[4];   
    Float_t yThetaSlope[4];     
    Float_t yOffset[6];         
    Float_t yProjOffset[2];     
    Float_t yPadOffset[3];      
    Float_t xPadSize;           
    Float_t xPadOffset;         
    Float_t dxVertex;           
    Float_t dxPadVertex;        
                                
                                
    Float_t zRichCenter, dzTarg, zRef, zNorm, thetaRef, yRef;
    Float_t rad2deg ;
public:
    HParticleBtAngleTrafo(void) {initParam();};
    ~HParticleBtAngleTrafo(void) {};
    void initParam(void);
    Float_t x2xPad(const Float_t x)
    {
        
	return x/xPadSize + xPadOffset;
    }
    Float_t xPad2x(const Float_t xPad)
    {
        
	return (xPad-xPadOffset)*xPadSize;
    }
    Float_t yPhi2x(const Float_t y, const Float_t phi)
    {
        
	return -tan(phi/rad2deg)*(y*xPar[1]+xPar[0]);
    }
    Float_t yPhi2xPad(const Float_t y, const Float_t phi)
    {
        
	Float_t x = yPhi2x(y, phi);
	return x2xPad(x);
    }
    Float_t angles2y(const Float_t theta, const Float_t phi);
    Float_t yPhi2Theta(const Float_t y, const Float_t phi);
    Float_t angles2x(const Float_t theta, const Float_t phi)
    {
        
        Float_t y = angles2y(theta, phi);
        return yPhi2x(y, phi);
    }
    Float_t angles2yPad(const Float_t theta, const Float_t phi);
    Float_t yPadPhi2Theta(const Float_t yPad, const Float_t phi);
    Float_t angles2xPad(const Float_t theta, const Float_t phi)
    {
        
        Float_t y = angles2y(theta, phi);
        return yPhi2xPad(y, phi);
    }
    Float_t xy2Phi(const Float_t x, const Float_t y)
    {
        
	return atan(-x/(y*xPar[1]+xPar[0]))*rad2deg;
    }
    Float_t xPadyPad2Phi(const Float_t xPad, const Float_t yPad);
    Float_t yPad2y(const Float_t yPad)
    {
	
	
	return xPadPar[0]+yPad*(xPadPar[1]+yPad*(xPadPar[2]+yPad*(xPadPar[3]+yPad*xPadPar[4])));
    }
    Float_t yPadPhi2x(const Float_t yPad, const Float_t phi)
    {
        
        return yPad2y(yPad) * tan(phi/rad2deg);
    }
   
    Float_t yPhi2yPad(const Float_t y, const Float_t phi);
    Float_t yPadPhi2y(const Float_t yPad, const Float_t phi);
    Float_t xy2yPad(const Float_t x, const Float_t y)
    {
        
        Float_t phi =  xy2Phi(x,y);
        return yPhi2yPad(y, phi);
    }
    Float_t xPadyPad2y(const Float_t xPad, const Float_t yPad)
    {
        
        Float_t phi =  xPadyPad2Phi(xPad,yPad);
        return yPadPhi2y(yPad, phi);
    }
    Float_t xy2Theta(const Float_t x, const Float_t y)
    {
        
	Float_t phi = xy2Phi(x,y);
        return yPhi2Theta(y,phi);
    }
    Float_t xPadyPad2Theta(const Float_t xPad, const Float_t yPad)
    {
        
	Float_t phi = xPadyPad2Phi(xPad,yPad);
        return yPadPhi2Theta(yPad,phi);
    }
    Float_t zTheta2dY(const Float_t z, const Float_t theta, const Float_t phi);
    Float_t zTheta2dYPad(const Float_t z, const Float_t theta, const Float_t phi);
    Float_t zTheta2dX()
    {
	
	return dxVertex;
    }
    Float_t zTheta2dXPad()
    {
	
	return dxPadVertex;
    }
    Float_t zY2dTheta(const Float_t z, const Float_t y, const Float_t x)
    {
        
	return zYPhi2dTheta(z, y, xy2Phi(x,y));
    }
    Float_t zYPad2dTheta(const Float_t z, const Float_t yPad, const Float_t xPad)
    {
	
	Float_t phi = xPadyPad2Phi(xPad,yPad);
	return zYPhi2dTheta(z, yPadPhi2y(yPad, phi), phi);
    }
    Float_t zYPhi2dTheta(const Float_t z, const Float_t y, const Float_t phi);
    Float_t zTheta2dTheta(const Float_t z, const Float_t theta, const Float_t phi);
    void setRichPos(const Float_t zRichPos) {zRichCenter = zRichPos;} 
    Float_t getRichPos() {return zRichCenter;}
    void setRichPos(const char * beamtime); 
    ClassDef(HParticleBtAngleTrafo,0)
};
#endif //HPARTICLEBTANGLETRAFO_H
 hparticlebtangletrafo.h:1  hparticlebtangletrafo.h:2  hparticlebtangletrafo.h:3  hparticlebtangletrafo.h:4  hparticlebtangletrafo.h:5  hparticlebtangletrafo.h:6  hparticlebtangletrafo.h:7  hparticlebtangletrafo.h:8  hparticlebtangletrafo.h:9  hparticlebtangletrafo.h:10  hparticlebtangletrafo.h:11  hparticlebtangletrafo.h:12  hparticlebtangletrafo.h:13  hparticlebtangletrafo.h:14  hparticlebtangletrafo.h:15  hparticlebtangletrafo.h:16  hparticlebtangletrafo.h:17  hparticlebtangletrafo.h:18  hparticlebtangletrafo.h:19  hparticlebtangletrafo.h:20  hparticlebtangletrafo.h:21  hparticlebtangletrafo.h:22  hparticlebtangletrafo.h:23  hparticlebtangletrafo.h:24  hparticlebtangletrafo.h:25  hparticlebtangletrafo.h:26  hparticlebtangletrafo.h:27  hparticlebtangletrafo.h:28  hparticlebtangletrafo.h:29  hparticlebtangletrafo.h:30  hparticlebtangletrafo.h:31  hparticlebtangletrafo.h:32  hparticlebtangletrafo.h:33  hparticlebtangletrafo.h:34  hparticlebtangletrafo.h:35  hparticlebtangletrafo.h:36  hparticlebtangletrafo.h:37  hparticlebtangletrafo.h:38  hparticlebtangletrafo.h:39  hparticlebtangletrafo.h:40  hparticlebtangletrafo.h:41  hparticlebtangletrafo.h:42  hparticlebtangletrafo.h:43  hparticlebtangletrafo.h:44  hparticlebtangletrafo.h:45  hparticlebtangletrafo.h:46  hparticlebtangletrafo.h:47  hparticlebtangletrafo.h:48  hparticlebtangletrafo.h:49  hparticlebtangletrafo.h:50  hparticlebtangletrafo.h:51  hparticlebtangletrafo.h:52  hparticlebtangletrafo.h:53  hparticlebtangletrafo.h:54  hparticlebtangletrafo.h:55  hparticlebtangletrafo.h:56  hparticlebtangletrafo.h:57  hparticlebtangletrafo.h:58  hparticlebtangletrafo.h:59  hparticlebtangletrafo.h:60  hparticlebtangletrafo.h:61  hparticlebtangletrafo.h:62  hparticlebtangletrafo.h:63  hparticlebtangletrafo.h:64  hparticlebtangletrafo.h:65  hparticlebtangletrafo.h:66  hparticlebtangletrafo.h:67  hparticlebtangletrafo.h:68  hparticlebtangletrafo.h:69  hparticlebtangletrafo.h:70  hparticlebtangletrafo.h:71  hparticlebtangletrafo.h:72  hparticlebtangletrafo.h:73  hparticlebtangletrafo.h:74  hparticlebtangletrafo.h:75  hparticlebtangletrafo.h:76  hparticlebtangletrafo.h:77  hparticlebtangletrafo.h:78  hparticlebtangletrafo.h:79  hparticlebtangletrafo.h:80  hparticlebtangletrafo.h:81  hparticlebtangletrafo.h:82  hparticlebtangletrafo.h:83  hparticlebtangletrafo.h:84  hparticlebtangletrafo.h:85  hparticlebtangletrafo.h:86  hparticlebtangletrafo.h:87  hparticlebtangletrafo.h:88  hparticlebtangletrafo.h:89  hparticlebtangletrafo.h:90  hparticlebtangletrafo.h:91  hparticlebtangletrafo.h:92  hparticlebtangletrafo.h:93  hparticlebtangletrafo.h:94  hparticlebtangletrafo.h:95  hparticlebtangletrafo.h:96  hparticlebtangletrafo.h:97  hparticlebtangletrafo.h:98  hparticlebtangletrafo.h:99  hparticlebtangletrafo.h:100  hparticlebtangletrafo.h:101  hparticlebtangletrafo.h:102  hparticlebtangletrafo.h:103  hparticlebtangletrafo.h:104  hparticlebtangletrafo.h:105  hparticlebtangletrafo.h:106  hparticlebtangletrafo.h:107  hparticlebtangletrafo.h:108  hparticlebtangletrafo.h:109  hparticlebtangletrafo.h:110  hparticlebtangletrafo.h:111  hparticlebtangletrafo.h:112  hparticlebtangletrafo.h:113  hparticlebtangletrafo.h:114  hparticlebtangletrafo.h:115  hparticlebtangletrafo.h:116  hparticlebtangletrafo.h:117  hparticlebtangletrafo.h:118  hparticlebtangletrafo.h:119  hparticlebtangletrafo.h:120  hparticlebtangletrafo.h:121  hparticlebtangletrafo.h:122  hparticlebtangletrafo.h:123  hparticlebtangletrafo.h:124  hparticlebtangletrafo.h:125  hparticlebtangletrafo.h:126  hparticlebtangletrafo.h:127  hparticlebtangletrafo.h:128  hparticlebtangletrafo.h:129  hparticlebtangletrafo.h:130  hparticlebtangletrafo.h:131  hparticlebtangletrafo.h:132  hparticlebtangletrafo.h:133  hparticlebtangletrafo.h:134  hparticlebtangletrafo.h:135  hparticlebtangletrafo.h:136  hparticlebtangletrafo.h:137  hparticlebtangletrafo.h:138  hparticlebtangletrafo.h:139  hparticlebtangletrafo.h:140  hparticlebtangletrafo.h:141  hparticlebtangletrafo.h:142  hparticlebtangletrafo.h:143  hparticlebtangletrafo.h:144  hparticlebtangletrafo.h:145  hparticlebtangletrafo.h:146  hparticlebtangletrafo.h:147  hparticlebtangletrafo.h:148  hparticlebtangletrafo.h:149  hparticlebtangletrafo.h:150  hparticlebtangletrafo.h:151  hparticlebtangletrafo.h:152  hparticlebtangletrafo.h:153  hparticlebtangletrafo.h:154  hparticlebtangletrafo.h:155  hparticlebtangletrafo.h:156  hparticlebtangletrafo.h:157  hparticlebtangletrafo.h:158  hparticlebtangletrafo.h:159  hparticlebtangletrafo.h:160  hparticlebtangletrafo.h:161  hparticlebtangletrafo.h:162