added a protection before writing out the corr NTuple
[u/mrichter/AliRoot.git] / HLT / global / physics / AliHLTMultiplicityCorrelationsComponent.cxx
CommitLineData
06f2306d 1//-*- Mode: C++ -*-
2// $Id: AliHLTMultiplicityCorrelationsComponent.cxx $
3/**************************************************************************
4 * This file is property of and copyright by the ALICE HLT Project *
5 * ALICE Experiment at CERN, All rights reserved. *
6 * *
7 * Primary Authors: Jochen Thaeder <jochen@thaeder.de> *
8 * for The ALICE HLT Project. *
9 * *
10 * Permission to use, copy, modify and distribute this software and its *
11 * documentation strictly for non-commercial purposes is hereby granted *
12 * without fee, provided that the above copyright notice appears in all *
13 * copies and that both the copyright notice and this permission notice *
14 * appear in the supporting documentation. The authors make no claims *
15 * about the suitability of this software for any purpose. It is *
16 * provided "as is" without express or implied warranty. *
17 **************************************************************************/
18
19/** @file AliHLTMultiplicityCorrelationsComponent.cxx
20 @author Jochen Thaeder <jochen@thaeder.de>
21 @brief Component for Multiplicty Correlations
22*/
23
24#if __GNUC__>= 3
25using namespace std;
26#endif
27
28#include "TMap.h"
29#include "TObjString.h"
30
31#include "AliESDtrackCuts.h"
32#include "AliHLTMultiplicityCorrelations.h"
33
34#include "AliHLTErrorGuard.h"
35#include "AliHLTDataTypes.h"
36#include "AliHLTMultiplicityCorrelationsComponent.h"
6c552baa 37#include "AliHLTITSClusterDataFormat.h"
06f2306d 38
39/** ROOT macro for the implementation of ROOT specific class methods */
40ClassImp(AliHLTMultiplicityCorrelationsComponent)
41
42/*
43 * ---------------------------------------------------------------------------------
44 * Constructor / Destructor
45 * ---------------------------------------------------------------------------------
46 */
47
48// #################################################################################
49AliHLTMultiplicityCorrelationsComponent::AliHLTMultiplicityCorrelationsComponent() :
50 AliHLTProcessor(),
51 fESDTrackCuts(NULL),
52 fCorrObj(NULL) {
53 // an example component which implements the ALICE HLT processor
54 // interface and does some analysis on the input raw data
55 //
56 // see header file for class documentation
57 // or
58 // refer to README to build package
59 // or
60 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
61 //
62 // NOTE: all helper classes should be instantiated in DoInit()
63}
64
65// #################################################################################
66AliHLTMultiplicityCorrelationsComponent::~AliHLTMultiplicityCorrelationsComponent() {
67 // see header file for class documentation
68}
69
70/*
71 * ---------------------------------------------------------------------------------
72 * Public functions to implement AliHLTComponent's interface.
73 * These functions are required for the registration process
74 * ---------------------------------------------------------------------------------
75 */
76
77// #################################################################################
78const Char_t* AliHLTMultiplicityCorrelationsComponent::GetComponentID() {
79 // see header file for class documentation
80 return "MultiplicityCorrelations";
81}
82
83// #################################################################################
84void AliHLTMultiplicityCorrelationsComponent::GetInputDataTypes( vector<AliHLTComponentDataType>& list) {
85 // see header file for class documentation
86 list.push_back(kAliHLTDataTypeESDObject|kAliHLTDataOriginAny);
6c552baa 87 list.push_back(kAliHLTDataTypeClusters|kAliHLTDataOriginITSSPD);
06f2306d 88}
89
90// #################################################################################
91AliHLTComponentDataType AliHLTMultiplicityCorrelationsComponent::GetOutputDataType() {
92 // see header file for class documentation
93 return kAliHLTDataTypeTObject|kAliHLTDataOriginHLT;
94}
95
96// #################################################################################
97void AliHLTMultiplicityCorrelationsComponent::GetOutputDataSize( ULong_t& constBase, Double_t& inputMultiplier ) {
98 // see header file for class documentation
99 constBase = 1000;
100 inputMultiplier = 0.5;
101}
102
103// #################################################################################
104void AliHLTMultiplicityCorrelationsComponent::GetOCDBObjectDescription( TMap* const targetMap) {
105 // see header file for class documentation
106
107 if (!targetMap) return;
108 targetMap->Add(new TObjString("HLT/ConfigGlobal/MultiplicityCorrelations"),
109 new TObjString("configuration object"));
110
111 return;
112}
113
114// #################################################################################
115AliHLTComponent* AliHLTMultiplicityCorrelationsComponent::Spawn() {
116 // see header file for class documentation
117 return new AliHLTMultiplicityCorrelationsComponent;
118}
119
120/*
121 * ---------------------------------------------------------------------------------
122 * Protected functions to implement AliHLTComponent's interface.
123 * These functions provide initialization as well as the actual processing
124 * capabilities of the component.
125 * ---------------------------------------------------------------------------------
126 */
127
128// #################################################################################
129Int_t AliHLTMultiplicityCorrelationsComponent::DoInit( Int_t argc, const Char_t** argv ) {
130 // see header file for class documentation
131
132 Int_t iResult=0;
133
134 // -- Initialize members
135 // -----------------------
136 do {
137 if (iResult<0) break;
138
139
140 fCorrObj = new AliHLTMultiplicityCorrelations;
141 if (!fCorrObj) {
142 iResult=-ENOMEM;
143 break;
144 }
145
146 fESDTrackCuts = new AliESDtrackCuts("AliESDtrackCuts","HLT");
147 if (!fESDTrackCuts) {
148 iResult=-ENOMEM;
149 break;
150 }
151
152 // implement further initialization
153 } while (0);
154
155 if (iResult<0) {
156 // implement cleanup
157
158 if (fCorrObj)
159 delete fCorrObj;
160 fCorrObj = NULL;
161
162 if (fESDTrackCuts)
163 delete fESDTrackCuts;
164 fESDTrackCuts = NULL;
165 }
166
167 if (iResult>=0) {
168 SetDefaultConfiguration();
169
170 // -- Read configuration object : HLT/ConfigGlobal/MultiplicityCorrelations
171 TString cdbPath="HLT/ConfigGlobal/";
172 cdbPath+=GetComponentID();
173 iResult=ConfigureFromCDBTObjString(cdbPath);
174
175 // -- Read the component arguments
176 if (iResult>=0) {
177 iResult=ConfigureFromArgumentString(argc, argv);
178 }
179 }
180
181 if (iResult>=0) {
182 HLTInfo("ESD track cuts : %s",fESDTrackCuts->GetTitle() );
183
184 fCorrObj->SetESDTrackCuts(fESDTrackCuts);
185 fCorrObj->Initialize();
186 }
187
188 return iResult;
189}
190
191// #################################################################################
192void AliHLTMultiplicityCorrelationsComponent::SetDefaultConfiguration() {
193 // see header file for class documentation
194
195 if (fESDTrackCuts) {
196 fESDTrackCuts->SetEtaRange(-0.9,0.9);
197 fESDTrackCuts->SetPtRange(0.2,200);
198 fESDTrackCuts->SetMinNClustersTPC(80);
199
200 fESDTrackCuts->SetDCAToVertex2D(kFALSE);
201 fESDTrackCuts->SetRequireSigmaToVertex(kFALSE);
202
203 fESDTrackCuts->SetMaxDCAToVertexXY(3.0);
204 fESDTrackCuts->SetMaxDCAToVertexZ(3.0);
205
206 fESDTrackCuts->SetRequireTPCRefit(kFALSE);
207 fESDTrackCuts->SetRequireITSRefit(kFALSE);
208 }
209
210 return;
211}
212
213// #################################################################################
214Int_t AliHLTMultiplicityCorrelationsComponent::ScanConfigurationArgument(Int_t argc, const Char_t** argv) {
215 // Scan configuration arguments
216 // Return the number of processed arguments
217 // -EPROTO if argument format error (e.g. number expected but not found)
218 //
219 // The AliHLTComponent base class implements a parsing loop for argument strings and
220 // arrays of strings which is invoked by ConfigureFromArgumentString/ConfigureFromCDBTObjString
221 // The component needs to implement ScanConfigurationArgument in order to decode the arguments.
222
223 if (argc<=0) return 0;
224 Int_t ii =0;
225 TString argument=argv[ii];
226
227 if (argument.IsNull()) return 0;
228
229 if( !fESDTrackCuts){
230 HLTError("No ESD track cuts availible");
231 return -ENOMEM;
232 }
233
234 // ---------------------
235
236 // -maxpt
237 if (argument.CompareTo("-maxpt")==0) {
238 if (++ii>=argc) return -EPROTO;
239 argument=argv[ii];
240
241 Float_t minPt, maxPt;
242 fESDTrackCuts->GetPtRange(minPt,maxPt);
243 maxPt = argument.Atof();
244 fESDTrackCuts->SetPtRange(minPt,maxPt);
245
246 TString title = fESDTrackCuts->GetTitle();
247 if (!title.CompareTo("No track cuts")) title = "";
248 else title += " && ";
249 title += Form("p_t < %f", maxPt);
250 fESDTrackCuts->SetTitle(title);
251 return 2;
252 }
253
254 // -minpt
255 if (argument.CompareTo("-minpt")==0) {
256 if (++ii>=argc) return -EPROTO;
257 argument=argv[ii];
258
259 Float_t minPt, maxPt;
260 fESDTrackCuts->GetPtRange(minPt,maxPt);
261 minPt = argument.Atof();
262 fESDTrackCuts->SetPtRange(minPt,maxPt);
263
264 TString title = fESDTrackCuts->GetTitle();
265 if (!title.CompareTo("No track cuts")) title = "";
266 else title += " && ";
267 title += Form("p_t > %f", minPt);
268 fESDTrackCuts->SetTitle(title);
269 return 2;
270 }
271
272 // -min-ldca
273 // minimum longitudinal dca to vertex
274 if (argument.CompareTo("-min-ldca")==0) {
275 if (++ii>=argc) return -EPROTO;
276 argument=argv[ii];
277
278 fESDTrackCuts->SetMinDCAToVertexZ(argument.Atof());
279 TString title = fESDTrackCuts->GetTitle();
280 if (!title.CompareTo("No track cuts")) title = "";
281 else title += " && ";
282 title += Form("DCAz > %f", argument.Atof());
283 fESDTrackCuts->SetTitle(title);
284 return 2;
285 }
286
287 // -max-ldca
288 // maximum longitudinal dca to vertex
289 if (argument.CompareTo("-max-ldca")==0) {
290 if (++ii>=argc) return -EPROTO;
291 argument=argv[ii];
292
293 fESDTrackCuts->SetMaxDCAToVertexZ(argument.Atof());
294 TString title = fESDTrackCuts->GetTitle();
295 if (!title.CompareTo("No track cuts")) title = "";
296 else title += " && ";
297 title += Form("DCAz < %f", argument.Atof());
298 fESDTrackCuts->SetTitle(title);
299 return 2;
300 }
301
302 // -min-tdca
303 // minimum transverse dca to vertex
304 if (argument.CompareTo("-min-tdca")==0) {
305 if (++ii>=argc) return -EPROTO;
306 argument=argv[ii];
307
308 fESDTrackCuts->SetMinDCAToVertexXY(argument.Atof());
309 TString title = fESDTrackCuts->GetTitle();
310 if (!title.CompareTo("No track cuts")) title = "";
311 else title += " && ";
312 title += Form("DCAr > %f", argument.Atof());
313 fESDTrackCuts->SetTitle(title);
314 return 2;
315 }
316
317 // -max-tdca
318 // maximum transverse dca to vertex
319 if (argument.CompareTo("-max-tdca")==0) {
320 if (++ii>=argc) return -EPROTO;
321 argument=argv[ii];
322
323 fESDTrackCuts->SetMaxDCAToVertexXY(argument.Atof());
324 TString title = fESDTrackCuts->GetTitle();
325 if (!title.CompareTo("No track cuts")) title = "";
326 else title += " && ";
327 title += Form("DCAr < %f", argument.Atof());
328 fESDTrackCuts->SetTitle(title);
329 return 2;
330 }
331
332 // -etarange
333 // +/- eta
334 if (argument.CompareTo("-etarange")==0) {
335 if (++ii>=argc) return -EPROTO;
336 argument=argv[ii];
337 Float_t eta = argument.Atof();
338
339 fESDTrackCuts->SetEtaRange(-eta,eta);
340 TString title = fESDTrackCuts->GetTitle();
341 if (!title.CompareTo("No track cuts")) title = "";
342 else title += " && ";
343 title += Form("Eta[%f,%f]", argument.Atof());
344 fESDTrackCuts->SetTitle(title);
345 return 2;
346 }
347
348
349 // -- BINNING --------------
350
351 // binningVzero
352 if (argument.CompareTo("-binningVzero")==0) {
353 if (++ii>=argc) return -EPROTO;
354 argument=argv[ii];
355 Int_t binning = argument.Atoi();
356 if (++ii>=argc) return -EPROTO;
357 argument=argv[ii];
358 Float_t min = argument.Atof();
359 if (++ii>=argc) return -EPROTO;
360 argument=argv[ii];
361 Float_t max = argument.Atof();
362
363 fCorrObj->SetBinningVzero(binning, min, max);
364 return 4;
365 }
366
367 // binningTpc
368 if (argument.CompareTo("-binningTpc")==0) {
369 if (++ii>=argc) return -EPROTO;
370 argument=argv[ii];
371 Int_t binning = argument.Atoi();
372 if (++ii>=argc) return -EPROTO;
373 argument=argv[ii];
374 Float_t min = argument.Atof();
375 if (++ii>=argc) return -EPROTO;
376 argument=argv[ii];
377 Float_t max = argument.Atof();
378
379 fCorrObj->SetBinningTpc(binning, min, max);
380 return 4;
381 }
382
6c552baa 383 // binningSpd
384 if (argument.CompareTo("-binningSpd")==0) {
385 if (++ii>=argc) return -EPROTO;
386 argument=argv[ii];
387 Int_t binning = argument.Atoi();
388 if (++ii>=argc) return -EPROTO;
389 argument=argv[ii];
390 Float_t min = argument.Atof();
391 if (++ii>=argc) return -EPROTO;
392 argument=argv[ii];
393 Float_t max = argument.Atof();
394
395 fCorrObj->SetBinningSpd(binning, min, max);
396 return 4;
397 }
398
06f2306d 399 // binningZdc
400 if (argument.CompareTo("-binningZdc")==0) {
401 if (++ii>=argc) return -EPROTO;
402 argument=argv[ii];
403 Int_t binning = argument.Atoi();
404 if (++ii>=argc) return -EPROTO;
405 argument=argv[ii];
406 Float_t min = argument.Atof();
407 if (++ii>=argc) return -EPROTO;
408 argument=argv[ii];
409 Float_t max = argument.Atof();
410
411 fCorrObj->SetBinningZdc(binning, min, max);
412 return 4;
413 }
414
415 // binningZnp
416 if (argument.CompareTo("-binningZnp")==0) {
417 if (++ii>=argc) return -EPROTO;
418 argument=argv[ii];
419 Int_t binning = argument.Atoi();
420 if (++ii>=argc) return -EPROTO;
421 argument=argv[ii];
422 Float_t min = argument.Atof();
423 if (++ii>=argc) return -EPROTO;
424 argument=argv[ii];
425 Float_t max = argument.Atof();
426
427 fCorrObj->SetBinningZnp(binning, min, max);
428 return 4;
429 }
430
431 // binningZem
432 if (argument.CompareTo("-binningZem")==0) {
433 if (++ii>=argc) return -EPROTO;
434 argument=argv[ii];
435 Int_t binning = argument.Atoi();
436 if (++ii>=argc) return -EPROTO;
437 argument=argv[ii];
438 Float_t min = argument.Atof();
439 if (++ii>=argc) return -EPROTO;
440 argument=argv[ii];
441 Float_t max = argument.Atof();
442
443 fCorrObj->SetBinningZem(binning, min, max);
444 return 4;
445 }
a75a9dbe 446 // binningZem
447 if (argument.CompareTo("-binningCalo")==0) {
448 if (++ii>=argc) return -EPROTO;
449 argument=argv[ii];
450 Int_t binning = argument.Atoi();
451 if (++ii>=argc) return -EPROTO;
452 argument=argv[ii];
453 Float_t min = argument.Atof();
454 if (++ii>=argc) return -EPROTO;
455 argument=argv[ii];
456 Float_t max = argument.Atof();
457
458 fCorrObj->SetBinningCalo(binning, min, max);
459 return 4;
460 }
1747bf74 461 if (argument.CompareTo("-enablePhos")==0) {
462 if (++ii>=argc) return -EPROTO;
463 argument=argv[ii];
464 Int_t enabled = argument.Atoi();
465 fCorrObj->SetProcessPhos(enabled);
466 return 2;
467 }
468 if (argument.CompareTo("-enableEmcal")==0) {
469 if (++ii>=argc) return -EPROTO;
470 argument=argv[ii];
471 Int_t enabled = argument.Atoi();
472 fCorrObj->SetProcessEmcal(enabled);
473 return 2;
474 }
06f2306d 475 // unknown argument
476 return -EINVAL;
477}
478
479// #################################################################################
480Int_t AliHLTMultiplicityCorrelationsComponent::DoDeinit() {
481 // see header file for class documentation
482
483 if (fCorrObj)
484 delete fCorrObj;
485 fCorrObj = NULL;
486
487 if (fESDTrackCuts)
488 delete fESDTrackCuts;
489 fESDTrackCuts = NULL;
490
491 return 0;
492}
493
494// #################################################################################
495Int_t AliHLTMultiplicityCorrelationsComponent::DoEvent(const AliHLTComponentEventData& /*evtData*/,
496 AliHLTComponentTriggerData& /*trigData*/) {
497 // see header file for class documentation
498
499 Int_t iResult=0;
500
501 // -- Only use data event
502 if (!IsDataEvent())
503 return 0;
504
6c552baa 505
06f2306d 506 // -- Get ESD object
6c552baa 507 AliESDEvent *esdEvent = NULL;
06f2306d 508 for ( const TObject *iter = GetFirstInputObject(kAliHLTDataTypeESDObject); iter != NULL; iter = GetNextInputObject() ) {
6c552baa 509 esdEvent = dynamic_cast<AliESDEvent*>(const_cast<TObject*>( iter ) );
06f2306d 510 if( !esdEvent ){
511 HLTWarning("Wrong ESDEvent object received");
512 iResult = -1;
513 continue;
514 }
515 esdEvent->GetStdContent();
06f2306d 516 }
517
6c552baa 518 // -- Get SPD clusters
519 // ---------------------
520 const AliHLTComponentBlockData* iter = NULL;
521 Int_t totalSpacePoint = 0;
522
523 for ( iter = GetFirstInputBlock(kAliHLTDataTypeClusters|kAliHLTDataOriginITSSPD);
524 iter != NULL; iter = GetNextInputBlock() ) {
525
526 const AliHLTITSClusterData* clusterData = (const AliHLTITSClusterData*) iter->fPtr;
527 Int_t nSpacepoint = (Int_t) clusterData->fSpacePointCnt;
528 totalSpacePoint += nSpacepoint;
529 }
530
531 // -- Process Event
532 // ------------------
533 if (esdEvent)
534 iResult = fCorrObj->ProcessEvent(esdEvent,totalSpacePoint);
535
06f2306d 536 if (iResult) {
537 HLTError("Error while processing event inside multiplicity correlation object");
538 return iResult;
539 }
540
541 // -- Send histlist
542 PushBack(dynamic_cast<TObject*>(fCorrObj->GetHistList()),
543 kAliHLTDataTypeTObject|kAliHLTDataOriginHLT,0);
544
545 return iResult;
546}
547
548// #################################################################################
549Int_t AliHLTMultiplicityCorrelationsComponent::Reconfigure(const Char_t* cdbEntry, const Char_t* chainId) {
550 // see header file for class documentation
551
552 Int_t iResult=0;
553 TString cdbPath;
554 if (cdbEntry) {
555 cdbPath=cdbEntry;
556 } else {
557 cdbPath="HLT/ConfigGlobal/";
558 cdbPath+=GetComponentID();
559 }
560
561 AliInfoClass(Form("reconfigure '%s' from entry %s%s", chainId, cdbPath.Data(), cdbEntry?"":" (default)"));
562 iResult=ConfigureFromCDBTObjString(cdbPath);
563
564 return iResult;
565}
566
567// #################################################################################
568Int_t AliHLTMultiplicityCorrelationsComponent::ReadPreprocessorValues(const Char_t* /*modules*/) {
569 // see header file for class documentation
570 ALIHLTERRORGUARD(5, "ReadPreProcessorValues not implemented for this component");
571 return 0;
572}