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