--- /dev/null
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * *
+ * Author: The ALICE Off-line Project. *
+ * Contributors are mentioned in the code where appropriate. *
+ * *
+ * Permission to use, copy, modify and distribute this software and its *
+ * documentation strictly for non-commercial purposes is hereby granted *
+ * without fee, provided that the above copyright notice appears in all *
+ * copies and that both the copyright notice and this permission notice *
+ * appear in the supporting documentation. The authors make no claims *
+ * about the suitability of this software for any purpose. It is *
+ * provided "as is" without express or implied warranty. *
+ **************************************************************************/
+
+// *
+// *
+// *
+// * this class defines the TOF object to be stored
+// * in OCDB on a run-by-run basis in order to have the measurement
+// * of the time evolution of T0 and of TOF resolution including
+// * average T0 uncertainty
+// *
+// *
+// *
+
+#include "AliTOFRunParams.h"
+
+ClassImp(AliTOFRunParams)
+
+//_________________________________________________________
+
+AliTOFRunParams::AliTOFRunParams() :
+ TObject(),
+ fNPoints(0),
+ fTimestamp(NULL),
+ fT0(NULL),
+ fTOFResolution(NULL),
+ fT0Spread(NULL)
+{
+ /*
+ * default constructor
+ */
+}
+
+//_________________________________________________________
+
+AliTOFRunParams::AliTOFRunParams(Int_t nPoints) :
+ TObject(),
+ fNPoints(nPoints),
+ fTimestamp(new UInt_t[nPoints]),
+ fT0(new Float_t[nPoints]),
+ fTOFResolution(new Float_t[nPoints]),
+ fT0Spread(new Float_t[nPoints])
+{
+ /*
+ * standard constructor
+ */
+}
+
+//_________________________________________________________
+
+AliTOFRunParams::~AliTOFRunParams()
+{
+ /*
+ * default destructor
+ */
+
+ if (fTimestamp) delete [] fTimestamp;
+ if (fT0) delete [] fT0;
+ if (fTOFResolution) delete [] fTOFResolution;
+ if (fT0Spread) delete [] fT0Spread;
+}
+
+//_________________________________________________________
+
+AliTOFRunParams::AliTOFRunParams(const AliTOFRunParams &source) :
+ TObject(source),
+ fNPoints(source.fNPoints),
+ fTimestamp(new UInt_t[source.fNPoints]),
+ fT0(new Float_t[source.fNPoints]),
+ fTOFResolution(new Float_t[source.fNPoints]),
+ fT0Spread(new Float_t[source.fNPoints])
+{
+ /*
+ * copy constructor
+ */
+
+ for (Int_t i = 0; i < fNPoints; i++) {
+ fTimestamp[i] = source.fTimestamp[i];
+ fT0[i] = source.fT0[i];
+ fTOFResolution[i] = source.fTOFResolution[i];
+ fT0Spread[i] = source.fT0Spread[i];
+ }
+
+}
+
+//_________________________________________________________
+
+AliTOFRunParams &
+AliTOFRunParams::operator=(const AliTOFRunParams &source)
+{
+ /*
+ * operator=
+ */
+
+ if (this == &source) return *this;
+ TObject::operator=(source);
+
+ if (fNPoints != source.fNPoints) {
+ if (fTimestamp) delete [] fTimestamp;
+ if (fT0) delete [] fT0;
+ if (fTOFResolution) delete [] fTOFResolution;
+ if (fT0Spread) delete [] fT0Spread;
+ fNPoints = source.fNPoints;
+ fTimestamp = new UInt_t[source.fNPoints];
+ fT0 = new Float_t[source.fNPoints];
+ fTOFResolution = new Float_t[source.fNPoints];
+ fT0Spread = new Float_t[source.fNPoints];
+ }
+
+ for (Int_t i = 0; i < fNPoints; i++) {
+ fTimestamp[i] = source.fTimestamp[i];
+ fT0[i] = source.fT0[i];
+ fTOFResolution[i] = source.fTOFResolution[i];
+ fT0Spread[i] = source.fT0Spread[i];
+ }
+
+ return *this;
+}
+
+//_________________________________________________________
+
+Float_t
+AliTOFRunParams::EvalT0(UInt_t timestamp)
+{
+ /*
+ * eval T0
+ */
+
+ /* critical cases:
+ 1. no measurement -> 0.
+ 2. single measurement -> single value
+ 3. timestamp before first measurement -> first value
+ 4. timestamp after last measurement -> last value
+ */
+ if (fNPoints <= 0 || !fT0 || !fTimestamp) return 0.;
+ if (fNPoints == 1) return fT0[0];
+ if (timestamp <= fTimestamp[0]) return fT0[0];
+ if (timestamp >= fTimestamp[fNPoints - 1]) return fT0[fNPoints - 1];
+
+ /* interpolate value */
+ Int_t ipoint;
+ for (ipoint = 0; ipoint < fNPoints - 1; ipoint++)
+ if (timestamp >= fTimestamp[ipoint] && timestamp < fTimestamp[ipoint + 1])
+ break;
+ Float_t coeff = (fT0[ipoint + 1] - fT0[ipoint]) / (Float_t)(fTimestamp[ipoint + 1] - fTimestamp[ipoint]);
+ Float_t t0 = fT0[ipoint] + coeff * (timestamp - fTimestamp[ipoint]);
+
+ return t0;
+}
+
+//_________________________________________________________
+
+Float_t
+AliTOFRunParams::EvalTOFResolution(UInt_t timestamp)
+{
+ /*
+ * eval TOF resolution
+ */
+
+ /* critical cases:
+ 1. no measurement -> 0.
+ 2. single measurement -> single value
+ 3. timestamp before first measurement -> first value
+ 4. timestamp after last measurement -> last value
+ */
+ if (fNPoints <= 0 || !fTOFResolution || !fTimestamp) return 0.;
+ if (fNPoints == 1) return fTOFResolution[0];
+ if (timestamp <= fTimestamp[0]) return fTOFResolution[0];
+ if (timestamp >= fTimestamp[fNPoints - 1]) return fTOFResolution[fNPoints - 1];
+
+ /* interpolate value */
+ Int_t ipoint;
+ for (ipoint = 0; ipoint < fNPoints - 1; ipoint++)
+ if (timestamp >= fTimestamp[ipoint] && timestamp < fTimestamp[ipoint + 1])
+ break;
+ Float_t coeff = (fTOFResolution[ipoint + 1] - fTOFResolution[ipoint]) / (Float_t)(fTimestamp[ipoint + 1] - fTimestamp[ipoint]);
+ Float_t reso = fTOFResolution[ipoint] + coeff * (timestamp - fTimestamp[ipoint]);
+
+ return reso;
+}
+
+//_________________________________________________________
+
+Float_t
+AliTOFRunParams::EvalT0Spread(UInt_t timestamp)
+{
+ /*
+ * eval T0 spread
+ */
+
+ /* critical cases:
+ 1. no measurement -> 0.
+ 2. single measurement -> single value
+ 3. timestamp before first measurement -> first value
+ 4. timestamp after last measurement -> last value
+ */
+ if (fNPoints <= 0 || !fT0Spread || !fTimestamp) return 0.;
+ if (fNPoints == 1) return fT0Spread[0];
+ if (timestamp <= fTimestamp[0]) return fT0Spread[0];
+ if (timestamp >= fTimestamp[fNPoints - 1]) return fT0Spread[fNPoints - 1];
+
+ /* interpolate value */
+ Int_t ipoint;
+ for (ipoint = 0; ipoint < fNPoints - 1; ipoint++)
+ if (timestamp >= fTimestamp[ipoint] && timestamp < fTimestamp[ipoint + 1])
+ break;
+ Float_t coeff = (fT0Spread[ipoint + 1] - fT0Spread[ipoint]) / (Float_t)(fTimestamp[ipoint + 1] - fTimestamp[ipoint]);
+ Float_t spread = fT0Spread[ipoint] + coeff * (timestamp - fTimestamp[ipoint]);
+
+ return spread;
+}
+