Skip to content

Commit dc0031b

Browse files
authored
read magnetic field from CCDB (#245)
1 parent 318da54 commit dc0031b

File tree

2 files changed

+42
-28
lines changed

2 files changed

+42
-28
lines changed

PWGCF/Core/PairCuts.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class PairCuts
6161
bool conversionCuts(T const& track1, T const& track2);
6262

6363
template <typename T>
64-
bool twoTrackCut(T const& track1, T const& track2, int bSign);
64+
bool twoTrackCut(T const& track1, T const& track2, float magField);
6565

6666
protected:
6767
float mCuts[ParticlesLastEntry] = {-1};
@@ -80,7 +80,7 @@ class PairCuts
8080
double getInvMassSquaredFast(T const& track1, double m0_1, T const& track2, double m0_2);
8181

8282
template <typename T>
83-
float getDPhiStar(T const& track1, T const& track2, float radius, float bSign);
83+
float getDPhiStar(T const& track1, T const& track2, float radius, float magField);
8484
};
8585

8686
template <typename T>
@@ -109,28 +109,28 @@ bool PairCuts::conversionCuts(T const& track1, T const& track2)
109109
}
110110

111111
template <typename T>
112-
bool PairCuts::twoTrackCut(T const& track1, T const& track2, int bSign)
112+
bool PairCuts::twoTrackCut(T const& track1, T const& track2, float magField)
113113
{
114114
// the variables & cut have been developed in Run 1 by the CF - HBT group
115115
//
116116
// Parameters:
117-
// bSign: sign of B field
117+
// magField: B field in kG
118118

119119
auto deta = track1.eta() - track2.eta();
120120

121121
// optimization
122122
if (std::fabs(deta) < mTwoTrackDistance * 2.5 * 3) {
123123
// check first boundaries to see if is worth to loop and find the minimum
124-
float dphistar1 = getDPhiStar(track1, track2, mTwoTrackRadius, bSign);
125-
float dphistar2 = getDPhiStar(track1, track2, 2.5, bSign);
124+
float dphistar1 = getDPhiStar(track1, track2, mTwoTrackRadius, magField);
125+
float dphistar2 = getDPhiStar(track1, track2, 2.5, magField);
126126

127127
const float kLimit = mTwoTrackDistance * 3;
128128

129129
if (std::fabs(dphistar1) < kLimit || std::fabs(dphistar2) < kLimit || dphistar1 * dphistar2 < 0) {
130130
float dphistarminabs = 1e5;
131131
float dphistarmin = 1e5;
132132
for (Double_t rad = mTwoTrackRadius; rad < 2.51; rad += 0.01) {
133-
float dphistar = getDPhiStar(track1, track2, rad, bSign);
133+
float dphistar = getDPhiStar(track1, track2, rad, magField);
134134

135135
float dphistarabs = std::fabs(dphistar);
136136

@@ -145,7 +145,7 @@ bool PairCuts::twoTrackCut(T const& track1, T const& track2, int bSign)
145145
}
146146

147147
if (dphistarminabs < mTwoTrackDistance && std::fabs(deta) < mTwoTrackDistance) {
148-
//LOGF(debug, "Removed track pair %ld %ld with %f %f %f %f %d %f %f %d %d", track1.index(), track2.index(), deta, dphistarminabs, track1.phi2(), track1.pt(), track1.sign(), track2.phi2(), track2.pt(), track2.sign(), bSign);
148+
//LOGF(debug, "Removed track pair %ld %ld with %f %f %f %f %d %f %f %d %f", track1.index(), track2.index(), deta, dphistarminabs, track1.phi2(), track1.pt(), track1.sign(), track2.phi2(), track2.pt(), track2.sign(), magField);
149149
return true;
150150
}
151151

@@ -308,7 +308,7 @@ double PairCuts::getInvMassSquaredFast(T const& track1, double m0_1, T const& tr
308308
}
309309

310310
template <typename T>
311-
float PairCuts::getDPhiStar(T const& track1, T const& track2, float radius, float bSign)
311+
float PairCuts::getDPhiStar(T const& track1, T const& track2, float radius, float magField)
312312
{
313313
//
314314
// calculates dphistar
@@ -322,7 +322,7 @@ float PairCuts::getDPhiStar(T const& track1, T const& track2, float radius, floa
322322
auto pt2 = track2.pt();
323323
auto charge2 = track2.sign();
324324

325-
float dphistar = phi1 - phi2 - charge1 * bSign * std::asin(0.075 * radius / pt1) + charge2 * bSign * std::asin(0.075 * radius / pt2);
325+
float dphistar = phi1 - phi2 - charge1 * std::asin(0.015 * magField * radius / pt1) + charge2 * std::asin(0.015 * magField * radius / pt2);
326326

327327
if (dphistar > M_PI) {
328328
dphistar = M_PI * 2 - dphistar;

PWGCF/Tasks/correlations.cxx

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "PWGCF/DataModel/CorrelationsDerived.h"
2424
#include "PWGCF/Core/CorrelationContainer.h"
2525
#include "PWGCF/Core/PairCuts.h"
26+
#include "DataFormatsParameters/GRPObject.h"
2627

2728
#include <TH1F.h>
2829
#include <cmath>
@@ -148,14 +149,30 @@ struct CorrelationTask {
148149

149150
// o2-ccdb-upload -p Users/jgrosseo/correlations/LHC15o -f /tmp/correction_2011_global.root -k correction
150151

151-
ccdb->setURL("http://ccdb-test.cern.ch:8080");
152+
ccdb->setURL("http://alice-ccdb.cern.ch");
152153
ccdb->setCaching(true);
153154
ccdb->setLocalObjectValidityChecking();
154155

155156
long now = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
156157
ccdb->setCreatedNotAfter(now); // TODO must become global parameter from the train creation time
157158
}
158159

160+
float getMagneticField(uint64_t timestamp)
161+
{
162+
// TODO done only once (and not per run). Will be replaced by CCDBConfigurable
163+
static o2::parameters::GRPObject* grpo = nullptr;
164+
if (grpo == nullptr) {
165+
grpo = ccdb->getForTimeStamp<o2::parameters::GRPObject>("GLO/GRP/GRP", timestamp);
166+
if (grpo == nullptr) {
167+
LOGF(fatal, "GRP object not found for timestamp %llu", timestamp);
168+
return 0;
169+
}
170+
LOGF(info, "Retrieved GRP for timestamp %llu with L3 current of %f", timestamp, grpo->getL3Current());
171+
}
172+
float l3current = grpo->getL3Current();
173+
return l3current / 30000.0f * 5.0f;
174+
}
175+
159176
template <typename TCollision, typename TTracks>
160177
void fillQA(TCollision collision, float centrality, TTracks tracks)
161178
{
@@ -180,7 +197,7 @@ struct CorrelationTask {
180197
}
181198

182199
template <typename TTarget, typename TTracks>
183-
void fillCorrelations(TTarget target, TTracks tracks1, TTracks tracks2, float centrality, float posZ, int bSign)
200+
void fillCorrelations(TTarget target, TTracks tracks1, TTracks tracks2, float centrality, float posZ, float magField)
184201
{
185202
// Cache efficiency for particles (too many FindBin lookups)
186203
float* efficiencyAssociated = nullptr;
@@ -228,7 +245,7 @@ struct CorrelationTask {
228245
continue;
229246
}
230247

231-
if (cfgTwoTrackCut > 0 && mPairCuts.twoTrackCut(track1, track2, bSign)) {
248+
if (cfgTwoTrackCut > 0 && mPairCuts.twoTrackCut(track1, track2, magField)) {
232249
continue;
233250
}
234251

@@ -277,38 +294,34 @@ struct CorrelationTask {
277294

278295
LOGF(info, "processSameAOD: Tracks for collision: %d | Vertex: %.1f | INT7: %d | V0M: %.1f", tracks.size(), collision.posZ(), collision.sel7(), collision.centV0M());
279296

280-
int bSign = 1; // TODO magnetic field from CCDB
281297
const auto centrality = collision.centV0M();
282298

283299
if (fillCollisionAOD(same, collision, centrality) == false) {
284300
return;
285301
}
286302
registry.fill(HIST("eventcount"), -2);
287303
fillQA(collision, centrality, tracks);
288-
fillCorrelations(same, tracks, tracks, centrality, collision.posZ(), bSign);
304+
fillCorrelations(same, tracks, tracks, centrality, collision.posZ(), getMagneticField(bc.timestamp()));
289305
}
290306
PROCESS_SWITCH(CorrelationTask, processSameAOD, "Process same event on AOD", true);
291307

292308
void processSameDerived(soa::Filtered<aod::CFCollisions>::iterator const& collision, soa::Filtered<aod::CFTracks> const& tracks)
293309
{
294310
LOGF(info, "processSameDerived: Tracks for collision: %d | Vertex: %.1f | V0M: %.1f", tracks.size(), collision.posZ(), collision.centV0M());
295311

296-
int bSign = 1; // TODO magnetic field from CCDB
297312
const auto centrality = collision.centV0M();
298313

299314
same->fillEvent(centrality, CorrelationContainer::kCFStepReconstructed);
300315
registry.fill(HIST("eventcount"), -2);
301316
fillQA(collision, centrality, tracks);
302-
fillCorrelations(same, tracks, tracks, centrality, collision.posZ(), bSign);
317+
fillCorrelations(same, tracks, tracks, centrality, collision.posZ(), getMagneticField(collision.timestamp()));
303318
}
304319
PROCESS_SWITCH(CorrelationTask, processSameDerived, "Process same event on derived data", false);
305320

306-
void processMixedAOD(soa::Filtered<soa::Join<aod::Collisions, aod::Hashes, aod::EvSels, aod::CentV0Ms>>& collisions, aodTracks const& tracks)
321+
void processMixedAOD(soa::Filtered<soa::Join<aod::Collisions, aod::Hashes, aod::EvSels, aod::CentV0Ms>>& collisions, aodTracks const& tracks, aod::BCsWithTimestamps const&)
307322
{
308323
// TODO loading of efficiency histogram missing here, because it will happen somehow in the CCDBConfigurable
309324

310-
int bSign = 1; // TODO magnetic field from CCDB
311-
312325
collisions.bindExternalIndices(&tracks);
313326
auto tracksTuple = std::make_tuple(tracks);
314327
AnalysisDataProcessorBuilder::GroupSlicer slicer(collisions, tracksTuple);
@@ -345,10 +358,12 @@ struct CorrelationTask {
345358
auto tracks2 = std::get<aodTracks>(it2.associatedTables());
346359
tracks2.bindExternalIndices(&collisions);
347360

361+
auto bc = collision1.bc_as<aod::BCsWithTimestamps>();
362+
348363
// LOGF(info, "Tracks: %d and %d entries", tracks1.size(), tracks2.size());
349364

350365
// TODO mixed event weight missing
351-
fillCorrelations(mixed, tracks1, tracks2, collision1.centV0M(), collision1.posZ(), bSign);
366+
fillCorrelations(mixed, tracks1, tracks2, collision1.centV0M(), collision1.posZ(), getMagneticField(bc.timestamp()));
352367
}
353368
}
354369
PROCESS_SWITCH(CorrelationTask, processMixedAOD, "Process mixed events on AOD", true);
@@ -357,8 +372,6 @@ struct CorrelationTask {
357372
{
358373
// TODO loading of efficiency histogram missing here, because it will happen somehow in the CCDBConfigurable
359374

360-
int bSign = 1; // TODO magnetic field from CCDB
361-
362375
collisions.bindExternalIndices(&tracks);
363376
auto tracksTuple = std::make_tuple(tracks);
364377
AnalysisDataProcessorBuilder::GroupSlicer slicer(collisions, tracksTuple);
@@ -393,19 +406,20 @@ struct CorrelationTask {
393406

394407
// LOGF(info, "Tracks: %d and %d entries", tracks1.size(), tracks2.size());
395408

396-
fillCorrelations(mixed, tracks1, tracks2, collision1.centV0M(), collision1.posZ(), bSign);
409+
fillCorrelations(mixed, tracks1, tracks2, collision1.centV0M(), collision1.posZ(), getMagneticField(collision1.timestamp()));
397410
}
398411
}
399412
PROCESS_SWITCH(CorrelationTask, processMixedDerived, "Process mixed events on derived data", false);
400413

401414
// Version with combinations
402-
void processWithCombinations(soa::Join<aod::Collisions, aod::CentV0Ms>::iterator const& collision, soa::Filtered<aod::Tracks> const& tracks)
415+
void processWithCombinations(soa::Join<aod::Collisions, aod::CentV0Ms>::iterator const& collision, aod::BCsWithTimestamps const&, soa::Filtered<aod::Tracks> const& tracks)
403416
{
404417
LOGF(info, "Tracks for collision (Combination run): %d", tracks.size());
405418

406-
const auto centrality = collision.centV0M();
419+
// TODO will go to CCDBConfigurable
420+
auto bc = collision.bc_as<aod::BCsWithTimestamps>();
407421

408-
int bSign = 1; // TODO magnetic field from CCDB
422+
const auto centrality = collision.centV0M();
409423

410424
for (auto track1 = tracks.begin(); track1 != tracks.end(); ++track1) {
411425

@@ -436,7 +450,7 @@ struct CorrelationTask {
436450
continue;
437451
}
438452

439-
if (cfgTwoTrackCut > 0 && mPairCuts.twoTrackCut(track1, track2, bSign)) {
453+
if (cfgTwoTrackCut > 0 && mPairCuts.twoTrackCut(track1, track2, getMagneticField(bc.timestamp()))) {
440454
continue;
441455
}
442456

0 commit comments

Comments
 (0)