ROOT logo
/**************************************************************************
 * 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.                  *
 **************************************************************************/

/* $Id$ */

// **********************
// Class containing the GRP data that have to be stored in the OCDB.
// Data come either from DAQ logbook or from DCS DB.
// Processing of the data can also be performed here.
// **********************

#include <TMap.h>
#include <TObject.h>
#include <TObjString.h>

#include "AliGRPObject.h"
#include "AliDCSSensor.h"
#include "AliLog.h"

ClassImp(AliGRPObject)

const Double_t kCavernCut = 1.0;           // tolerable difference between cavern pressure sensors
const Double_t kSurfaceDifference = 4.5;   //  offset between surface and cavern pressure sensors
	
const Float_t AliGRPObject::fgkInvalidFloat = 1E-33; // value to identify invalid data - float
const TString AliGRPObject::fgkInvalidString = "";  // value to identify invalid data - string
const Char_t AliGRPObject::fgkInvalidChar = -1;         // value to identify invalid data - uchar
const Int_t AliGRPObject::fgkInvalidInt = -1;  // value to identify invalid data - uint
const Int_t AliGRPObject::fgkInvalidUInt = 0;  // value to identify invalid data - uint
const Int_t AliGRPObject::fgknDCSDPHallProbes = 40;   // number of dcs dps
const char* AliGRPObject::fgkDCSDataPointsHallProbes[AliGRPObject::fgknDCSDPHallProbes] = {
		   "L3_BSF17_H1",
		   "L3_BSF17_H2",
		   "L3_BSF17_H3",
		   "L3_BSF17_Temperature",
		   "L3_BSF4_H1",
		   "L3_BSF4_H2",
		   "L3_BSF4_H3",
		   "L3_BSF4_Temperature",
		   "L3_BKF17_H1",
		   "L3_BKF17_H2",
		   "L3_BKF17_H3",
		   "L3_BKF17_Temperature",
		   "L3_BKF4_H1",
		   "L3_BKF4_H2",
		   "L3_BKF4_H3",
		   "L3_BKF4_Temperature",
		   "L3_BSF13_H1",
		   "L3_BSF13_H2",
		   "L3_BSF13_H3",
		   "L3_BSF13_Temperature",
		   "L3_BSF8_H1",
		   "L3_BSF8_H2",
		   "L3_BSF8_H3",
		   "L3_BSF8_Temperature",
		   "L3_BKF13_H1",
		   "L3_BKF13_H2",
		   "L3_BKF13_H3",
		   "L3_BKF13_Temperature",
		   "L3_BKF8_H1",
		   "L3_BKF8_H2",
		   "L3_BKF8_H3",
		   "L3_BKF8_Temperature",
		   "Dipole_Inside_H1",
		   "Dipole_Inside_H2",
		   "Dipole_Inside_H3",
		   "Dipole_Inside_Temperature",
		   "Dipole_Outside_H1",
		   "Dipole_Outside_H2",
		   "Dipole_Outside_H3",
		   "Dipole_Outside_Temperature",
                 };

//-----------------------------------------------------------------------------
AliGRPObject::AliGRPObject():
	TObject(),
	fPoints(5),
	fDimension(0),
	fTimeStart((time_t)fgkInvalidFloat),
	fTimeEnd((time_t)fgkInvalidFloat),
	fBeamEnergy(fgkInvalidFloat),
	fBeamType(fgkInvalidString),
	fNumberOfDetectors(fgkInvalidChar),
	fDetectorMask(fgkInvalidUInt),
	fLHCPeriod(fgkInvalidString),
	fRunType(fgkInvalidString),
	fLHCState(fgkInvalidString),
	fL3Polarity(fgkInvalidChar),
	fDipolePolarity(fgkInvalidChar),
	fL3Current(new Float_t[fPoints]),
	fDipoleCurrent(new Float_t[fPoints]),
	fCavernTemperature(new Float_t[fPoints]),
	fCavernAtmosPressure(0x0),
	fCavernAtmosPressure2(0x0),
	fSurfaceAtmosPressure(0x0),
	fHallProbes(0x0),
	fMachineMode(fgkInvalidString),
	fLHCStateArray(0x0),
	fMachineModeArray(0x0),
	fQATrigClasses(0x0),
	fQACloningRequest(0x0),
	fMaxTimeLHCValidity(0),
	fNFalseDataQualityFlag(0),
	fFalseDataQualityFlag(0x0),
	fBeamTypeFromLHC(fgkInvalidString)
{

	//
	// AliGRPObject default ctor
	//

	fDimension = fgknDCSDPHallProbes*fPoints;
	fHallProbes = new Float_t[fDimension];

	for (Int_t nhp=0; nhp< fDimension; nhp++){ // setting to zero values for non working HP 
		if ((nhp >= 0 && nhp <= 1*fPoints-1) || // L3_BSF17_H1
		    (nhp >= 1*fPoints && nhp <= 2*fPoints-1) || // L3_BSF17_H2
		    (nhp >= 2*fPoints && nhp <= 3*fPoints-1) || // L3_BSF17_H3
                    (nhp >= 3*fPoints && nhp <= 4*fPoints-1) || // L3_BSF17_Temperature
                    (nhp >= 6*fPoints && nhp <= 7*fPoints-1) ) { // L3_BSF4_H3
			fHallProbes[nhp] = 0; // setting to zero values for non working HP 
			AliDebug(2,Form("setting hp[%d] to zero = %f", 
nhp, fHallProbes[nhp]));
		}
		else {
			fHallProbes[nhp] = fgkInvalidFloat;
		}
	}


	for (Int_t i = 0; i < fPoints; i++){

		fL3Current[i] = fgkInvalidFloat;
		fDipoleCurrent[i] = fgkInvalidFloat;
		fCavernTemperature[i] = fgkInvalidFloat;
	}

	for (Int_t ibeamType = 0; ibeamType<2; ibeamType++){
		fSeparateBeamType[ibeamType] = fgkInvalidString;
	}
}

//-----------------------------------------------------------------------------

AliGRPObject::AliGRPObject(const AliGRPObject &obj):
	TObject(obj),
	fPoints(obj.fPoints),
	fDimension(obj.fDimension),
	fTimeStart(obj.fTimeStart),
	fTimeEnd(obj.fTimeEnd),
	fBeamEnergy(obj.fBeamEnergy),
	fBeamType(obj.fBeamType),
	fNumberOfDetectors(obj.fNumberOfDetectors),
	fDetectorMask(obj.fDetectorMask),
	fLHCPeriod(obj.fLHCPeriod),
	fRunType(obj.fRunType),
	fLHCState(obj.fLHCState),
	fL3Polarity(obj.fL3Polarity),
	fDipolePolarity(obj.fDipolePolarity),
	fL3Current(new Float_t[fPoints]),
	fDipoleCurrent(new Float_t[fPoints]),
	fCavernTemperature(new Float_t[fPoints]),
	fCavernAtmosPressure(obj.fCavernAtmosPressure),
	fCavernAtmosPressure2(obj.fCavernAtmosPressure2),
	fSurfaceAtmosPressure(obj.fSurfaceAtmosPressure),
	fHallProbes(0x0),
	fMachineMode(obj.fMachineMode),
	fLHCStateArray(obj.fLHCStateArray),
	fMachineModeArray(obj.fMachineModeArray),
	fQATrigClasses(obj.fQATrigClasses),
	fQACloningRequest(obj.fQACloningRequest),
	fMaxTimeLHCValidity(obj.fMaxTimeLHCValidity),
	fNFalseDataQualityFlag(obj.fNFalseDataQualityFlag),
	fFalseDataQualityFlag(obj.fFalseDataQualityFlag),
	fBeamTypeFromLHC(obj.fBeamTypeFromLHC)


{

	//
	// AliGRPObject copy ctor
	//

	fHallProbes = new Float_t[fDimension]; 

	for (Int_t nhp=0; nhp< fDimension; nhp++){
		fHallProbes[nhp] = obj.fHallProbes[nhp];
	}

	for (Int_t i = 0; i < fPoints; i++){

		fL3Current[i] = obj.fL3Current[i];
		fDipoleCurrent[i] = obj.fDipoleCurrent[i];
		fCavernTemperature[i] = obj.fCavernTemperature[i];
	}

	for (Int_t ibeamType = 0; ibeamType<2; ibeamType++){
		fSeparateBeamType[ibeamType] = obj.fSeparateBeamType[ibeamType];
	}
}

//-----------------------------------------------------------------------------

AliGRPObject& AliGRPObject:: operator=(const AliGRPObject & obj) 
{

	//
	// AliGRPObject assignment operator
	//

	if (&obj == this) return *this; 

	TObject::operator=(obj);
	this->fTimeStart = obj.GetTimeStart();
	this->fTimeEnd = obj.GetTimeEnd();
	this->fBeamEnergy = obj.GetBeamEnergy();
	this->fBeamType = obj.GetBeamType();
	this->fNumberOfDetectors = obj.GetNumberOfDetectors();
	this->fDetectorMask = obj.GetDetectorMask();
	this->fLHCPeriod = obj.GetLHCPeriod();
	this->fRunType = obj.GetRunType();
	this->fLHCState = obj.GetLHCState();
	this->fL3Polarity = obj.GetL3Polarity();
	this->fDipolePolarity = obj.GetDipolePolarity();
	this->fCavernAtmosPressure = obj.GetCavernAtmosPressure();
	this->fCavernAtmosPressure2 = obj.GetCavernAtmosPressure2();
	this->fSurfaceAtmosPressure = obj.GetSurfaceAtmosPressure();
	this->fPoints = obj.GetPoints();
	this->fDimension = obj.GetDimension();

	this->fL3Current = new Float_t[fPoints];
	this->fDipoleCurrent = new Float_t[fPoints];
	this->fCavernTemperature = new Float_t[fPoints];
	
	if (this->fHallProbes==NULL) this->fHallProbes = new Float_t[this->fDimension]; 
	for (Int_t nhp=0; nhp< fDimension; nhp++){
		this->fHallProbes[nhp] = obj.GetHallProbes(nhp);

	}
	for (Int_t i = 0; i < fPoints; i++){

		this->fL3Current[i] = obj.GetL3Current((Stats)i);
		this->fDipoleCurrent[i] = obj.GetDipoleCurrent((Stats)i);
		this->fCavernTemperature[i] = obj.GetCavernTemperature((Stats)i);
	}

	this->fMachineMode = obj.fMachineMode;
	this->fLHCStateArray = obj.fLHCStateArray;
	this->fMachineModeArray = obj.fMachineModeArray;
	this->fMaxTimeLHCValidity = obj.fMaxTimeLHCValidity;

	this->fQATrigClasses = obj.fQATrigClasses;
	this->fQACloningRequest = obj.fQACloningRequest;

	for (Int_t ibeamType = 0; ibeamType<2; ibeamType++){
		this->fSeparateBeamType[ibeamType] = obj.fSeparateBeamType[ibeamType];
	}

	this->fNFalseDataQualityFlag = obj.fNFalseDataQualityFlag;
	this->fFalseDataQualityFlag = obj.fFalseDataQualityFlag;
	this->fBeamTypeFromLHC = obj.fBeamTypeFromLHC;

	return *this;
}

//-----------------------------------------------------------------------------

AliGRPObject::~AliGRPObject() {

	//
	// dtor
	//

	
	delete [] fHallProbes;
	delete [] fL3Current;
	delete [] fDipoleCurrent;
	delete [] fCavernTemperature;

	if (fCavernAtmosPressure){
		delete fCavernAtmosPressure;
		fCavernAtmosPressure = 0x0;
	}
	if (fCavernAtmosPressure2){
		delete fCavernAtmosPressure2;
		fCavernAtmosPressure2 = 0x0;
	}
	if (fSurfaceAtmosPressure){
		delete fSurfaceAtmosPressure;
		fSurfaceAtmosPressure = 0x0;
	}
	if (fLHCStateArray){
		delete fLHCStateArray;
		fLHCStateArray = 0x0;
	}
	if (fMachineModeArray){
		delete fMachineModeArray;
		fMachineModeArray = 0x0;
	}
	if (fQATrigClasses) {
	  delete fQATrigClasses;
	  fQATrigClasses = 0x0;
	}
	if (fQACloningRequest) {
	  delete fQACloningRequest;
	  fQACloningRequest = 0x0;
	}
	if (fFalseDataQualityFlag){
		delete fFalseDataQualityFlag;
		fFalseDataQualityFlag = 0x0;
	}
}

//-----------------------------------------------------------------------------
Float_t* AliGRPObject::GetHallProbesArray(DP_HallProbes hp) const {

	//
	// method to return array of statistical
        // variables for Hall Probe hp
	//

	Float_t* array = new Float_t[fPoints];
	Int_t shift = fPoints*(Int_t)hp; 
	for (Int_t i=0;i<fPoints; i++){

		array[i] = fHallProbes[shift+i];

	}

	return array;
}
//-------------------------------------------------------------------------------

void AliGRPObject::SetHallProbes(DP_HallProbes hp, const Float_t* hall_probe){

	//
	// method to set hall probe hp 
	// from a given array
	//

	Int_t shift = fPoints*hp;
	for (Int_t i = 0; i< fPoints; i++){

		fHallProbes[i+shift] =  hall_probe[i];
	}
	return;
}

//-------------------------------------------------------------------------------

void AliGRPObject::ReadValuesFromMap(const TMap* mapGRP){

	//
	// method to set the values of the GRP parameters 
	// reading them from the old format of the GRP 
	// object, i.e. a TMap
	//

	if (mapGRP->GetValue("fAliceStartTime")){
		SetTimeStart((time_t)(((TObjString*)(mapGRP->GetValue("fAliceStartTime")))->GetString()).Atoi());
	}
	else {
		AliError(Form("No fAliceStartTime value found in GRP map!"));
	}
	if (mapGRP->GetValue("fAliceStopTime")){
		SetTimeEnd((time_t)(((TObjString*)(mapGRP->GetValue("fAliceStopTime")))->GetString()).Atoi());
	}
	
	else { 
		AliError(Form("No fAliceStopTime value found in GRP map!"));
	}

	if(mapGRP->GetValue("fAliceBeamEnergy")){
	  double be = (((TObjString*)(mapGRP->GetValue("fAliceBeamEnergy")))->GetString()).Atof();
	  if (IsBeamEnergyIsSqrtSHalfGeV()) be/=2;   // old format was storig sqrt(s)
	  SetBeamEnergy(be);
	}
	else { 
		AliError(Form("No fAliceBeamEnergy value found in GRP map!"));
	}
	if(mapGRP->GetValue("fAliceBeamType")){
		SetBeamType(((TObjString*)(mapGRP->GetValue("fAliceBeamType")))->GetString());
	}
	else { 
		AliError(Form("No fAliceBeamType value found in GRP map!"));
	}
	if(mapGRP->GetValue("fNumberOfDetectors")){
		SetNumberOfDetectors((Char_t)(((TObjString*)(mapGRP->GetValue("fNumberOfDetectors")))->GetString()).Atoi()); 
		AliDebug(1, Form("fNumberOfDetectors = %d", fNumberOfDetectors));
	}
	else { 
		AliError(Form("No fNumberOfDetectors value found in GRP map!"));
	}
	if(mapGRP->GetValue("fDetectorMask")){
		SetDetectorMask((UInt_t)(((TObjString*)(mapGRP->GetValue("fDetectorMask")))->GetString()).Atoi());  
		AliDebug(1, Form("fDetectorMask = %d",fDetectorMask));
	}
	else { 
		AliError(Form("No fDetectorMask value found in GRP map!"));
	}
	if(mapGRP->GetValue("fLHCPeriod")){
		SetLHCPeriod(((TObjString*)(mapGRP->GetValue("fLHCPeriod")))->GetString());
	}
	else { 
		AliError(Form("No fLHCPeriod value found in GRP map!"));
	}
	if(mapGRP->GetValue("fRunType")){
		SetRunType(((TObjString*)(mapGRP->GetValue("fRunType")))->GetString());
	}
	else { 
		AliError(Form("No fRunType value found in GRP map!"));
	}
	if(mapGRP->GetValue("fLHCState")){
		SetLHCState(((TObjString*)(mapGRP->GetValue("fLHCState")))->GetString());
	}
	else { 
		AliError(Form("No fLHCState value found in GRP map!"));
	}
	if(mapGRP->GetValue("fLHCluminosity")){
		AliInfo(Form("fLHCLuminosity found, but not there anymore in the new object"));
	}	
	else { 
		AliError(Form("No fLHCLuminosity value found in GRP map!"));
	}
	if(mapGRP->GetValue("fBeamIntensity")){
		AliInfo(Form("fBeamIntensity found, but not there anymore in the new object"));
	}	
	else { 
		AliError(Form("No fBeamIntensity value found in GRP map!"));
	}
	if(mapGRP->GetValue("fL3Polarity")){
		SetL3Polarity((Char_t)(((TObjString*)(mapGRP->GetValue("fL3Polarity")))->GetString()).Atoi());
	}	
	else { 
		AliError(Form("No fL3Polarity value found in GRP map!"));
	}
	if(mapGRP->GetValue("fDipolePolarity")){
		SetDipolePolarity((Char_t)(((TObjString*)(mapGRP->GetValue("fDipolePolarity")))->GetString()).Atoi());  
	}	
	else { 
		AliError(Form("No fDipolePolarity value found in GRP map!"));
	}
	if(mapGRP->GetValue("fL3Current")){
		AliInfo(Form("fL3Current found, but porting only average to the new object, since the other values are not available in the old object"));
		SetL3Current((Float_t)(((TObjString*)(mapGRP->GetValue("fL3Current")))->GetString()).Atof(),(Stats)0);
	}	
	else { 
		AliError(Form("No fL3Current value found in GRP map!"));
	}
	if(mapGRP->GetValue("fDipoleCurrent")){
		AliInfo(Form("fDipoleCurrent found, but porting only average to the new object, since the other values are not available in the old object"));
		SetDipoleCurrent((Float_t)(((TObjString*)(mapGRP->GetValue("fDipoleCurrent")))->GetString()).Atof(),(Stats)0);
	}	
	else { 
		AliError(Form("No fDipoleCurrent value found in GRP map!"));
	}
	if(mapGRP->GetValue("fCavernTemperature")){
		AliInfo(Form("fCaverntemperature found, but porting only average to the new object, since the other values are not available in the old object"));
		SetCavernTemperature((Float_t)(((TObjString*)(mapGRP->GetValue("fCavernTemperature")))->GetString()).Atof(),(Stats)0);
	}	
	else { 
		AliError(Form("No fCavernTemperature value found in GRP map!"));
	}
	if(mapGRP->GetValue("fCavernAtmosPressure")){
		AliInfo(Form("fCavernAtmosPressure found, but not ported to the new object since of a different type"));
	}	
	else { 
		AliError(Form("No fCavernAtmosPressure value found in GRP map!"));
	}
	if(mapGRP->GetValue("fP2Pressure")){
		SetSurfaceAtmosPressure((AliDCSSensor*)((TObjString*)(mapGRP->GetValue("fP2Pressure"))));
	}
	else { 
		AliError(Form("No fP2Pressure value found in GRP map!"));
	}
	
	return;

}
//-------------------------------------------------------------------------------

Float_t AliGRPObject::GetBeamEnergy() const {

	//
	// Getting the energy
	// in case of BeamType = A-A, multiplying by 82/208 (for PbPb)
	//

	Float_t energy = fBeamEnergy;
	if (fBeamType=="A-A"){
		energy = energy*82./208;
	}
	return IsBeamEnergyIsSqrtSHalfGeV() ? energy : energy/2;
}

//-------------------------------------------------------------------------------

Double_t AliGRPObject::EvalCavernPressure(const TTimeStamp& time, Bool_t& inside) const { 
//
//  Return current pressure value from 'best' cavern sensor
//    (default sensor 2. If sensor 1 and sensor 2 are sufficiently different,
//     use sensor most compatible with surface sensor

  return EvalCavernPressure(fCavernAtmosPressure,fCavernAtmosPressure2,
             fSurfaceAtmosPressure,time,inside);
	     			
}

//-------------------------------------------------------------------------------

Double_t AliGRPObject::EvalCavernPressure(AliDCSSensor* cavern1, 
	              AliDCSSensor* cavern2, AliDCSSensor* surface, 
		      const TTimeStamp& time, Bool_t& inside)  {
//
//  Return current pressure value from 'best' cavern sensor
//    (default sensor 2. If sensor 1 and sensor 2 are sufficiently different,
//     use sensor most compatible with surface sensor

     
    Double_t valueSensor2 = cavern2->Eval(time,inside);
    Double_t valueSensor1 = cavern1->Eval(time,inside);
    if (TMath::Abs(valueSensor2-valueSensor1)<kCavernCut) {
        return valueSensor2;
    } else { 
        Double_t valueSurface = surface->Eval(time,inside);
        Double_t diff1 = TMath::Abs(valueSensor1-valueSurface-kSurfaceDifference);
        Double_t diff2 = TMath::Abs(valueSensor2-valueSurface-kSurfaceDifference);
	if (TMath::Abs(diff1)<TMath::Abs(diff2) ) {
	    return valueSensor1;
	} else {
	    return valueSensor2;
	}
     }
}

//-------------------------------------------------------------------------------

AliDCSSensor* AliGRPObject::GetBestCavernAtmosPressure(AliDCSSensor* cavern1, 
	     AliDCSSensor* cavern2, AliDCSSensor* surface, const TTimeStamp& time) {

//
//  Return pointer to 'best' cavern sensor
//    (default sensor 2. If sensor 1 and sensor 2 are sufficiently different,
//     use sensor most compatible with surface sensor
//    Pressure measuread at time specified by TTimestamp


    Bool_t inside; 
    Double_t valueSensor2 = cavern2->Eval(time,inside);
    Double_t valueSensor1 = cavern1->Eval(time,inside);
    if (TMath::Abs(valueSensor2-valueSensor1)<kCavernCut) {
        return cavern2;
    } else { 
        Double_t valueSurface = surface->Eval(time,inside);
        Double_t diff1 = TMath::Abs(valueSensor1-valueSurface-kSurfaceDifference);
        Double_t diff2 = TMath::Abs(valueSensor2-valueSurface-kSurfaceDifference);
	if (TMath::Abs(diff1)<TMath::Abs(diff2) ) {
	    return cavern1;
	} else {
	    return cavern2;
	}
     }
}

//-------------------------------------------------------------------------------

AliDCSSensor*   AliGRPObject::GetBestCavernAtmosPressure(const TTimeStamp& time) const {
//
//  Return pointer to 'best' cavern sensor
//    (default sensor 2. If sensor 1 and sensor 2 are sufficiently different,
//     use sensor most compatible with surface sensor
//    Pressure measuread at time specified by TTimestamp


   return GetBestCavernAtmosPressure(fCavernAtmosPressure,
        fCavernAtmosPressure2, fSurfaceAtmosPressure, time);

}
    
//-------------------------------------------------------------------------------

AliDCSSensor*   AliGRPObject::GetBestCavernAtmosPressure() const {
//
//  Return pointer to 'best' cavern sensor
//    (default sensor 2. If sensor 1 and sensor 2 are sufficiently different,
//     use sensor most compatible with surface sensor
//    Pressure measuread at start-of-run

   return GetBestCavernAtmosPressure(TTimeStamp(fTimeStart));
}

//-------------------------------------------------------------------------------
void AliGRPObject::SetFalseDataQualityFlagPeriods(Double_t* falses){
	
	//
	// setting the starts (even positions in the array) and ends (odd positions in the array)
	// of the periods when the Data Quality Flag was set to FALSE
	//
	
	fFalseDataQualityFlag = new TArrayD(fNFalseDataQualityFlag*2,falses);
}

//-------------------------------------------------------------------------------
Double_t AliGRPObject::GetStartFalseDataQualityFlag(Int_t iperiod) const {
	
	// 
	// returning the start timestamp of the FALSE period "iperiod"
	//
	
	if (iperiod < fNFalseDataQualityFlag){
		return fFalseDataQualityFlag->At(iperiod*2);
	}
	else{
		AliError(Form("You are looking for FALSE period %d, but the number of FALSE periods was %d - returning -1!", iperiod, fNFalseDataQualityFlag));
	}
	return -1.;
}

//-------------------------------------------------------------------------------
Double_t AliGRPObject::GetEndFalseDataQualityFlag(Int_t iperiod) const {
	
	// 
	// returning the end timestamp of the FALSE period "iperiod"
	//
	
	if (iperiod < fNFalseDataQualityFlag){
		return fFalseDataQualityFlag->At(iperiod*2+1);
	}
	else{
		AliError(Form("You are looking for FALSE period %d, but the number of FALSE periods was %d - returning -1!", iperiod, fNFalseDataQualityFlag));
	}
	return -1.;
}
 AliGRPObject.cxx:1
 AliGRPObject.cxx:2
 AliGRPObject.cxx:3
 AliGRPObject.cxx:4
 AliGRPObject.cxx:5
 AliGRPObject.cxx:6
 AliGRPObject.cxx:7
 AliGRPObject.cxx:8
 AliGRPObject.cxx:9
 AliGRPObject.cxx:10
 AliGRPObject.cxx:11
 AliGRPObject.cxx:12
 AliGRPObject.cxx:13
 AliGRPObject.cxx:14
 AliGRPObject.cxx:15
 AliGRPObject.cxx:16
 AliGRPObject.cxx:17
 AliGRPObject.cxx:18
 AliGRPObject.cxx:19
 AliGRPObject.cxx:20
 AliGRPObject.cxx:21
 AliGRPObject.cxx:22
 AliGRPObject.cxx:23
 AliGRPObject.cxx:24
 AliGRPObject.cxx:25
 AliGRPObject.cxx:26
 AliGRPObject.cxx:27
 AliGRPObject.cxx:28
 AliGRPObject.cxx:29
 AliGRPObject.cxx:30
 AliGRPObject.cxx:31
 AliGRPObject.cxx:32
 AliGRPObject.cxx:33
 AliGRPObject.cxx:34
 AliGRPObject.cxx:35
 AliGRPObject.cxx:36
 AliGRPObject.cxx:37
 AliGRPObject.cxx:38
 AliGRPObject.cxx:39
 AliGRPObject.cxx:40
 AliGRPObject.cxx:41
 AliGRPObject.cxx:42
 AliGRPObject.cxx:43
 AliGRPObject.cxx:44
 AliGRPObject.cxx:45
 AliGRPObject.cxx:46
 AliGRPObject.cxx:47
 AliGRPObject.cxx:48
 AliGRPObject.cxx:49
 AliGRPObject.cxx:50
 AliGRPObject.cxx:51
 AliGRPObject.cxx:52
 AliGRPObject.cxx:53
 AliGRPObject.cxx:54
 AliGRPObject.cxx:55
 AliGRPObject.cxx:56
 AliGRPObject.cxx:57
 AliGRPObject.cxx:58
 AliGRPObject.cxx:59
 AliGRPObject.cxx:60
 AliGRPObject.cxx:61
 AliGRPObject.cxx:62
 AliGRPObject.cxx:63
 AliGRPObject.cxx:64
 AliGRPObject.cxx:65
 AliGRPObject.cxx:66
 AliGRPObject.cxx:67
 AliGRPObject.cxx:68
 AliGRPObject.cxx:69
 AliGRPObject.cxx:70
 AliGRPObject.cxx:71
 AliGRPObject.cxx:72
 AliGRPObject.cxx:73
 AliGRPObject.cxx:74
 AliGRPObject.cxx:75
 AliGRPObject.cxx:76
 AliGRPObject.cxx:77
 AliGRPObject.cxx:78
 AliGRPObject.cxx:79
 AliGRPObject.cxx:80
 AliGRPObject.cxx:81
 AliGRPObject.cxx:82
 AliGRPObject.cxx:83
 AliGRPObject.cxx:84
 AliGRPObject.cxx:85
 AliGRPObject.cxx:86
 AliGRPObject.cxx:87
 AliGRPObject.cxx:88
 AliGRPObject.cxx:89
 AliGRPObject.cxx:90
 AliGRPObject.cxx:91
 AliGRPObject.cxx:92
 AliGRPObject.cxx:93
 AliGRPObject.cxx:94
 AliGRPObject.cxx:95
 AliGRPObject.cxx:96
 AliGRPObject.cxx:97
 AliGRPObject.cxx:98
 AliGRPObject.cxx:99
 AliGRPObject.cxx:100
 AliGRPObject.cxx:101
 AliGRPObject.cxx:102
 AliGRPObject.cxx:103
 AliGRPObject.cxx:104
 AliGRPObject.cxx:105
 AliGRPObject.cxx:106
 AliGRPObject.cxx:107
 AliGRPObject.cxx:108
 AliGRPObject.cxx:109
 AliGRPObject.cxx:110
 AliGRPObject.cxx:111
 AliGRPObject.cxx:112
 AliGRPObject.cxx:113
 AliGRPObject.cxx:114
 AliGRPObject.cxx:115
 AliGRPObject.cxx:116
 AliGRPObject.cxx:117
 AliGRPObject.cxx:118
 AliGRPObject.cxx:119
 AliGRPObject.cxx:120
 AliGRPObject.cxx:121
 AliGRPObject.cxx:122
 AliGRPObject.cxx:123
 AliGRPObject.cxx:124
 AliGRPObject.cxx:125
 AliGRPObject.cxx:126
 AliGRPObject.cxx:127
 AliGRPObject.cxx:128
 AliGRPObject.cxx:129
 AliGRPObject.cxx:130
 AliGRPObject.cxx:131
 AliGRPObject.cxx:132
 AliGRPObject.cxx:133
 AliGRPObject.cxx:134
 AliGRPObject.cxx:135
 AliGRPObject.cxx:136
 AliGRPObject.cxx:137
 AliGRPObject.cxx:138
 AliGRPObject.cxx:139
 AliGRPObject.cxx:140
 AliGRPObject.cxx:141
 AliGRPObject.cxx:142
 AliGRPObject.cxx:143
 AliGRPObject.cxx:144
 AliGRPObject.cxx:145
 AliGRPObject.cxx:146
 AliGRPObject.cxx:147
 AliGRPObject.cxx:148
 AliGRPObject.cxx:149
 AliGRPObject.cxx:150
 AliGRPObject.cxx:151
 AliGRPObject.cxx:152
 AliGRPObject.cxx:153
 AliGRPObject.cxx:154
 AliGRPObject.cxx:155
 AliGRPObject.cxx:156
 AliGRPObject.cxx:157
 AliGRPObject.cxx:158
 AliGRPObject.cxx:159
 AliGRPObject.cxx:160
 AliGRPObject.cxx:161
 AliGRPObject.cxx:162
 AliGRPObject.cxx:163
 AliGRPObject.cxx:164
 AliGRPObject.cxx:165
 AliGRPObject.cxx:166
 AliGRPObject.cxx:167
 AliGRPObject.cxx:168
 AliGRPObject.cxx:169
 AliGRPObject.cxx:170
 AliGRPObject.cxx:171
 AliGRPObject.cxx:172
 AliGRPObject.cxx:173
 AliGRPObject.cxx:174
 AliGRPObject.cxx:175
 AliGRPObject.cxx:176
 AliGRPObject.cxx:177
 AliGRPObject.cxx:178
 AliGRPObject.cxx:179
 AliGRPObject.cxx:180
 AliGRPObject.cxx:181
 AliGRPObject.cxx:182
 AliGRPObject.cxx:183
 AliGRPObject.cxx:184
 AliGRPObject.cxx:185
 AliGRPObject.cxx:186
 AliGRPObject.cxx:187
 AliGRPObject.cxx:188
 AliGRPObject.cxx:189
 AliGRPObject.cxx:190
 AliGRPObject.cxx:191
 AliGRPObject.cxx:192
 AliGRPObject.cxx:193
 AliGRPObject.cxx:194
 AliGRPObject.cxx:195
 AliGRPObject.cxx:196
 AliGRPObject.cxx:197
 AliGRPObject.cxx:198
 AliGRPObject.cxx:199
 AliGRPObject.cxx:200
 AliGRPObject.cxx:201
 AliGRPObject.cxx:202
 AliGRPObject.cxx:203
 AliGRPObject.cxx:204
 AliGRPObject.cxx:205
 AliGRPObject.cxx:206
 AliGRPObject.cxx:207
 AliGRPObject.cxx:208
 AliGRPObject.cxx:209
 AliGRPObject.cxx:210
 AliGRPObject.cxx:211
 AliGRPObject.cxx:212
 AliGRPObject.cxx:213
 AliGRPObject.cxx:214
 AliGRPObject.cxx:215
 AliGRPObject.cxx:216
 AliGRPObject.cxx:217
 AliGRPObject.cxx:218
 AliGRPObject.cxx:219
 AliGRPObject.cxx:220
 AliGRPObject.cxx:221
 AliGRPObject.cxx:222
 AliGRPObject.cxx:223
 AliGRPObject.cxx:224
 AliGRPObject.cxx:225
 AliGRPObject.cxx:226
 AliGRPObject.cxx:227
 AliGRPObject.cxx:228
 AliGRPObject.cxx:229
 AliGRPObject.cxx:230
 AliGRPObject.cxx:231
 AliGRPObject.cxx:232
 AliGRPObject.cxx:233
 AliGRPObject.cxx:234
 AliGRPObject.cxx:235
 AliGRPObject.cxx:236
 AliGRPObject.cxx:237
 AliGRPObject.cxx:238
 AliGRPObject.cxx:239
 AliGRPObject.cxx:240
 AliGRPObject.cxx:241
 AliGRPObject.cxx:242
 AliGRPObject.cxx:243
 AliGRPObject.cxx:244
 AliGRPObject.cxx:245
 AliGRPObject.cxx:246
 AliGRPObject.cxx:247
 AliGRPObject.cxx:248
 AliGRPObject.cxx:249
 AliGRPObject.cxx:250
 AliGRPObject.cxx:251
 AliGRPObject.cxx:252
 AliGRPObject.cxx:253
 AliGRPObject.cxx:254
 AliGRPObject.cxx:255
 AliGRPObject.cxx:256
 AliGRPObject.cxx:257
 AliGRPObject.cxx:258
 AliGRPObject.cxx:259
 AliGRPObject.cxx:260
 AliGRPObject.cxx:261
 AliGRPObject.cxx:262
 AliGRPObject.cxx:263
 AliGRPObject.cxx:264
 AliGRPObject.cxx:265
 AliGRPObject.cxx:266
 AliGRPObject.cxx:267
 AliGRPObject.cxx:268
 AliGRPObject.cxx:269
 AliGRPObject.cxx:270
 AliGRPObject.cxx:271
 AliGRPObject.cxx:272
 AliGRPObject.cxx:273
 AliGRPObject.cxx:274
 AliGRPObject.cxx:275
 AliGRPObject.cxx:276
 AliGRPObject.cxx:277
 AliGRPObject.cxx:278
 AliGRPObject.cxx:279
 AliGRPObject.cxx:280
 AliGRPObject.cxx:281
 AliGRPObject.cxx:282
 AliGRPObject.cxx:283
 AliGRPObject.cxx:284
 AliGRPObject.cxx:285
 AliGRPObject.cxx:286
 AliGRPObject.cxx:287
 AliGRPObject.cxx:288
 AliGRPObject.cxx:289
 AliGRPObject.cxx:290
 AliGRPObject.cxx:291
 AliGRPObject.cxx:292
 AliGRPObject.cxx:293
 AliGRPObject.cxx:294
 AliGRPObject.cxx:295
 AliGRPObject.cxx:296
 AliGRPObject.cxx:297
 AliGRPObject.cxx:298
 AliGRPObject.cxx:299
 AliGRPObject.cxx:300
 AliGRPObject.cxx:301
 AliGRPObject.cxx:302
 AliGRPObject.cxx:303
 AliGRPObject.cxx:304
 AliGRPObject.cxx:305
 AliGRPObject.cxx:306
 AliGRPObject.cxx:307
 AliGRPObject.cxx:308
 AliGRPObject.cxx:309
 AliGRPObject.cxx:310
 AliGRPObject.cxx:311
 AliGRPObject.cxx:312
 AliGRPObject.cxx:313
 AliGRPObject.cxx:314
 AliGRPObject.cxx:315
 AliGRPObject.cxx:316
 AliGRPObject.cxx:317
 AliGRPObject.cxx:318
 AliGRPObject.cxx:319
 AliGRPObject.cxx:320
 AliGRPObject.cxx:321
 AliGRPObject.cxx:322
 AliGRPObject.cxx:323
 AliGRPObject.cxx:324
 AliGRPObject.cxx:325
 AliGRPObject.cxx:326
 AliGRPObject.cxx:327
 AliGRPObject.cxx:328
 AliGRPObject.cxx:329
 AliGRPObject.cxx:330
 AliGRPObject.cxx:331
 AliGRPObject.cxx:332
 AliGRPObject.cxx:333
 AliGRPObject.cxx:334
 AliGRPObject.cxx:335
 AliGRPObject.cxx:336
 AliGRPObject.cxx:337
 AliGRPObject.cxx:338
 AliGRPObject.cxx:339
 AliGRPObject.cxx:340
 AliGRPObject.cxx:341
 AliGRPObject.cxx:342
 AliGRPObject.cxx:343
 AliGRPObject.cxx:344
 AliGRPObject.cxx:345
 AliGRPObject.cxx:346
 AliGRPObject.cxx:347
 AliGRPObject.cxx:348
 AliGRPObject.cxx:349
 AliGRPObject.cxx:350
 AliGRPObject.cxx:351
 AliGRPObject.cxx:352
 AliGRPObject.cxx:353
 AliGRPObject.cxx:354
 AliGRPObject.cxx:355
 AliGRPObject.cxx:356
 AliGRPObject.cxx:357
 AliGRPObject.cxx:358
 AliGRPObject.cxx:359
 AliGRPObject.cxx:360
 AliGRPObject.cxx:361
 AliGRPObject.cxx:362
 AliGRPObject.cxx:363
 AliGRPObject.cxx:364
 AliGRPObject.cxx:365
 AliGRPObject.cxx:366
 AliGRPObject.cxx:367
 AliGRPObject.cxx:368
 AliGRPObject.cxx:369
 AliGRPObject.cxx:370
 AliGRPObject.cxx:371
 AliGRPObject.cxx:372
 AliGRPObject.cxx:373
 AliGRPObject.cxx:374
 AliGRPObject.cxx:375
 AliGRPObject.cxx:376
 AliGRPObject.cxx:377
 AliGRPObject.cxx:378
 AliGRPObject.cxx:379
 AliGRPObject.cxx:380
 AliGRPObject.cxx:381
 AliGRPObject.cxx:382
 AliGRPObject.cxx:383
 AliGRPObject.cxx:384
 AliGRPObject.cxx:385
 AliGRPObject.cxx:386
 AliGRPObject.cxx:387
 AliGRPObject.cxx:388
 AliGRPObject.cxx:389
 AliGRPObject.cxx:390
 AliGRPObject.cxx:391
 AliGRPObject.cxx:392
 AliGRPObject.cxx:393
 AliGRPObject.cxx:394
 AliGRPObject.cxx:395
 AliGRPObject.cxx:396
 AliGRPObject.cxx:397
 AliGRPObject.cxx:398
 AliGRPObject.cxx:399
 AliGRPObject.cxx:400
 AliGRPObject.cxx:401
 AliGRPObject.cxx:402
 AliGRPObject.cxx:403
 AliGRPObject.cxx:404
 AliGRPObject.cxx:405
 AliGRPObject.cxx:406
 AliGRPObject.cxx:407
 AliGRPObject.cxx:408
 AliGRPObject.cxx:409
 AliGRPObject.cxx:410
 AliGRPObject.cxx:411
 AliGRPObject.cxx:412
 AliGRPObject.cxx:413
 AliGRPObject.cxx:414
 AliGRPObject.cxx:415
 AliGRPObject.cxx:416
 AliGRPObject.cxx:417
 AliGRPObject.cxx:418
 AliGRPObject.cxx:419
 AliGRPObject.cxx:420
 AliGRPObject.cxx:421
 AliGRPObject.cxx:422
 AliGRPObject.cxx:423
 AliGRPObject.cxx:424
 AliGRPObject.cxx:425
 AliGRPObject.cxx:426
 AliGRPObject.cxx:427
 AliGRPObject.cxx:428
 AliGRPObject.cxx:429
 AliGRPObject.cxx:430
 AliGRPObject.cxx:431
 AliGRPObject.cxx:432
 AliGRPObject.cxx:433
 AliGRPObject.cxx:434
 AliGRPObject.cxx:435
 AliGRPObject.cxx:436
 AliGRPObject.cxx:437
 AliGRPObject.cxx:438
 AliGRPObject.cxx:439
 AliGRPObject.cxx:440
 AliGRPObject.cxx:441
 AliGRPObject.cxx:442
 AliGRPObject.cxx:443
 AliGRPObject.cxx:444
 AliGRPObject.cxx:445
 AliGRPObject.cxx:446
 AliGRPObject.cxx:447
 AliGRPObject.cxx:448
 AliGRPObject.cxx:449
 AliGRPObject.cxx:450
 AliGRPObject.cxx:451
 AliGRPObject.cxx:452
 AliGRPObject.cxx:453
 AliGRPObject.cxx:454
 AliGRPObject.cxx:455
 AliGRPObject.cxx:456
 AliGRPObject.cxx:457
 AliGRPObject.cxx:458
 AliGRPObject.cxx:459
 AliGRPObject.cxx:460
 AliGRPObject.cxx:461
 AliGRPObject.cxx:462
 AliGRPObject.cxx:463
 AliGRPObject.cxx:464
 AliGRPObject.cxx:465
 AliGRPObject.cxx:466
 AliGRPObject.cxx:467
 AliGRPObject.cxx:468
 AliGRPObject.cxx:469
 AliGRPObject.cxx:470
 AliGRPObject.cxx:471
 AliGRPObject.cxx:472
 AliGRPObject.cxx:473
 AliGRPObject.cxx:474
 AliGRPObject.cxx:475
 AliGRPObject.cxx:476
 AliGRPObject.cxx:477
 AliGRPObject.cxx:478
 AliGRPObject.cxx:479
 AliGRPObject.cxx:480
 AliGRPObject.cxx:481
 AliGRPObject.cxx:482
 AliGRPObject.cxx:483
 AliGRPObject.cxx:484
 AliGRPObject.cxx:485
 AliGRPObject.cxx:486
 AliGRPObject.cxx:487
 AliGRPObject.cxx:488
 AliGRPObject.cxx:489
 AliGRPObject.cxx:490
 AliGRPObject.cxx:491
 AliGRPObject.cxx:492
 AliGRPObject.cxx:493
 AliGRPObject.cxx:494
 AliGRPObject.cxx:495
 AliGRPObject.cxx:496
 AliGRPObject.cxx:497
 AliGRPObject.cxx:498
 AliGRPObject.cxx:499
 AliGRPObject.cxx:500
 AliGRPObject.cxx:501
 AliGRPObject.cxx:502
 AliGRPObject.cxx:503
 AliGRPObject.cxx:504
 AliGRPObject.cxx:505
 AliGRPObject.cxx:506
 AliGRPObject.cxx:507
 AliGRPObject.cxx:508
 AliGRPObject.cxx:509
 AliGRPObject.cxx:510
 AliGRPObject.cxx:511
 AliGRPObject.cxx:512
 AliGRPObject.cxx:513
 AliGRPObject.cxx:514
 AliGRPObject.cxx:515
 AliGRPObject.cxx:516
 AliGRPObject.cxx:517
 AliGRPObject.cxx:518
 AliGRPObject.cxx:519
 AliGRPObject.cxx:520
 AliGRPObject.cxx:521
 AliGRPObject.cxx:522
 AliGRPObject.cxx:523
 AliGRPObject.cxx:524
 AliGRPObject.cxx:525
 AliGRPObject.cxx:526
 AliGRPObject.cxx:527
 AliGRPObject.cxx:528
 AliGRPObject.cxx:529
 AliGRPObject.cxx:530
 AliGRPObject.cxx:531
 AliGRPObject.cxx:532
 AliGRPObject.cxx:533
 AliGRPObject.cxx:534
 AliGRPObject.cxx:535
 AliGRPObject.cxx:536
 AliGRPObject.cxx:537
 AliGRPObject.cxx:538
 AliGRPObject.cxx:539
 AliGRPObject.cxx:540
 AliGRPObject.cxx:541
 AliGRPObject.cxx:542
 AliGRPObject.cxx:543
 AliGRPObject.cxx:544
 AliGRPObject.cxx:545
 AliGRPObject.cxx:546
 AliGRPObject.cxx:547
 AliGRPObject.cxx:548
 AliGRPObject.cxx:549
 AliGRPObject.cxx:550
 AliGRPObject.cxx:551
 AliGRPObject.cxx:552
 AliGRPObject.cxx:553
 AliGRPObject.cxx:554
 AliGRPObject.cxx:555
 AliGRPObject.cxx:556
 AliGRPObject.cxx:557
 AliGRPObject.cxx:558
 AliGRPObject.cxx:559
 AliGRPObject.cxx:560
 AliGRPObject.cxx:561
 AliGRPObject.cxx:562
 AliGRPObject.cxx:563
 AliGRPObject.cxx:564
 AliGRPObject.cxx:565
 AliGRPObject.cxx:566
 AliGRPObject.cxx:567
 AliGRPObject.cxx:568
 AliGRPObject.cxx:569
 AliGRPObject.cxx:570
 AliGRPObject.cxx:571
 AliGRPObject.cxx:572
 AliGRPObject.cxx:573
 AliGRPObject.cxx:574
 AliGRPObject.cxx:575
 AliGRPObject.cxx:576
 AliGRPObject.cxx:577
 AliGRPObject.cxx:578
 AliGRPObject.cxx:579
 AliGRPObject.cxx:580
 AliGRPObject.cxx:581
 AliGRPObject.cxx:582
 AliGRPObject.cxx:583
 AliGRPObject.cxx:584
 AliGRPObject.cxx:585
 AliGRPObject.cxx:586
 AliGRPObject.cxx:587
 AliGRPObject.cxx:588
 AliGRPObject.cxx:589
 AliGRPObject.cxx:590
 AliGRPObject.cxx:591
 AliGRPObject.cxx:592
 AliGRPObject.cxx:593
 AliGRPObject.cxx:594
 AliGRPObject.cxx:595
 AliGRPObject.cxx:596
 AliGRPObject.cxx:597
 AliGRPObject.cxx:598
 AliGRPObject.cxx:599
 AliGRPObject.cxx:600
 AliGRPObject.cxx:601
 AliGRPObject.cxx:602
 AliGRPObject.cxx:603
 AliGRPObject.cxx:604
 AliGRPObject.cxx:605
 AliGRPObject.cxx:606
 AliGRPObject.cxx:607
 AliGRPObject.cxx:608
 AliGRPObject.cxx:609
 AliGRPObject.cxx:610
 AliGRPObject.cxx:611
 AliGRPObject.cxx:612
 AliGRPObject.cxx:613
 AliGRPObject.cxx:614
 AliGRPObject.cxx:615
 AliGRPObject.cxx:616
 AliGRPObject.cxx:617
 AliGRPObject.cxx:618
 AliGRPObject.cxx:619
 AliGRPObject.cxx:620
 AliGRPObject.cxx:621
 AliGRPObject.cxx:622
 AliGRPObject.cxx:623
 AliGRPObject.cxx:624
 AliGRPObject.cxx:625
 AliGRPObject.cxx:626
 AliGRPObject.cxx:627
 AliGRPObject.cxx:628
 AliGRPObject.cxx:629
 AliGRPObject.cxx:630
 AliGRPObject.cxx:631
 AliGRPObject.cxx:632
 AliGRPObject.cxx:633
 AliGRPObject.cxx:634
 AliGRPObject.cxx:635
 AliGRPObject.cxx:636
 AliGRPObject.cxx:637
 AliGRPObject.cxx:638
 AliGRPObject.cxx:639
 AliGRPObject.cxx:640
 AliGRPObject.cxx:641
 AliGRPObject.cxx:642
 AliGRPObject.cxx:643
 AliGRPObject.cxx:644
 AliGRPObject.cxx:645