]>
Commit | Line | Data |
---|---|---|
48d874ff | 1 | #ifndef AliFJWrapper_H |
2 | #define AliFJWrapper_H | |
3 | ||
4 | // $Id$ | |
5 | ||
a9c8e539 | 6 | #if !defined(__CINT__) |
48d874ff | 7 | |
8 | #include <vector> | |
a9c8e539 | 9 | #include <TString.h> |
48d874ff | 10 | #include "AliLog.h" |
11 | #include "FJ_includes.h" | |
8082a80b | 12 | #include "AliJetShape.h" |
48d874ff | 13 | |
a9c8e539 | 14 | class AliFJWrapper |
48d874ff | 15 | { |
16 | public: | |
17 | AliFJWrapper(const char *name, const char *title); | |
18 | virtual ~AliFJWrapper(); | |
a9c8e539 | 19 | |
48d874ff | 20 | virtual void AddInputVector (Double_t px, Double_t py, Double_t pz, Double_t E, Int_t index = -99999); |
21 | virtual void AddInputVector (const fastjet::PseudoJet& vec, Int_t index = -99999); | |
22 | virtual void AddInputVectors(const std::vector<fastjet::PseudoJet>& vecs, Int_t offsetIndex = -99999); | |
a9c8e539 | 23 | virtual const char *ClassName() const { return "AliFJWrapper"; } |
24 | virtual void Clear(const Option_t* /*opt*/ = ""); | |
48d874ff | 25 | virtual void CopySettingsFrom (const AliFJWrapper& wrapper); |
26 | virtual void GetMedianAndSigma(Double_t& median, Double_t& sigma, Int_t remove = 0) const; | |
8082a80b | 27 | fastjet::ClusterSequenceArea* GetClusterSequence() const { return fClustSeq; } |
28 | const std::vector<fastjet::PseudoJet> GetInputVectors() const { return fInputVectors; } | |
29 | const std::vector<fastjet::PseudoJet> GetInclusiveJets() const { return fInclusiveJets; } | |
30 | std::vector<fastjet::PseudoJet> GetJetConstituents(UInt_t idx) const; | |
31 | Double_t GetMedianUsedForBgSubtraction() const { return fMedUsedForBgSub; } | |
32 | const char* GetName() const { return fName; } | |
33 | const char* GetTitle() const { return fTitle; } | |
34 | Double_t GetJetArea (UInt_t idx) const; | |
35 | fastjet::PseudoJet GetJetAreaVector (UInt_t idx) const; | |
36 | Double_t GetJetSubtractedPt (UInt_t idx) const; | |
37 | virtual std::vector<double> GetSubtractedJetsPts(Double_t median_pt = -1, Bool_t sorted = kFALSE); | |
38 | Bool_t GetLegacyMode() { return fLegacyMode; } | |
93daf3f7 | 39 | #ifdef FASTJET_VERSION |
3ec5da8e | 40 | const std::vector<fastjet::contrib::GenericSubtractorInfo> GetGenSubtractorInfoJetMass() const {return fGenSubtractorInfoJetMass ; } |
41 | const std::vector<fastjet::contrib::GenericSubtractorInfo> GetGenSubtractorInfoJetAngularity() const {return fGenSubtractorInfoJetAngularity ; } | |
42 | const std::vector<fastjet::contrib::GenericSubtractorInfo> GetGenSubtractorInfoJetpTD() const {return fGenSubtractorInfoJetpTD ; } | |
43 | const std::vector<fastjet::contrib::GenericSubtractorInfo> GetGenSubtractorInfoJetCircularity() const {return fGenSubtractorInfoJetCircularity ; } | |
df20822b | 44 | const std::vector<fastjet::contrib::GenericSubtractorInfo> GetGenSubtractorInfoJetSigma2() const {return fGenSubtractorInfoJetSigma2 ; } |
3ec5da8e | 45 | const std::vector<fastjet::contrib::GenericSubtractorInfo> GetGenSubtractorInfoJetConstituent() const {return fGenSubtractorInfoJetConstituent ; } |
46 | const std::vector<fastjet::contrib::GenericSubtractorInfo> GetGenSubtractorInfoJetLeSub() const {return fGenSubtractorInfoJetLeSub ; } | |
47 | const std::vector<fastjet::PseudoJet> GetConstituentSubtrJets() const {return fConstituentSubtrJets ; } | |
8082a80b | 48 | #endif |
3ec5da8e | 49 | virtual std::vector<double> GetGRNumerator() const { return fGRNumerator ; } |
50 | virtual std::vector<double> GetGRDenominator() const { return fGRDenominator ; } | |
51 | virtual std::vector<double> GetGRNumeratorSub() const { return fGRNumeratorSub ; } | |
52 | virtual std::vector<double> GetGRDenominatorSub() const { return fGRDenominatorSub ; } | |
48d874ff | 53 | |
54 | virtual Int_t Run(); | |
8082a80b | 55 | virtual Int_t DoGenericSubtractionJetMass(); |
726c9488 | 56 | virtual Int_t DoGenericSubtractionGR(Int_t ijet); |
0d13a63c | 57 | virtual Int_t DoGenericSubtractionJetAngularity(); |
58 | virtual Int_t DoGenericSubtractionJetpTD(); | |
59 | virtual Int_t DoGenericSubtractionJetCircularity(); | |
b9ccc456 | 60 | virtual Int_t DoGenericSubtractionJetSigma2(); |
0d13a63c | 61 | virtual Int_t DoGenericSubtractionJetConstituent(); |
62 | virtual Int_t DoGenericSubtractionJetLeSub(); | |
8082a80b | 63 | virtual Int_t DoConstituentSubtraction(); |
48d874ff | 64 | |
65 | void SetStrategy(const fastjet::Strategy &strat) { fStrategy = strat; } | |
66 | void SetAlgorithm(const fastjet::JetAlgorithm &algor) { fAlgor = algor; } | |
67 | void SetRecombScheme(const fastjet::RecombinationScheme &scheme) { fScheme = scheme; } | |
68 | void SetAreaType(const fastjet::AreaType &atype) { fAreaType = atype; } | |
69 | void SetNRepeats(Int_t nrepeat) { fNGhostRepeats = nrepeat; } | |
70 | void SetGhostArea(Double_t gharea) { fGhostArea = gharea; } | |
71 | void SetMaxRap(Double_t maxrap) { fMaxRap = maxrap; } | |
72 | void SetR(Double_t r) { fR = r; } | |
73 | void SetGridScatter(Double_t gridSc) { fGridScatter = gridSc; } | |
74 | void SetKtScatter(Double_t ktSc) { fKtScatter = ktSc; } | |
75 | void SetMeanGhostKt(Double_t meankt) { fMeanGhostKt = meankt; } | |
76 | void SetPluginAlgor(Int_t plugin) { fPluginAlgor = plugin; } | |
77 | void SetUseArea4Vector(Bool_t useA4v) { fUseArea4Vector = useA4v; } | |
78 | void SetupAlgorithmfromOpt(const char *option); | |
79 | void SetupAreaTypefromOpt(const char *option); | |
80 | void SetupSchemefromOpt(const char *option); | |
81 | void SetupStrategyfromOpt(const char *option); | |
5d0a5007 | 82 | void SetLegacyMode (Bool_t mode) { fLegacyMode ^= mode; } |
83 | void SetLegacyFJ(); | |
8082a80b | 84 | void SetUseExternalBkg(Bool_t b, Double_t rho, Double_t rhom) { fUseExternalBkg = b; fRho = rho; fRhom = rhom;} |
726c9488 | 85 | void SetRMaxAndStep(Double_t rmax, Double_t dr) {fRMax = rmax; fDRStep = dr; } |
48d874ff | 86 | |
87 | protected: | |
8082a80b | 88 | TString fName; //! |
89 | TString fTitle; //! | |
90 | std::vector<fastjet::PseudoJet> fInputVectors; //! | |
91 | std::vector<fastjet::PseudoJet> fInclusiveJets; //! | |
92 | std::vector<double> fSubtractedJetsPt; //! | |
93 | std::vector<fastjet::PseudoJet> fConstituentSubtrJets; //! | |
94 | fastjet::AreaDefinition *fAreaDef; //! | |
95 | fastjet::VoronoiAreaSpec *fVorAreaSpec; //! | |
96 | fastjet::GhostedAreaSpec *fGhostedAreaSpec; //! | |
97 | fastjet::JetDefinition *fJetDef; //! | |
98 | fastjet::JetDefinition::Plugin *fPlugin; //! | |
99 | fastjet::RangeDefinition *fRange; //! | |
100 | fastjet::ClusterSequenceArea *fClustSeq; //! | |
101 | fastjet::Strategy fStrategy; //! | |
102 | fastjet::JetAlgorithm fAlgor; //! | |
103 | fastjet::RecombinationScheme fScheme; //! | |
104 | fastjet::AreaType fAreaType; //! | |
105 | Int_t fNGhostRepeats; //! | |
106 | Double_t fGhostArea; //! | |
107 | Double_t fMaxRap; //! | |
108 | Double_t fR; //! | |
48d874ff | 109 | // no setters for the moment - used default values in the constructor |
8082a80b | 110 | Double_t fGridScatter; //! |
111 | Double_t fKtScatter; //! | |
112 | Double_t fMeanGhostKt; //! | |
113 | Int_t fPluginAlgor; //! | |
48d874ff | 114 | // extra parameters |
8082a80b | 115 | Double_t fMedUsedForBgSub; //! |
116 | Bool_t fUseArea4Vector; //! | |
5d0a5007 | 117 | #ifdef FASTJET_VERSION |
726c9488 | 118 | fastjet::JetMedianBackgroundEstimator *fBkrdEstimator; //! |
93daf3f7 | 119 | //from contrib package |
726c9488 | 120 | fastjet::contrib::GenericSubtractor *fGenSubtractor; //! |
3ec5da8e | 121 | std::vector<fastjet::contrib::GenericSubtractorInfo> fGenSubtractorInfoJetMass; //! |
122 | std::vector<fastjet::contrib::GenericSubtractorInfo> fGenSubtractorInfoGRNum; //! | |
123 | std::vector<fastjet::contrib::GenericSubtractorInfo> fGenSubtractorInfoGRDen; //! | |
124 | std::vector<fastjet::contrib::GenericSubtractorInfo> fGenSubtractorInfoJetAngularity; //! | |
125 | std::vector<fastjet::contrib::GenericSubtractorInfo> fGenSubtractorInfoJetpTD; //! | |
126 | std::vector<fastjet::contrib::GenericSubtractorInfo> fGenSubtractorInfoJetCircularity; //! | |
df20822b | 127 | std::vector<fastjet::contrib::GenericSubtractorInfo> fGenSubtractorInfoJetSigma2; //! |
3ec5da8e | 128 | std::vector<fastjet::contrib::GenericSubtractorInfo> fGenSubtractorInfoJetConstituent; //! |
129 | std::vector<fastjet::contrib::GenericSubtractorInfo> fGenSubtractorInfoJetLeSub; //! | |
5d0a5007 | 130 | #endif |
8082a80b | 131 | Bool_t fLegacyMode; //! |
132 | Bool_t fUseExternalBkg; //! | |
133 | Double_t fRho; // pT background density | |
134 | Double_t fRhom; // mT background density | |
726c9488 | 135 | Double_t fRMax; //! |
136 | Double_t fDRStep; //! | |
137 | std::vector<double> fGRNumerator; //! | |
138 | std::vector<double> fGRDenominator; //! | |
139 | std::vector<double> fGRNumeratorSub; //! | |
140 | std::vector<double> fGRDenominatorSub; //! | |
48d874ff | 141 | |
142 | virtual void SubtractBackground(const Double_t median_pt = -1); | |
143 | ||
144 | private: | |
145 | AliFJWrapper(); | |
146 | AliFJWrapper(const AliFJWrapper& wrapper); | |
147 | AliFJWrapper& operator = (const AliFJWrapper& wrapper); | |
148 | }; | |
149 | #endif | |
150 | #endif | |
151 | ||
152 | #ifdef AliFJWrapper_CXX | |
153 | #undef AliFJWrapper_CXX | |
154 | ||
155 | #if defined __GNUC__ | |
156 | #pragma GCC system_header | |
157 | #endif | |
158 | ||
159 | namespace fj = fastjet; | |
160 | ||
161 | //_________________________________________________________________________________________________ | |
162 | AliFJWrapper::AliFJWrapper(const char *name, const char *title) | |
a9c8e539 | 163 | : |
164 | fName (name) | |
165 | , fTitle (title) | |
48d874ff | 166 | , fInputVectors ( ) |
167 | , fInclusiveJets ( ) | |
168 | , fSubtractedJetsPt ( ) | |
8082a80b | 169 | , fConstituentSubtrJets ( ) |
48d874ff | 170 | , fAreaDef (0) |
171 | , fVorAreaSpec (0) | |
172 | , fGhostedAreaSpec (0) | |
173 | , fJetDef (0) | |
174 | , fPlugin (0) | |
175 | , fRange (0) | |
176 | , fClustSeq (0) | |
177 | , fStrategy (fj::Best) | |
178 | , fAlgor (fj::kt_algorithm) | |
179 | , fScheme (fj::BIpt_scheme) | |
180 | , fAreaType (fj::active_area) | |
181 | , fNGhostRepeats (1) | |
6d75c7ee | 182 | , fGhostArea (0.005) |
48d874ff | 183 | , fMaxRap (1.) |
184 | , fR (0.4) | |
185 | , fGridScatter (1.0) | |
7dc91d51 | 186 | , fKtScatter (0.1) |
48d874ff | 187 | , fMeanGhostKt (1e-100) |
188 | , fPluginAlgor (0) | |
189 | , fMedUsedForBgSub (0) | |
190 | , fUseArea4Vector (kFALSE) | |
5d0a5007 | 191 | #ifdef FASTJET_VERSION |
192 | , fBkrdEstimator (0) | |
8082a80b | 193 | , fGenSubtractor (0) |
194 | , fGenSubtractorInfoJetMass ( ) | |
fde4b180 | 195 | , fGenSubtractorInfoGRNum ( ) |
196 | , fGenSubtractorInfoGRDen ( ) | |
0d13a63c | 197 | , fGenSubtractorInfoJetAngularity ( ) |
198 | , fGenSubtractorInfoJetpTD ( ) | |
199 | , fGenSubtractorInfoJetCircularity( ) | |
b9ccc456 | 200 | , fGenSubtractorInfoJetSigma2() |
0d13a63c | 201 | , fGenSubtractorInfoJetConstituent ( ) |
202 | , fGenSubtractorInfoJetLeSub ( ) | |
5d0a5007 | 203 | #endif |
204 | , fLegacyMode (false) | |
8082a80b | 205 | , fUseExternalBkg (false) |
206 | , fRho (0) | |
207 | , fRhom (0) | |
726c9488 | 208 | , fRMax(2.) |
209 | , fDRStep(0.04) | |
726c9488 | 210 | , fGRNumerator() |
211 | , fGRDenominator() | |
212 | , fGRNumeratorSub() | |
213 | , fGRDenominatorSub() | |
48d874ff | 214 | { |
215 | // Constructor. | |
216 | } | |
217 | ||
218 | //_________________________________________________________________________________________________ | |
219 | AliFJWrapper::~AliFJWrapper() | |
220 | { | |
221 | // Destructor. | |
222 | ||
223 | delete fAreaDef; | |
224 | delete fVorAreaSpec; | |
225 | delete fGhostedAreaSpec; | |
226 | delete fJetDef; | |
227 | delete fPlugin; | |
228 | delete fRange; | |
5d0a5007 | 229 | delete fClustSeq; |
230 | #ifdef FASTJET_VERSION | |
8082a80b | 231 | if (fBkrdEstimator) delete fBkrdEstimator; |
232 | if (fGenSubtractor) delete fGenSubtractor; | |
5d0a5007 | 233 | #endif |
48d874ff | 234 | } |
235 | ||
236 | //_________________________________________________________________________________________________ | |
237 | void AliFJWrapper::CopySettingsFrom(const AliFJWrapper& wrapper) | |
238 | { | |
239 | // Copy some settings. | |
240 | // You very often want to keep most of the settings | |
241 | // but change only the algorithm or R - do it after call to this function | |
242 | ||
8082a80b | 243 | fStrategy = wrapper.fStrategy; |
244 | fAlgor = wrapper.fAlgor; | |
245 | fScheme = wrapper.fScheme; | |
246 | fAreaType = wrapper.fAreaType; | |
247 | fNGhostRepeats = wrapper.fNGhostRepeats; | |
248 | fGhostArea = wrapper.fGhostArea; | |
249 | fMaxRap = wrapper.fMaxRap; | |
250 | fR = wrapper.fR; | |
251 | fGridScatter = wrapper.fGridScatter; | |
252 | fKtScatter = wrapper.fKtScatter; | |
253 | fMeanGhostKt = wrapper.fMeanGhostKt; | |
254 | fPluginAlgor = wrapper.fPluginAlgor; | |
255 | fUseArea4Vector = wrapper.fUseArea4Vector; | |
256 | fLegacyMode = wrapper.fLegacyMode; | |
257 | fUseExternalBkg = wrapper.fUseExternalBkg; | |
258 | fRho = wrapper.fRho; | |
259 | fRhom = wrapper.fRhom; | |
48d874ff | 260 | } |
261 | ||
262 | //_________________________________________________________________________________________________ | |
a9c8e539 | 263 | void AliFJWrapper::Clear(const Option_t */*opt*/) |
48d874ff | 264 | { |
265 | // Simply clear the input vectors. | |
266 | // Make sure done on every event if the instance is reused | |
267 | // Reset the median to zero. | |
268 | ||
269 | fInputVectors.clear(); | |
270 | fMedUsedForBgSub = 0; | |
271 | ||
272 | // for the moment brute force delete everything | |
273 | delete fAreaDef; fAreaDef = 0; | |
274 | delete fVorAreaSpec; fVorAreaSpec = 0; | |
275 | delete fGhostedAreaSpec; fGhostedAreaSpec = 0; | |
276 | delete fJetDef; fJetDef = 0; | |
277 | delete fPlugin; fPlugin = 0; | |
278 | delete fRange; fRange = 0; | |
279 | delete fClustSeq; fClustSeq = 0; | |
5d0a5007 | 280 | #ifdef FASTJET_VERSION |
8082a80b | 281 | if (fBkrdEstimator) delete fBkrdEstimator ; fBkrdEstimator = 0; |
282 | if (fGenSubtractor) delete fGenSubtractor ; fGenSubtractor = 0; | |
5d0a5007 | 283 | #endif |
48d874ff | 284 | } |
285 | ||
286 | //_________________________________________________________________________________________________ | |
287 | void AliFJWrapper::AddInputVector(Double_t px, Double_t py, Double_t pz, Double_t E, Int_t index) | |
288 | { | |
289 | // Make the input pseudojet. | |
290 | ||
291 | fastjet::PseudoJet inVec(px, py, pz, E); | |
292 | ||
293 | if (index > -99999) { | |
294 | inVec.set_user_index(index); | |
295 | } else { | |
296 | inVec.set_user_index(fInputVectors.size()); | |
297 | } | |
298 | ||
299 | // add to the fj container of input vectors | |
300 | fInputVectors.push_back(inVec); | |
301 | } | |
302 | ||
303 | //_________________________________________________________________________________________________ | |
304 | void AliFJWrapper::AddInputVector(const fj::PseudoJet& vec, Int_t index) | |
305 | { | |
306 | // Add an input pseudojet. | |
307 | ||
308 | fj::PseudoJet inVec = vec; | |
309 | ||
310 | if (index > -99999) { | |
311 | inVec.set_user_index(index); | |
312 | } else { | |
313 | inVec.set_user_index(fInputVectors.size()); | |
314 | } | |
315 | ||
316 | // add to the fj container of input vectors | |
317 | fInputVectors.push_back(inVec); | |
318 | } | |
319 | ||
320 | //_________________________________________________________________________________________________ | |
321 | void AliFJWrapper::AddInputVectors(const std::vector<fj::PseudoJet>& vecs, Int_t offsetIndex) | |
322 | { | |
323 | // Add the input from vector of pseudojets. | |
324 | ||
325 | for (UInt_t i = 0; i < vecs.size(); ++i) { | |
326 | fj::PseudoJet inVec = vecs[i]; | |
48d874ff | 327 | if (offsetIndex > -99999) |
328 | inVec.set_user_index(fInputVectors.size() + offsetIndex); | |
329 | // add to the fj container of input vectors | |
48d874ff | 330 | fInputVectors.push_back(inVec); |
331 | } | |
332 | } | |
333 | ||
334 | //_________________________________________________________________________________________________ | |
335 | Double_t AliFJWrapper::GetJetArea(UInt_t idx) const | |
336 | { | |
337 | // Get the jet area. | |
338 | ||
339 | Double_t retval = -1; // really wrong area.. | |
340 | if ( idx < fInclusiveJets.size() ) { | |
7dc91d51 | 341 | retval = fClustSeq->area(fInclusiveJets[idx]); |
48d874ff | 342 | } else { |
343 | AliError(Form("[e] ::GetJetArea wrong index: %d",idx)); | |
344 | } | |
345 | return retval; | |
346 | } | |
347 | ||
4e22c11c | 348 | //_________________________________________________________________________________________________ |
349 | fastjet::PseudoJet AliFJWrapper::GetJetAreaVector(UInt_t idx) const | |
350 | { | |
351 | // Get the jet area as vector. | |
352 | fastjet::PseudoJet retval; | |
353 | if ( idx < fInclusiveJets.size() ) { | |
354 | retval = fClustSeq->area_4vector(fInclusiveJets[idx]); | |
355 | } else { | |
356 | AliError(Form("[e] ::GetJetArea wrong index: %d",idx)); | |
357 | } | |
358 | return retval; | |
359 | } | |
360 | ||
48d874ff | 361 | //_________________________________________________________________________________________________ |
362 | std::vector<double> AliFJWrapper::GetSubtractedJetsPts(Double_t median_pt, Bool_t sorted) | |
363 | { | |
364 | // Get subtracted jets pTs, returns vector. | |
365 | ||
366 | SubtractBackground(median_pt); | |
367 | ||
368 | if (kTRUE == sorted) { | |
369 | std::sort(fSubtractedJetsPt.begin(), fSubtractedJetsPt.begin()); | |
370 | } | |
371 | return fSubtractedJetsPt; | |
372 | } | |
373 | ||
374 | //_________________________________________________________________________________________________ | |
375 | Double_t AliFJWrapper::GetJetSubtractedPt(UInt_t idx) const | |
376 | { | |
377 | // Get subtracted jets pTs, returns Double_t. | |
378 | ||
379 | Double_t retval = -99999.; // really wrong pt.. | |
380 | if ( idx < fSubtractedJetsPt.size() ) { | |
381 | retval = fSubtractedJetsPt[idx]; | |
382 | } | |
383 | return retval; | |
384 | } | |
385 | ||
386 | //_________________________________________________________________________________________________ | |
387 | std::vector<fastjet::PseudoJet> | |
388 | AliFJWrapper::GetJetConstituents(UInt_t idx) const | |
389 | { | |
390 | // Get jets constituents. | |
391 | ||
392 | std::vector<fastjet::PseudoJet> retval; | |
393 | ||
394 | if ( idx < fInclusiveJets.size() ) { | |
395 | retval = fClustSeq->constituents(fInclusiveJets[idx]); | |
396 | } else { | |
397 | AliError(Form("[e] ::GetJetConstituents wrong index: %d",idx)); | |
398 | } | |
399 | ||
400 | return retval; | |
401 | } | |
402 | ||
403 | //_________________________________________________________________________________________________ | |
404 | void AliFJWrapper::GetMedianAndSigma(Double_t &median, Double_t &sigma, Int_t remove) const | |
405 | { | |
406 | // Get the median and sigma from fastjet. | |
407 | // User can also do it on his own because the cluster sequence is exposed (via a getter) | |
408 | ||
409 | if (!fClustSeq) { | |
410 | AliError("[e] Run the jfinder first."); | |
b0a20945 | 411 | return; |
48d874ff | 412 | } |
413 | ||
414 | Double_t mean_area = 0; | |
415 | try { | |
416 | if(0 == remove) { | |
417 | fClustSeq->get_median_rho_and_sigma(*fRange, fUseArea4Vector, median, sigma, mean_area); | |
418 | } else { | |
419 | std::vector<fastjet::PseudoJet> input_jets = sorted_by_pt(fClustSeq->inclusive_jets()); | |
420 | input_jets.erase(input_jets.begin(), input_jets.begin() + remove); | |
5d0a5007 | 421 | fClustSeq->get_median_rho_and_sigma(input_jets, *fRange, fUseArea4Vector, median, sigma, mean_area); |
48d874ff | 422 | input_jets.clear(); |
423 | } | |
424 | } catch (fj::Error) { | |
425 | AliError(" [w] FJ Exception caught."); | |
426 | median = -1.; | |
427 | sigma = -1; | |
428 | } | |
429 | } | |
430 | ||
431 | //_________________________________________________________________________________________________ | |
432 | Int_t AliFJWrapper::Run() | |
433 | { | |
434 | // Run the actual jet finder. | |
435 | ||
436 | if (fAreaType == fj::voronoi_area) { | |
437 | // Rfact - check dependence - default is 1. | |
438 | // NOTE: hardcoded variable! | |
439 | fVorAreaSpec = new fj::VoronoiAreaSpec(1.); | |
440 | fAreaDef = new fj::AreaDefinition(*fVorAreaSpec); | |
441 | } else { | |
442 | fGhostedAreaSpec = new fj::GhostedAreaSpec(fMaxRap, | |
443 | fNGhostRepeats, | |
444 | fGhostArea, | |
445 | fGridScatter, | |
446 | fKtScatter, | |
447 | fMeanGhostKt); | |
448 | ||
449 | fAreaDef = new fj::AreaDefinition(*fGhostedAreaSpec, fAreaType); | |
450 | } | |
451 | ||
452 | // this is acceptable by fastjet: | |
453 | fRange = new fj::RangeDefinition(fMaxRap - 0.95 * fR); | |
454 | ||
455 | if (fAlgor == fj::plugin_algorithm) { | |
456 | if (fPluginAlgor == 0) { | |
457 | // SIS CONE ALGOR | |
458 | // NOTE: hardcoded split parameter | |
459 | Double_t overlap_threshold = 0.75; // NOTE: this actually splits a lot: thr/min(pt1,pt2) | |
460 | fPlugin = new fj::SISConePlugin(fR, | |
461 | overlap_threshold, | |
462 | 0, //search of stable cones - zero = until no more | |
463 | 1.0); // this should be seed effectively for proto jets | |
464 | fJetDef = new fastjet::JetDefinition(fPlugin); | |
c515ed6d | 465 | } else if (fPluginAlgor == 1) { |
466 | // CDF cone | |
467 | // NOTE: hardcoded split parameter | |
468 | Double_t overlap_threshold = 0.75; // NOTE: this actually splits a lot: thr/min(pt1,pt2) | |
469 | fPlugin = new fj::CDFMidPointPlugin(fR, | |
470 | overlap_threshold, | |
471 | 1.0, //search of stable cones - zero = until no more | |
472 | 1.0); // this should be seed effectively for proto jets | |
473 | fJetDef = new fastjet::JetDefinition(fPlugin); | |
48d874ff | 474 | } else { |
475 | AliError("[e] Unrecognized plugin number!"); | |
476 | } | |
477 | } else { | |
478 | fJetDef = new fj::JetDefinition(fAlgor, fR, fScheme, fStrategy); | |
479 | } | |
480 | ||
481 | try { | |
482 | fClustSeq = new fj::ClusterSequenceArea(fInputVectors, *fJetDef, *fAreaDef); | |
483 | } catch (fj::Error) { | |
484 | AliError(" [w] FJ Exception caught."); | |
485 | return -1; | |
486 | } | |
487 | ||
5d0a5007 | 488 | // FJ3 :: Define an JetMedianBackgroundEstimator just in case it will be used |
489 | #ifdef FASTJET_VERSION | |
8082a80b | 490 | fBkrdEstimator = new fj::JetMedianBackgroundEstimator(fj::SelectorAbsRapMax(fMaxRap)); |
5d0a5007 | 491 | #endif |
492 | ||
493 | if (fLegacyMode) { SetLegacyFJ(); } // for FJ 2.x even if fLegacyMode is set, SetLegacyFJ is dummy | |
494 | ||
48d874ff | 495 | // inclusive jets: |
496 | fInclusiveJets.clear(); | |
7dc91d51 | 497 | fInclusiveJets = fClustSeq->inclusive_jets(0.0); |
48d874ff | 498 | |
499 | return 0; | |
500 | } | |
501 | ||
5d0a5007 | 502 | //_________________________________________________________________________________________________ |
503 | void AliFJWrapper::SetLegacyFJ() | |
504 | { | |
505 | // This methods enable legacy behaviour (FastJet 2.x) when AliROOT is compiled with FastJet 3.x | |
506 | #ifdef FASTJET_VERSION | |
507 | std::cout << "WARNING! Setting FastJet in legacy mode" << std::endl; | |
508 | if (fGhostedAreaSpec) { fGhostedAreaSpec->set_fj2_placement(kTRUE); } | |
509 | if (fBkrdEstimator) { | |
510 | fBkrdEstimator->set_provide_fj2_sigma(kTRUE); | |
511 | fBkrdEstimator->set_use_area_4vector(kFALSE); | |
512 | } | |
513 | #endif | |
514 | } | |
515 | ||
48d874ff | 516 | //_________________________________________________________________________________________________ |
517 | void AliFJWrapper::SubtractBackground(Double_t median_pt) | |
518 | { | |
519 | // Subtract the background (specify the value - see below the meaning). | |
520 | // Negative argument means the bg will be determined with the current algorithm | |
521 | // this is the default behavior. Zero is allowed | |
522 | // Note: user may set the switch for area4vector based subtraction. | |
523 | ||
524 | Double_t median = 0; | |
525 | Double_t sigma = 0; | |
526 | Double_t mean_area = 0; | |
527 | ||
528 | // clear the subtracted jet pt's vector<double> | |
529 | fSubtractedJetsPt.clear(); | |
5d0a5007 | 530 | |
48d874ff | 531 | // check what was specified (default is -1) |
532 | if (median_pt < 0) { | |
533 | try { | |
5d0a5007 | 534 | fClustSeq->get_median_rho_and_sigma(*fRange, fUseArea4Vector, median, sigma, mean_area); |
48d874ff | 535 | } |
5d0a5007 | 536 | |
48d874ff | 537 | catch (fj::Error) { |
538 | AliError(" [w] FJ Exception caught."); | |
539 | median = -9999.; | |
540 | sigma = -1; | |
541 | fMedUsedForBgSub = median; | |
542 | return; | |
543 | } | |
544 | fMedUsedForBgSub = median; | |
545 | } else { | |
546 | // we do not know the sigma in this case | |
547 | sigma = -1; | |
548 | if (0.0 == median_pt) { | |
549 | // AliWarning(Form(" [w] Median specified for bg subtraction is ZERO: %f", median_pt )) << endl; | |
550 | fMedUsedForBgSub = 0.; | |
551 | } else { | |
552 | fMedUsedForBgSub = median_pt; | |
553 | } | |
554 | } | |
555 | ||
556 | // subtract: | |
557 | for (unsigned i = 0; i < fInclusiveJets.size(); i++) { | |
5d0a5007 | 558 | if ( fUseArea4Vector ) { |
48d874ff | 559 | // subtract the background using the area4vector |
560 | fj::PseudoJet area4v = fClustSeq->area_4vector(fInclusiveJets[i]); | |
561 | fj::PseudoJet jet_sub = fInclusiveJets[i] - area4v * fMedUsedForBgSub; | |
562 | fSubtractedJetsPt.push_back(jet_sub.perp()); // here we put only the pt of the jet - note: this can be negative | |
563 | } else { | |
564 | // subtract the background using scalars | |
565 | // fj::PseudoJet jet_sub = fInclusiveJets[i] - area * fMedUsedForBgSub_; | |
566 | Double_t area = fClustSeq->area(fInclusiveJets[i]); | |
567 | // standard subtraction | |
568 | Double_t pt_sub = fInclusiveJets[i].perp() - fMedUsedForBgSub * area; | |
569 | fSubtractedJetsPt.push_back(pt_sub); // here we put only the pt of the jet - note: this can be negative | |
570 | } | |
571 | } | |
572 | } | |
573 | ||
8082a80b | 574 | //_________________________________________________________________________________________________ |
575 | Int_t AliFJWrapper::DoGenericSubtractionJetMass() { | |
576 | //Do generic subtraction for jet mass | |
93daf3f7 | 577 | #ifdef FASTJET_VERSION |
8082a80b | 578 | if(fUseExternalBkg) fGenSubtractor = new fj::contrib::GenericSubtractor(fRho,fRhom); |
579 | else fGenSubtractor = new fj::contrib::GenericSubtractor(fBkrdEstimator); | |
580 | ||
581 | // Define jet shape | |
582 | AliJetShapeMass shapeMass; | |
583 | ||
584 | // clear the generic subtractor info vector | |
585 | fGenSubtractorInfoJetMass.clear(); | |
586 | for (unsigned i = 0; i < fInclusiveJets.size(); i++) { | |
587 | fj::contrib::GenericSubtractorInfo info; | |
588 | if(fInclusiveJets[i].perp()>0.) | |
589 | double subtracted_shape = (*fGenSubtractor)(shapeMass, fInclusiveJets[i], info); | |
590 | fGenSubtractorInfoJetMass.push_back(info); | |
591 | } | |
8082a80b | 592 | #endif |
593 | return 0; | |
594 | } | |
595 | ||
726c9488 | 596 | //_________________________________________________________________________________________________ |
597 | Int_t AliFJWrapper::DoGenericSubtractionGR(Int_t ijet) { | |
598 | //Do generic subtraction for jet mass | |
599 | #ifdef FASTJET_VERSION | |
600 | if(fUseExternalBkg) fGenSubtractor = new fj::contrib::GenericSubtractor(fRho,fRhom); | |
601 | else fGenSubtractor = new fj::contrib::GenericSubtractor(fBkrdEstimator); | |
602 | ||
603 | if(ijet>fInclusiveJets.size()) return 0; | |
604 | ||
605 | fGRNumerator.clear(); | |
606 | fGRDenominator.clear(); | |
607 | fGRNumeratorSub.clear(); | |
608 | fGRDenominatorSub.clear(); | |
609 | ||
610 | // Define jet shape | |
611 | for(Double_t r = 0.; r<fRMax; r+=fDRStep) { | |
612 | AliJetShapeGRNum shapeGRNum(r,fDRStep); | |
613 | AliJetShapeGRDen shapeGRDen(r,fDRStep); | |
614 | ||
615 | // clear the generic subtractor info vector | |
616 | fGenSubtractorInfoGRNum.clear(); | |
617 | fGenSubtractorInfoGRDen.clear(); | |
618 | fj::contrib::GenericSubtractorInfo infoNum; | |
619 | fj::contrib::GenericSubtractorInfo infoDen; | |
620 | if(fInclusiveJets[ijet].perp()>0.) { | |
621 | double sub_num = (*fGenSubtractor)(shapeGRNum, fInclusiveJets[ijet], infoNum); | |
622 | double sub_den = (*fGenSubtractor)(shapeGRDen, fInclusiveJets[ijet], infoDen); | |
623 | } | |
624 | fGenSubtractorInfoGRNum.push_back(infoNum); | |
625 | fGenSubtractorInfoGRDen.push_back(infoDen); | |
626 | fGRNumerator.push_back(infoNum.unsubtracted()); | |
627 | fGRDenominator.push_back(infoDen.unsubtracted()); | |
628 | fGRNumeratorSub.push_back(infoNum.second_order_subtracted()); | |
629 | fGRDenominatorSub.push_back(infoDen.second_order_subtracted()); | |
630 | } | |
631 | #endif | |
632 | return 0; | |
633 | } | |
0d13a63c | 634 | //_________________________________________________________________________________________________ |
635 | Int_t AliFJWrapper::DoGenericSubtractionJetAngularity() { | |
636 | //Do generic subtraction for jet mass | |
637 | #ifdef FASTJET_VERSION | |
638 | if(fUseExternalBkg) fGenSubtractor = new fj::contrib::GenericSubtractor(fRho,fRhom); | |
639 | else fGenSubtractor = new fj::contrib::GenericSubtractor(fBkrdEstimator); | |
640 | ||
641 | // Define jet shape | |
642 | AliJetShapeAngularity shapeAngularity; | |
643 | ||
644 | // clear the generic subtractor info vector | |
645 | fGenSubtractorInfoJetAngularity.clear(); | |
646 | for (unsigned i = 0; i < fInclusiveJets.size(); i++) { | |
647 | fj::contrib::GenericSubtractorInfo infoAng; | |
648 | if(fInclusiveJets[i].perp()>0.) | |
649 | double subtracted_shape = (*fGenSubtractor)(shapeAngularity, fInclusiveJets[i], infoAng); | |
650 | fGenSubtractorInfoJetAngularity.push_back(infoAng); | |
651 | } | |
0d13a63c | 652 | #endif |
653 | return 0; | |
654 | } | |
655 | //_________________________________________________________________________________________________ | |
656 | Int_t AliFJWrapper::DoGenericSubtractionJetpTD() { | |
657 | //Do generic subtraction for jet mass | |
658 | #ifdef FASTJET_VERSION | |
659 | if(fUseExternalBkg) fGenSubtractor = new fj::contrib::GenericSubtractor(fRho,fRhom); | |
660 | else fGenSubtractor = new fj::contrib::GenericSubtractor(fBkrdEstimator); | |
661 | ||
662 | // Define jet shape | |
663 | AliJetShapepTD shapepTD; | |
664 | ||
665 | // clear the generic subtractor info vector | |
666 | fGenSubtractorInfoJetpTD.clear(); | |
667 | for (unsigned i = 0; i < fInclusiveJets.size(); i++) { | |
668 | fj::contrib::GenericSubtractorInfo infopTD; | |
669 | if(fInclusiveJets[i].perp()>0.) | |
670 | double subtracted_shape = (*fGenSubtractor)(shapepTD, fInclusiveJets[i], infopTD); | |
671 | fGenSubtractorInfoJetpTD.push_back(infopTD); | |
672 | } | |
0d13a63c | 673 | #endif |
674 | return 0; | |
675 | } | |
676 | //_________________________________________________________________________________________________ | |
677 | Int_t AliFJWrapper::DoGenericSubtractionJetCircularity() { | |
678 | //Do generic subtraction for jet mass | |
679 | #ifdef FASTJET_VERSION | |
680 | if(fUseExternalBkg) fGenSubtractor = new fj::contrib::GenericSubtractor(fRho,fRhom); | |
681 | else fGenSubtractor = new fj::contrib::GenericSubtractor(fBkrdEstimator); | |
682 | ||
683 | // Define jet shape | |
684 | AliJetShapeCircularity shapecircularity; | |
685 | ||
686 | // clear the generic subtractor info vector | |
687 | fGenSubtractorInfoJetCircularity.clear(); | |
688 | for (unsigned i = 0; i < fInclusiveJets.size(); i++) { | |
689 | fj::contrib::GenericSubtractorInfo infoCirc; | |
690 | if(fInclusiveJets[i].perp()>0.) | |
691 | double subtracted_shape = (*fGenSubtractor)(shapecircularity, fInclusiveJets[i], infoCirc); | |
692 | fGenSubtractorInfoJetCircularity.push_back(infoCirc); | |
693 | } | |
0d13a63c | 694 | #endif |
695 | return 0; | |
696 | } | |
b9ccc456 | 697 | //_________________________________________________________________________________________________ |
698 | Int_t AliFJWrapper::DoGenericSubtractionJetSigma2() { | |
699 | //Do generic subtraction for jet mass | |
700 | #ifdef FASTJET_VERSION | |
701 | if(fUseExternalBkg) fGenSubtractor = new fj::contrib::GenericSubtractor(fRho,fRhom); | |
702 | else fGenSubtractor = new fj::contrib::GenericSubtractor(fBkrdEstimator); | |
703 | ||
704 | // Define jet shape | |
705 | AliJetShapeSigma2 shapesigma2; | |
0d13a63c | 706 | |
b9ccc456 | 707 | // clear the generic subtractor info vector |
708 | fGenSubtractorInfoJetSigma2.clear(); | |
709 | for (unsigned i = 0; i < fInclusiveJets.size(); i++) { | |
710 | fj::contrib::GenericSubtractorInfo infoSigma; | |
711 | if(fInclusiveJets[i].perp()>0.) | |
712 | double subtracted_shape = (*fGenSubtractor)(shapesigma2, fInclusiveJets[i], infoSigma); | |
713 | fGenSubtractorInfoJetSigma2.push_back(infoSigma); | |
714 | } | |
715 | #endif | |
df20822b | 716 | return 0; |
b9ccc456 | 717 | } |
0d13a63c | 718 | //_________________________________________________________________________________________________ |
719 | Int_t AliFJWrapper::DoGenericSubtractionJetConstituent() { | |
720 | //Do generic subtraction for jet mass | |
721 | #ifdef FASTJET_VERSION | |
722 | if(fUseExternalBkg) fGenSubtractor = new fj::contrib::GenericSubtractor(fRho,fRhom); | |
723 | else fGenSubtractor = new fj::contrib::GenericSubtractor(fBkrdEstimator); | |
724 | ||
725 | // Define jet shape | |
726 | AliJetShapeConstituent shapeconst; | |
727 | ||
728 | // clear the generic subtractor info vector | |
729 | fGenSubtractorInfoJetConstituent.clear(); | |
730 | for (unsigned i = 0; i < fInclusiveJets.size(); i++) { | |
731 | fj::contrib::GenericSubtractorInfo infoConst; | |
732 | if(fInclusiveJets[i].perp()>0.) | |
733 | double subtracted_shape = (*fGenSubtractor)(shapeconst, fInclusiveJets[i], infoConst); | |
734 | fGenSubtractorInfoJetConstituent.push_back(infoConst); | |
735 | } | |
3ec5da8e | 736 | #endif |
0d13a63c | 737 | return 0; |
738 | } | |
739 | ||
740 | //_________________________________________________________________________________________________ | |
741 | Int_t AliFJWrapper::DoGenericSubtractionJetLeSub() { | |
742 | //Do generic subtraction for jet mass | |
743 | #ifdef FASTJET_VERSION | |
744 | if(fUseExternalBkg) fGenSubtractor = new fj::contrib::GenericSubtractor(fRho,fRhom); | |
745 | else fGenSubtractor = new fj::contrib::GenericSubtractor(fBkrdEstimator); | |
746 | ||
747 | // Define jet shape | |
748 | AliJetShapeLeSub shapeLeSub; | |
749 | ||
750 | // clear the generic subtractor info vector | |
751 | fGenSubtractorInfoJetLeSub.clear(); | |
752 | for (unsigned i = 0; i < fInclusiveJets.size(); i++) { | |
753 | fj::contrib::GenericSubtractorInfo infoLeSub; | |
754 | if(fInclusiveJets[i].perp()>0.) | |
755 | double subtracted_shape = (*fGenSubtractor)(shapeLeSub, fInclusiveJets[i], infoLeSub); | |
756 | fGenSubtractorInfoJetLeSub.push_back(infoLeSub); | |
757 | } | |
0d13a63c | 758 | #endif |
759 | return 0; | |
760 | } | |
726c9488 | 761 | |
8082a80b | 762 | //_________________________________________________________________________________________________ |
763 | Int_t AliFJWrapper::DoConstituentSubtraction() { | |
764 | //Do constituent subtraction | |
93daf3f7 | 765 | #ifdef FASTJET_VERSION |
8082a80b | 766 | fj::contrib::ConstituentSubtractor *subtractor; |
8ed8c5bb | 767 | if(fUseExternalBkg) |
8082a80b | 768 | subtractor = new fj::contrib::ConstituentSubtractor(fRho,fRhom,kFALSE,kTRUE); |
8082a80b | 769 | else subtractor = new fj::contrib::ConstituentSubtractor(fBkrdEstimator); |
770 | ||
771 | //clear constituent subtracted jets | |
772 | fConstituentSubtrJets.clear(); | |
773 | for (unsigned i = 0; i < fInclusiveJets.size(); i++) { | |
774 | fj::PseudoJet subtracted_jet(0.,0.,0.,0.); | |
775 | if(fInclusiveJets[i].perp()>0.) | |
776 | subtracted_jet = (*subtractor)(fInclusiveJets[i]); | |
777 | fConstituentSubtrJets.push_back(subtracted_jet); | |
778 | } | |
779 | if(subtractor) delete subtractor; | |
780 | ||
781 | #endif | |
782 | return 0; | |
783 | } | |
784 | ||
48d874ff | 785 | //_________________________________________________________________________________________________ |
786 | void AliFJWrapper::SetupAlgorithmfromOpt(const char *option) | |
787 | { | |
788 | // Setup algorithm from char. | |
789 | ||
790 | std::string opt(option); | |
791 | ||
792 | if (!opt.compare("kt")) fAlgor = fj::kt_algorithm; | |
793 | if (!opt.compare("antikt")) fAlgor = fj::antikt_algorithm; | |
794 | if (!opt.compare("cambridge")) fAlgor = fj::cambridge_algorithm; | |
795 | if (!opt.compare("genkt")) fAlgor = fj::genkt_algorithm; | |
796 | if (!opt.compare("cambridge_passive")) fAlgor = fj::cambridge_for_passive_algorithm; | |
797 | if (!opt.compare("genkt_passive")) fAlgor = fj::genkt_for_passive_algorithm; | |
798 | if (!opt.compare("ee_kt")) fAlgor = fj::ee_kt_algorithm; | |
799 | if (!opt.compare("ee_genkt")) fAlgor = fj::ee_genkt_algorithm; | |
800 | if (!opt.compare("plugin")) fAlgor = fj::plugin_algorithm; | |
801 | } | |
802 | ||
803 | //_________________________________________________________________________________________________ | |
804 | void AliFJWrapper::SetupAreaTypefromOpt(const char *option) | |
805 | { | |
806 | // Setup area type from char. | |
807 | ||
808 | std::string opt(option); | |
809 | ||
810 | if (!opt.compare("active")) fAreaType = fj::active_area; | |
811 | if (!opt.compare("invalid")) fAreaType = fj::invalid_area; | |
812 | if (!opt.compare("active_area_explicit_ghosts")) fAreaType = fj::active_area_explicit_ghosts; | |
813 | if (!opt.compare("one_ghost_passive")) fAreaType = fj::one_ghost_passive_area; | |
814 | if (!opt.compare("passive")) fAreaType = fj::passive_area; | |
815 | if (!opt.compare("voronoi")) fAreaType = fj::voronoi_area; | |
816 | } | |
817 | ||
818 | //_________________________________________________________________________________________________ | |
819 | void AliFJWrapper::SetupSchemefromOpt(const char *option) | |
820 | { | |
821 | // | |
822 | // setup scheme from char | |
823 | // | |
824 | ||
825 | std::string opt(option); | |
826 | ||
827 | if (!opt.compare("BIpt")) fScheme = fj::BIpt_scheme; | |
828 | if (!opt.compare("BIpt2")) fScheme = fj::BIpt2_scheme; | |
829 | if (!opt.compare("E")) fScheme = fj::E_scheme; | |
830 | if (!opt.compare("pt")) fScheme = fj::pt_scheme; | |
831 | if (!opt.compare("pt2")) fScheme = fj::pt2_scheme; | |
832 | if (!opt.compare("Et")) fScheme = fj::Et_scheme; | |
833 | if (!opt.compare("Et2")) fScheme = fj::Et2_scheme; | |
834 | } | |
835 | ||
836 | //_________________________________________________________________________________________________ | |
837 | void AliFJWrapper::SetupStrategyfromOpt(const char *option) | |
838 | { | |
839 | // Setup strategy from char. | |
840 | ||
841 | std::string opt(option); | |
842 | ||
843 | if (!opt.compare("Best")) fStrategy = fj::Best; | |
844 | if (!opt.compare("N2MinHeapTiled")) fStrategy = fj::N2MinHeapTiled; | |
845 | if (!opt.compare("N2Tiled")) fStrategy = fj::N2Tiled; | |
846 | if (!opt.compare("N2PoorTiled")) fStrategy = fj::N2PoorTiled; | |
847 | if (!opt.compare("N2Plain")) fStrategy = fj::N2Plain; | |
848 | if (!opt.compare("N3Dumb")) fStrategy = fj::N3Dumb; | |
849 | if (!opt.compare("NlnN")) fStrategy = fj::NlnN; | |
850 | if (!opt.compare("NlnN3pi")) fStrategy = fj::NlnN3pi; | |
851 | if (!opt.compare("NlnN4pi")) fStrategy = fj::NlnN4pi; | |
852 | if (!opt.compare("NlnNCam4pi")) fStrategy = fj::NlnNCam4pi; | |
853 | if (!opt.compare("NlnNCam2pi2R")) fStrategy = fj::NlnNCam2pi2R; | |
854 | if (!opt.compare("NlnNCam")) fStrategy = fj::NlnNCam; | |
855 | if (!opt.compare("plugin")) fStrategy = fj::plugin_strategy; | |
856 | } | |
857 | #endif |