#ifndef ROOT_THaMWDC
#define ROOT_THaMWDC
#define DO_THAMWDC_TRACKING 0
#if DO_THAMWDC_TRACKING
#define DO_TRACKING_BBE
#endif
#include "THaTrackingDetector.h"
#include "TMatrixD.h"
#include "TClonesArray.h"
#include <vector>
#define STRING_LENGTH 200
#define MAX_MATRIX 500000
#define MAX_MODULE_ERRORS 50
#define MIN_DETERMINANT 1e-5
#define MAX_PLANES 20
#define TOPNTRACKS 10
#define TOPNCOARSETRACKS 50
#define SPEED_OF_LIGHT 0.3
#define SCINT_OFFSET 54.5
#define SCINT_TIME_WIDTH 20.0
using namespace std;
class THaMWDCPlane;
class THaMWDCGroup;
class THaMWDCHit;
class THaTrack;
class TClonesArray;
class THaBenchmark;
class THaMWDC : public THaTrackingDetector {
public:
THaMWDC( const char* name, const char* description = "", THaApparatus* a = NULL );
virtual ~THaMWDC();
virtual Int_t Decode( const THaEvData& );
virtual EStatus Init( const TDatime& date );
virtual Int_t CoarseTrack( TClonesArray& tracks );
virtual Int_t FineTrack( TClonesArray& tracks );
virtual Int_t DefineVariables( EMode mode = kDefine );
virtual Int_t FindVertices(TClonesArray&) {return 0;}
virtual void Print(const Option_t* opt) const;
virtual void SetDebug( Int_t level );
void EnableBenchmarks( Bool_t b = kTRUE );
UInt_t GetNPlanes() const { return fPlanes->GetEntriesFast(); }
TClonesArray* GetPlanes() const { return fPlanes; }
THaMWDCPlane* GetPlane(Int_t i) const { return (THaMWDCPlane*)fPlanes->At(i);}
UInt_t GetNGroups() const { return fGroups.size();}
vector<THaMWDCGroup *> GetGroups() { return fGroups;}
THaMWDCGroup* GetGroup(Int_t i) const { return fGroups[i]; }
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 {
kUseShowerCuts = 1 << 0,
kValidShowerData = 1 << 1,
kValidClusterData = 1 << 2
};
enum {
kRejected = 1 << 0,
kSoftMax = 1 << 1,
kHardMax = 1 << 2
};
enum ETrackingMode { kCoarseTracking, kFineTracking };
protected:
TClonesArray* fPlanes;
vector <THaMWDCGroup *> fGroups;
TMatrixD* fConstructMatrix[MAX_MATRIX];
Int_t fValidBits[MAX_MATRIX];
Int_t fPlaneNumbersForBits[MAX_MATRIX][MAX_PLANES+1];
UInt_t fReconstructBits;
Int_t fNtracks;
Int_t fNmatrices;
UInt_t fNPlanes;
UInt_t fShowerStatus;
TVector3 fShowerOrigin;
Int_t fTotalConsideredEvents;
Int_t fTotalTrackingEvents;
Int_t fRejectedTrackingEvents;
Int_t fHardMaxTrackingEvents;
Int_t fSoftMaxTrackingEvents;
#ifdef DO_TRACKING_BBE
UInt_t fMaxGroups;
UInt_t fHardMaxGroups;
UInt_t fMaxCallThreshold;
UInt_t fMinimumPlanes;
#endif
Double_t fTargetXhigh;
Double_t fTargetXlow;
Double_t fTargetYhigh;
Double_t fTargetYlow;
Double_t fTargetZ;
Double_t fTargetXExt;
Double_t fTargetYExt;
Double_t fShowerXExt;
Double_t fShowerYExt;
Double_t fTargetWindowXOffset;
THaBenchmark* fBench;
Bool_t fDoBench;
UInt_t fTooBusy;
Double_t fCoarseProcTime;
Double_t fFineProcTime;
Int_t fEstNGroups;
Int_t fEstNCalls;
Int_t fNGroups;
Int_t fNCalls;
Int_t ReadDatabase( const TDatime& date );
void Clear( Option_t* opt="" );
Int_t End(THaRunBase* run);
Int_t ConstructTracks( TClonesArray * tracks = NULL, ETrackingMode mode = kCoarseTracking );
#ifdef DO_TRACKING_BBE
void FindGroups();
void AllCombos( Int_t planebits, vector<THaMWDCGroup*> &groups, vector<THaMWDCHit*> hits, Int_t depth );
Bool_t HitValidByShower( THaMWDCHit *hit );
void GetShowerData();
#endif //#ifdef DO_TRACKING_BBE
Bool_t UseShowerCuts() { return (fShowerStatus & kUseShowerCuts) ? true : false; }
Bool_t HaveValidShowerData() { return (fShowerStatus & kValidShowerData) ? true : false; }
Bool_t HaveValidClusterData() { return (fShowerStatus & kValidClusterData) ? true : false; }
void SetUseShowerCuts( Bool_t b ) { if(b) fShowerStatus |= kUseShowerCuts;
else fShowerStatus &= ~kUseShowerCuts; }
void SetValidShowerData( Bool_t b ) { if(b) fShowerStatus |= kValidShowerData;
else fShowerStatus &= ~kValidShowerData; }
void SetValidClusterData( Bool_t b ) { if(b) fShowerStatus |= kValidClusterData;
else fShowerStatus &= ~kValidClusterData;}
void LoadTargetData();
void PrintCutInfo();
#ifdef DO_TRACKING_BBE
void GenerateConstructMatrices();
void GenerateConstructMatrixForBits( Int_t trialbits );
Bool_t ValidPlaneBits( UInt_t bits );
void HeapSortGroupsByChi2(vector <THaMWDCGroup*> &v);
void HeapSortSiftDown( vector <THaMWDCGroup*> &v, UInt_t n );
void HeapSortBuildHeap( vector <THaMWDCGroup*> &v );
Double_t GetScintillatorTime();
Double_t GetScintillatorZ();
Double_t GetScintTimeCorrection( THaMWDCPlane* );
#endif //#ifdef DO_TRACKING_BBE
void SetScintCorrection();
ClassDef(THaMWDC,0)
};
#endif
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.