#include <THashTable.h>
#include <TGeoGlobalMagField.h>
#include "AliGRPManager.h"
#include "AliLog.h"
#include "AliRunInfo.h"
#include "AliGRPObject.h"
#include "AliCDBManager.h"
#include "AliCDBEntry.h"
#include "AliMagF.h"
ClassImp(AliGRPManager)
AliGRPManager::AliGRPManager() :
TObject(),
fGRPData(NULL)
{
}
AliGRPManager::~AliGRPManager()
{
if (fGRPData) delete fGRPData;
}
Bool_t AliGRPManager::ReadGRPEntry()
{
AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/Data");
if (entry) {
TMap* m = dynamic_cast<TMap*>(entry->GetObject());
if (m) {
AliInfo("Found a TMap in GRP/GRP/Data, converting it into an AliGRPObject");
m->Print();
fGRPData = new AliGRPObject();
fGRPData->ReadValuesFromMap(m);
}
else {
AliInfo("Found an AliGRPObject in GRP/GRP/Data, reading it");
fGRPData = dynamic_cast<AliGRPObject*>(entry->GetObject());
entry->SetOwner(0);
}
AliCDBManager::Instance()->UnloadFromCache("GRP/GRP/Data");
}
if (!fGRPData) {
AliError("No GRP entry found in OCDB!");
return kFALSE;
}
return kTRUE;
}
Bool_t AliGRPManager::SetMagField()
{
if ( TGeoGlobalMagField::Instance()->IsLocked() ) {
if (TGeoGlobalMagField::Instance()->GetField()->TestBit(AliMagF::kOverrideGRP)) {
AliInfo("ExpertMode!!! GRP information will be ignored !");
AliInfo("ExpertMode!!! Running with the externally locked B field !");
return kTRUE;
}
else {
AliInfo("Destroying existing B field instance!");
delete TGeoGlobalMagField::Instance();
}
}
if (!fGRPData) {
AliError("GRP Data is not loaded");
return kFALSE;
}
Bool_t ok = kTRUE;
Float_t l3Current = fGRPData->GetL3Current((AliGRPObject::Stats)0);
if (l3Current == AliGRPObject::GetInvalidFloat()) {
AliError("GRP/GRP/Data entry: missing value for the L3 current !");
ok = kFALSE;
}
Char_t l3Polarity = fGRPData->GetL3Polarity();
if (l3Polarity == AliGRPObject::GetInvalidChar()) {
AliError("GRP/GRP/Data entry: missing value for the L3 polarity !");
ok = kFALSE;
}
Float_t diCurrent = fGRPData->GetDipoleCurrent((AliGRPObject::Stats)0);
if (diCurrent == AliGRPObject::GetInvalidFloat()) {
AliError("GRP/GRP/Data entry: missing value for the dipole current !");
ok = kFALSE;
}
Char_t diPolarity = fGRPData->GetDipolePolarity();
if (diPolarity == AliGRPObject::GetInvalidChar()) {
AliError("GRP/GRP/Data entry: missing value for the dipole polarity !");
ok = kFALSE;
}
TString beamType = fGRPData->GetBeamType();
if (beamType==AliGRPObject::GetInvalidString()) {
AliError("GRP/GRP/Data entry: missing value for the beam type ! Using UNKNOWN");
beamType = "UNKNOWN";
}
Float_t beamEnergy = fGRPData->GetBeamEnergy();
if (beamEnergy==AliGRPObject::GetInvalidFloat()) {
AliError("GRP/GRP/Data entry: missing value for the beam energy ! Using 0");
beamEnergy = 0;
}
Int_t polConvention = fGRPData->IsPolarityConventionLHC() ? AliMagF::kConvLHC : AliMagF::kConvDCS2008;
Bool_t uniformB = fGRPData->IsUniformBMap();
if (ok) {
AliMagF* fld = AliMagF::CreateFieldMap(TMath::Abs(l3Current) * (l3Polarity ? -1:1),
TMath::Abs(diCurrent) * (diPolarity ? -1:1),
polConvention,uniformB,beamEnergy, beamType.Data());
if (fld) {
TGeoGlobalMagField::Instance()->SetField( fld );
TGeoGlobalMagField::Instance()->Lock();
AliInfo("Running with the B field constructed out of GRP !");
}
else {
AliError("Failed to create a B field map !");
ok = kFALSE;
}
}
else {
AliError("B field is neither set nor constructed from GRP ! Exitig...");
}
return ok;
}
AliRunInfo* AliGRPManager::GetRunInfo()
{
if(!fGRPData) ReadGRPEntry();
TString lhcState = fGRPData->GetLHCState();
if (lhcState==AliGRPObject::GetInvalidString()) {
AliError("GRP/GRP/Data entry: missing value for the LHC state ! Using UNKNOWN");
lhcState = "UNKNOWN";
}
TString beamType = fGRPData->GetBeamType();
if (beamType==AliGRPObject::GetInvalidString()) {
AliError("GRP/GRP/Data entry: missing value for the beam type ! Using UNKNOWN");
beamType = "UNKNOWN";
}
Float_t beamEnergy = fGRPData->GetBeamEnergy();
if (beamEnergy==AliGRPObject::GetInvalidFloat()) {
AliError("GRP/GRP/Data entry: missing value for the beam energy ! Using 0");
beamEnergy = 0;
}
beamEnergy /= 120E3;
TString runType = fGRPData->GetRunType();
if (runType==AliGRPObject::GetInvalidString()) {
AliError("GRP/GRP/Data entry: missing value for the run type ! Using UNKNOWN");
runType = "UNKNOWN";
}
Int_t activeDetectors = fGRPData->GetDetectorMask();
if (activeDetectors==AliGRPObject::GetInvalidUInt()) {
AliError("GRP/GRP/Data entry: missing value for the detector mask ! Using 1074790399");
activeDetectors = 1074790399;
}
return new AliRunInfo(lhcState, beamType, beamEnergy, runType, activeDetectors);
}
THashTable* AliGRPManager::GetCosmicTriggers()
{
THashTable* listOfCosmicTriggers = 0;
AliCDBEntry* entry = 0;
entry = AliCDBManager::Instance()->Get("GRP/Calib/CosmicTriggers");
if (entry) {
listOfCosmicTriggers = dynamic_cast<THashTable*>(entry->GetObject());
entry->SetOwner(0);
}
if (!listOfCosmicTriggers) {
AliWarning("Can not get list of cosmic triggers from OCDB! Cosmic event specie will be effectively disabled!");
}
return listOfCosmicTriggers;
}
void AliGRPManager::SetGRPEntry(const AliGRPObject* source)
{
if (!source) return;
if (fGRPData) delete fGRPData;
fGRPData = new AliGRPObject(*source);
AliInfo("Created GRP Data from external object");
}