3 //**************************************************************************
4 //* This file is property of and copyright by the ALICE HLT Project *
5 //* ALICE Experiment at CERN, All rights reserved. *
7 //* Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no> *
8 //* for The ALICE HLT Project. *
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 //**************************************************************************
19 /// @file AliHLTGlobalHistoComponent.cxx
20 /// @author Matthias Richter
22 /// @brief A histogramming component for global ESD properties based
23 /// on the AliHLTTTreeProcessor
25 #include "AliHLTGlobalHistoComponent.h"
26 #include "AliESDEvent.h"
28 #include "AliKFParticle.h"
29 #include "AliKFVertex.h"
35 /** ROOT macro for the implementation of ROOT specific class methods */
36 ClassImp(AliHLTGlobalHistoComponent)
38 AliHLTGlobalHistoComponent::AliHLTGlobalHistoComponent()
39 : AliHLTTTreeProcessor()
48 , fVertexStatus(kFALSE)
50 , fTrackVariablesInt()
59 // see header file for class documentation
61 // refer to README to build package
63 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
67 AliHLTGlobalHistoComponent::~AliHLTGlobalHistoComponent()
69 // see header file for class documentation
70 fTrackVariables.Reset();
71 fTrackVariablesInt.Reset();
73 fUPCVariables.Reset();
76 void AliHLTGlobalHistoComponent::GetInputDataTypes(AliHLTComponentDataTypeList& list){
77 // see header file for class documentation
78 list.push_back(kAliHLTAllDataTypes);
81 AliHLTComponentDataType AliHLTGlobalHistoComponent::GetOutputDataType(){
82 // see header file for class documentation
83 return kAliHLTDataTypeHistogram|kAliHLTDataOriginOut;
86 TTree* AliHLTGlobalHistoComponent::CreateTree(int /*argc*/, const char** /*argv*/){
87 // create the tree and branches
89 TTree* pTree=new TTree("ESDproperties", "HLT ESD properties");
90 if (!pTree) return NULL;
92 const char* trackVariableNames = {
93 // Note the black at the end of each name!
107 const char* trackIntVariableNames = {
108 // Note the black at the end of each name!
112 const char* V0VariableNames = {
113 // Note the black at the end of each name!
126 const char* UPCVariableNames = {
127 // Note the black at the end of each name!
138 int maxTrackCount = 20000; // FIXME: make configurable
139 int maxV0Count = 100000;
142 if ((iResult=fTrackVariables.Init(maxTrackCount, trackVariableNames))<0) {
143 HLTError("failed to initialize internal structure for track properties (float)");
145 if ((iResult=fTrackVariablesInt.Init(maxTrackCount, trackIntVariableNames))<0) {
146 HLTError("failed to initialize internal structure for track properties (int)");
148 if ((iResult=fV0Variables.Init(maxV0Count, V0VariableNames))<0) {
149 HLTError("failed to initialize internal structure for V0 properties (float)");
151 if ((iResult=fUPCVariables.Init(maxUPCCount, UPCVariableNames))<0) {
152 HLTError("failed to initialize internal structure for UPC properties (float)");
156 pTree->Branch("event", &fEvent, "event/I");
157 pTree->Branch("trackcount", &fNofTracks, "trackcount/I");
158 pTree->Branch("vertexX", &fVertexX, "vertexX/F");
159 pTree->Branch("vertexY", &fVertexY, "vertexY/F");
160 pTree->Branch("vertexZ", &fVertexZ, "vertexZ/F");
161 pTree->Branch("V0", &fNofV0s, "V0/I");
162 pTree->Branch("UPC", &fNofUPCpairs, "UPC/I");
163 pTree->Branch("nContributors",&fNofContributors, "nContributors/I");
164 pTree->Branch("vertexStatus", &fVertexStatus, "vertexStatus/I");
167 // FIXME: this is a bit ugly since type 'f' and 'i' are specified
168 // explicitely. Would be better to use a function like
169 // AliHLTGlobalHistoVariables::GetType but could not get this working
170 for (i=0; i<fTrackVariables.Variables(); i++) {
171 TString specifier=fTrackVariables.GetKey(i);
172 float* pArray=fTrackVariables.GetArray(specifier);
173 specifier+="[trackcount]/f";
174 pTree->Branch(fTrackVariables.GetKey(i), pArray, specifier.Data());
176 for (i=0; i<fTrackVariablesInt.Variables(); i++) {
177 TString specifier=fTrackVariablesInt.GetKey(i);
178 int* pArray=fTrackVariablesInt.GetArray(specifier);
179 specifier+="[trackcount]/i";
180 pTree->Branch(fTrackVariablesInt.GetKey(i), pArray, specifier.Data());
182 for (i=0; i<fV0Variables.Variables(); i++) {
183 TString specifier=fV0Variables.GetKey(i);
184 float* pArray=fV0Variables.GetArray(specifier);
186 pTree->Branch(fV0Variables.GetKey(i), pArray, specifier.Data());
188 for (i=0; i<fUPCVariables.Variables(); i++) {
189 TString specifier=fUPCVariables.GetKey(i);
190 float* pArray=fUPCVariables.GetArray(specifier);
191 specifier+="[UPC]/f";
192 pTree->Branch(fUPCVariables.GetKey(i), pArray, specifier.Data());
202 void AliHLTGlobalHistoComponent::FillHistogramDefinitions(){
203 /// default histogram definitions
206 int AliHLTGlobalHistoComponent::FillTree(TTree* pTree, const AliHLTComponentEventData& /*evtData*/, AliHLTComponentTriggerData& /*trigData*/ ){
208 /// fill the tree from the ESD
210 if (!IsDataEvent()) return 0;
214 // fetch ESD from input stream
215 const TObject* obj = GetFirstInputObject(kAliHLTAllDataTypes, "AliESDEvent");
216 AliESDEvent* esd = dynamic_cast<AliESDEvent*>(const_cast<TObject*>(obj));
217 esd->GetStdContent();
219 // fill track variables
220 fNofTracks = esd->GetNumberOfTracks();
221 fVertexX = esd->GetPrimaryVertexTracks()->GetX();
222 fVertexY = esd->GetPrimaryVertexTracks()->GetY();
223 fVertexZ = esd->GetPrimaryVertexTracks()->GetZ();
224 fNofV0s = esd->GetNumberOfV0s();
225 fNofContributors = esd->GetPrimaryVertexTracks()->GetNContributors();
226 fVertexStatus = esd->GetPrimaryVertexTracks()->GetStatus();
229 for (int i=0; i<fNofTracks; i++) {
230 AliESDtrack *esdTrack = esd->GetTrack(i);
231 if (!esdTrack) continue;
233 Float_t DCAr, DCAz = -99;
234 esdTrack->GetImpactParametersTPC(DCAr, DCAz);
236 fTrackVariables.Fill("Track_pt" , esdTrack->Pt() );
237 fTrackVariables.Fill("Track_phi" , esdTrack->Phi()*TMath::RadToDeg() );
238 fTrackVariables.Fill("Track_eta" , esdTrack->Theta() );
239 fTrackVariables.Fill("Track_p" , esdTrack->P() );
240 fTrackVariables.Fill("Track_theta" , esdTrack->Theta()*TMath::RadToDeg() );
241 fTrackVariables.Fill("Track_Nclusters" , esdTrack->GetTPCNcls() );
242 fTrackVariables.Fill("Track_status" , esdTrack->GetStatus() );
243 fTrackVariables.Fill("Track_charge" , esdTrack->Charge() );
244 fTrackVariables.Fill("Track_DCAr" , DCAr );
245 fTrackVariables.Fill("Track_DCAz" , DCAz );
246 fTrackVariables.Fill("Track_dEdx" , esdTrack->GetTPCsignal() );
247 fTrackVariablesInt.Fill("Track_status" , esdTrack->GetStatus() );
249 //HLTInfo("added parameters for %d tracks", fNofTracks);
252 AliESDtrack *esdTrack1 = esd->GetTrack(0);
253 if(!esdTrack1) return 0;
254 AliESDtrack *esdTrack2 = esd->GetTrack(1);
255 if(!esdTrack2) return 0;
257 if(esdTrack1->Charge()*esdTrack2->Charge()<0){
259 fUPCVariables.Fill("nClusters_1", esdTrack1->GetTPCNcls() );
260 fUPCVariables.Fill("nClusters_2", esdTrack2->GetTPCNcls() );
261 fUPCVariables.Fill("polarity_1", esdTrack1->Charge() );
262 fUPCVariables.Fill("polarity_2", esdTrack2->Charge() );
263 fUPCVariables.Fill("px_1", esdTrack1->Px() );
264 fUPCVariables.Fill("py_1", esdTrack1->Py() );
265 fUPCVariables.Fill("px_2", esdTrack2->Px() );
266 fUPCVariables.Fill("py_2", esdTrack2->Py() );
270 AliKFParticle::SetField( esd->GetMagneticField() );
272 //const double kKsMass = 0.49767;
273 //const double kLambdaMass = 1.11568;
274 //const double kPi0Mass = 0.13498;
276 //std::vector<AliKFParticle> vGammas;
279 for (int i=0; i<fNofV0s; i++) {
280 AliESDv0 *esdV0 = esd->GetV0(i);
281 if (!esdV0) continue;
283 AliESDtrack *t1 = esd->GetTrack( esd->GetV0(i)->GetNindex());
284 AliESDtrack *t2 = esd->GetTrack( esd->GetV0(i)->GetPindex());
286 AliKFParticle kf1( *t1, 11 );
287 AliKFParticle kf2( *t2, 11 );
289 AliKFVertex primVtx( *esd->GetPrimaryVertexTracks() );
290 double dev1 = kf1.GetDeviationFromVertex( primVtx );
291 double dev2 = kf2.GetDeviationFromVertex( primVtx );
293 AliKFParticle v0( kf1, kf2 );
294 double devPrim = v0.GetDeviationFromVertex( primVtx );
296 v0.SetProductionVertex( primVtx );
298 Double_t length, sigmaLength;
299 if( v0.GetDecayLength( length, sigmaLength ) ) continue;
301 double dx = v0.GetX()-primVtx.GetX();
302 double dy = v0.GetY()-primVtx.GetY();
303 double r = sqrt(dx*dx + dy*dy);
306 // Armenteros-Podolanski plot
310 AliKFParticle kf01 = kf1, kf02 = kf2;
311 kf01.SetProductionVertex(v0);
312 kf02.SetProductionVertex(v0);
313 kf01.TransportToProductionVertex();
314 kf02.TransportToProductionVertex();
315 double px1=kf01.GetPx(), py1=kf01.GetPy(), pz1=kf01.GetPz();
316 double px2=kf02.GetPx(), py2=kf02.GetPy(), pz2=kf02.GetPz();
317 double px = px1+px2, py = py1+py2, pz = pz1+pz2;
318 double p = sqrt(px*px+py*py+pz*pz);
319 double l1 = (px*px1 + py*py1 + pz*pz1)/p;
320 double l2 = (px*px2 + py*py2 + pz*pz2)/p;
321 pt = sqrt(px1*px1+py1*py1+pz1*pz1 - l1*l1);
322 ap = (l2-l1)/(l1+l2);
326 // t1->GetTPCNcls()>=fAPCuts[0]
327 // && t2->GetTPCNcls()>=fAPCuts[0]
328 // && dev1>=fAPCuts[1]
329 // && dev2>=fAPCuts[1]
330 // && devPrim <= fAPCuts[2]
331 // && length >= fAPCuts[3]*sigmaLength
332 // && length >= fAPCuts[4]
333 // && r <= fAPCuts[5]
336 // //if( fAP ) fAP->Fill( ap, pt );
344 // t1->GetTPCNcls()>=fGammaCuts[0]
345 // && t2->GetTPCNcls()>=fGammaCuts[0]
346 // && dev1>=fGammaCuts[1]
347 // && dev2>=fGammaCuts[1]
348 // && devPrim <= fGammaCuts[2]
349 // && length >= fGammaCuts[3]*sigmaLength
350 // && length >= fGammaCuts[4]
351 // && r <= fGammaCuts[5]
353 // double mass, error;
354 // v0.GetMass(mass,error);
355 // //if( fGamma ) fGamma->Fill( mass );
357 // if( TMath::Abs(mass)<=fGammaCuts[6]*error || TMath::Abs(mass)<=fGammaCuts[7] ){
358 // AliKFParticle gamma = v0;
359 // gamma.SetMassConstraint(0);
361 // // && t1->GetTPCNcls()>=60
362 // // && t2->GetTPCNcls()>=60
363 // // ) fGammaXY->Fill(gamma.GetX(), gamma.GetY());
366 // vGammas.push_back( gamma );
370 // if( isGamma ) continue;
378 // t1->GetTPCNcls()>=fKsCuts[0]
379 // && t2->GetTPCNcls()>=fKsCuts[0]
380 // && dev1>=fKsCuts[1]
381 // && dev2>=fKsCuts[1]
382 // && devPrim <= fKsCuts[2]
383 // && length >= fKsCuts[3]*sigmaLength
384 // && length >= fKsCuts[4]
385 // && r <= fKsCuts[5]
388 // AliKFParticle piN( *t1, 211 );
389 // AliKFParticle piP( *t2, 211 );
391 // AliKFParticle Ks( piN, piP );
392 // Ks.SetProductionVertex( primVtx );
394 // double mass, error;
395 // Ks.GetMass( mass, error);
396 // //if( fKShort ) fKShort->Fill( mass );
397 // if( TMath::Abs( mass - kKsMass )<=fKsCuts[6]*error || TMath::Abs( mass - kKsMass )<=fKsCuts[7] ){
403 // if( isKs ) continue;
406 // //printf("QQQQQQQQQQQQQQQQq :%f\n",fLambdaCuts[0]);
408 // t1->GetTPCNcls()>=fLambdaCuts[0]
409 // && t2->GetTPCNcls()>=fLambdaCuts[0]
410 // && dev1>=fLambdaCuts[1]
411 // && dev2>=fLambdaCuts[1]
412 // && devPrim <= fLambdaCuts[2]
413 // && length >= fLambdaCuts[3]*sigmaLength
414 // && length >= fLambdaCuts[4]
415 // && r <= fLambdaCuts[5]
416 // && TMath::Abs( ap )>.4
419 // AliKFParticle kP, kpi;
421 // kP = AliKFParticle( *t2, 2212 );
422 // kpi = AliKFParticle( *t1, 211 );
424 // kP = AliKFParticle( *t1, 2212 );
425 // kpi = AliKFParticle( *t2, 211 );
428 // AliKFParticle lambda = AliKFParticle( kP, kpi );
429 // lambda.SetProductionVertex( primVtx );
430 // //double mass, error;
431 // lambda.GetMass( Lmass, Lerror);
432 // //if( fLambda ) fLambda->Fill( mass );
433 // if( TMath::Abs( Lmass - kLambdaMass )<=fLambdaCuts[6]*Lerror || TMath::Abs( Lmass - kLambdaMass )<=fLambdaCuts[7] ){
439 fV0Variables.Fill("V0_AP", ap);
440 fV0Variables.Fill("V0_pt", pt);
441 fV0Variables.Fill("clust1", t1->GetTPCNcls());
442 fV0Variables.Fill("clust2", t2->GetTPCNcls());
443 fV0Variables.Fill("dev1", dev1);
444 fV0Variables.Fill("dev2", dev2);
445 fV0Variables.Fill("devPrim", devPrim);
446 fV0Variables.Fill("length", length);
447 fV0Variables.Fill("sigmaLength", sigmaLength);
448 fV0Variables.Fill("r", r);
450 } // end of loop over V0s
453 // fill an empty event
462 int AliHLTGlobalHistoComponent::ResetVariables()
464 /// reset all filling variables
467 fTrackVariables.ResetCount();
468 fTrackVariablesInt.ResetCount();
469 fV0Variables.ResetCount();
470 fUPCVariables.ResetCount();
474 AliHLTComponentDataType AliHLTGlobalHistoComponent::GetOriginDataType() const
476 // get the origin of the output data
477 return kAliHLTDataTypeHistogram|kAliHLTDataOriginHLT;
480 // AliHLTUInt32_t AliHLTGlobalHistoComponent::GetDataSpec() const;
482 // // get specifications of the output data