#ifndef ALIALIGNMENTTRACKS_H
#define ALIALIGNMENTTRACKS_H
class TChain;
class TSelector;
class TFile;
class TTree;
class TArrayI;
class AliTrackPointArray;
class AliAlignObj;
class AliTrackFitter;
class AliTrackResiduals;
#include <TObject.h>
#include "AliAlignObj.h"
class AliAlignmentTracks : public TObject {
public:
AliAlignmentTracks();
AliAlignmentTracks(TChain *esdchain);
AliAlignmentTracks(const char *esdfilename, const char *esdtreename = "esdTree");
virtual ~AliAlignmentTracks();
void AddESD(TChain *esdchain);
void AddESD(const char *esdfilename, const char *esdtreename = "esdTree");
void SetPointsFilename(const char *pointsfilename = "AliTrackPoints.root") { fPointsFilename = pointsfilename; }
void ProcessESD(TSelector *selector);
void ProcessESD(Bool_t onlyITS=kFALSE,Int_t minITSpts=0,
Bool_t cuts=kTRUE,
Float_t minAngleWrtITSModulePlanes=0.,
Float_t minMom=0.3,Float_t maxMom=1.e9,
Float_t minAbsSinPhi=0.,Float_t maxAbsSinPhi=1.,
Float_t minSinTheta=0.,Float_t maxSinTheta=1.);
void ProcessESDCosmics(Bool_t onlyITS=kFALSE,Int_t minITSpts=0,
Float_t maxMatchingAngle=0.17,
Bool_t cuts=kTRUE,
Float_t minAngleWrtITSModulePlanes=0.,
Float_t minMom=0.3,Float_t maxMom=1.e9,
Float_t minAbsSinPhi=0.,Float_t maxAbsSinPhi=1.,
Float_t minSinTheta=0.,Float_t maxSinTheta=1.);
void BuildIndex();
Bool_t ReadAlignObjs(const char *alignObjFileName = "AlignObjs.root", const char* arrayName = "Alignment");
void SetTrackFitter(AliTrackFitter *fitter) { fTrackFitter = fitter; }
void SetMinimizer(AliTrackResiduals *minimizer) { fMinimizer = minimizer; }
Bool_t AlignDetector(AliGeomManager::ELayerID firstLayer,
AliGeomManager::ELayerID lastLayer,
AliGeomManager::ELayerID layerRangeMin = AliGeomManager::kFirstLayer,
AliGeomManager::ELayerID layerRangeMax = AliGeomManager::kLastLayer,Int_t iterations = 1);
Bool_t AlignLayer(AliGeomManager::ELayerID layer,
AliGeomManager::ELayerID layerRangeMin = AliGeomManager::kFirstLayer,
AliGeomManager::ELayerID layerRangeMax = AliGeomManager::kLastLayer,
Int_t iterations = 1);
Bool_t AlignVolume(UShort_t volId, UShort_t volIdFit,
Int_t iterations);
Bool_t AlignVolumes(const TArrayI *volids, const TArrayI *volidsfit = 0x0,
AliGeomManager::ELayerID layerRangeMin = AliGeomManager::kFirstLayer,
AliGeomManager::ELayerID layerRangeMax = AliGeomManager::kLastLayer,
Int_t iterations = 1);
AliAlignObj* GetAlignObj(UShort_t volid) const {
Int_t iModule;
AliGeomManager::ELayerID iLayer = AliGeomManager::VolUIDToLayer(volid,iModule);
return fAlignObjs[iLayer-AliGeomManager::kFirstLayer][iModule];
}
void SetUpdate(Bool_t update){fDoUpdate = update;}
void SetCovIsUsed(Bool_t covisused){fCovIsUsed=covisused;}
Bool_t GetUpdate() const { return fDoUpdate;}
void WriteRealignObjArray(TString outfilename,AliGeomManager::ELayerID layerRangeMin,AliGeomManager::ELayerID layerRangeMax);
Int_t GetLastIndex(Int_t iLayer,Int_t iModule) const { return fLastIndex[iLayer][iModule]; }
Bool_t Misalign(const char *misalignObjFileName, const char* arrayName);
protected:
void InitIndex();
void ResetIndex();
void DeleteIndex();
void InitAlignObjs();
void ResetAlignObjs();
void DeleteAlignObjs();
Int_t LoadPoints(const TArrayI *volids, AliTrackPointArray** &points,Int_t &pointsdim);
void UnloadPoints(Int_t n, AliTrackPointArray **points);
AliTrackFitter *CreateFitter();
AliTrackResiduals *CreateMinimizer();
TChain *fESDChain;
TString fPointsFilename;
TFile *fPointsFile;
TTree *fPointsTree;
Int_t **fLastIndex;
TArrayI ***fArrayIndex;
Bool_t fIsIndexBuilt;
AliAlignObj ***fAlignObjs;
AliAlignObj ***fMisalignObjs;
AliTrackFitter *fTrackFitter;
AliTrackResiduals*fMinimizer;
Bool_t fDoUpdate;
Bool_t fCovIsUsed;
private:
AliAlignmentTracks(const AliAlignmentTracks & alignment);
AliAlignmentTracks& operator= (const AliAlignmentTracks& alignment);
ClassDef(AliAlignmentTracks,2)
};
#endif