#ifndef FAIRTIMESTAMP_H #define FAIRTIMESTAMP_H #include "FairMultiLinkedData.h" #include "TMath.h" /** * Base class for Time stamp information ** Aug. 2010 **@author M.Al-Turany */ class FairTimeStamp : public FairMultiLinkedData { public: /** Default constructor **/ FairTimeStamp(); /** Constructor with time **/ FairTimeStamp(Double_t time); /** Constructor with time and time error **/ FairTimeStamp(Double_t time, Double_t timeerror); /** Destructor **/ virtual ~FairTimeStamp(); /** Accessors **/ virtual Double_t GetTimeStamp() const { return fTimeStamp; }; virtual Double_t GetTimeStampError() const { return fTimeStampError;}; virtual FairLink GetEntryNr() const {return fEntryNr;} /** Modifiers **/ virtual void SetTimeStamp(Double_t t) { fTimeStamp = t; } virtual void SetTimeStampError(Double_t t) {fTimeStampError = t;} virtual void SetEntryNr(FairLink entry) {fEntryNr = entry;} virtual Int_t Compare(const TObject* obj) const { if (this == obj) { return 0; } FairTimeStamp* tsobj = (FairTimeStamp*)obj; Double_t ts = tsobj->GetTimeStamp(); Double_t tserror = tsobj->GetTimeStampError(); if (fTimeStamp < ts) { return -1; } else if (fTimeStamp == ts && fTimeStampError < tserror) { return -1; } else if (fTimeStamp == ts && fTimeStampError == tserror) { return 0; } else { return 1; } } virtual std::ostream& Print(std::ostream& out = std::cout) const; virtual Bool_t IsSortable() const { return kTRUE;}; virtual bool equal(FairTimeStamp* data) const{ //return (fTimeStamp == data->GetTimeStamp() && fTimeStampError == data->GetTimeStampError()); return operator == (data); } friend std::ostream& operator<< (std::ostream& out, const FairTimeStamp& link) { link.Print(out); return out; } //new interfaces //default active time virtual Double_t GetActiveTime() const { return GetTimeStamp() + TMath::Abs(GetTimeStampError()); } virtual FairTimeStamp* Pileup(const FairTimeStamp* rValue) { return this ;} virtual bool operator< (const FairTimeStamp* rValue) const { if(GetTimeStamp() < rValue->GetTimeStamp()) return GetActiveTime() < rValue->GetTimeStamp(); return false; } virtual bool operator == (const FairTimeStamp* rValue) const { Double_t error = TMath::Sqrt(GetTimeStampError()*GetTimeStampError() + rValue->GetTimeStampError()*rValue->GetTimeStampError()); return TMath::Abs(GetTimeStamp() - rValue->GetTimeStamp()) <= error ; } virtual bool operator != (const FairTimeStamp* rValue) const { return !operator==(rValue); } //virtual bool operator == (const FairTimeStamp& rValue) const { // return TMath::Abs(GetTimeStamp() - rValue.GetTimeStamp()) < TMath::Abs(GetTimeStampError()) ; } //virtual bool operator < (const FairTimeStamp& rValue) const { return GetTimeStamp() < rValue.GetTimeStamp(); } //virtual bool operator != (const FairTimeStamp& rValue) const { return !operator==(rValue); } protected: Double_t fTimeStamp; /** Time of digit or Hit [ns] */ Double_t fTimeStampError; /** Error on time stamp */ FairLink fEntryNr; //! indicates where the data is stored in the branch ClassDef(FairTimeStamp,2); }; struct FairTimeStampLess { const bool operator()(const FairTimeStamp* lw, const FairTimeStamp* rw) const; }; #endif