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

////////////////////////////////////////////////////////////////////////////
//                                                                        //
// AliGRPManager class                                                    //
// The class can be used in order to access and read the Global Run       //
// Parameters entry from OCDB.                                            //
// It has a methods to set the magnetic field instanton and return        //
// the run and event info objects.                                        //
//                                                                        //
// cvetan.cheshkov@cern.ch 15/06/2009                                     //
//                                                                        //
// Usage:                                                                 //
// AliGRPManager grpMan;                                                  //
// Bool_t status = kTRUE;                                                 //
// status = grpMan.ReadGRPEntry(); // Read the corresponding OCDB entry   //
// status = grpMan.SetMagField();  // Set global field instanton          //
// AliRunInfo *runInfo = grpMan.GetRunInfo();// Get instance of run info  //
//                                                                        //
// Note: CDB manager should be initialized beforehand                     //
////////////////////////////////////////////////////////////////////////////

#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)
{
  // Default constructor
}

//_____________________________________________________________________________
AliGRPManager::~AliGRPManager()
{
  // Destructor
  if (fGRPData) delete fGRPData;
}

//_____________________________________________________________________________
Bool_t AliGRPManager::ReadGRPEntry()
{
  //------------------------------------
  // Initialization of the GRP entry. 
  // Returns kTRUE in case of success.
  //------------------------------------

  AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/Data");

  if (entry) {

    TMap* m = dynamic_cast<TMap*>(entry->GetObject());  // old GRP entry

    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());  // new GRP entry
       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()
{
  // Dealing with the magnetic field map
  // Construct the mag field map from the data in GRP
  // Set the global mag field instance

  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;
  }
  //
  // Construct the field map out of the information retrieved from GRP.
  Bool_t ok = kTRUE;
  // L3
  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;
  }
  
  // Dipole
  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";
    //ok = kFALSE;  // temprorary suppressed to make read cosmics data
  }
  
  Float_t beamEnergy = fGRPData->GetBeamEnergy();
  if (beamEnergy==AliGRPObject::GetInvalidFloat()) {
    AliError("GRP/GRP/Data entry:  missing value for the beam energy ! Using 0");
    beamEnergy = 0;
    //ok = kFALSE;  // temprorary suppressed to make read cosmics data
  }
  
  // read special bits for the polarity convention and map type
  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()
{
  // Constructs and returns an object
  // containing the run information
  // The user code is the owner of the object
  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;
  }
  // energy is provided in MeV*120
  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)
{
  // Create a GRP entry from the extrnaly provide GRP object
  // To be used by HLT to create an online GRP instance
  if (!source) return;
  if (fGRPData) delete fGRPData;
  fGRPData = new AliGRPObject(*source);
  AliInfo("Created GRP Data from external object");
  //
}
 
 AliGRPManager.cxx:1
 AliGRPManager.cxx:2
 AliGRPManager.cxx:3
 AliGRPManager.cxx:4
 AliGRPManager.cxx:5
 AliGRPManager.cxx:6
 AliGRPManager.cxx:7
 AliGRPManager.cxx:8
 AliGRPManager.cxx:9
 AliGRPManager.cxx:10
 AliGRPManager.cxx:11
 AliGRPManager.cxx:12
 AliGRPManager.cxx:13
 AliGRPManager.cxx:14
 AliGRPManager.cxx:15
 AliGRPManager.cxx:16
 AliGRPManager.cxx:17
 AliGRPManager.cxx:18
 AliGRPManager.cxx:19
 AliGRPManager.cxx:20
 AliGRPManager.cxx:21
 AliGRPManager.cxx:22
 AliGRPManager.cxx:23
 AliGRPManager.cxx:24
 AliGRPManager.cxx:25
 AliGRPManager.cxx:26
 AliGRPManager.cxx:27
 AliGRPManager.cxx:28
 AliGRPManager.cxx:29
 AliGRPManager.cxx:30
 AliGRPManager.cxx:31
 AliGRPManager.cxx:32
 AliGRPManager.cxx:33
 AliGRPManager.cxx:34
 AliGRPManager.cxx:35
 AliGRPManager.cxx:36
 AliGRPManager.cxx:37
 AliGRPManager.cxx:38
 AliGRPManager.cxx:39
 AliGRPManager.cxx:40
 AliGRPManager.cxx:41
 AliGRPManager.cxx:42
 AliGRPManager.cxx:43
 AliGRPManager.cxx:44
 AliGRPManager.cxx:45
 AliGRPManager.cxx:46
 AliGRPManager.cxx:47
 AliGRPManager.cxx:48
 AliGRPManager.cxx:49
 AliGRPManager.cxx:50
 AliGRPManager.cxx:51
 AliGRPManager.cxx:52
 AliGRPManager.cxx:53
 AliGRPManager.cxx:54
 AliGRPManager.cxx:55
 AliGRPManager.cxx:56
 AliGRPManager.cxx:57
 AliGRPManager.cxx:58
 AliGRPManager.cxx:59
 AliGRPManager.cxx:60
 AliGRPManager.cxx:61
 AliGRPManager.cxx:62
 AliGRPManager.cxx:63
 AliGRPManager.cxx:64
 AliGRPManager.cxx:65
 AliGRPManager.cxx:66
 AliGRPManager.cxx:67
 AliGRPManager.cxx:68
 AliGRPManager.cxx:69
 AliGRPManager.cxx:70
 AliGRPManager.cxx:71
 AliGRPManager.cxx:72
 AliGRPManager.cxx:73
 AliGRPManager.cxx:74
 AliGRPManager.cxx:75
 AliGRPManager.cxx:76
 AliGRPManager.cxx:77
 AliGRPManager.cxx:78
 AliGRPManager.cxx:79
 AliGRPManager.cxx:80
 AliGRPManager.cxx:81
 AliGRPManager.cxx:82
 AliGRPManager.cxx:83
 AliGRPManager.cxx:84
 AliGRPManager.cxx:85
 AliGRPManager.cxx:86
 AliGRPManager.cxx:87
 AliGRPManager.cxx:88
 AliGRPManager.cxx:89
 AliGRPManager.cxx:90
 AliGRPManager.cxx:91
 AliGRPManager.cxx:92
 AliGRPManager.cxx:93
 AliGRPManager.cxx:94
 AliGRPManager.cxx:95
 AliGRPManager.cxx:96
 AliGRPManager.cxx:97
 AliGRPManager.cxx:98
 AliGRPManager.cxx:99
 AliGRPManager.cxx:100
 AliGRPManager.cxx:101
 AliGRPManager.cxx:102
 AliGRPManager.cxx:103
 AliGRPManager.cxx:104
 AliGRPManager.cxx:105
 AliGRPManager.cxx:106
 AliGRPManager.cxx:107
 AliGRPManager.cxx:108
 AliGRPManager.cxx:109
 AliGRPManager.cxx:110
 AliGRPManager.cxx:111
 AliGRPManager.cxx:112
 AliGRPManager.cxx:113
 AliGRPManager.cxx:114
 AliGRPManager.cxx:115
 AliGRPManager.cxx:116
 AliGRPManager.cxx:117
 AliGRPManager.cxx:118
 AliGRPManager.cxx:119
 AliGRPManager.cxx:120
 AliGRPManager.cxx:121
 AliGRPManager.cxx:122
 AliGRPManager.cxx:123
 AliGRPManager.cxx:124
 AliGRPManager.cxx:125
 AliGRPManager.cxx:126
 AliGRPManager.cxx:127
 AliGRPManager.cxx:128
 AliGRPManager.cxx:129
 AliGRPManager.cxx:130
 AliGRPManager.cxx:131
 AliGRPManager.cxx:132
 AliGRPManager.cxx:133
 AliGRPManager.cxx:134
 AliGRPManager.cxx:135
 AliGRPManager.cxx:136
 AliGRPManager.cxx:137
 AliGRPManager.cxx:138
 AliGRPManager.cxx:139
 AliGRPManager.cxx:140
 AliGRPManager.cxx:141
 AliGRPManager.cxx:142
 AliGRPManager.cxx:143
 AliGRPManager.cxx:144
 AliGRPManager.cxx:145
 AliGRPManager.cxx:146
 AliGRPManager.cxx:147
 AliGRPManager.cxx:148
 AliGRPManager.cxx:149
 AliGRPManager.cxx:150
 AliGRPManager.cxx:151
 AliGRPManager.cxx:152
 AliGRPManager.cxx:153
 AliGRPManager.cxx:154
 AliGRPManager.cxx:155
 AliGRPManager.cxx:156
 AliGRPManager.cxx:157
 AliGRPManager.cxx:158
 AliGRPManager.cxx:159
 AliGRPManager.cxx:160
 AliGRPManager.cxx:161
 AliGRPManager.cxx:162
 AliGRPManager.cxx:163
 AliGRPManager.cxx:164
 AliGRPManager.cxx:165
 AliGRPManager.cxx:166
 AliGRPManager.cxx:167
 AliGRPManager.cxx:168
 AliGRPManager.cxx:169
 AliGRPManager.cxx:170
 AliGRPManager.cxx:171
 AliGRPManager.cxx:172
 AliGRPManager.cxx:173
 AliGRPManager.cxx:174
 AliGRPManager.cxx:175
 AliGRPManager.cxx:176
 AliGRPManager.cxx:177
 AliGRPManager.cxx:178
 AliGRPManager.cxx:179
 AliGRPManager.cxx:180
 AliGRPManager.cxx:181
 AliGRPManager.cxx:182
 AliGRPManager.cxx:183
 AliGRPManager.cxx:184
 AliGRPManager.cxx:185
 AliGRPManager.cxx:186
 AliGRPManager.cxx:187
 AliGRPManager.cxx:188
 AliGRPManager.cxx:189
 AliGRPManager.cxx:190
 AliGRPManager.cxx:191
 AliGRPManager.cxx:192
 AliGRPManager.cxx:193
 AliGRPManager.cxx:194
 AliGRPManager.cxx:195
 AliGRPManager.cxx:196
 AliGRPManager.cxx:197
 AliGRPManager.cxx:198
 AliGRPManager.cxx:199
 AliGRPManager.cxx:200
 AliGRPManager.cxx:201
 AliGRPManager.cxx:202
 AliGRPManager.cxx:203
 AliGRPManager.cxx:204
 AliGRPManager.cxx:205
 AliGRPManager.cxx:206
 AliGRPManager.cxx:207
 AliGRPManager.cxx:208
 AliGRPManager.cxx:209
 AliGRPManager.cxx:210
 AliGRPManager.cxx:211
 AliGRPManager.cxx:212
 AliGRPManager.cxx:213
 AliGRPManager.cxx:214
 AliGRPManager.cxx:215
 AliGRPManager.cxx:216
 AliGRPManager.cxx:217
 AliGRPManager.cxx:218
 AliGRPManager.cxx:219
 AliGRPManager.cxx:220
 AliGRPManager.cxx:221
 AliGRPManager.cxx:222
 AliGRPManager.cxx:223
 AliGRPManager.cxx:224
 AliGRPManager.cxx:225
 AliGRPManager.cxx:226
 AliGRPManager.cxx:227
 AliGRPManager.cxx:228
 AliGRPManager.cxx:229
 AliGRPManager.cxx:230
 AliGRPManager.cxx:231
 AliGRPManager.cxx:232
 AliGRPManager.cxx:233
 AliGRPManager.cxx:234
 AliGRPManager.cxx:235
 AliGRPManager.cxx:236
 AliGRPManager.cxx:237
 AliGRPManager.cxx:238
 AliGRPManager.cxx:239
 AliGRPManager.cxx:240
 AliGRPManager.cxx:241
 AliGRPManager.cxx:242
 AliGRPManager.cxx:243
 AliGRPManager.cxx:244
 AliGRPManager.cxx:245
 AliGRPManager.cxx:246
 AliGRPManager.cxx:247
 AliGRPManager.cxx:248
 AliGRPManager.cxx:249
 AliGRPManager.cxx:250
 AliGRPManager.cxx:251
 AliGRPManager.cxx:252
 AliGRPManager.cxx:253
 AliGRPManager.cxx:254
 AliGRPManager.cxx:255
 AliGRPManager.cxx:256
 AliGRPManager.cxx:257
 AliGRPManager.cxx:258
 AliGRPManager.cxx:259
 AliGRPManager.cxx:260
 AliGRPManager.cxx:261
 AliGRPManager.cxx:262
 AliGRPManager.cxx:263
 AliGRPManager.cxx:264
 AliGRPManager.cxx:265
 AliGRPManager.cxx:266