/************************************************************************** * 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. * **************************************************************************/ #include #include "AliLHCClockPhase.h" #include "AliDCSValue.h" #include "AliLog.h" using std::endl; using std::cout; ClassImp(AliLHCClockPhase) //______________________________________________________________________________ AliLHCClockPhase::AliLHCClockPhase(): TObject(), fPhaseB1(), fPhaseB2() { // default constructor // ... fPhaseB1.SetOwner(); fPhaseB2.SetOwner(); } //______________________________________________________________________________ void AliLHCClockPhase::AddPhaseB1DP(UInt_t timestamp, Float_t phase) { // Add a phase beam1 measurement // to the array of data-points fPhaseB1.AddLast(new AliDCSValue(phase,timestamp)); } //______________________________________________________________________________ void AliLHCClockPhase::AddPhaseB2DP(UInt_t timestamp, Float_t phase) { // Add a phase beam2 measurement // to the array of data-points fPhaseB2.AddLast(new AliDCSValue(phase,timestamp)); } //______________________________________________________________________________ const AliDCSValue* AliLHCClockPhase::GetPhaseB1DP(Int_t index) const { // Get the value of the phase // The argument is the DP index AliDCSValue *value = (AliDCSValue*)fPhaseB1.At(index); if (!value) { AliFatal(Form("Invalid index of the beam1 data point: %d (0 -> %d)", index,fPhaseB1.GetEntries())); return NULL; } return value; } //______________________________________________________________________________ const AliDCSValue* AliLHCClockPhase::GetPhaseB2DP(Int_t index) const { // Get the value of the phase // The argument is the DP index AliDCSValue *value = (AliDCSValue*)fPhaseB2.At(index); if (!value) { AliFatal(Form("Invalid index of the beam2 data point: %d (0 -> %d)", index,fPhaseB2.GetEntries())); return NULL; } return value; } //______________________________________________________________________________ Float_t AliLHCClockPhase::GetMeanPhaseB1() const { // Get mean beam1 phase shift. // The mean is calculated using all the data-points. Int_t n = 0; Float_t phase = 0; for(Int_t i = 0; i < fPhaseB1.GetEntries(); ++i) { AliDCSValue *value = (AliDCSValue*)fPhaseB1.At(i); if (value) { phase += value->GetFloat(); ++n; } } if (n == 0) { AliError("No beam1 measurements found! Assuming 0 phase shift!"); return 0; } phase /= n; return phase; } //______________________________________________________________________________ Float_t AliLHCClockPhase::GetMeanPhaseB2() const { // Get mean beam2 phase shift. // The mean is calculated using all the data-points. Int_t n = 0; Float_t phase = 0; for(Int_t i = 0; i < fPhaseB2.GetEntries(); ++i) { AliDCSValue *value = (AliDCSValue*)fPhaseB2.At(i); if (value) { phase += value->GetFloat(); ++n; } } if (n == 0) { AliError("No beam2 measurements found! Assuming 0 phase shift!"); return 0; } phase /= n; return phase; } //______________________________________________________________________________ Float_t AliLHCClockPhase::GetMeanPhase() const { // Get mean phase shift. // Beam1 and beam2 phases are calculated using // all beam1 and beam2 data-points. The two phases are // then averaged in order to get the mean value. return (GetMeanPhaseB1() + GetMeanPhaseB2())/2; } //______________________________________________________________________________ Float_t AliLHCClockPhase::GetPhaseB1(UInt_t timestamp) const { // Get beam1 phase shift using the // event time-stamp as an argument. // This methods loops over data-points and // returns the value of the closest (in time) // measurement found. Long64_t deltat = 0xffffffff; Float_t phase = 0; for(Int_t i = 0; i < fPhaseB1.GetEntries(); ++i) { AliDCSValue *value = (AliDCSValue*)fPhaseB1.At(i); if (value) { if (TMath::Abs((Long64_t)timestamp-(Long64_t)value->GetTimeStamp()) <= deltat) { phase = value->GetFloat(); deltat = TMath::Abs((Long64_t)timestamp-(Long64_t)value->GetTimeStamp()); } } } if (deltat == 0xffffffff) { AliError(Form("Can't get the beam1 phase shift at time-stamp = %u",timestamp)); return 0; } return phase; } //______________________________________________________________________________ Float_t AliLHCClockPhase::GetPhaseB2(UInt_t timestamp) const { // Get beam2 phase shift using the // event time-stamp as an argument. // This methods loops over data-points and // returns the value of the closest (in time) // measurement found. Long64_t deltat = 0xffffffff; Float_t phase = 0; for(Int_t i = 0; i < fPhaseB2.GetEntries(); ++i) { AliDCSValue *value = (AliDCSValue*)fPhaseB2.At(i); if (value) { if (TMath::Abs((Long64_t)timestamp-(Long64_t)value->GetTimeStamp()) <= deltat) { phase = value->GetFloat(); deltat = TMath::Abs((Long64_t)timestamp-(Long64_t)value->GetTimeStamp()); } } } if (deltat == 0xffffffff) { AliError(Form("Can't get the beam2 phase shift at time-stamp = %u",timestamp)); return 0; } return phase; } //______________________________________________________________________________ Float_t AliLHCClockPhase::GetPhase(UInt_t timestamp) const { // Get mean phase shift using the event time-stamp as // an argument. // Beam1 and beam2 phases are calculated using // the closest beam1 and beam2 data-points. The two phases are // then averaged in order to get the mean value. return (GetPhaseB1(timestamp) + GetPhaseB2(timestamp))/2; } //______________________________________________________________________________ void AliLHCClockPhase::Print( const Option_t* ) const { // Print all the data-points for beam1 and beam2 // as well as the mean phases cout << "AliLHCClockPhase object:" << endl; cout << "Beam1:" << endl; for(Int_t i = 0; i < fPhaseB1.GetEntries(); ++i) { AliDCSValue *value = (AliDCSValue*)fPhaseB1.At(i); if (value) cout << "TS=" << value->GetTimeStamp() << " " << value->GetFloat() << endl; } cout << "Beam1 mean phase=" << GetMeanPhaseB1() << " ns" << endl; cout << "Beam2:" << endl; for(Int_t i = 0; i < fPhaseB2.GetEntries(); ++i) { AliDCSValue *value = (AliDCSValue*)fPhaseB2.At(i); if (value) cout << "TS=" << value->GetTimeStamp() << " " << value->GetFloat() << endl; } cout << "Beam2 mean phase=" << GetMeanPhaseB2() << " ns" << endl; cout << "Mean phase (beam1 & beam2) =" << GetMeanPhase() << " ns" << endl; }