////////////////////////////////////////////////////////////////////////////////////////
#include <TVectorT.h>
+#include <THnSparse.h>
+
#include "AliTPCCalibRawBase.h"
class TH1S;
+#include "TObjArray.h"
class TH2S;
class TH1F;
class TTreeSRedirector;
class AliTPCParam;
class AliRawReader;
class AliTPCRawStream;
-class AliTPCRawStreamFast;
class TGraph;
class TMap;
+class TCollection;
struct eventHeaderStruct;
virtual Int_t Update(const Int_t isector, const Int_t iRow, const Int_t iPad,
const Int_t iTimeBin, const Float_t signal);
+ virtual void ProcessBunch(const Int_t sector, const Int_t row, const Int_t pad,
+ const Int_t length, const UInt_t startTimeBin, const UShort_t* signal);
+
virtual void Analyse();
+ void AnalyseTrack();
//
AliTPCCalROC* GetCalRocT0 (Int_t sector, Bool_t force=kFALSE); // get calibration object - sector
TH2S* GetHistoQ (Int_t sector, Bool_t force=kFALSE); // get refernce histogram
TH2S* GetHistoT0 (Int_t sector, Bool_t force=kFALSE); // get refernce histogram
TH2S* GetHistoRMS(Int_t sector, Bool_t force=kFALSE); // get refernce histogram
-
+
Float_t GetMeanT0rms() const {return fMeanT0rms;}
Float_t GetMeanQrms() const {return fMeanQrms;}
Float_t GetMeanRMSrms() const {return fMeanRMSrms;}
TVectorF* GetTMeanEvents(Int_t sector, Bool_t force=kFALSE);
TVectorF* GetQMeanEvents(Int_t sector, Bool_t force=kFALSE);
- TVectorD* GetEventTimes() { return &fVEventTime; }
- TVectorD* GetEventIds() { return &fVEventNumber; }
+ const TVectorD* GetEventTimes() const { return &fVEventTime; }
+ const TVectorD* GetEventIds() const { return &fVEventNumber; }
//
void SetRangeRefQ (Int_t nBins, Float_t xMin, Float_t xMax){ fNbinsQ = nBins; fXminQ = xMin; fXmaxQ = xMax; } //Set range for Q reference histograms
//
void SetEventInfo(UInt_t runNumber,UInt_t timestamp, UInt_t eventId){ fRunNumber=runNumber; fTimeStamp=timestamp; fEventId=eventId;}
//
- void SetPedestalDatabase(AliTPCCalPad *pedestalTPC, AliTPCCalPad *padNoiseTPC) {fPedestalTPC = pedestalTPC; fPadNoiseTPC = padNoiseTPC;}
+ void SetPedestalDatabase(AliTPCCalPad * const pedestalTPC, AliTPCCalPad * const padNoiseTPC) {fPedestalTPC = pedestalTPC; fPadNoiseTPC = padNoiseTPC;}
void SetIsZeroSuppressed(Bool_t zs=kTRUE) { fIsZeroSuppressed=zs; }
void SetSecRejectRatio(Float_t ratio) { fSecRejectRatio=ratio; }
+
+ void SetProcessOld(Bool_t process=kTRUE) {fProcessOld=process;}
+ void SetProcessNew(Bool_t process=kTRUE) {fProcessNew=process; if (process&&!fHnDrift) CreateDVhist(); }
//Getters
Int_t GetNeventsProcessed() const { return fNevents; }
Float_t GetPeakIntegralPlus() const {return fPeakIntPlus;}
- void Merge(AliTPCCalibCE *ce);
+ void Merge(AliTPCCalibCE * const ce);
+ virtual Long64_t Merge(TCollection * const list);
TGraph *MakeGraphTimeCE(Int_t sector, Int_t xVariable=0, Int_t fitType=0, Int_t fitParameter=0);
-
+
+ //
+ // New functions using also the laser tracks
+ //
+ Bool_t IsEdgePad(Int_t sector, Int_t row, Int_t pad) const;
+
+ void FindLocalMaxima(TObjArray * const arrObj, Double_t timestamp, Int_t burst);
+ Int_t FindLaserTrackID(Int_t sector,Int_t row, const Double_t *peakpos,Double_t &mindist, const Double_t *peakposloc, Int_t &itrackMin2);
+
+ const THnSparseI *GetHnDrift() const {return fHnDrift;}
+ const TObjArray& GetArrHnDrift() const {return fArrHnDrift;}
+ const TVectorD& GetTimeBursts() const {return fTimeBursts;}
+ const TObjArray *GetArrFitGraphs() const {return fArrFitGraphs;}
+
+ virtual void DumpToFile(const Char_t *filename, const Char_t *dir="", Bool_t append=kFALSE);
+
+ static AliTPCCalibCE *ReadFromFile(const Char_t *filename);
+
+protected:
+ virtual void EndEvent();
+ virtual void ResetEvent();
+
private:
// reference histogram ranges
Int_t fNbinsT0; // Number of bins for T0 reference histogram
Int_t fCurrentRow; //! current row processed
Float_t fMaxPadSignal; //! maximum bin of current pad
Int_t fMaxTimeBin; //! time bin with maximum value
- TVectorF fPadSignal; //! signal of current Pad
+ Float_t fPadSignal[1024]; //! signal of current Pad
Float_t fPadPedestal; //! Pedestal Value of current pad
Float_t fPadNoise; //! Noise Value of current pad
Float_t fCurrentCETimeRef; //! Time refernce of the current sector
+ // new part of the algorithm
+ Bool_t fProcessOld; // Whether to use the old algorithm
+ Bool_t fProcessNew; // Whether to use the new algorithm
+ Bool_t fAnalyseNew; //! Whether to analyse the new part of the algorithm.
+ //In the DA this needs to be switched off, in the Preprocessor on...
+ enum {kHnBinsDV=5};
+ THnSparseI *fHnDrift; //! Histogram digits for each pad and timebin for several timestamps
+ TObjArray fArrHnDrift; // array of sparse histograms for each burst
+ TVectorD fTimeBursts; // time stamps of bursts
+ UInt_t fBinsLastAna[100]; // number of bin in the THnSparse during the last analysis
+ UShort_t fPeaks[14]; //! Peak position: 4 laser layers and CE
+ UShort_t fPeakWidths[14]; //! Peak window widths
+ TObjArray *fArrFitGraphs; // Fit resut graphs for each parameter
+ UInt_t fEventInBunch; //! event in current bunch
+
+
+ //
void FindPedestal(Float_t part=.6);
void UpdateCETimeRef(); //Get the time reference of the last valid measurement in sector
void FindCESignal(TVectorD ¶m, Float_t &qSum, const TVectorF maxima);
TObjArray* GetParamArray(Int_t sector, TObjArray *arr, Bool_t force=kFALSE) const;
- virtual void EndEvent();
- virtual void ResetEvent();
void ResetPad();
void ProcessPad();
+
+ // new part of the algorithm
+ void CreateDVhist();
+
+ void FindLaserLayers();
+ Bool_t IsPeakInRange(UShort_t timebin, Int_t roc) const;
+
+ TObjArray *SetupMeasured();
+ void ResetMeasured(TObjArray * const arr);
+
+ void AddCEtoIdeal(TObjArray *arr);
+
+ void CalculateDV(TObjArray * const arrIdeal, TObjArray * const arrMeasured, Int_t burst);
+ Double_t SetBurstHnDrift();
//debug
TVectorF* GetPadQEvent(Int_t sector, Bool_t force=kFALSE);
TVectorF* GetPadRMSEvent(Int_t sector, Bool_t force=kFALSE);
TVectorF* GetPadPedestalEvent(Int_t sector, Bool_t force=kFALSE);
- ClassDef(AliTPCCalibCE,8) //Implementation of the TPC Central Electrode calibration
+ ClassDef(AliTPCCalibCE,10) //Implementation of the TPC Central Electrode calibration
};
+//Inline functions
+//_____________________________________________________________________
+inline Bool_t AliTPCCalibCE::IsPeakInRange(UShort_t timebin, Int_t roc) const
+{
+ //
+ // Check whether timebin is in the range of a laser layer
+ //
+ Int_t side=(roc/18)%2;
+ Int_t add=7*side;
+// return kTRUE;
+ if (fPeaks[13]<2) return kTRUE; //not determined yet
+ for (Int_t i=add; i<add+7; ++i){
+ if (TMath::Abs((Short_t)timebin-(Short_t)fPeaks[i])<(Short_t)fPeakWidths[i]) return kTRUE;
+ }
+ return kFALSE;
+}
+
#endif