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 "TEveManager.h"
26 #include "TEvePointSet.h"
27 #include "TEveTrack.h"
29 #include "AliESDEvent.h"
30 #include "TEveTrackPropagator.h"
31 #include "AliEveTrack.h"
32 #include "TEveVSDStructs.h"
34 #include "TPCLib/tracking-ca/AliHLTTPCCATrackParam.h"
35 #include "TPCLib/tracking-ca/AliHLTTPCCATrackConvertor.h"
36 #include "AliEveMagField.h"
41 ClassImp(AliHLTEveHLT)
43 AliHLTEveHLT::AliHLTEveHLT() :
44 AliHLTEveBase("TPC tracks"),
46 fUseIpOnFailedITS(kFALSE),
47 fUseRkStepper(kFALSE),
50 fPointSetVertex(NULL),
64 AliHLTEveHLT::~AliHLTEveHLT()
66 //Destructor, not implemented
72 void AliHLTEveHLT::ProcessEsdEvent( AliESDEvent * esd ) {
73 //See header file for documentation
74 if(!fTrackList) CreateTrackList();
75 if(!fPointSetVertex) CreateVertexPointSet();
76 ProcessEsdEvent(esd, fTrackList);
79 ///_____________________________________________________________________
80 void AliHLTEveHLT::ProcessBlock(AliHLTHOMERBlockDesc * block) {
81 //See header file for documentation
82 if ( ! block->GetDataType().CompareTo("ALIESDV0") ) {
83 if(!fTrackList) CreateTrackList();
84 if(!fPointSetVertex) CreateVertexPointSet();
85 ProcessEsdBlock(block, fTrackList);
88 else if ( ! block->GetDataType().CompareTo("ROOTTOBJ") ) {
89 //processROOTTOBJ( block, gHLTText );
92 else if ( ! block->GetDataType().CompareTo("HLTRDLST") ) {
93 //processHLTRDLST( block );
96 else if ( !block->GetDataType().CompareTo("ROOTHIST") ) {
98 fCanvas = CreateCanvas("Primary Vertex", "Primary Vertex");
99 fCanvas->Divide(3, 2);
101 ProcessHistograms( block , fCanvas);
105 ///____________________________________________________________________________
106 void AliHLTEveHLT::UpdateElements() {
107 //See header file for documentation
108 //if(fCanvas) fCanvas->Update();
110 if(fTrackList) fTrackList->ElementChanged();
111 if(fPointSetVertex) fPointSetVertex->ResetBBox();
114 ///_________________________________________________________________________________
115 void AliHLTEveHLT::ResetElements(){
116 //See header file for documentation
118 cout << "destroy"<<endl;
120 RemoveElement(fTrackList);
124 if(fPointSetVertex) fPointSetVertex->Reset();
125 cout<< "reset done"<<endl;
130 ///_____________________________________________________________________________________
131 void * AliHLTEveHLT::DestroyGarbage(void * arg) {
132 AliHLTEveHLT * hlt = reinterpret_cast<AliHLTEveHLT*>(arg);
133 if(hlt) hlt->DestroyOldTrackList();
136 ///_____________________________________________________________________________________
137 void AliHLTEveHLT::DestroyOldTrackList() {
138 cout << "Destroying the old tracklist's elements"<<endl;
139 fOldTrackList->DestroyElements();
140 cout << "Destroying the old tracklist itself"<<endl;
141 fOldTrackList->Destroy();
144 ///_____________________________________________________________________________________
145 void AliHLTEveHLT::ProcessHistograms(AliHLTHOMERBlockDesc * block, TCanvas * canvas) {
146 //See header file for documentation
147 if ( ! block->GetClassName().CompareTo("TH1F")) {
148 TH1F* histo = reinterpret_cast<TH1F*>(block->GetTObject());
150 TString name(histo->GetName());
151 if( !name.CompareTo("primVertexZ") ){
154 }else if( !name.CompareTo("primVertexX") ){
157 }else if( !name.CompareTo("primVertexY") ){
162 } else if ( ! block->GetClassName().CompareTo("TH2F")) {
163 TH2F *hista = reinterpret_cast<TH2F*>(block->GetTObject());
165 TString name(hista->GetName());
166 if( !name.CompareTo("primVertexXY")) {
176 void AliHLTEveHLT::CreateTrackList() {
177 //See header file for documentation
178 fTrackList = new TEveTrackList("ESD Tracks");
179 fTrackList->SetMainColor(6);
180 AddElement(fTrackList);
184 void AliHLTEveHLT::CreateVertexPointSet() {
185 //See header file for documentation
186 fPointSetVertex = new TEvePointSet("Primary Vertex");
187 fPointSetVertex->SetMainColor(6);
188 fPointSetVertex->SetMarkerStyle((Style_t)kFullStar);
190 AddElement(fPointSetVertex);
194 void AliHLTEveHLT::ProcessEsdBlock( AliHLTHOMERBlockDesc * block, TEveTrackList * cont ) {
195 //See header file for documentation
197 AliESDEvent* esd = (AliESDEvent *) (block->GetTObject());
200 ProcessEsdEvent(esd, cont);
203 void AliHLTEveHLT::ProcessEsdEvent(AliESDEvent * esd, TEveTrackList * cont) {
205 esd->GetStdContent();
207 cout << esd->GetEventNumberInFile() << " " << esd->GetNumberOfCaloClusters() << endl;
209 //fEventManager->SetRunNumber(esd->GetRunNumber());
212 const AliESDVertex * esdVertex = esd->GetPrimaryVertex();
215 esdVertex->GetXYZ(vertex);
216 fPointSetVertex->SetNextPoint(vertex[0], vertex[1], vertex[2]);
219 SetUpTrackPropagator(cont->GetPropagator(),-0.1*esd->GetMagneticField(), 520);
221 for (Int_t iter = 0; iter < esd->GetNumberOfTracks(); ++iter) {
222 AliEveTrack* track = dynamic_cast<AliEveTrack*>(MakeEsdTrack(esd->GetTrack(iter), cont));
223 cont->AddElement(track);
225 // fHistPt->Fill(esd->GetTrack(iter)->Pt()); // KK
226 // fHistP->Fill(esd->GetTrack(iter)->P()*esd->GetTrack(iter)->Charge());
227 // fHistEta->Fill(esd->GetTrack(iter)->Eta());
228 // fHistTheta->Fill(esd->GetTrack(iter)->Theta()*TMath::RadToDeg());
229 // fHistPhi->Fill(esd->GetTrack(iter)->Phi()*TMath::RadToDeg());
230 // if(esd->GetTrack(iter)->GetStatus()&AliESDtrack::kTPCin || (esd->GetTrack(iter)->GetStatus()&AliESDtrack::kTPCin && esd->GetTrack(iter)->GetStatus()&AliESDtrack::kITSin)){
231 // fHistnClusters->Fill(esd->GetTrack(iter)->GetTPCNcls());
235 //fHistMult->Fill(esd->GetNumberOfTracks()); // KK
238 cont->SetTitle(Form("N=%d", esd->GetNumberOfTracks()) );
245 void AliHLTEveHLT::DrawHistograms(){
246 //See header file for documentation
249 fTrCanvas = CreateCanvas("TPC Tr QA", "TPC Track QA");
250 fTrCanvas->Divide(4, 2);
254 fTrCanvas->cd(icd++);
256 fTrCanvas->cd(icd++);
258 fTrCanvas->cd(icd++);
260 fTrCanvas->cd(icd++);
262 fTrCanvas->cd(icd++);
264 fTrCanvas->cd(icd++);
265 fHistnClusters->Draw();
266 fTrCanvas->cd(icd++);
274 AliEveTrack* AliHLTEveHLT::MakeEsdTrack (AliESDtrack *at, TEveTrackList* cont) {
275 //See header file for documentation
278 const double kCLight = 0.000299792458;
279 double bz = - kCLight*10.*( cont->GetPropagator()->GetMagField(0,0,0).fZ);
281 Bool_t innerTaken = kFALSE;
282 if ( ! at->IsOn(AliESDtrack::kITSrefit) && fUseIpOnFailedITS)
284 //tp = at->GetInnerParam();
288 // Add inner/outer track parameters as path-marks.
290 Double_t pbuf[3], vbuf[3];
292 AliExternalTrackParam trackParam = *at;
294 // take parameters constrained to vertex (if they are)
296 if( at->GetConstrainedParam() ){
297 trackParam = *at->GetConstrainedParam();
299 else if( at->GetInnerParam() ){
300 trackParam = *(at->GetInnerParam());
302 if( at->GetStatus()&AliESDtrack::kTRDin ){
303 // transport to TRD in
305 trackParam.PropagateTo( 290.45, -10.*( cont->GetPropagator()->GetMagField(0,0,0).fZ) );
310 rt.fLabel = at->GetLabel();
311 rt.fIndex = (Int_t) at->GetID();
312 rt.fStatus = (Int_t) at->GetStatus();
313 rt.fSign = (Int_t) trackParam.GetSign();
314 trackParam.GetXYZ(vbuf);
315 trackParam.GetPxPyPz(pbuf);
318 Double_t ep = at->GetP(), mc = at->GetMass();
319 rt.fBeta = ep/TMath::Sqrt(ep*ep + mc*mc);
322 AliEveTrack* track = new AliEveTrack(&rt, cont->GetPropagator());
323 track->SetAttLineAttMarker(cont);
324 track->SetName(Form("AliEveTrack %d", at->GetID()));
325 track->SetElementTitle(CreateTrackTitle(at));
326 track->SetSourceObject(at);
329 // Set reference points along the trajectory
330 // and the last point
333 TEvePathMark startPoint(TEvePathMark::kReference);
334 trackParam.GetXYZ(vbuf);
335 trackParam.GetPxPyPz(pbuf);
336 startPoint.fV.Set(vbuf);
337 startPoint.fP.Set(pbuf);
340 Double_t ep = at->GetP(), mc = at->GetMass();
341 rt.fBeta = ep/TMath::Sqrt(ep*ep + mc*mc);
343 track->AddPathMark( startPoint );
347 if( at->GetTPCPoints(2)>80 ){
350 // use AliHLTTPCCATrackParam propagator
351 // since AliExternalTrackParam:PropagateTo()
352 // has an offset at big distances
355 AliHLTTPCCATrackParam t;
356 AliHLTTPCCATrackConvertor::SetExtParam( t, trackParam );
358 Double_t x0 = trackParam.GetX();
359 Double_t dx = at->GetTPCPoints(2) - x0;
362 // set a reference at the half of trajectory for better drawing
365 for( double dxx=dx/2; TMath::Abs(dxx)>=1.; dxx*=.9 ){
366 if( !t.TransportToX(x0+dxx, bz, .999 ) ) continue;
367 AliHLTTPCCATrackConvertor::GetExtParam( t, trackParam, trackParam.GetAlpha() );
368 trackParam.GetXYZ(vbuf);
369 trackParam.GetPxPyPz(pbuf);
370 TEvePathMark midPoint(TEvePathMark::kReference);
371 midPoint.fV.Set(vbuf);
372 midPoint.fP.Set(pbuf);
373 track->AddPathMark( midPoint );
378 // Set a reference at the end of the trajectory
379 // and a "decay point", to let the event display know where the track ends
382 for( ; TMath::Abs(dx)>=1.; dx*=.9 ){
383 if( !t.TransportToX(x0+dx, bz, .999 ) ) continue;
384 AliHLTTPCCATrackConvertor::GetExtParam( t, trackParam, trackParam.GetAlpha() );
385 trackParam.GetXYZ(vbuf);
386 trackParam.GetPxPyPz(pbuf);
387 TEvePathMark endPoint(TEvePathMark::kReference);
388 TEvePathMark decPoint(TEvePathMark::kDecay);
389 endPoint.fV.Set(vbuf);
390 endPoint.fP.Set(pbuf);
391 decPoint.fV.Set(vbuf);
392 decPoint.fP.Set(pbuf);
393 track->AddPathMark( endPoint );
394 track->AddPathMark( decPoint );
399 if (at->IsOn(AliESDtrack::kTPCrefit))
403 AddTrackParamToTrack(track, at->GetInnerParam());
405 AddTrackParamToTrack(track, at->GetOuterParam());
410 void AliHLTEveHLT::SetUpTrackPropagator(TEveTrackPropagator* trkProp, Float_t magF, Float_t maxR) {
411 //See header file for documentation
414 trkProp->SetMagFieldObj(new AliEveMagField);
417 trkProp->SetMagField(magF);
421 trkProp->SetStepper(TEveTrackPropagator::kRungeKutta);
424 trkProp->SetMaxR(maxR);
428 void AliHLTEveHLT::AddTrackParamToTrack(AliEveTrack* track, const AliExternalTrackParam* tp) {
429 //See header file for documentation
434 Double_t pbuf[3], vbuf[3];
438 TEvePathMark pm(TEvePathMark::kReference);
441 track->AddPathMark(pm);
446 TString AliHLTEveHLT::CreateTrackTitle(AliESDtrack* t) {
447 // Add additional track parameters as a path-mark to track.
451 Int_t label = t->GetLabel(), index = t->GetID();
452 TString idx(index == kMinInt ? "<undef>" : Form("%d", index));
453 TString lbl(label == kMinInt ? "<undef>" : Form("%d", label));
458 Double_t pt = t->Pt();
459 Double_t ptsig = TMath::Sqrt(t->GetSigma1Pt2());
460 Double_t ptsq = pt*pt;
461 Double_t ptm = pt / (1.0 + pt*ptsig);
462 Double_t ptM = pt / (1.0 - pt*ptsig);
464 s = Form("Index=%s, Label=%s\nChg=%d, Pdg=%d\n"
465 "pT = %.3f + %.3f - %.3f [%.3f]\n"
466 "P = (%.3f, %.3f, %.3f)\n"
467 "V = (%.3f, %.3f, %.3f)\n",
468 idx.Data(), lbl.Data(), t->Charge(), 0,
469 pt, ptM - pt, pt - ptm, ptsig*ptsq,
474 s += "Det (in,out,refit,pid):\n";
475 o = AliESDtrack::kITSin;
476 s += Form("ITS (%d,%d,%d,%d) ", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
477 o = AliESDtrack::kTPCin;
478 s += Form("TPC(%d,%d,%d,%d)\n", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
479 o = AliESDtrack::kTRDin;
480 s += Form("TRD(%d,%d,%d,%d) ", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
481 o = AliESDtrack::kTOFin;
482 s += Form("TOF(%d,%d,%d,%d)\n", t->IsOn(o), t->IsOn(o<<1), t->IsOn(o<<2), t->IsOn(o<<3));
483 o = AliESDtrack::kHMPIDout;
484 s += Form("HMPID(out=%d,pid=%d)\n", t->IsOn(o), t->IsOn(o<<1));
485 s += Form("ESD pid=%d", t->IsOn(AliESDtrack::kESDpid));
487 if (t->IsOn(AliESDtrack::kESDpid))
491 s += Form("\n[%.2f %.2f %.2f %.2f %.2f]", pid[0], pid[1], pid[2], pid[3], pid[4]);