#ifndef ROOT_LOpticsOpt
#define ROOT_LOpticsOpt
#include "THaTrackingDetector.h"
#include "TRotation.h"
#include "TMath.h"
#include <vector>
#ifdef DEBUG_LEVEL
# undef DEBUG_LEVEL
#endif
#define DEBUG_LEVEL 3
#include "DebugDef.h"
class TCanvas;
class THaTrack;
class TClonesArray;
class THaMatrixElement;
class LOpticsOpt : public THaTrackingDetector {
public:
Int_t LoadDataBase(TString DataBaseName);
Int_t SaveDataBase(TString DataBaseName);
virtual void Print(const Option_t* opt) const;
UInt_t Matrix2Array(Double_t Array[],Bool_t FreeParaFlag[]=NULL)
{assert(fCurrentMatrixElems);return Matrix2Array(Array,(*fCurrentMatrixElems),FreeParaFlag);}
UInt_t Matrix2Array(Double_t Array[], const std::vector<THaMatrixElement> &Matrix,Bool_t FreeParaFlag[]=NULL);
UInt_t Array2Matrix(const Double_t Array[])
{assert(fCurrentMatrixElems);return Array2Matrix(Array,(*fCurrentMatrixElems));}
UInt_t Array2Matrix(const Double_t Array[], std::vector<THaMatrixElement> &Matrix);
UInt_t LoadRawData(TString DataFileName,UInt_t NLoad = MaxNRawData);
enum {MaxNEventData = 50,MaxNRawData = 1000000, kNUM_PRECOMP_POW= 10};
typedef struct
{
Double_t Data[MaxNEventData];
Double_t powers[kNUM_PRECOMP_POW][5];
} EventData;
EventData fRawData[MaxNRawData];
UInt_t fNRawData;
UInt_t fNCalibData;
enum CommonIdx{
kCutID =0,
kX = 1,
kTh = 2,
kY= 3,
kPhi =4,
kBeamX=5,
kBeamY=6,
kL_tr_tg_th=7,
kL_tr_tg_ph=8
};
enum ExtraSieveIdx{
kRealTh = 40,
kRealPhi,
kRealTgX,
kRealThMatrix,
kCalcTh,
kCalcPh
};
enum ExtraVertexIdx{
kL_tr_tg_y=9,
kRealTgY,
kRealReactZ,
kCalcTgY,
kCalcReactZ
};
enum ExtraDpIdx{
kL_tr_tg_dp=9,
kL_tr_p,
kurb_e,
kRunNum,
kExtraDataFlag,
kKineID,
kCentralp,
kRadiLossDp,
kScatterAngle,
kDpKinOffsets,
kRealDpKin,
kRealDpKinMatrix,
kCalcDpKinMatrix,
kCalcDpKin,
kRealDpKinExcitations
};
void PrepareSieve(void);
Double_t VerifyMatrix_Sieve(void);
TCanvas* CheckSieve(void);
Double_t SumSquareDTh();
Double_t SumSquareDPhi();
Double_t fArbitaryVertexShift[100];
void PrepareVertex(void);
Double_t VerifyMatrix_Vertex(void);
TCanvas* CheckVertex(void);
Double_t SumSquareDTgY();
Double_t SumSquareDTgYAverFoils();
Double_t fArbitaryDpKinShift[100];
void PrepareDp(void);
Double_t VerifyMatrix_Dp(void);
TCanvas* CheckDp(void);
TCanvas* CheckDpVSAngle(void);
TCanvas* CheckDpVSCutID(void);
Double_t SumSquareDp(Bool_t IncludeExtraData=kFALSE);
TRotation fTCSInHCS;
TVector3 fPointingOffset;
inline Double_t ScatMom(Double_t DM, Double_t Ma, Double_t P0, Double_t Theta)
{
return (-DM*DM - 2*Ma*DM + 2*Ma*P0)/(2*(Ma + P0 - P0*TMath::Cos(Theta)));
}
LOpticsOpt( const char* name="Optimizer", const char* description = "Optimizer for HRS Optics",
THaApparatus* a = NULL );
virtual ~LOpticsOpt();
enum {
kStageMask = BIT(14) | BIT(15),
kInvalid = 0x0000,
kCoarse = BIT(14),
kFine = BIT(15),
kReassigned = BIT(16),
kMultiTrack = BIT(17),
kBadTrack = BIT(18)
};
enum {
kOnlyFastest = BIT(14),
kTDCbits = BIT(15) | BIT(16),
kHardTDCcut = BIT(15),
kSoftTDCcut = BIT(16),
kIgnoreNegDrift = BIT(17),
kCoarseOnly = BIT(23)
};
enum ECoordTypes { kTransport, kRotatingTransport };
enum EFPMatrixElemTags { T000 = 0, Y000, P000 };
enum { kPORDER = 7 };
friend class THaMatrixElement;
std::vector<THaMatrixElement> * fCurrentMatrixElems;
std::vector<THaMatrixElement> fTMatrixElems;
std::vector<THaMatrixElement> fDMatrixElems;
std::vector<THaMatrixElement> fPMatrixElems;
std::vector<THaMatrixElement> fPTAMatrixElems;
std::vector<THaMatrixElement> fYMatrixElems;
std::vector<THaMatrixElement> fYTAMatrixElems;
std::vector<THaMatrixElement> fFPMatrixElems;
std::vector<THaMatrixElement> fLMatrixElems;
void CalcTargetCoords(THaTrack *the_track, const ECoordTypes mode);
void CalcMatrix(const double x, std::vector<THaMatrixElement> &matrix);
Double_t CalcTargetVar(const std::vector<THaMatrixElement> &matrix,
const double powers[][5]);
Double_t CalcTarget2FPLen(const std::vector<THaMatrixElement>& matrix,
const Double_t powers[][5]);
virtual Int_t ConstructTracks( TClonesArray* tracks = NULL, Int_t flag = 0 );
virtual void Clear( Option_t* opt="" );
virtual Int_t Decode( const THaEvData& );
virtual Int_t CoarseTrack( TClonesArray& tracks );
virtual Int_t FineTrack( TClonesArray& tracks );
virtual Int_t FindVertices( TClonesArray& tracks );
virtual EStatus Init( const TDatime& date );
ClassDef(LOpticsOpt,0)
};
class THaMatrixElement {
public:
THaMatrixElement() : iszero(true), pw(3), order(0), v(0), poly(LOpticsOpt::kPORDER),OptOrder(0) {}
bool match( const THaMatrixElement& rhs ) const;
bool iszero;
std::vector<int> pw;
int order;
double v;
std::vector<double> poly;
void SkimPoly();
UInt_t OptOrder;
};
#endif
Last change: Sat Aug 29 01:15:07 2009
Last generated: 2009-08-29 01:15
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.