2 /**************************************************************************
3 * This file is property of and copyright by the ALICE HLT Project *
4 * ALICE Experiment at CERN, All rights reserved. *
6 * Primary Authors: Svein Lindal <slindal@fys.uio.no > *
7 * for The ALICE HLT Project. *
9 * Permission to use, copy, modify and distribute this software and its *
10 * documentation strictly for non-commercial purposes is hereby granted *
11 * without fee, provided that the above copyright notice appears in all *
12 * copies and that both the copyright notice and this permission notice *
13 * appear in the supporting documentation. The authors make no claims *
14 * about the suitability of this software for any purpose. It is *
15 * provided "as is" without express or implied warranty. *
16 **************************************************************************/
18 /// @file AliHLTEvePhos.cxx
19 /// @author Svein Lindal <slindal@fys.uio.no>
20 /// @brief HLT class for the HLT EVE display
22 #include "AliHLTEveHLT.h"
23 #include "AliHLTHOMERBlockDesc.h"
24 #include "AliHLTEveBase.h"
25 #include "AliEveHLTEventManager.h"
26 #include "AliHLTGlobalTriggerDecision.h"
27 #include "TEveManager.h"
28 #include "TEvePointSet.h"
29 #include "TEveTrack.h"
30 #include "TEveElement.h"
32 #include "AliESDEvent.h"
33 #include "AliESDtrack.h"
34 #include "TEveTrackPropagator.h"
35 #include "AliEveTrack.h"
36 #include "TEveVSDStructs.h"
38 #include "TPCLib/tracking-ca/AliHLTTPCCATrackParam.h"
39 #include "TPCLib/tracking-ca/AliHLTTPCCATrackConvertor.h"
40 #include "AliEveMagField.h"
46 ClassImp(AliHLTEveHLT)
48 AliHLTEveHLT::AliHLTEveHLT() :
49 AliHLTEveBase("TPC tracks"),
51 fUseIpOnFailedITS(kFALSE),
52 fUseRkStepper(kFALSE),
56 fPointSetVertex(NULL),
72 ///___________________________________________________________________
73 AliHLTEveHLT::~AliHLTEveHLT()
75 //Destructor, not implemented
88 ///________________________________________________________________________
89 void AliHLTEveHLT::CreateHistograms(){
90 //See header file for documentation
92 //fHistPt = new TH1F("fHistPt", "transverse momentum", 100, 0, 10); // KK
93 //fHistP = new TH1F("fHistP", "signed momentum", 100,-7, 7);
95 //fHistPt ->SetXTitle("p_{t} (GeV/c)"); // KK
96 //fHistP ->SetXTitle("P*charge (GeV/c)");
98 // fHistTheta = new TH1F("fHistTheta", "polar angle", 180, 0,180);
99 // fHistTheta->SetXTitle("#theta (degrees)");
101 fHistEta = new TH1F("fHistEta", "pseudorapidity", 100,-2, 2);
102 fHistEta ->SetXTitle("#eta");
104 fHistPhi = new TH1F("fHistPhi", "azimuthal angle", 180, 0,360);
105 fHistPhi ->SetXTitle("#phi (degrees)");
107 fHistnClusters = new TH1F("fHistnClusters","TPC clusters per track", 160, 0,160);
109 fHistMult = new TH1F("fHistMult", "event track multiplicity",150, 0, 15000);
111 fHistDCAr = new TH1F("fHistDCAr", "DCA r", 200, -100, 100);
116 ///_____________________________________________________________________
117 void AliHLTEveHLT::ProcessBlock(AliHLTHOMERBlockDesc * block) {
118 //See header file for documentation
119 if ( ! block->GetDataType().CompareTo("ALIESDV0") ) {
120 ProcessEsdBlock(block);
123 else if ( ! block->GetDataType().CompareTo("ROOTTOBJ") ) {
124 //processROOTTOBJ( block, gHLTText );
127 else if ( ! block->GetDataType().CompareTo("HLTRDLST") ) {
128 cout << "ignoring hlt rdlst"<<endl;
129 //processHLTRDLST( block );
132 else if ( ! block->GetDataType().CompareTo("GLOBTRIG") ) {
133 ProcessGlobalTrigger( block );
136 else if ( !block->GetDataType().CompareTo("ROOTHIST") ) {
138 fCanvas = CreateCanvas("PVtx/Tr QA", "PrimV");
139 fCanvas->Divide(3, 3);
141 ProcessHistograms( block , fCanvas);
145 ///____________________________________________________________________________
146 void AliHLTEveHLT::UpdateElements() {
147 //See header file for documentation
152 for(Int_t il = 0; il < fNTrackBins; il++) {
153 TEveTrackList * trackList = dynamic_cast<TEveTrackList*>(fTrackLists->FindChild(Form("Tracks_%d", il)));
154 if(trackList) trackList->ElementChanged();
158 if(fPointSetVertex) fPointSetVertex->ResetBBox();
159 if(fTrCanvas) fTrCanvas->Update();
160 if(fVertexCanvas) fVertexCanvas->Update();
161 if(fCanvas) fCanvas->Update();
165 ///_________________________________________________________________________________
166 void AliHLTEveHLT::ResetElements(){
167 //See header file for documentation
169 cout << "destroy"<<endl;
172 for(Int_t il = 0; il < fNTrackBins; il++) {
173 TEveTrackList * trackList = dynamic_cast<TEveTrackList*>(fTrackLists->FindChild(Form("Tracks_%d", il)));
174 if(trackList) trackList->DestroyElements();
182 if(fPointSetVertex) fPointSetVertex->Reset();
183 cout<< "reset done"<<endl;
188 ///_____________________________________________________________________________________
189 void * AliHLTEveHLT::DestroyGarbage(void * arg) {
190 AliHLTEveHLT * hlt = reinterpret_cast<AliHLTEveHLT*>(arg);
191 if(hlt) hlt->DestroyOldTrackList();
194 ///_____________________________________________________________________________________
195 void AliHLTEveHLT::DestroyOldTrackList() {
196 cout << "Destroying the old tracklist's elements"<<endl;
197 fOldTrackList->DestroyElements();
198 cout << "Destroying the old tracklist itself"<<endl;
199 fOldTrackList->Destroy();
202 ///_____________________________________________________________________________________
203 void AliHLTEveHLT::ProcessHistograms(AliHLTHOMERBlockDesc * block, TCanvas * canvas) {
204 //See header file for documentation
206 fTrCanvas = CreateCanvas("ESD", "ESD");
207 fTrCanvas->Divide(4, 2);
211 fVertexCanvas = CreateCanvas("Vtx", "Vtx");
212 fVertexCanvas->Divide(4, 2);
217 if ( ! block->GetClassName().CompareTo("TH1F")) {
218 TH1F* histo = reinterpret_cast<TH1F*>(block->GetTObject());
220 TString name(histo->GetName());
221 cout << "TH1F " <<name << endl;
222 if( !name.CompareTo("primVertexZ") ){
225 }else if( !name.CompareTo("primVertexX") ){
228 }else if( !name.CompareTo("primVertexY") ){
231 } else if ( name.Contains("Track")) {
232 AddHistogramToCanvas(histo, fTrCanvas, fTrCount);
234 AddHistogramToCanvas(histo, fVertexCanvas, fVCount);
237 } else if ( ! block->GetClassName().CompareTo("TH2F")) {
238 TH2F *hista = reinterpret_cast<TH2F*>(block->GetTObject());
240 TString name(hista->GetName());
241 cout << "TH2F " << name << endl;
242 if( !name.CompareTo("primVertexXY")) {
245 } else if ( name.Contains("Track")) {
246 AddHistogramToCanvas(hista, fTrCanvas, fTrCount);
248 AddHistogramToCanvas(hista, fVertexCanvas, fVCount);
255 ///_____________________________________________________________________________________
256 void AliHLTEveHLT::AddHistogramToCanvas(TH1* histogram, TCanvas * canvas, Int_t &cdCount) {
257 canvas->cd(++cdCount);
262 ///________________________________________________________________________________________
263 void AliHLTEveHLT::CreateTrackList() {
264 //See header file for documentation
265 fTrackList = new TEveTrackList("ESD Tracks");
266 fTrackList->SetMainColor(kOrange);
267 AddElement(fTrackList);
270 ///________________________________________________________________________________________
271 void AliHLTEveHLT::CreateTrackLists() {
272 //See header file for documentation
273 fTrackLists = new TEveElementList("ESD Track lists");
274 AddElement(fTrackLists);
275 for(Int_t i = 0; i < 10; i++) {
276 TEveTrackList * trackList = new TEveTrackList(Form("Tracks_%d", i));
277 trackList->SetMainColor(kOrange-i);
278 fTrackLists->AddElement(trackList);
283 ///_________________________________________________________________________________________
284 void AliHLTEveHLT::CreateVertexPointSet() {
285 //See header file for documentation
286 fPointSetVertex = new TEvePointSet("Primary Vertex");
287 fPointSetVertex->SetMainColor(6);
288 fPointSetVertex->SetMarkerStyle((Style_t)kFullStar);
290 AddElement(fPointSetVertex);
293 ///________________________________________________________________________
294 void AliHLTEveHLT::ProcessGlobalTrigger( AliHLTHOMERBlockDesc * block ) {
295 //See header file for documentation
296 AliHLTGlobalTriggerDecision * decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(block->GetTObject());
297 if(decision) decision->Print();
302 ///______________________________________________________________________
303 void AliHLTEveHLT::ProcessEsdBlock( AliHLTHOMERBlockDesc * block) {
304 //See header file for documentation
306 AliESDEvent* esd = (AliESDEvent *) (block->GetTObject());
309 ProcessEsdEvent(esd);
314 ///_________________________________________________________________________________
315 Color_t AliHLTEveHLT::GetColor(Float_t pt) {
317 Color_t baseColor = kOrange;
319 Float_t binlimit = 0.1;
320 for(Int_t i = 0; i< 10; i++) {
323 return baseColor - i;
328 return baseColor - 9;
332 ///_________________________________________________________________________________
333 Int_t AliHLTEveHLT::GetColorBin(Float_t pt) {
336 Float_t binlimit = 0.1;
337 for(Int_t i = 0; i< 10; i++) {
349 ///____________________________________________________________________
350 void AliHLTEveHLT::ProcessEsdEvent( AliESDEvent * esd ) {
351 //See header file for documentation
352 if(!fPointSetVertex) CreateVertexPointSet();
353 if(!fTrackLists) CreateTrackLists();
355 cout << "ProcessESDEvent() :"<< esd->GetEventNumberInFile()<< " " << esd->GetNumberOfCaloClusters() << " tracks : " << esd->GetNumberOfTracks() << endl;
357 //fEventManager->SetRunNumber(esd->GetRunNumber());
360 const AliESDVertex * esdVertex = esd->GetPrimaryVertex();
363 esdVertex->GetXYZ(vertex);
364 fPointSetVertex->SetNextPoint(vertex[0], vertex[1], vertex[2]);
367 TEveTrackList * trackList = dynamic_cast<TEveTrackList*>(fTrackLists->FirstChild());
368 if(trackList) SetUpTrackPropagator(trackList->GetPropagator(),-0.1*esd->GetMagneticField(), 520);
369 for (Int_t iter = 0; iter < esd->GetNumberOfTracks(); ++iter) {
371 AliESDtrack * esdTrack = dynamic_cast<AliESDtrack*>(esd->GetTrack(iter));
372 FillTrackList(esdTrack);
373 FillHistograms(esdTrack);
376 fHistMult->Fill(esd->GetNumberOfTracks()); // KK
378 //BALLE hardcoded size
379 for(Int_t il = 0; il < fNTrackBins; il++) {
380 trackList = dynamic_cast<TEveTrackList*>(fTrackLists->FindChild(Form("Tracks_%d", il)));
381 trackList->MakeTracks();
384 ///__________________________________________________________________________
385 void AliHLTEveHLT::FillTrackList(AliESDtrack * esdTrack) {
386 //See header file for documentation
387 TEveTrackList * trackList = dynamic_cast<TEveTrackList*>(fTrackLists->FirstChild());
388 if (!trackList) return;
390 AliEveTrack* track = dynamic_cast<AliEveTrack*>(MakeEsdTrack(esdTrack, trackList));
391 Int_t bin = GetColorBin(esdTrack->Pt());
392 trackList = dynamic_cast<TEveTrackList*>(fTrackLists->FindChild(Form("Tracks_%d", bin)));
394 track->SetAttLineAttMarker(trackList);
395 trackList->AddElement(track);
396 } else cout << "BALLE"<<endl;
402 ///____________________________________________________________________________________
403 void AliHLTEveHLT::FillHistograms(AliESDtrack * esdTrack) {
405 if(esdTrack->GetTPCNcls() == 0) return;
407 fHistEta->Fill(esdTrack->Eta());
408 // fHistTheta->Fill(esdTrack->Theta()*TMath::RadToDeg());
409 fHistPhi->Fill(esdTrack->Phi()*TMath::RadToDeg());
412 Float_t DCAr, DCAz = -99;
413 esdTrack->GetImpactParametersTPC(DCAr, DCAz);
414 fHistDCAr->Fill(DCAr);
417 if(esdTrack->GetStatus()&AliESDtrack::kTPCin || (esdTrack->GetStatus()&AliESDtrack::kTPCin && esdTrack->GetStatus()&AliESDtrack::kITSin)){
418 fHistnClusters->Fill(esdTrack->GetTPCNcls());
422 void AliHLTEveHLT::DrawHistograms(){
423 //See header file for documentation
425 fCanvas = CreateCanvas("PVtx/Tr QA", "Primary vertex, Track QA");
426 fCanvas->Divide(3, 3);
436 fHistnClusters->Draw();
448 AliEveTrack* AliHLTEveHLT::MakeEsdTrack (AliESDtrack *at, TEveTrackList* cont) {
449 //See header file for documentation
455 const double kCLight = 0.000299792458;
456 double bz = - kCLight*10.*( cont->GetPropagator()->GetMagField(0,0,0).fZ);
458 Bool_t innerTaken = kFALSE;
459 if ( ! at->IsOn(AliESDtrack::kITSrefit) && fUseIpOnFailedITS)
461 //tp = at->GetInnerParam();
465 // Add inner/outer track parameters as path-marks.
467 Double_t pbuf[3], vbuf[3];
469 AliExternalTrackParam trackParam = *at;
471 // take parameters constrained to vertex (if they are)
473 if( at->GetConstrainedParam() ){
474 trackParam = *at->GetConstrainedParam();
476 else if( at->GetInnerParam() ){
477 float x = at->GetX();
478 float y = at->GetY();
479 if(sqrt(x*x+y*y)>.5 ) trackParam = *(at->GetInnerParam());
481 if( at->GetStatus()&AliESDtrack::kTRDin ){
482 // transport to TRD in
484 trackParam.PropagateTo( 290.45, -10.*( cont->GetPropagator()->GetMagField(0,0,0).fZ) );
489 rt.fLabel = at->GetLabel();
490 rt.fIndex = (Int_t) at->GetID();
491 rt.fStatus = (Int_t) at->GetStatus();
492 rt.fSign = (Int_t) trackParam.GetSign();
493 trackParam.GetXYZ(vbuf);
494 trackParam.GetPxPyPz(pbuf);
497 Double_t ep = at->GetP(), mc = at->GetMass();
498 rt.fBeta = ep/TMath::Sqrt(ep*ep + mc*mc);
501 AliEveTrack* track = new AliEveTrack(&rt, cont->GetPropagator());
502 track->SetName(Form("AliEveTrack %d", at->GetID()));
503 track->SetElementTitle(CreateTrackTitle(at));
504 track->SetSourceObject(at);
507 // Set reference points along the trajectory
508 // and the last point
511 TEvePathMark startPoint(TEvePathMark::kReference);
512 trackParam.GetXYZ(vbuf);
513 trackParam.GetPxPyPz(pbuf);
514 startPoint.fV.Set(vbuf);
515 startPoint.fP.Set(pbuf);
518 Double_t ep = at->GetP(), mc = at->GetMass();
519 rt.fBeta = ep/TMath::Sqrt(ep*ep + mc*mc);
521 track->AddPathMark( startPoint );
525 if( at->GetOuterParam() && at->GetTPCPoints(2)>80 ){
528 // use AliHLTTPCCATrackParam propagator
529 // since AliExternalTrackParam:PropagateTo()
530 // has an offset at big distances
532 double rot = at->GetOuterParam()->GetAlpha() - trackParam.GetAlpha();
533 double crot = cos(rot), srot = sin(rot);
534 double xEnd = at->GetTPCPoints(2)*crot - at->GetTPCPoints(3)*srot;
535 // take parameters constrained to vertex (if they are)
538 AliHLTTPCCATrackParam t;
539 AliHLTTPCCATrackConvertor::SetExtParam( t, trackParam );
541 Double_t x0 = trackParam.GetX();
542 Double_t dx = xEnd - x0;
546 // set a reference at the half of trajectory for better drawing
551 if( TMath::Abs(dxx)>=1. ){
553 if( !t.TransportToX(x0+dxx, bz, .999 ) ){
556 AliExternalTrackParam tt;
557 AliHLTTPCCATrackConvertor::GetExtParam( t, tt, trackParam.GetAlpha() );
560 TEvePathMark midPoint(TEvePathMark::kReference);
561 midPoint.fV.Set(vbuf);
562 midPoint.fP.Set(pbuf);
563 track->AddPathMark( midPoint );
569 // Set a reference at the end of the trajectory
570 // and a "decay point", to let the event display know where the track ends
574 ///Removing meaningless loop, please have a look Sergey!!
576 // FIXME this loop does not make sense anymore
577 // Matthias 2010-05-02
578 if( !t.TransportToX(x0+dx, bz, .999 ) ){
584 AliHLTTPCCATrackConvertor::SetExtParam( t, trackParam );
586 AliExternalTrackParam tt;
587 AliHLTTPCCATrackConvertor::GetExtParam( t, tt, trackParam.GetAlpha() );
590 TEvePathMark endPoint(TEvePathMark::kReference);
591 TEvePathMark decPoint(TEvePathMark::kDecay);
592 endPoint.fV.Set(vbuf);
593 endPoint.fP.Set(pbuf);
594 decPoint.fV.Set(vbuf);
595 decPoint.fP.Set(pbuf);
596 track->AddPathMark( endPoint );
597 track->AddPathMark( decPoint );
601 if ( ok && at->IsOn(AliESDtrack::kTPCrefit))
605 AddTrackParamToTrack(track, at->GetInnerParam());
607 AddTrackParamToTrack(track, at->GetOuterParam());
613 void AliHLTEveHLT::SetUpTrackPropagator(TEveTrackPropagator* trkProp, Float_t magF, Float_t maxR) {
614 //See header file for documentation
617 trkProp->SetMagFieldObj(new AliEveMagField);
620 trkProp->SetMagField(magF);
624 trkProp->SetStepper(TEveTrackPropagator::kRungeKutta);
627 trkProp->SetMaxR(maxR);
631 void AliHLTEveHLT::AddTrackParamToTrack(AliEveTrack* track, const AliExternalTrackParam* tp) {
632 //See header file for documentation
637 Double_t pbuf[3], vbuf[3];
641 TEvePathMark pm(TEvePathMark::kReference);
644 track->AddPathMark(pm);
649 TString AliHLTEveHLT::CreateTrackTitle(AliESDtrack* t) {
650 // Add additional track parameters as a path-mark to track.
654 Int_t label = t->GetLabel(), index = t->GetID();
655 TString idx(index == kMinInt ? "<undef>" : Form("%d", index));
656 TString lbl(label == kMinInt ? "<undef>" : Form("%d", label));
661 Double_t pt = t->Pt();
662 Double_t ptsig = TMath::Sqrt(t->GetSigma1Pt2());
663 Double_t ptsq = pt*pt;
664 Double_t ptm = pt / (1.0 + pt*ptsig);
665 Double_t ptM = pt / (1.0 - pt*ptsig);
667 s = Form("Index=%s, Label=%s\nChg=%d, Pdg=%d\n"
668 "pT = %.3f + %.3f - %.3f [%.3f]\n"
669 "P = (%.3f, %.3f, %.3f)\n"
670 "V = (%.3f, %.3f, %.3f)\n",
671 idx.Data(), lbl.Data(), t->Charge(), 0,
672 pt, ptM - pt, pt - ptm, ptsig*ptsq,
677 s += "Det (in,out,refit,pid):\n";
678 o = AliESDtrack::kITSin;
679 s += Form("ITS (%d,%d,%d,%d) ", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
680 o = AliESDtrack::kTPCin;
681 s += Form("TPC(%d,%d,%d,%d)\n", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
682 o = AliESDtrack::kTRDin;
683 s += Form("TRD(%d,%d,%d,%d) ", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
684 o = AliESDtrack::kTOFin;
685 s += Form("TOF(%d,%d,%d,%d)\n", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
686 o = AliESDtrack::kHMPIDout;
687 s += Form("HMPID(out=%d,pid=%d)\n", t->IsOn(o), t->IsOn(o<<1));
688 s += Form("ESD pid=%d", t->IsOn(AliESDtrack::kESDpid));
690 if (t->IsOn(AliESDtrack::kESDpid))
694 s += Form("\n[%.2f %.2f %.2f %.2f %.2f]", pid[0], pid[1], pid[2], pid[3], pid[4]);