dNdPtAnalysisComponent added
[u/mrichter/AliRoot.git] / HLT / global / physics / AliHLTdNdPtAnalysisComponent.cxx
1 //**************************************************************************
2 //* This file is property of and copyright by the ALICE HLT Project        * 
3 //* ALICE Experiment at CERN, All rights reserved.                         *
4 //*                                                                        *
5 //* Primary Authors: S.Gorbunov <sergey.gorbunov@kip.uni-heidelberg.de>    *
6 //*                  for The ALICE HLT Project.                            *
7 //*                                                                        *
8 //* Permission to use, copy, modify and distribute this software and its   *
9 //* documentation strictly for non-commercial purposes is hereby granted   *
10 //* without fee, provided that the above copyright notice appears in all   *
11 //* copies and that both the copyright notice and this permission notice   *
12 //* appear in the supporting documentation. The authors make no claims     *
13 //* about the suitability of this software for any purpose. It is          *
14 //* provided "as is" without express or implied warranty.                  *
15 //**************************************************************************
16
17 /** @file   AliHLTdNdPtAnalysisComponent.cxx
18     @author Sergey Gorbunov
19     @brief  Component for ploting charge in clusters
20 */
21
22 #if __GNUC__>= 3
23 using namespace std;
24 #endif
25
26 #include "AliHLTdNdPtAnalysisComponent.h"
27 #include "AlidNdPtAnalysisPbPb.h"
28 #include "AlidNdPtEventCuts.h"
29 #include "AlidNdPtAcceptanceCuts.h"
30 #include "AliESDtrackCuts.h"
31
32 #include "AliCDBEntry.h"
33 #include "AliCDBManager.h"
34 #include <TFile.h>
35 #include <TString.h>
36 #include "TObjString.h"
37 #include "TObjArray.h"
38 #include "TH1F.h"
39 #include "TH2F.h"
40 #include "TSystem.h"
41 #include "AliESDEvent.h"
42 #include "AliESDtrack.h"
43 #include "AliESDv0.h"
44 #include "AliHLTMessage.h"
45 #include "TTimeStamp.h"
46
47 //#include "AliHLTTPC.h"
48 //#include <stdlib.h>
49 //#include <cerrno>
50
51
52 AliHLTdNdPtAnalysisComponent::AliHLTdNdPtAnalysisComponent() :
53   fUID(0),
54   fBenchmark("dNdPt"),
55   fAnalysis(0),
56   fEventCuts(0),
57   fAcceptanceCuts(0),
58   fESDtrackCuts(0)
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 }
67
68 AliHLTdNdPtAnalysisComponent::~AliHLTdNdPtAnalysisComponent()
69 {
70   // see header file for class documentation
71   if( fAnalysis ){
72     fAnalysis->SetEventCuts(0);
73     fAnalysis->SetAcceptanceCuts(0);
74     fAnalysis->SetTrackCuts(0);
75   }
76   delete fAnalysis;
77   delete fEventCuts;
78   delete fAcceptanceCuts;
79   delete fESDtrackCuts;
80 }
81
82 // Public functions to implement AliHLTComponent's interface.
83 // These functions are required for the registration process
84
85 const char* AliHLTdNdPtAnalysisComponent::GetComponentID()
86 {
87   // see header file for class documentation
88   
89   return "dNdPtAnalysis";
90 }
91
92 void AliHLTdNdPtAnalysisComponent::GetInputDataTypes(AliHLTComponentDataTypeList& list)
93 {
94   // see header file for class documentation
95   list.clear();
96   list.push_back( kAliHLTDataTypeESDObject|kAliHLTDataOriginOut );
97 }
98
99 AliHLTComponentDataType AliHLTdNdPtAnalysisComponent::GetOutputDataType()
100 {
101   // see header file for class documentation
102   return kAliHLTDataTypeHistogram  | kAliHLTDataOriginOut;
103 }
104
105 void AliHLTdNdPtAnalysisComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
106 {
107   // see header file for class documentation
108   // XXX TODO: Find more realistic values.
109   constBase = 80000;
110   inputMultiplier = 0;
111 }
112
113 AliHLTComponent* AliHLTdNdPtAnalysisComponent::Spawn()
114 {
115   // see header file for class documentation
116   return new AliHLTdNdPtAnalysisComponent;
117 }
118
119 void AliHLTdNdPtAnalysisComponent::SetDefaultConfiguration()
120 {
121   // Set default configuration for the CA merger component
122   // Some parameters can be later overwritten from the OCDB
123
124   fBenchmark.Reset();
125   fBenchmark.SetTimer(0,"total");
126   fBenchmark.SetTimer(1,"reco");    
127
128   if( !fEventCuts || !fAcceptanceCuts || !fESDtrackCuts){
129     HLTError("Out of memory");
130     return ;
131   }
132
133   Float_t zvWindow=20.;
134   float etaWindow=0.9;
135   Float_t ptMin=0.15;
136   
137   fEventCuts->SetZvRange(-zvWindow,zvWindow);  
138   fEventCuts->SetMeanXYZv(0.0,0.0,0.0);
139   fEventCuts->SetSigmaMeanXYZv(1.0,1.0,10.0);  
140   fEventCuts->SetTriggerRequired(kFALSE);
141
142   fAcceptanceCuts->SetEtaRange(-etaWindow,etaWindow);
143   fAcceptanceCuts->SetPtRange(ptMin,1.e10);
144   fAcceptanceCuts->SetMaxDCAr(3.0);
145   fAcceptanceCuts->SetMaxDCAz(30.0);
146
147   float maxDCAtoVertex = 3.0; // cm
148
149   fESDtrackCuts->SetRequireSigmaToVertex(kFALSE);
150   fESDtrackCuts->SetMaxDCAToVertexXY(maxDCAtoVertex);    
151   fESDtrackCuts->SetMaxDCAToVertexZ(maxDCAtoVertex);    
152   fESDtrackCuts->SetRequireTPCRefit(kFALSE);
153   fESDtrackCuts->SetAcceptKinkDaughters(kTRUE);
154   fESDtrackCuts->DefineHistograms();
155 }
156
157
158
159 int AliHLTdNdPtAnalysisComponent::ReadConfigurationString(  const char* arguments )
160 {
161   // Set configuration parameters for the CA merger component from the string
162
163   int iResult = 0;
164   if ( !arguments ) return iResult;
165
166   if( !fEventCuts || !fAcceptanceCuts || !fESDtrackCuts){
167     HLTError("Out of memory");
168     return -ENOMEM;
169   }
170
171   TString allArgs = arguments;
172   TString argument;
173   int bMissingParam = 0;
174
175   TObjArray* pTokens = allArgs.Tokenize( " " );
176
177   int nArgs =  pTokens ? pTokens->GetEntries() : 0;
178
179   for ( int i = 0; i < nArgs; i++ ) {
180     argument = ( ( TObjString* )pTokens->At( i ) )->GetString();
181     if ( argument.IsNull() ) continue;
182
183     if ( argument.CompareTo( "-vertexZRange" ) == 0 ) {
184       if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
185       float z = ( ( TObjString* )pTokens->At( i ) )->GetString().Atof();
186       fEventCuts->SetZvRange(-z, z );
187       HLTInfo( "Z vertex range is set to [%f,%f]", -z,z);
188       continue;
189     }
190  
191     if ( argument.CompareTo( "-meanVertexXYZ" ) == 0 ) {
192       if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
193       float x = ( ( TObjString* )pTokens->At( i ) )->GetString().Atof();
194       if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
195       float y = ( ( TObjString* )pTokens->At( i ) )->GetString().Atof();
196       if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
197       float z = ( ( TObjString* )pTokens->At( i ) )->GetString().Atof();
198       fEventCuts->SetMeanXYZv(x,y,z);
199       HLTInfo( "mean vertex is set to (%f,%f,%f)", x,y,z);
200       continue;
201     }
202  
203     if ( argument.CompareTo( "-meanVertexXYZSigma" ) == 0 ) {
204       if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
205       float x = ( ( TObjString* )pTokens->At( i ) )->GetString().Atof();
206       if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
207       float y = ( ( TObjString* )pTokens->At( i ) )->GetString().Atof();
208       if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
209       float z = ( ( TObjString* )pTokens->At( i ) )->GetString().Atof();
210       fEventCuts->SetSigmaMeanXYZv(x,y,z);
211       HLTInfo( "mean vertex sigma is set to (%f,%f,%f)", x,y,z);
212       continue;
213     }
214
215     if ( argument.CompareTo( "-etaRange" ) == 0 ) {
216       if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
217       float eta = ( ( TObjString* )pTokens->At( i ) )->GetString().Atof();
218       fAcceptanceCuts->SetEtaRange(-eta,eta);     
219       HLTInfo( "eta range is set to [%f,%f]", -eta,eta);
220       continue;
221     }
222
223     if ( argument.CompareTo( "-ptRange" ) == 0 ) {
224       if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
225       float ptMin = ( ( TObjString* )pTokens->At( i ) )->GetString().Atof();
226       if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
227       float ptMax = ( ( TObjString* )pTokens->At( i ) )->GetString().Atof();
228       fAcceptanceCuts->SetPtRange(ptMin,1.e10);
229       HLTInfo( "pt range is set to [%f,%f]", -ptMin,ptMax);
230       continue;
231     }
232  
233     if ( argument.CompareTo( "-dcaRmax" ) == 0 ) {
234       if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
235       float x = ( ( TObjString* )pTokens->At( i ) )->GetString().Atof();
236       fAcceptanceCuts->SetMaxDCAr(x);
237       HLTInfo( "max DCA R is set to %f", x);
238       continue;
239     }
240  
241     if ( argument.CompareTo( "-dcaZmax" ) == 0 ) {
242       if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
243       float x = ( ( TObjString* )pTokens->At( i ) )->GetString().Atof();
244       fAcceptanceCuts->SetMaxDCAz(x);
245       HLTInfo( "max DCA Z is set to %f", x);
246       continue;
247     }
248
249     if ( argument.CompareTo( "-dcaVtxRmax" ) == 0 ) {
250       if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
251       float x = ( ( TObjString* )pTokens->At( i ) )->GetString().Atof();
252       fESDtrackCuts->SetMaxDCAToVertexXY(x);    
253       HLTInfo( "max DCA R to vertex  is set to %f", x);
254       continue;
255     }
256
257     if ( argument.CompareTo( "-dcaVtxZmax" ) == 0 ) {
258       if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
259       float x = ( ( TObjString* )pTokens->At( i ) )->GetString().Atof();
260       fESDtrackCuts->SetMaxDCAToVertexZ(x);    
261       HLTInfo( "max DCA Z to vertex  is set to %f", x);
262       continue;
263     }
264
265     if ( argument.CompareTo( "-sigmaToVertex" ) == 0 ) {
266       if ( ( bMissingParam = ( ++i >= pTokens->GetEntries() ) ) ) break;
267       bool x = ( ( TObjString* )pTokens->At( i ) )->GetString().Atoi();
268       fESDtrackCuts->SetRequireSigmaToVertex(x);
269       HLTInfo( "sigma to vertex requirement is set to %i",x);
270       continue;
271     }
272
273     HLTError( "Unknown option \"%s\"", argument.Data() );
274     iResult = -EINVAL;
275   }
276   delete pTokens;
277   
278   if ( bMissingParam ) {
279     HLTError( "Specifier missed for parameter \"%s\"", argument.Data() );
280     iResult = -EINVAL;
281   }
282
283   return iResult;
284 }
285
286 int AliHLTdNdPtAnalysisComponent::ReadCDBEntry( const char* cdbEntry, const char* chainId )
287 {
288   // see header file for class documentation
289   return 0;//SG!!!
290   const char* defaultNotify = "";
291   
292   if ( !cdbEntry ) {
293     cdbEntry = ""; 
294     defaultNotify = " (default)";
295     chainId = 0;
296   }
297
298   HLTInfo( "configure from entry \"%s\"%s, chain id %s", cdbEntry, defaultNotify, ( chainId != NULL && chainId[0] != 0 ) ? chainId : "<none>" );
299   AliCDBEntry *pEntry = AliCDBManager::Instance()->Get( cdbEntry );//,GetRunNo());
300
301   if ( !pEntry ) {
302     HLTError( "cannot fetch object \"%s\" from CDB", cdbEntry );
303     return -EINVAL;
304   }
305
306   TObjString* pString = dynamic_cast<TObjString*>( pEntry->GetObject() );
307
308   if ( !pString ) {
309     HLTError( "configuration object \"%s\" has wrong type, required TObjString", cdbEntry );
310     return -EINVAL;
311   }
312
313   HLTInfo( "received configuration object string: \"%s\"", pString->GetString().Data() );
314
315   return  ReadConfigurationString( pString->GetString().Data() );
316 }
317
318 int AliHLTdNdPtAnalysisComponent::Configure( const char* cdbEntry, const char* chainId, const char *commandLine )
319 {
320   // Configure the component
321   // There are few levels of configuration,
322   // parameters which are set on one step can be overwritten on the next step
323
324   if( !fEventCuts ) fEventCuts = new AlidNdPtEventCuts;
325   if( !fAcceptanceCuts ) fAcceptanceCuts = new AlidNdPtAcceptanceCuts;
326   if( !fESDtrackCuts ) fESDtrackCuts = new AliESDtrackCuts;
327
328   if( !fEventCuts || !fAcceptanceCuts || !fESDtrackCuts){
329     HLTError("Out of memory");
330     return -ENOMEM;
331   }
332
333   //* read hard-coded values
334
335   SetDefaultConfiguration();
336
337   //* read the default CDB entry
338
339   int iResult1 = ReadCDBEntry( NULL, chainId );
340
341   //* read the actual CDB entry if required
342
343   int iResult2 = ( cdbEntry ) ? ReadCDBEntry( cdbEntry, chainId ) : 0;
344
345   //* read extra parameters from input (if they are)
346
347   int iResult3 = 0;
348
349   if ( commandLine && commandLine[0] != '\0' ) {
350     HLTInfo( "received configuration string from HLT framework: \"%s\"", commandLine );
351     iResult3 = ReadConfigurationString( commandLine );
352   }
353
354   return iResult1 ? iResult1 : ( iResult2 ? iResult2 : iResult3 );
355 }
356
357 int AliHLTdNdPtAnalysisComponent::Reconfigure( const char* cdbEntry, const char* chainId )
358 {
359   // Reconfigure the component from OCDB
360
361   return Configure( cdbEntry, chainId, NULL );
362 }
363
364
365 int AliHLTdNdPtAnalysisComponent::DoInit( int argc, const char** argv ) 
366 {
367   // init
368
369   fUID = 0;
370   fBenchmark.Reset();
371   fBenchmark.SetTimer(0,"total");
372   fBenchmark.SetTimer(1,"reco");
373
374   TString arguments = "";
375   for ( int i = 0; i < argc; i++ ) {
376     if ( !arguments.IsNull() ) arguments += " ";
377     arguments += argv[i];
378   }
379
380   int iResult = Configure( NULL, NULL, arguments.Data()  );
381
382   if( fAnalysis ){
383     fAnalysis->SetEventCuts(0);
384     fAnalysis->SetAcceptanceCuts(0);
385     fAnalysis->SetTrackCuts(0);
386   }
387   delete fAnalysis;  
388
389   fAnalysis = new AlidNdPtAnalysisPbPb;
390
391   if( !fAnalysis || !fEventCuts || !fAcceptanceCuts || !fESDtrackCuts){
392     HLTError("Out of memory");
393     return -ENOMEM;
394   }
395
396   fAnalysis->SetUseMCInfo(kFALSE);
397   fAnalysis->SetAnalysisMode(AlidNdPtHelper::kTPC);
398   fAnalysis->SetTrigger(AliTriggerAnalysis::kMB1);
399   fAnalysis->SetTriggerClass(0) ;
400   fAnalysis->SetParticleMode(AlidNdPtHelper::kAllPart);
401   fAnalysis->SetPhysicsTriggerSelection(0);
402
403   fAnalysis->SetEventCuts(fEventCuts);
404   fAnalysis->SetAcceptanceCuts(fAcceptanceCuts);
405   fAnalysis->SetTrackCuts(fESDtrackCuts);
406
407   fAnalysis->SetBackgroundCuts(0);
408   
409   fAnalysis->Init();
410
411   return iResult; 
412 }
413   
414 int AliHLTdNdPtAnalysisComponent::DoDeinit()
415 {
416   // see header file for class documentation
417   fUID = 0;
418   if( fAnalysis ){
419     fAnalysis->SetEventCuts(0);
420     fAnalysis->SetAcceptanceCuts(0);
421     fAnalysis->SetTrackCuts(0);
422   }
423   delete fAnalysis;
424   fAnalysis = 0;
425   return 0;
426 }
427
428
429 int AliHLTdNdPtAnalysisComponent::DoEvent(const AliHLTComponentEventData& evtData, AliHLTComponentTriggerData& /*trigData*/)
430 {
431   if ( GetFirstInputBlock( kAliHLTDataTypeSOR ) || GetFirstInputBlock( kAliHLTDataTypeEOR ) ) {
432     return 0;
433   }
434
435   if( !fAnalysis ){
436     HLTWarning("Analysis objects has not been created!!!");
437     return 0;
438   }
439
440   fBenchmark.StartNewEvent();
441   fBenchmark.Start(0);
442   
443
444   if( fUID == 0 ){
445     TTimeStamp t;
446     fUID = ( gSystem->GetPid() + t.GetNanoSec())*10 + evtData.fEventID;
447   }
448
449   for( const AliHLTComponentBlockData *i= GetFirstInputBlock(); i!=NULL; i=GetNextInputBlock() ){
450     fBenchmark.AddInput(i->fSize);
451   }
452
453   for ( const TObject *iter = GetFirstInputObject(kAliHLTDataTypeESDObject); iter != NULL; iter = GetNextInputObject() ) {
454
455     AliESDEvent *esdEvent = dynamic_cast<AliESDEvent*>(const_cast<TObject*>( iter ) );
456     if( !esdEvent ){ 
457       HLTWarning("Wrong ESDEvent object received");
458       continue;
459     }
460     esdEvent->GetStdContent();
461     fBenchmark.Start(1);
462     fAnalysis->Process(esdEvent);
463     fBenchmark.Stop(1);
464   }
465   fBenchmark.Stop(0);
466   HLTWarning(fBenchmark.GetStatistics());
467   return 0;
468 }
469
470