1 /**************************************************************************
2 * This file is property of and copyright by the ALICE HLT Project *
3 * ALICE Experiment at CERN, All rights reserved. *
5 * Primary Authors: Svein Lindal <slindal@fys.uio.no > *
6 * for The ALICE HLT Project. *
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 **************************************************************************/
17 /// @file AliHLTEvePhos.cxx
18 /// @author Svein Lindal <slindal@fys.uio.no>
19 /// @brief HLT class for the HLT EVE display
21 #include "AliHLTEveHLT.h"
22 #include "AliHLTHOMERBlockDesc.h"
23 #include "AliHLTEveBase.h"
24 #include "AliEveHLTEventManager.h"
25 #include "AliHLTGlobalTriggerDecision.h"
26 #include "TEveManager.h"
27 #include "TEvePointSet.h"
28 #include "TEveTrack.h"
29 #include "TEveElement.h"
31 #include "AliESDEvent.h"
32 #include "AliESDtrack.h"
33 #include "TEveTrackPropagator.h"
34 #include "AliEveTrack.h"
35 #include "TEveVSDStructs.h"
37 #include "TPCLib/tracking-ca/AliHLTTPCCATrackParam.h"
38 #include "TPCLib/tracking-ca/AliHLTTPCCATrackConvertor.h"
39 #include "AliEveMagField.h"
45 ClassImp(AliHLTEveHLT)
47 AliHLTEveHLT::AliHLTEveHLT() :
48 AliHLTEveBase("TPC tracks"),
50 fUseIpOnFailedITS(kFALSE),
51 fUseRkStepper(kFALSE),
55 fPointSetVertex(NULL),
71 ///___________________________________________________________________
72 AliHLTEveHLT::~AliHLTEveHLT()
74 //Destructor, not implemented
87 ///________________________________________________________________________
88 void AliHLTEveHLT::CreateHistograms(){
89 //See header file for documentation
91 //fHistPt = new TH1F("fHistPt", "transverse momentum", 100, 0, 10); // KK
92 //fHistP = new TH1F("fHistP", "signed momentum", 100,-7, 7);
94 //fHistPt ->SetXTitle("p_{t} (GeV/c)"); // KK
95 //fHistP ->SetXTitle("P*charge (GeV/c)");
97 // fHistTheta = new TH1F("fHistTheta", "polar angle", 180, 0,180);
98 // fHistTheta->SetXTitle("#theta (degrees)");
100 fHistEta = new TH1F("fHistEta", "pseudorapidity", 100,-2, 2);
101 fHistEta ->SetXTitle("#eta");
103 fHistPhi = new TH1F("fHistPhi", "azimuthal angle", 180, 0,360);
104 fHistPhi ->SetXTitle("#phi (degrees)");
106 fHistnClusters = new TH1F("fHistnClusters","TPC clusters per track", 160, 0,160);
108 fHistMult = new TH1F("fHistMult", "event track multiplicity",150, 0, 15000);
110 fHistDCAr = new TH1F("fHistDCAr", "DCA r", 200, -100, 100);
115 ///_____________________________________________________________________
116 void AliHLTEveHLT::ProcessBlock(AliHLTHOMERBlockDesc * block) {
117 //See header file for documentation
118 if ( ! block->GetDataType().CompareTo("ALIESDV0") ) {
119 ProcessEsdBlock(block);
122 else if ( ! block->GetDataType().CompareTo("ROOTTOBJ") ) {
123 //processROOTTOBJ( block, gHLTText );
126 else if ( ! block->GetDataType().CompareTo("HLTRDLST") ) {
127 cout << "ignoring hlt rdlst"<<endl;
128 //processHLTRDLST( block );
131 else if ( ! block->GetDataType().CompareTo("GLOBTRIG") ) {
132 ProcessGlobalTrigger( block );
135 else if ( !block->GetDataType().CompareTo("ROOTHIST") ) {
137 fCanvas = CreateCanvas("PVtx/Tr QA", "PrimV");
138 fCanvas->Divide(3, 3);
140 ProcessHistograms( block , fCanvas);
144 ///____________________________________________________________________________
145 void AliHLTEveHLT::UpdateElements() {
146 //See header file for documentation
151 for(Int_t il = 0; il < fNTrackBins; il++) {
152 TEveTrackList * trackList = dynamic_cast<TEveTrackList*>(fTrackLists->FindChild(Form("Tracks_%d", il)));
153 trackList->ElementChanged();
157 if(fPointSetVertex) fPointSetVertex->ResetBBox();
158 if(fTrCanvas) fTrCanvas->Update();
159 if(fVertexCanvas) fVertexCanvas->Update();
160 if(fCanvas) fCanvas->Update();
164 ///_________________________________________________________________________________
165 void AliHLTEveHLT::ResetElements(){
166 //See header file for documentation
168 cout << "destroy"<<endl;
171 for(Int_t il = 0; il < fNTrackBins; il++) {
172 TEveTrackList * trackList = dynamic_cast<TEveTrackList*>(fTrackLists->FindChild(Form("Tracks_%d", il)));
173 trackList->DestroyElements();
181 if(fPointSetVertex) fPointSetVertex->Reset();
182 cout<< "reset done"<<endl;
187 ///_____________________________________________________________________________________
188 void * AliHLTEveHLT::DestroyGarbage(void * arg) {
189 AliHLTEveHLT * hlt = reinterpret_cast<AliHLTEveHLT*>(arg);
190 if(hlt) hlt->DestroyOldTrackList();
193 ///_____________________________________________________________________________________
194 void AliHLTEveHLT::DestroyOldTrackList() {
195 cout << "Destroying the old tracklist's elements"<<endl;
196 fOldTrackList->DestroyElements();
197 cout << "Destroying the old tracklist itself"<<endl;
198 fOldTrackList->Destroy();
201 ///_____________________________________________________________________________________
202 void AliHLTEveHLT::ProcessHistograms(AliHLTHOMERBlockDesc * block, TCanvas * canvas) {
203 //See header file for documentation
205 fTrCanvas = CreateCanvas("ESD", "ESD");
206 fTrCanvas->Divide(4, 2);
210 fVertexCanvas = CreateCanvas("Vtx", "Vtx");
211 fVertexCanvas->Divide(4, 2);
216 if ( ! block->GetClassName().CompareTo("TH1F")) {
217 TH1F* histo = reinterpret_cast<TH1F*>(block->GetTObject());
219 TString name(histo->GetName());
220 cout << "TH1F " <<name << endl;
221 if( !name.CompareTo("primVertexZ") ){
224 }else if( !name.CompareTo("primVertexX") ){
227 }else if( !name.CompareTo("primVertexY") ){
230 } else if ( name.Contains("Track")) {
231 AddHistogramToCanvas(histo, fTrCanvas, fTrCount);
233 AddHistogramToCanvas(histo, fVertexCanvas, fVCount);
236 } else if ( ! block->GetClassName().CompareTo("TH2F")) {
237 TH2F *hista = reinterpret_cast<TH2F*>(block->GetTObject());
239 TString name(hista->GetName());
240 cout << "TH2F " << name << endl;
241 if( !name.CompareTo("primVertexXY")) {
244 } else if ( name.Contains("Track")) {
245 AddHistogramToCanvas(hista, fTrCanvas, fTrCount);
247 AddHistogramToCanvas(hista, fVertexCanvas, fVCount);
254 ///_____________________________________________________________________________________
255 void AliHLTEveHLT::AddHistogramToCanvas(TH1* histogram, TCanvas * canvas, Int_t &cdCount) {
256 canvas->cd(++cdCount);
261 ///________________________________________________________________________________________
262 void AliHLTEveHLT::CreateTrackList() {
263 //See header file for documentation
264 fTrackList = new TEveTrackList("ESD Tracks");
265 fTrackList->SetMainColor(kOrange);
266 AddElement(fTrackList);
269 ///________________________________________________________________________________________
270 void AliHLTEveHLT::CreateTrackLists() {
271 //See header file for documentation
272 fTrackLists = new TEveElementList("ESD Track lists");
273 AddElement(fTrackLists);
274 for(Int_t i = 0; i < 10; i++) {
275 TEveTrackList * trackList = new TEveTrackList(Form("Tracks_%d", i));
276 trackList->SetMainColor(kOrange-i);
277 fTrackLists->AddElement(trackList);
282 ///_________________________________________________________________________________________
283 void AliHLTEveHLT::CreateVertexPointSet() {
284 //See header file for documentation
285 fPointSetVertex = new TEvePointSet("Primary Vertex");
286 fPointSetVertex->SetMainColor(6);
287 fPointSetVertex->SetMarkerStyle((Style_t)kFullStar);
289 AddElement(fPointSetVertex);
292 ///________________________________________________________________________
293 void AliHLTEveHLT::ProcessGlobalTrigger( AliHLTHOMERBlockDesc * block ) {
294 //See header file for documentation
295 AliHLTGlobalTriggerDecision * decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(block->GetTObject());
301 ///______________________________________________________________________
302 void AliHLTEveHLT::ProcessEsdBlock( AliHLTHOMERBlockDesc * block) {
303 //See header file for documentation
305 AliESDEvent* esd = (AliESDEvent *) (block->GetTObject());
308 ProcessEsdEvent(esd);
313 ///_________________________________________________________________________________
314 Color_t AliHLTEveHLT::GetColor(Float_t pt) {
316 Color_t baseColor = kOrange;
318 Float_t binlimit = 0.1;
319 for(Int_t i = 0; i< 10; i++) {
322 return baseColor - i;
327 return baseColor - 9;
331 ///_________________________________________________________________________________
332 Int_t AliHLTEveHLT::GetColorBin(Float_t pt) {
335 Float_t binlimit = 0.1;
336 for(Int_t i = 0; i< 10; i++) {
348 ///____________________________________________________________________
349 void AliHLTEveHLT::ProcessEsdEvent( AliESDEvent * esd ) {
350 //See header file for documentation
351 if(!fPointSetVertex) CreateVertexPointSet();
352 if(!fTrackLists) CreateTrackLists();
354 cout << "ProcessESDEvent() :"<< esd->GetEventNumberInFile()<< " " << esd->GetNumberOfCaloClusters() << " tracks : " << esd->GetNumberOfTracks() << endl;
356 //fEventManager->SetRunNumber(esd->GetRunNumber());
359 const AliESDVertex * esdVertex = esd->GetPrimaryVertex();
362 esdVertex->GetXYZ(vertex);
363 fPointSetVertex->SetNextPoint(vertex[0], vertex[1], vertex[2]);
366 SetUpTrackPropagator(dynamic_cast<TEveTrackList*>(fTrackLists->FirstChild())->GetPropagator(),-0.1*esd->GetMagneticField(), 520);
368 for (Int_t iter = 0; iter < esd->GetNumberOfTracks(); ++iter) {
370 AliESDtrack * esdTrack = dynamic_cast<AliESDtrack*>(esd->GetTrack(iter));
371 FillTrackList(esdTrack);
372 FillHistograms(esdTrack);
375 fHistMult->Fill(esd->GetNumberOfTracks()); // KK
377 //BALLE hardcoded size
378 for(Int_t il = 0; il < fNTrackBins; il++) {
379 TEveTrackList * trackList = dynamic_cast<TEveTrackList*>(fTrackLists->FindChild(Form("Tracks_%d", il)));
380 trackList->MakeTracks();
383 ///__________________________________________________________________________
384 void AliHLTEveHLT::FillTrackList(AliESDtrack * esdTrack) {
385 //See header file for documentation
386 AliEveTrack* track = dynamic_cast<AliEveTrack*>(MakeEsdTrack(esdTrack, dynamic_cast<TEveTrackList*>(fTrackLists->FirstChild())));
387 Int_t bin = GetColorBin(esdTrack->Pt());
388 TEveTrackList * trackList = dynamic_cast<TEveTrackList*>(fTrackLists->FindChild(Form("Tracks_%d", bin)));
390 track->SetAttLineAttMarker(trackList);
391 trackList->AddElement(track);
392 } else cout << "BALLE"<<endl;
398 ///____________________________________________________________________________________
399 void AliHLTEveHLT::FillHistograms(AliESDtrack * esdTrack) {
401 if(esdTrack->GetTPCNcls() == 0) return;
403 fHistEta->Fill(esdTrack->Eta());
404 // fHistTheta->Fill(esdTrack->Theta()*TMath::RadToDeg());
405 fHistPhi->Fill(esdTrack->Phi()*TMath::RadToDeg());
408 Float_t DCAr, DCAz = -99;
409 esdTrack->GetImpactParametersTPC(DCAr, DCAz);
410 fHistDCAr->Fill(DCAr);
413 if(esdTrack->GetStatus()&AliESDtrack::kTPCin || (esdTrack->GetStatus()&AliESDtrack::kTPCin && esdTrack->GetStatus()&AliESDtrack::kITSin)){
414 fHistnClusters->Fill(esdTrack->GetTPCNcls());
418 void AliHLTEveHLT::DrawHistograms(){
419 //See header file for documentation
421 fCanvas = CreateCanvas("PVtx/Tr QA", "Primary vertex, Track QA");
422 fCanvas->Divide(3, 3);
432 fHistnClusters->Draw();
444 AliEveTrack* AliHLTEveHLT::MakeEsdTrack (AliESDtrack *at, TEveTrackList* cont) {
445 //See header file for documentation
451 const double kCLight = 0.000299792458;
452 double bz = - kCLight*10.*( cont->GetPropagator()->GetMagField(0,0,0).fZ);
454 Bool_t innerTaken = kFALSE;
455 if ( ! at->IsOn(AliESDtrack::kITSrefit) && fUseIpOnFailedITS)
457 //tp = at->GetInnerParam();
461 // Add inner/outer track parameters as path-marks.
463 Double_t pbuf[3], vbuf[3];
465 AliExternalTrackParam trackParam = *at;
467 // take parameters constrained to vertex (if they are)
469 if( at->GetConstrainedParam() ){
470 trackParam = *at->GetConstrainedParam();
472 else if( at->GetInnerParam() ){
473 float x = at->GetX();
474 float y = at->GetY();
475 if(sqrt(x*x+y*y)>.5 ) trackParam = *(at->GetInnerParam());
477 if( at->GetStatus()&AliESDtrack::kTRDin ){
478 // transport to TRD in
480 trackParam.PropagateTo( 290.45, -10.*( cont->GetPropagator()->GetMagField(0,0,0).fZ) );
485 rt.fLabel = at->GetLabel();
486 rt.fIndex = (Int_t) at->GetID();
487 rt.fStatus = (Int_t) at->GetStatus();
488 rt.fSign = (Int_t) trackParam.GetSign();
489 trackParam.GetXYZ(vbuf);
490 trackParam.GetPxPyPz(pbuf);
493 Double_t ep = at->GetP(), mc = at->GetMass();
494 rt.fBeta = ep/TMath::Sqrt(ep*ep + mc*mc);
497 AliEveTrack* track = new AliEveTrack(&rt, cont->GetPropagator());
498 track->SetName(Form("AliEveTrack %d", at->GetID()));
499 track->SetElementTitle(CreateTrackTitle(at));
500 track->SetSourceObject(at);
503 // Set reference points along the trajectory
504 // and the last point
507 TEvePathMark startPoint(TEvePathMark::kReference);
508 trackParam.GetXYZ(vbuf);
509 trackParam.GetPxPyPz(pbuf);
510 startPoint.fV.Set(vbuf);
511 startPoint.fP.Set(pbuf);
514 Double_t ep = at->GetP(), mc = at->GetMass();
515 rt.fBeta = ep/TMath::Sqrt(ep*ep + mc*mc);
517 track->AddPathMark( startPoint );
521 if( at->GetOuterParam() && at->GetTPCPoints(2)>80 ){
524 // use AliHLTTPCCATrackParam propagator
525 // since AliExternalTrackParam:PropagateTo()
526 // has an offset at big distances
528 double rot = at->GetOuterParam()->GetAlpha() - trackParam.GetAlpha();
529 double crot = cos(rot), srot = sin(rot);
530 double xEnd = at->GetTPCPoints(2)*crot - at->GetTPCPoints(3)*srot;
531 // take parameters constrained to vertex (if they are)
534 AliHLTTPCCATrackParam t;
535 AliHLTTPCCATrackConvertor::SetExtParam( t, trackParam );
537 Double_t x0 = trackParam.GetX();
538 Double_t dx = xEnd - x0;
542 // set a reference at the half of trajectory for better drawing
545 for( double dxx=dx/2; ok && TMath::Abs(dxx)>=1.; dxx*=.9 ){
547 if( !t.TransportToX(x0+dxx, bz, .999 ) ){
552 AliExternalTrackParam tt;
553 AliHLTTPCCATrackConvertor::GetExtParam( t, tt, trackParam.GetAlpha() );
556 TEvePathMark midPoint(TEvePathMark::kReference);
557 midPoint.fV.Set(vbuf);
558 midPoint.fP.Set(pbuf);
559 track->AddPathMark( midPoint );
565 // Set a reference at the end of the trajectory
566 // and a "decay point", to let the event display know where the track ends
571 if( !t.TransportToX(x0+dx, bz, .999 ) ){
574 if( TMath::Abs(dx)<1. ) break;
582 AliHLTTPCCATrackConvertor::SetExtParam( t, trackParam );
584 AliExternalTrackParam tt;
585 AliHLTTPCCATrackConvertor::GetExtParam( t, tt, trackParam.GetAlpha() );
588 TEvePathMark endPoint(TEvePathMark::kReference);
589 TEvePathMark decPoint(TEvePathMark::kDecay);
590 endPoint.fV.Set(vbuf);
591 endPoint.fP.Set(pbuf);
592 decPoint.fV.Set(vbuf);
593 decPoint.fP.Set(pbuf);
594 track->AddPathMark( endPoint );
595 track->AddPathMark( decPoint );
599 if ( ok && at->IsOn(AliESDtrack::kTPCrefit))
603 AddTrackParamToTrack(track, at->GetInnerParam());
605 AddTrackParamToTrack(track, at->GetOuterParam());
611 void AliHLTEveHLT::SetUpTrackPropagator(TEveTrackPropagator* trkProp, Float_t magF, Float_t maxR) {
612 //See header file for documentation
615 trkProp->SetMagFieldObj(new AliEveMagField);
618 trkProp->SetMagField(magF);
622 trkProp->SetStepper(TEveTrackPropagator::kRungeKutta);
625 trkProp->SetMaxR(maxR);
629 void AliHLTEveHLT::AddTrackParamToTrack(AliEveTrack* track, const AliExternalTrackParam* tp) {
630 //See header file for documentation
635 Double_t pbuf[3], vbuf[3];
639 TEvePathMark pm(TEvePathMark::kReference);
642 track->AddPathMark(pm);
647 TString AliHLTEveHLT::CreateTrackTitle(AliESDtrack* t) {
648 // Add additional track parameters as a path-mark to track.
652 Int_t label = t->GetLabel(), index = t->GetID();
653 TString idx(index == kMinInt ? "<undef>" : Form("%d", index));
654 TString lbl(label == kMinInt ? "<undef>" : Form("%d", label));
659 Double_t pt = t->Pt();
660 Double_t ptsig = TMath::Sqrt(t->GetSigma1Pt2());
661 Double_t ptsq = pt*pt;
662 Double_t ptm = pt / (1.0 + pt*ptsig);
663 Double_t ptM = pt / (1.0 - pt*ptsig);
665 s = Form("Index=%s, Label=%s\nChg=%d, Pdg=%d\n"
666 "pT = %.3f + %.3f - %.3f [%.3f]\n"
667 "P = (%.3f, %.3f, %.3f)\n"
668 "V = (%.3f, %.3f, %.3f)\n",
669 idx.Data(), lbl.Data(), t->Charge(), 0,
670 pt, ptM - pt, pt - ptm, ptsig*ptsq,
675 s += "Det (in,out,refit,pid):\n";
676 o = AliESDtrack::kITSin;
677 s += Form("ITS (%d,%d,%d,%d) ", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
678 o = AliESDtrack::kTPCin;
679 s += Form("TPC(%d,%d,%d,%d)\n", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
680 o = AliESDtrack::kTRDin;
681 s += Form("TRD(%d,%d,%d,%d) ", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
682 o = AliESDtrack::kTOFin;
683 s += Form("TOF(%d,%d,%d,%d)\n", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
684 o = AliESDtrack::kHMPIDout;
685 s += Form("HMPID(out=%d,pid=%d)\n", t->IsOn(o), t->IsOn(o<<1));
686 s += Form("ESD pid=%d", t->IsOn(AliESDtrack::kESDpid));
688 if (t->IsOn(AliESDtrack::kESDpid))
692 s += Form("\n[%.2f %.2f %.2f %.2f %.2f]", pid[0], pid[1], pid[2], pid[3], pid[4]);