ROOT logo
/**************************************************************************
 * This file is property of and copyright by the ALICE HLT Project        *
 * All rights reserved.                                                   *
 *                                                                        *
 * Primary Authors:                                                       *
 *   Artur Szostak <artursz@iafrica.com>                                  *
 *                                                                        *
 * 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: DisplaydHLTData.C 37070 2009-11-20 13:53:08Z aszostak $

/**
 * \ingroup macros
 * \file CreateCDBFieldIntegrals.C
 * \brief Macro for creating and storing the magnetic field integrals in the CDB.
 *
 * This macro calculates the magnetic field integrals for the dipole magnet and
 * writes them into the CDB under the HLT/ConfigMUON/FieldIntegrals path.
 * These are then used by the online dHLT reconstruction components during
 * momentum estimation of the tracks found.
 * The simplest method to run this macro is with the following command:
 * \code
 *   > aliroot -b -q -l CreateCDBFieldIntegrals.C
 * \endcode
 *
 * \author Artur Szostak <artursz@iafrica.com>
 */

#if !defined(__CINT__) || defined(__MAKECINT__)
#include "AliCDBManager.h"
#include "AliCDBStorage.h"
#include "AliCDBEntry.h"
#include "AliGRPManager.h"
#include "AliHLTMUONConstants.h"
#include "AliMagF.h"
#include "TMap.h"
#include "TArrayD.h"
#include "TObjString.h"
#include "TString.h"
#include "TVector3.h"
#include "TMath.h"
#include "TSystem.h"
#include <iostream>
using std::cout;
using std::cerr;
using std::endl;
#endif

/**
 * Calculates the average magnetic field integral for the dipole magnet given the
 * L3 solenoid current and dipole magnet current.
 * \param [in] currentL3  The current in the L3 solenoid magnet.
 * \param [in] currentDip  The current in the dipole magnet.
 * \param [out] result  The magnetic field integral result.
 * \param [in] sqrts  The centre of mass energy for the beams.
 * \param [in] beamtype  The beam type as given the AliMagF, eg. p-p, A-A or none.
 * \note The sign of the current indicates the polarity setting for the magnet.
 * \returns  true if the magnetic field was calculated successfully and false otherwise.
 */
bool CalculateIntegral(
		Float_t currentL3, Float_t currentDip, Float_t& result,
		Float_t sqrts = 0, const char* beamtype = "none"
	)
{
	AliMagF* fld = AliMagF::CreateFieldMap(currentL3, currentDip, AliMagF::kConvLHC, kFALSE, sqrts, beamtype);
	if (fld == NULL) return false;
	
	TArrayD totals;
	for (int theta = 171; theta <= 179; ++theta)
	for (int phi = 0; phi < 360; phi += 10)
	{
		TVector3 dr;
		dr.SetMagThetaPhi(1, theta*TMath::Pi()/180., phi*TMath::Pi()/180.);
		Double_t dx = 1e-3 * dr.Mag();
		
		TVector3 r(0, 0, 0);
		int nsteps = 0;
		Double_t total = 0;
		while (r.Z() > -1700 && nsteps < 10000)
		{
			Double_t p[3] = {r.X(), r.Y(), r.Z()};
			Double_t b[3];
			fld->Field(p, b);
			total += b[0] * dx;
			++nsteps;
			r += dr;
		}
		
		totals.Set(totals.GetSize()+1);
		totals[totals.GetSize()-1] = total;
	}
	
	result = - TMath::Mean(totals.GetSize(), totals.GetArray());
	Float_t rms = TMath::RMS(totals.GetSize(), totals.GetArray());
	
	cout << "Integrated field value = " << result
		<< " +/- " << rms
		<< ", for L3 current = " << currentL3
		<< ", dipole current = " << currentDip << endl;
	return true;
}

/**
 * Calculates the magnetic field integrals for the dipole magnet and stores them
 * into the CDB.
 * \param cdbPath  The path to the local storage.
 * \param version  The version of the CDB entry.
 * \param firstRun = The first run number for which the CDB entry is valid.
 * \param lastRun = The last run number for which the CDB entry is valid.
 * \param sqrts  The centre of mass energy for the beams.
 * \param beamtype  The beam type as given the AliMagF, eg. p-p, A-A or none.
 */
void CreateCDBFieldIntegrals(
		const char* cdbPath = "local://$ALICE_ROOT/OCDB",
		Int_t version = 0,
		Int_t firstRun = 0,
		Int_t lastRun = AliCDBRunRange::Infinity(),
		Float_t sqrts = 0,
		const char* beamtype = "none"
	)
{
	// Get the CDB manager and storage.
	AliCDBManager* cdbManager = AliCDBManager::Instance();
	if (cdbManager == NULL)
	{
		cerr << "ERROR: Global CDB manager object does not exist." << endl;
		return;
	}
	AliCDBStorage* storage = cdbManager->GetStorage(cdbPath);
	if (storage == NULL)
	{
		cerr << "ERROR: Could not get storage for: " << cdbPath << endl;
		return;
	}
	
	const int nL3Current = 5;
	const int nDipCurrent = 3;
	Float_t currentL3[nL3Current] = {-30e3, -12e3, 0, 12e3, 30e3};
	Float_t currentDip[nDipCurrent] = {-6e3, 0, 6e3};
	
	// Create and store the configuration parameters for the trigger reconstructor.
	TMap* params = new TMap;
	params->SetOwner(kTRUE);
	for (int i = 0; i < nL3Current; ++i)
	for (int j = 0; j < nDipCurrent; ++j)
	{
		if (currentL3[i]*currentDip[j] < 0) continue; // Skip invalid combinations.
		Float_t bfieldintegral;
		if (! CalculateIntegral(currentL3[i], currentDip[j], bfieldintegral, sqrts, beamtype)) continue;
		const char* paramName = Form("L3_current=%0.2e;Dipole_current=%0.2e", currentL3[i], currentDip[j]);
		const char* paramValue = Form("%8.8f", bfieldintegral);
		params->Add(new TObjString(paramName), new TObjString(paramValue));
	}
	
	const char* path = AliHLTMUONConstants::FieldIntegralsCDBPath();
	AliCDBId id(path, firstRun, lastRun, version);
	AliCDBMetaData* metaData = new AliCDBMetaData();
	metaData->SetResponsible("dimuon HLT");
	metaData->SetComment("Magnetic field integral parameters for dimuon HLT.");
	storage->Put(params, id, metaData);
}
 CreateCDBFieldIntegrals.C:1
 CreateCDBFieldIntegrals.C:2
 CreateCDBFieldIntegrals.C:3
 CreateCDBFieldIntegrals.C:4
 CreateCDBFieldIntegrals.C:5
 CreateCDBFieldIntegrals.C:6
 CreateCDBFieldIntegrals.C:7
 CreateCDBFieldIntegrals.C:8
 CreateCDBFieldIntegrals.C:9
 CreateCDBFieldIntegrals.C:10
 CreateCDBFieldIntegrals.C:11
 CreateCDBFieldIntegrals.C:12
 CreateCDBFieldIntegrals.C:13
 CreateCDBFieldIntegrals.C:14
 CreateCDBFieldIntegrals.C:15
 CreateCDBFieldIntegrals.C:16
 CreateCDBFieldIntegrals.C:17
 CreateCDBFieldIntegrals.C:18
 CreateCDBFieldIntegrals.C:19
 CreateCDBFieldIntegrals.C:20
 CreateCDBFieldIntegrals.C:21
 CreateCDBFieldIntegrals.C:22
 CreateCDBFieldIntegrals.C:23
 CreateCDBFieldIntegrals.C:24
 CreateCDBFieldIntegrals.C:25
 CreateCDBFieldIntegrals.C:26
 CreateCDBFieldIntegrals.C:27
 CreateCDBFieldIntegrals.C:28
 CreateCDBFieldIntegrals.C:29
 CreateCDBFieldIntegrals.C:30
 CreateCDBFieldIntegrals.C:31
 CreateCDBFieldIntegrals.C:32
 CreateCDBFieldIntegrals.C:33
 CreateCDBFieldIntegrals.C:34
 CreateCDBFieldIntegrals.C:35
 CreateCDBFieldIntegrals.C:36
 CreateCDBFieldIntegrals.C:37
 CreateCDBFieldIntegrals.C:38
 CreateCDBFieldIntegrals.C:39
 CreateCDBFieldIntegrals.C:40
 CreateCDBFieldIntegrals.C:41
 CreateCDBFieldIntegrals.C:42
 CreateCDBFieldIntegrals.C:43
 CreateCDBFieldIntegrals.C:44
 CreateCDBFieldIntegrals.C:45
 CreateCDBFieldIntegrals.C:46
 CreateCDBFieldIntegrals.C:47
 CreateCDBFieldIntegrals.C:48
 CreateCDBFieldIntegrals.C:49
 CreateCDBFieldIntegrals.C:50
 CreateCDBFieldIntegrals.C:51
 CreateCDBFieldIntegrals.C:52
 CreateCDBFieldIntegrals.C:53
 CreateCDBFieldIntegrals.C:54
 CreateCDBFieldIntegrals.C:55
 CreateCDBFieldIntegrals.C:56
 CreateCDBFieldIntegrals.C:57
 CreateCDBFieldIntegrals.C:58
 CreateCDBFieldIntegrals.C:59
 CreateCDBFieldIntegrals.C:60
 CreateCDBFieldIntegrals.C:61
 CreateCDBFieldIntegrals.C:62
 CreateCDBFieldIntegrals.C:63
 CreateCDBFieldIntegrals.C:64
 CreateCDBFieldIntegrals.C:65
 CreateCDBFieldIntegrals.C:66
 CreateCDBFieldIntegrals.C:67
 CreateCDBFieldIntegrals.C:68
 CreateCDBFieldIntegrals.C:69
 CreateCDBFieldIntegrals.C:70
 CreateCDBFieldIntegrals.C:71
 CreateCDBFieldIntegrals.C:72
 CreateCDBFieldIntegrals.C:73
 CreateCDBFieldIntegrals.C:74
 CreateCDBFieldIntegrals.C:75
 CreateCDBFieldIntegrals.C:76
 CreateCDBFieldIntegrals.C:77
 CreateCDBFieldIntegrals.C:78
 CreateCDBFieldIntegrals.C:79
 CreateCDBFieldIntegrals.C:80
 CreateCDBFieldIntegrals.C:81
 CreateCDBFieldIntegrals.C:82
 CreateCDBFieldIntegrals.C:83
 CreateCDBFieldIntegrals.C:84
 CreateCDBFieldIntegrals.C:85
 CreateCDBFieldIntegrals.C:86
 CreateCDBFieldIntegrals.C:87
 CreateCDBFieldIntegrals.C:88
 CreateCDBFieldIntegrals.C:89
 CreateCDBFieldIntegrals.C:90
 CreateCDBFieldIntegrals.C:91
 CreateCDBFieldIntegrals.C:92
 CreateCDBFieldIntegrals.C:93
 CreateCDBFieldIntegrals.C:94
 CreateCDBFieldIntegrals.C:95
 CreateCDBFieldIntegrals.C:96
 CreateCDBFieldIntegrals.C:97
 CreateCDBFieldIntegrals.C:98
 CreateCDBFieldIntegrals.C:99
 CreateCDBFieldIntegrals.C:100
 CreateCDBFieldIntegrals.C:101
 CreateCDBFieldIntegrals.C:102
 CreateCDBFieldIntegrals.C:103
 CreateCDBFieldIntegrals.C:104
 CreateCDBFieldIntegrals.C:105
 CreateCDBFieldIntegrals.C:106
 CreateCDBFieldIntegrals.C:107
 CreateCDBFieldIntegrals.C:108
 CreateCDBFieldIntegrals.C:109
 CreateCDBFieldIntegrals.C:110
 CreateCDBFieldIntegrals.C:111
 CreateCDBFieldIntegrals.C:112
 CreateCDBFieldIntegrals.C:113
 CreateCDBFieldIntegrals.C:114
 CreateCDBFieldIntegrals.C:115
 CreateCDBFieldIntegrals.C:116
 CreateCDBFieldIntegrals.C:117
 CreateCDBFieldIntegrals.C:118
 CreateCDBFieldIntegrals.C:119
 CreateCDBFieldIntegrals.C:120
 CreateCDBFieldIntegrals.C:121
 CreateCDBFieldIntegrals.C:122
 CreateCDBFieldIntegrals.C:123
 CreateCDBFieldIntegrals.C:124
 CreateCDBFieldIntegrals.C:125
 CreateCDBFieldIntegrals.C:126
 CreateCDBFieldIntegrals.C:127
 CreateCDBFieldIntegrals.C:128
 CreateCDBFieldIntegrals.C:129
 CreateCDBFieldIntegrals.C:130
 CreateCDBFieldIntegrals.C:131
 CreateCDBFieldIntegrals.C:132
 CreateCDBFieldIntegrals.C:133
 CreateCDBFieldIntegrals.C:134
 CreateCDBFieldIntegrals.C:135
 CreateCDBFieldIntegrals.C:136
 CreateCDBFieldIntegrals.C:137
 CreateCDBFieldIntegrals.C:138
 CreateCDBFieldIntegrals.C:139
 CreateCDBFieldIntegrals.C:140
 CreateCDBFieldIntegrals.C:141
 CreateCDBFieldIntegrals.C:142
 CreateCDBFieldIntegrals.C:143
 CreateCDBFieldIntegrals.C:144
 CreateCDBFieldIntegrals.C:145
 CreateCDBFieldIntegrals.C:146
 CreateCDBFieldIntegrals.C:147
 CreateCDBFieldIntegrals.C:148
 CreateCDBFieldIntegrals.C:149
 CreateCDBFieldIntegrals.C:150
 CreateCDBFieldIntegrals.C:151
 CreateCDBFieldIntegrals.C:152
 CreateCDBFieldIntegrals.C:153
 CreateCDBFieldIntegrals.C:154
 CreateCDBFieldIntegrals.C:155
 CreateCDBFieldIntegrals.C:156
 CreateCDBFieldIntegrals.C:157
 CreateCDBFieldIntegrals.C:158
 CreateCDBFieldIntegrals.C:159
 CreateCDBFieldIntegrals.C:160
 CreateCDBFieldIntegrals.C:161
 CreateCDBFieldIntegrals.C:162
 CreateCDBFieldIntegrals.C:163
 CreateCDBFieldIntegrals.C:164
 CreateCDBFieldIntegrals.C:165
 CreateCDBFieldIntegrals.C:166
 CreateCDBFieldIntegrals.C:167
 CreateCDBFieldIntegrals.C:168
 CreateCDBFieldIntegrals.C:169