-/**************************************************************************\r
- * This file is property of and copyright by the ALICE HLT Project *\r
- * ALICE Experiment at CERN, All rights reserved. *\r
- * *\r
- * Primary Authors: Svein Lindal <slindal@fys.uio.no > *\r
- * for The ALICE HLT Project. *\r
- * *\r
- * Permission to use, copy, modify and distribute this software and its *\r
- * documentation strictly for non-commercial purposes is hereby granted *\r
- * without fee, provided that the above copyright notice appears in all *\r
- * copies and that both the copyright notice and this permission notice *\r
- * appear in the supporting documentation. The authors make no claims *\r
- * about the suitability of this software for any purpose. It is *\r
- * provided "as is" without express or implied warranty. *\r
- **************************************************************************/\r
-\r
-/// @file AliHLTEvePhos.cxx\r
-/// @author Svein Lindal <slindal@fys.uio.no>\r
-/// @brief Muon processor for the HLT EVE display\r
-\r
-#include "AliHLTEveMuon.h"\r
-#include "AliHLTMUONDataBlockReader.h"\r
-#include "AliHLTHOMERBlockDesc.h"\r
-#include "TCanvas.h"\r
-#include "TEveStraightLineSet.h"\r
-#include "TEvePointSet.h"\r
-#include "AliEveHLTEventManager.h"\r
-#include "TEveManager.h"\r
-\r
-\r
-#include "TEveVSDStructs.h"\r
-#include "TGeoGlobalMagField.h"\r
-#include "AliMUONTrack.h"\r
-#include "AliMUONTrackParam.h"\r
-#include "AliMUONESDInterface.h"\r
-#include "AliMUONVTrackReconstructor.h"\r
-#include "AliEveMUONTrack.h"\r
-#include "AliHLTMUONConstants.h"\r
-#include "AliHLTMUONUtils.h"\r
-#include "AliMUONVCluster.h"\r
-#include "AliMUONVClusterStore.h"\r
-#include "AliMUONConstants.h"\r
-#include "TEveTrackPropagator.h"\r
-\r
-using namespace std;\r
-\r
-class AliHLTMUONUtils;\r
-class AliEveMuonTrack;\r
-\r
-ClassImp(AliHLTEveMuon);\r
-\r
-AliHLTEveMuon::AliHLTEveMuon() : \r
- AliHLTEveBase("Muon"),\r
- fFullTrackList(NULL),\r
- fTracks(NULL),\r
- fClusters(NULL)\r
-{\r
- // Constructor.\r
- SetMaxHistograms(6);\r
-}\r
-\r
-AliHLTEveMuon::~AliHLTEveMuon()\r
-{\r
- //Destructor\r
- if (fFullTrackList)\r
- delete fFullTrackList;\r
- fFullTrackList = NULL;\r
- \r
- if (fTracks)\r
- delete fTracks;\r
- fTracks = NULL;\r
-\r
- if(fClusters)\r
- delete fClusters;\r
- fClusters = NULL;\r
-}\r
-\r
-\r
-void AliHLTEveMuon::ProcessBlock(AliHLTHOMERBlockDesc * block) {\r
- //See header file for documentation\r
- if ( (block->GetDataType().CompareTo("RECHITS") == 0) || (block->GetDataType().CompareTo("TRIGRECS") == 0) ) {\r
- if(!fClusters) {\r
- fClusters = CreateClusters();\r
- AddElement(fClusters);\r
- }\r
- ProcessClusters( block, fClusters );\r
- \r
- }else if(block->GetDataType().CompareTo("MANTRACK") == 0){\r
- \r
- if ( !fTracks ) {\r
- fTracks = CreateTrackSet(); \r
- AddElement(fTracks);\r
- }\r
- \r
- ProcessTracks( block, fTracks );\r
-\r
- }else if(block->GetDataType().CompareTo("TRACKS") == 0){\r
- \r
- if ( !fFullTrackList ) {\r
- fFullTrackList = CreateFullTrackList(); \r
- AddElement(fFullTrackList);\r
- }\r
- \r
- ProcessFullTracks( block, fFullTrackList );\r
-\r
- } else if(block->GetDataType().CompareTo("ROOTHIST") == 0) {\r
- ProcessHistogram(block);\r
- }\r
- \r
-}\r
-\r
-TEvePointSet * AliHLTEveMuon::CreateClusters() {\r
- //See header file for documentation\r
- TEvePointSet * ps = new TEvePointSet("MUON RecHits");\r
- ps->SetMainColor(kBlue);\r
- ps->SetMarkerStyle(20);\r
- return ps;\r
-}\r
-\r
-TEveStraightLineSet * AliHLTEveMuon::CreateTrackSet() {\r
- // See header file\r
- TEveStraightLineSet * lineset = new TEveStraightLineSet("MUON Tracks");\r
- lineset->SetMainColor(kRed);\r
- lineset->SetLineWidth(3);\r
- return lineset;\r
-}\r
-\r
-TEveTrackList * AliHLTEveMuon::CreateFullTrackList(){\r
- // See header file\r
- TEveTrackList * lineset = new TEveTrackList("MUON Full Tracks");\r
- lineset->SetMainColor(kBlue);\r
- return lineset;\r
-}\r
-\r
-void AliHLTEveMuon::ProcessHistogram(AliHLTHOMERBlockDesc * block ) {\r
- //See header file for documentation\r
- if(!fCanvas) {\r
- fCanvas = CreateCanvas("MUON QA", "MUON QA");\r
- fCanvas->Divide(3, 2);\r
- }\r
- AddHistogramsToCanvas(block, fCanvas, fHistoCount);\r
-}\r
-\r
-void AliHLTEveMuon::UpdateElements() {\r
- //See header file for documentation\r
- if(fCanvas) fCanvas->Update();\r
- if(fClusters) fClusters->ResetBBox();\r
- if(fTracks) fTracks->ElementChanged();\r
-}\r
-\r
-void AliHLTEveMuon::ResetElements(){\r
- //See header file for documentation\r
- fHistoCount = 0;\r
- \r
- if ( fClusters ) fClusters->Reset();\r
- if ( fTracks ){\r
- fTracks->Destroy();\r
- fTracks = NULL;\r
- }\r
- if ( fFullTrackList ){\r
- fFullTrackList->Destroy();\r
- fFullTrackList = NULL;\r
- }\r
-\r
-\r
-}\r
-\r
-void AliHLTEveMuon::ProcessClusters(AliHLTHOMERBlockDesc * block, TEvePointSet * clusters) {\r
- //See header file for documentation\r
- unsigned long size = block->GetSize();\r
- Int_t * buffer ;\r
- \r
- buffer = (Int_t *)block->GetData();\r
- //cout<<"block size : "<<size<<", buffer : "<<buffer<<", DataType : "<<block->GetDataType()<<endl;\r
-\r
- if(block->GetDataType().CompareTo("RECHITS") == 0){\r
- \r
- AliHLTMUONRecHitsBlockReader trackblock((char*)buffer, size);\r
- const AliHLTMUONRecHitStruct* hit = trackblock.GetArray();\r
- \r
- for(AliHLTUInt32_t ientry = 0; ientry < trackblock.Nentries(); ientry++){\r
- if(hit->fX!=0.0 && hit->fY!=0.0 && hit->fZ!=0.0)\r
- clusters->SetNextPoint(hit->fX,hit->fY,hit->fZ);\r
- hit++;\r
- \r
- }// track hit loop\r
- }\r
- \r
- else{// if rechits\r
- // if(!strcmp((BlockType(ULong64_t(reader->GetBlockDataType(i)))).Data(),"TRIGRECS")){\r
- \r
- AliHLTMUONTriggerRecordsBlockReader trigblock(buffer, size);\r
- const AliHLTMUONTriggerRecordStruct* trigrec = trigblock.GetArray();\r
- for(AliHLTUInt32_t ientry = 0; ientry < trigblock.Nentries(); ientry++){\r
- \r
- const AliHLTMUONRecHitStruct* hit = &trigrec->fHit[0];\r
- for(AliHLTUInt32_t ch = 0; ch < 4; ch++)\r
- {\r
- if(hit->fX!=0.0 && hit->fY!=0.0 && hit->fZ!=0.0)\r
- clusters->SetNextPoint(hit->fX,hit->fY,hit->fZ);\r
- hit++;\r
- }// trig chamber loop\r
- trigrec++;\r
- }//trig hit loop\r
- }//else trigger\r
- \r
-}\r
-\r
-void AliHLTEveMuon::ProcessTracks(AliHLTHOMERBlockDesc * block, TEveStraightLineSet * tracks) {\r
- //See header file for documentation \r
- unsigned long size = block->GetSize();\r
- Int_t * buffer = (Int_t *)block->GetData();\r
- AliHLTMUONRecHitStruct hit1,hit2;\r
- hit1.fX = hit1.fY = hit1.fZ = hit2.fX = hit2.fY = hit2.fZ = 0;\r
- Int_t ch1=0, ch2=0;\r
- Float_t x0=0.0,y0=0.0,z0=0.0;\r
- Float_t x3=0.0,y3=0.0,z3=0.0;\r
- if(block->GetDataType().CompareTo("MANTRACK") == 0){ \r
- AliHLTMUONMansoTracksBlockReader mantrackblock(buffer, size);\r
- const AliHLTMUONMansoTrackStruct* mtrack = mantrackblock.GetArray();\r
- for(AliHLTUInt32_t ientry = 0; ientry < mantrackblock.Nentries(); ientry++){\r
- const AliHLTMUONRecHitStruct* hit = &mtrack->fHit[0];\r
- for(AliHLTUInt32_t ch = 0; ch < 4; ch++){\r
- // cout << setw(10) << left << ch + 7 << setw(0);\r
- // cout << setw(13) << left << hit->fX << setw(0);\r
- // cout << setw(13) << left << hit->fY << setw(0);\r
- // cout << hit->fZ << setw(0) << endl;\r
- if(hit->fZ != 0.0){\r
- if(ch==0 || ch==1){\r
- hit1 = *hit; ch1 = ch+6;\r
- }else{\r
- hit2 = *hit; ch2 = ch+6;\r
- }\r
- }\r
- hit++;\r
- }// trig chamber loop\r
- // printf("ch : %d, (X,Y,Z) : (%f,%f,%f)\n",ch1,hit1.fX,hit1.fY,hit1.fZ);\r
- // printf("ch : %d, (X,Y,Z) : (%f,%f,%f)\n",ch2,hit2.fX,hit2.fY,hit2.fZ);\r
- // meminfo();\r
- z3 = AliMUONConstants::DefaultChamberZ(ch2+4);\r
- y3 = hit1.fY - (hit1.fZ-z3)*(hit1.fY - hit2.fY)/(hit1.fZ - hit2.fZ) ;\r
- x3 = hit1.fX - (hit1.fZ-z3)*(hit1.fX - hit2.fX)/(hit1.fZ - hit2.fZ) ;\r
-\r
- z0 = AliMUONConstants::DefaultChamberZ(ch1);\r
- y0 = hit1.fY - (hit1.fZ-z0)*(hit1.fY - hit2.fY)/(hit1.fZ - hit2.fZ) ;\r
- x0 = hit1.fX - (hit1.fZ-z0)*(hit1.fX - hit2.fX)/(hit1.fZ - hit2.fZ) ;\r
- \r
-\r
- tracks->AddLine(x0,y0,z0,x3,y3,z3);\r
- mtrack++;\r
- }\r
- // cout<<"NofManso Tracks : "<<mantrackblock.Nentries()<<endl;\r
- }\r
-}\r
-\r
-int AliHLTEveMuon::MakeMUONTrack(AliMUONTrack *muonTrack, const AliHLTMUONTrackStruct *muonHLTTrack)\r
-{\r
- // See header for documentation\r
- AliHLTUInt32_t clusterIndex = 0; // for the cluster unique ID. \r
- AliHLTMUONParticleSign sign;\r
- bool hitset[16];\r
- AliHLTMUONUtils::UnpackTrackFlags(\r
- muonHLTTrack->fFlags, sign, hitset\r
- );\r
- \r
- // add track parameters at vertex\r
- TVector3 mom(muonHLTTrack->fPx, muonHLTTrack->fPy, muonHLTTrack->fPz);\r
- AliMUONTrackParam paramAtVtx;\r
- if (mom.Mag() != 0)\r
- paramAtVtx.SetInverseBendingMomentum(muonHLTTrack->fInverseBendingMomentum);\r
- else\r
- paramAtVtx.SetInverseBendingMomentum(0.);\r
- paramAtVtx.SetNonBendingSlope(TMath::Tan(muonHLTTrack->fThetaX));\r
- paramAtVtx.SetBendingSlope(TMath::Tan(muonHLTTrack->fThetaY));\r
- paramAtVtx.SetZ(muonHLTTrack->fZ);\r
- paramAtVtx.SetBendingCoor(muonHLTTrack->fY);\r
- paramAtVtx.SetNonBendingCoor(muonHLTTrack->fX);\r
- muonTrack->SetTrackParamAtVertex(¶mAtVtx);\r
-\r
- //printf("(X,Y,Z) : (%8.3f,%8.3f,%8.3f)\n",muonHLTTrack->fX,muonHLTTrack->fY,muonHLTTrack->fZ);\r
-\r
- // add clusters\r
- Int_t nHits = 0;\r
- AliMUONVClusterStore* cStore = AliMUONESDInterface::NewClusterStore();\r
- if (!cStore) return -1;\r
- AliMUONVCluster* cluster = cStore->CreateCluster(0,0,0);\r
- AliMUONTrackParam trackParam;\r
- for (int i = 0; i < 16; i++)\r
- {\r
- if (not hitset[i]) continue;\r
- \r
- AliHLTUInt8_t chamber;\r
- AliHLTUInt16_t detElemId;\r
- AliHLTMUONUtils::UnpackRecHitFlags((muonHLTTrack->fHit[i]).fFlags, chamber, detElemId);\r
- \r
- cluster->SetUniqueID(AliMUONVCluster::BuildUniqueID(chamber, detElemId, clusterIndex++));\r
- cluster->SetXYZ((muonHLTTrack->fHit[i]).fX, (muonHLTTrack->fHit[i]).fY, (muonHLTTrack->fHit[i]).fZ);\r
- cluster->SetErrXY( // Use nominal values.\r
- AliHLTMUONConstants::DefaultNonBendingReso(),\r
- AliHLTMUONConstants::DefaultBendingReso()\r
- );\r
- cluster->SetCharge(-1.); // Indicate no total charge calculated.\r
- cluster->SetChi2(-1.); // Indicate no fit made.\r
- trackParam.SetZ(cluster->GetZ());\r
- muonTrack->AddTrackParamAtCluster(trackParam, *cluster, kTRUE);\r
- nHits++;\r
- }\r
- \r
- // compute track parameters at each cluster\r
- if (nHits > 0) {\r
- AliMUONTrackParam *firstTrackParam = (AliMUONTrackParam*) muonTrack->GetTrackParamAtCluster()->First();\r
- trackParam = (*firstTrackParam);\r
- if (!AliMUONESDInterface::GetTracker()) AliMUONESDInterface::ResetTracker();\r
- if (!AliMUONESDInterface::GetTracker()->RefitTrack(*muonTrack, kFALSE) &&\r
- muonTrack->GetGlobalChi2() < AliMUONTrack::MaxChi2()) {\r
- *firstTrackParam = trackParam;\r
- muonTrack->UpdateCovTrackParamAtCluster();\r
- }\r
- }\r
-\r
- muonTrack->SetGlobalChi2(muonHLTTrack->fChi2);\r
- \r
- return 0;\r
-}\r
-\r
-Int_t AliHLTEveMuon::ProcessFullTracks(AliHLTHOMERBlockDesc * block, TEveTrackList * fullTracks) {\r
-\r
- // See header for documentation \r
-\r
- Int_t iResult = 0;\r
-\r
- Double_t b[3], x[3];\r
- x[0] = 0.0 ; x[1] = 0.0 ; x[2] = -950.0;\r
- TGeoGlobalMagField::Instance()->Field(x,b);\r
- //" Field at (0.0, 0.0, -950.0) [at the middle of dipole magnet] \r
- //should be (6.79, 0.03, -0.17) or similar value with change of sign"\r
- if(TMath::AreEqualAbs(b[0],0.0,1.0e-5) and TMath::AreEqualAbs(b[1],0.0,1.0e-5) and TMath::AreEqualAbs(b[2],0.0,1.0e-5)){\r
- printf("At (X,Y,Z) : (%6.2lf,%6.2lf,%6.2lf) Field (Bx,By,Bz) is (%6.2lf,%6.2lf,%6.2lf)\n",\r
- x[0],x[1],x[2],b[0],b[1],b[2]); \r
- cerr<<"Magnetic field is not properly set, MUON tracking will not possble"<<endl;\r
- return 1;\r
- }\r
- \r
- \r
-\r
- TEveRecTrack rt;\r
- \r
- unsigned long size = block->GetSize();\r
- Int_t * buffer = (Int_t *)block->GetData();\r
-\r
- AliHLTMUONTracksBlockReader muontrackblock(buffer, size);\r
- const AliHLTMUONTrackStruct* mtrack = muontrackblock.GetArray();\r
- //cout<<"NofTracks : "<<muontrackblock.Nentries()<<endl;\r
- for(AliHLTUInt32_t ientry = 0; ientry < muontrackblock.Nentries(); ientry++){\r
- \r
- AliMUONTrack *muonTrack = new AliMUONTrack();\r
- MakeMUONTrack(muonTrack,mtrack);\r
- if(muonTrack->GetNClusters()==0){\r
- delete muonTrack;\r
- continue;\r
- }\r
- \r
- rt.fLabel = ientry;\r
- AliEveMUONTrack* track = new AliEveMUONTrack(&rt, fullTracks->GetPropagator());\r
- track->MakeMUONTrack(muonTrack);\r
- //track->SetTitle(Form("HLT Track : %d, pt : %lf",ientry,TMath::Sqrt(((mtrack->fPx * mtrack->fPx) + (mtrack->fPy * mtrack->fPy)))));\r
- track->SetName(Form("HLT Track : %d, pt : %lf",ientry,TMath::Sqrt(((mtrack->fPx * mtrack->fPx) + (mtrack->fPy * mtrack->fPy)))));\r
- fullTracks->AddElement(track);\r
- \r
- mtrack++;\r
- }//track loop\r
- \r
- return iResult;\r
-\r
-}\r
+/**************************************************************************
+ * This file is property of and copyright by the ALICE HLT Project *
+ * ALICE Experiment at CERN, All rights reserved. *
+ * *
+ * Primary Authors: Svein Lindal <slindal@fys.uio.no > *
+ * for The ALICE HLT Project. *
+ * *
+ * Permission to use, copy, modify and distribute this software and its *
+ * documentation strictly for non-commercial purposes is hereby granted *
+ * without fee, provided that the above copyright notice appears in all *
+ * copies and that both the copyright notice and this permission notice *
+ * appear in the supporting documentation. The authors make no claims *
+ * about the suitability of this software for any purpose. It is *
+ * provided "as is" without express or implied warranty. *
+ **************************************************************************/
+
+/// @file AliHLTEvePhos.cxx
+/// @author Svein Lindal <slindal@fys.uio.no>
+/// @brief Muon processor for the HLT EVE display
+
+#include "AliHLTEveMuon.h"
+#include "AliHLTMUONDataBlockReader.h"
+#include "AliHLTHOMERBlockDesc.h"
+#include "TCanvas.h"
+#include "TEveStraightLineSet.h"
+#include "TEvePointSet.h"
+#include "AliEveHLTEventManager.h"
+#include "TEveManager.h"
+
+
+#include "TEveVSDStructs.h"
+#include "TGeoGlobalMagField.h"
+#include "AliMUONTrack.h"
+#include "AliMUONTrackParam.h"
+#include "AliMUONESDInterface.h"
+#include "AliMUONVTrackReconstructor.h"
+#include "AliEveMUONTrack.h"
+#include "AliHLTMUONConstants.h"
+#include "AliHLTMUONUtils.h"
+#include "AliMUONVCluster.h"
+#include "AliMUONVClusterStore.h"
+#include "AliMUONConstants.h"
+#include "TEveTrackPropagator.h"
+
+using namespace std;
+
+class AliHLTMUONUtils;
+class AliEveMuonTrack;
+
+ClassImp(AliHLTEveMuon);
+
+AliHLTEveMuon::AliHLTEveMuon() :
+ AliHLTEveBase("Muon"),
+ fFullTrackList(NULL),
+ fTracks(NULL),
+ fClusters(NULL)
+{
+ // Constructor.
+ SetMaxHistograms(6);
+}
+
+AliHLTEveMuon::~AliHLTEveMuon()
+{
+ //Destructor
+ if (fFullTrackList)
+ delete fFullTrackList;
+ fFullTrackList = NULL;
+
+ if (fTracks)
+ delete fTracks;
+ fTracks = NULL;
+
+ if(fClusters)
+ delete fClusters;
+ fClusters = NULL;
+}
+
+
+void AliHLTEveMuon::ProcessBlock(AliHLTHOMERBlockDesc * block) {
+ //See header file for documentation
+ if ( (block->GetDataType().CompareTo("RECHITS") == 0) || (block->GetDataType().CompareTo("TRIGRECS") == 0) ) {
+ if(!fClusters) {
+ fClusters = CreateClusters();
+ AddElement(fClusters);
+ }
+ ProcessClusters( block, fClusters );
+
+ }else if(block->GetDataType().CompareTo("MANTRACK") == 0){
+
+ if ( !fTracks ) {
+ fTracks = CreateTrackSet();
+ AddElement(fTracks);
+ }
+
+ ProcessTracks( block, fTracks );
+
+ }else if(block->GetDataType().CompareTo("TRACKS") == 0){
+
+ if ( !fFullTrackList ) {
+ fFullTrackList = CreateFullTrackList();
+ AddElement(fFullTrackList);
+ }
+
+ ProcessFullTracks( block, fFullTrackList );
+
+ } else if(block->GetDataType().CompareTo("ROOTHIST") == 0) {
+ ProcessHistogram(block);
+ }
+
+}
+
+TEvePointSet * AliHLTEveMuon::CreateClusters() {
+ //See header file for documentation
+ TEvePointSet * ps = new TEvePointSet("MUON RecHits");
+ ps->SetMainColor(kBlue);
+ ps->SetMarkerStyle(20);
+ return ps;
+}
+
+TEveStraightLineSet * AliHLTEveMuon::CreateTrackSet() {
+ // See header file
+ TEveStraightLineSet * lineset = new TEveStraightLineSet("MUON Tracks");
+ lineset->SetMainColor(kRed);
+ lineset->SetLineWidth(3);
+ return lineset;
+}
+
+TEveTrackList * AliHLTEveMuon::CreateFullTrackList(){
+ // See header file
+ TEveTrackList * lineset = new TEveTrackList("MUON Full Tracks");
+ lineset->SetMainColor(kBlue);
+ return lineset;
+}
+
+void AliHLTEveMuon::ProcessHistogram(AliHLTHOMERBlockDesc * block ) {
+ //See header file for documentation
+ if(!fCanvas) {
+ fCanvas = CreateCanvas("MUON QA", "MUON QA");
+ fCanvas->Divide(3, 2);
+ }
+ AddHistogramsToCanvas(block, fCanvas, fHistoCount);
+}
+
+void AliHLTEveMuon::UpdateElements() {
+ //See header file for documentation
+ if(fCanvas) fCanvas->Update();
+ if(fClusters) fClusters->ResetBBox();
+ if(fTracks) fTracks->ElementChanged();
+}
+
+void AliHLTEveMuon::ResetElements(){
+ //See header file for documentation
+ fHistoCount = 0;
+
+ if ( fClusters ) fClusters->Reset();
+ if ( fTracks ){
+ fTracks->Destroy();
+ fTracks = NULL;
+ }
+ if ( fFullTrackList ){
+ fFullTrackList->Destroy();
+ fFullTrackList = NULL;
+ }
+
+
+}
+
+void AliHLTEveMuon::ProcessClusters(AliHLTHOMERBlockDesc * block, TEvePointSet * clusters) {
+ //See header file for documentation
+ unsigned long size = block->GetSize();
+ Int_t * buffer ;
+
+ buffer = (Int_t *)block->GetData();
+ //cout<<"block size : "<<size<<", buffer : "<<buffer<<", DataType : "<<block->GetDataType()<<endl;
+
+ if(block->GetDataType().CompareTo("RECHITS") == 0){
+
+ AliHLTMUONRecHitsBlockReader trackblock((char*)buffer, size);
+ const AliHLTMUONRecHitStruct* hit = trackblock.GetArray();
+
+ for(AliHLTUInt32_t ientry = 0; ientry < trackblock.Nentries(); ientry++){
+ if(hit->fX!=0.0 && hit->fY!=0.0 && hit->fZ!=0.0)
+ clusters->SetNextPoint(hit->fX,hit->fY,hit->fZ);
+ hit++;
+
+ }// track hit loop
+ }
+
+ else{// if rechits
+ // if(!strcmp((BlockType(ULong64_t(reader->GetBlockDataType(i)))).Data(),"TRIGRECS")){
+
+ AliHLTMUONTriggerRecordsBlockReader trigblock(buffer, size);
+ const AliHLTMUONTriggerRecordStruct* trigrec = trigblock.GetArray();
+ for(AliHLTUInt32_t ientry = 0; ientry < trigblock.Nentries(); ientry++){
+
+ const AliHLTMUONRecHitStruct* hit = &trigrec->fHit[0];
+ for(AliHLTUInt32_t ch = 0; ch < 4; ch++)
+ {
+ if(hit->fX!=0.0 && hit->fY!=0.0 && hit->fZ!=0.0)
+ clusters->SetNextPoint(hit->fX,hit->fY,hit->fZ);
+ hit++;
+ }// trig chamber loop
+ trigrec++;
+ }//trig hit loop
+ }//else trigger
+
+}
+
+void AliHLTEveMuon::ProcessTracks(AliHLTHOMERBlockDesc * block, TEveStraightLineSet * tracks) {
+ //See header file for documentation
+ unsigned long size = block->GetSize();
+ Int_t * buffer = (Int_t *)block->GetData();
+ AliHLTMUONRecHitStruct hit1,hit2;
+ hit1.fX = hit1.fY = hit1.fZ = hit2.fX = hit2.fY = hit2.fZ = 0;
+ Int_t ch1=0, ch2=0;
+ Float_t x0=0.0,y0=0.0,z0=0.0;
+ Float_t x3=0.0,y3=0.0,z3=0.0;
+ if(block->GetDataType().CompareTo("MANTRACK") == 0){
+ AliHLTMUONMansoTracksBlockReader mantrackblock(buffer, size);
+ const AliHLTMUONMansoTrackStruct* mtrack = mantrackblock.GetArray();
+ for(AliHLTUInt32_t ientry = 0; ientry < mantrackblock.Nentries(); ientry++){
+ const AliHLTMUONRecHitStruct* hit = &mtrack->fHit[0];
+ for(AliHLTUInt32_t ch = 0; ch < 4; ch++){
+ // cout << setw(10) << left << ch + 7 << setw(0);
+ // cout << setw(13) << left << hit->fX << setw(0);
+ // cout << setw(13) << left << hit->fY << setw(0);
+ // cout << hit->fZ << setw(0) << endl;
+ if(hit->fZ != 0.0){
+ if(ch==0 || ch==1){
+ hit1 = *hit; ch1 = ch+6;
+ }else{
+ hit2 = *hit; ch2 = ch+6;
+ }
+ }
+ hit++;
+ }// trig chamber loop
+ // printf("ch : %d, (X,Y,Z) : (%f,%f,%f)\n",ch1,hit1.fX,hit1.fY,hit1.fZ);
+ // printf("ch : %d, (X,Y,Z) : (%f,%f,%f)\n",ch2,hit2.fX,hit2.fY,hit2.fZ);
+ // meminfo();
+ z3 = AliMUONConstants::DefaultChamberZ(ch2+4);
+ y3 = hit1.fY - (hit1.fZ-z3)*(hit1.fY - hit2.fY)/(hit1.fZ - hit2.fZ) ;
+ x3 = hit1.fX - (hit1.fZ-z3)*(hit1.fX - hit2.fX)/(hit1.fZ - hit2.fZ) ;
+
+ z0 = AliMUONConstants::DefaultChamberZ(ch1);
+ y0 = hit1.fY - (hit1.fZ-z0)*(hit1.fY - hit2.fY)/(hit1.fZ - hit2.fZ) ;
+ x0 = hit1.fX - (hit1.fZ-z0)*(hit1.fX - hit2.fX)/(hit1.fZ - hit2.fZ) ;
+
+
+ tracks->AddLine(x0,y0,z0,x3,y3,z3);
+ mtrack++;
+ }
+ // cout<<"NofManso Tracks : "<<mantrackblock.Nentries()<<endl;
+ }
+}
+
+int AliHLTEveMuon::MakeMUONTrack(AliMUONTrack *muonTrack, const AliHLTMUONTrackStruct *muonHLTTrack)
+{
+ // See header for documentation
+ AliHLTUInt32_t clusterIndex = 0; // for the cluster unique ID.
+ AliHLTMUONParticleSign sign;
+ bool hitset[16];
+ AliHLTMUONUtils::UnpackTrackFlags(
+ muonHLTTrack->fFlags, sign, hitset
+ );
+
+ // add track parameters at vertex
+ TVector3 mom(muonHLTTrack->fPx, muonHLTTrack->fPy, muonHLTTrack->fPz);
+ AliMUONTrackParam paramAtVtx;
+ if (mom.Mag() != 0)
+ paramAtVtx.SetInverseBendingMomentum(muonHLTTrack->fInverseBendingMomentum);
+ else
+ paramAtVtx.SetInverseBendingMomentum(0.);
+ paramAtVtx.SetNonBendingSlope(TMath::Tan(muonHLTTrack->fThetaX));
+ paramAtVtx.SetBendingSlope(TMath::Tan(muonHLTTrack->fThetaY));
+ paramAtVtx.SetZ(muonHLTTrack->fZ);
+ paramAtVtx.SetBendingCoor(muonHLTTrack->fY);
+ paramAtVtx.SetNonBendingCoor(muonHLTTrack->fX);
+ muonTrack->SetTrackParamAtVertex(¶mAtVtx);
+
+ //printf("(X,Y,Z) : (%8.3f,%8.3f,%8.3f)\n",muonHLTTrack->fX,muonHLTTrack->fY,muonHLTTrack->fZ);
+
+ // add clusters
+ Int_t nHits = 0;
+ AliMUONVClusterStore* cStore = AliMUONESDInterface::NewClusterStore();
+ if (!cStore) return -1;
+ AliMUONVCluster* cluster = cStore->CreateCluster(0,0,0);
+ AliMUONTrackParam trackParam;
+ for (int i = 0; i < 16; i++)
+ {
+ if (not hitset[i]) continue;
+
+ AliHLTUInt8_t chamber;
+ AliHLTUInt16_t detElemId;
+ AliHLTMUONUtils::UnpackRecHitFlags((muonHLTTrack->fHit[i]).fFlags, chamber, detElemId);
+
+ cluster->SetUniqueID(AliMUONVCluster::BuildUniqueID(chamber, detElemId, clusterIndex++));
+ cluster->SetXYZ((muonHLTTrack->fHit[i]).fX, (muonHLTTrack->fHit[i]).fY, (muonHLTTrack->fHit[i]).fZ);
+ cluster->SetErrXY( // Use nominal values.
+ AliHLTMUONConstants::DefaultNonBendingReso(),
+ AliHLTMUONConstants::DefaultBendingReso()
+ );
+ cluster->SetCharge(-1.); // Indicate no total charge calculated.
+ cluster->SetChi2(-1.); // Indicate no fit made.
+ trackParam.SetZ(cluster->GetZ());
+ muonTrack->AddTrackParamAtCluster(trackParam, *cluster, kTRUE);
+ nHits++;
+ }
+
+ // compute track parameters at each cluster
+ if (nHits > 0) {
+ AliMUONTrackParam *firstTrackParam = (AliMUONTrackParam*) muonTrack->GetTrackParamAtCluster()->First();
+ trackParam = (*firstTrackParam);
+ if (!AliMUONESDInterface::GetTracker()) AliMUONESDInterface::ResetTracker();
+ if (!AliMUONESDInterface::GetTracker()->RefitTrack(*muonTrack, kFALSE) &&
+ muonTrack->GetGlobalChi2() < AliMUONTrack::MaxChi2()) {
+ *firstTrackParam = trackParam;
+ muonTrack->UpdateCovTrackParamAtCluster();
+ }
+ }
+
+ muonTrack->SetGlobalChi2(muonHLTTrack->fChi2);
+
+ return 0;
+}
+
+Int_t AliHLTEveMuon::ProcessFullTracks(AliHLTHOMERBlockDesc * block, TEveTrackList * fullTracks) {
+
+ // See header for documentation
+
+ Int_t iResult = 0;
+
+ Double_t b[3], x[3];
+ x[0] = 0.0 ; x[1] = 0.0 ; x[2] = -950.0;
+ TGeoGlobalMagField::Instance()->Field(x,b);
+ //" Field at (0.0, 0.0, -950.0) [at the middle of dipole magnet]
+ //should be (6.79, 0.03, -0.17) or similar value with change of sign"
+ if(TMath::AreEqualAbs(b[0],0.0,1.0e-5) and TMath::AreEqualAbs(b[1],0.0,1.0e-5) and TMath::AreEqualAbs(b[2],0.0,1.0e-5)){
+ printf("At (X,Y,Z) : (%6.2lf,%6.2lf,%6.2lf) Field (Bx,By,Bz) is (%6.2lf,%6.2lf,%6.2lf)\n",
+ x[0],x[1],x[2],b[0],b[1],b[2]);
+ cerr<<"Magnetic field is not properly set, MUON tracking will not possble"<<endl;
+ return 1;
+ }
+
+
+
+ TEveRecTrack rt;
+
+ unsigned long size = block->GetSize();
+ Int_t * buffer = (Int_t *)block->GetData();
+
+ AliHLTMUONTracksBlockReader muontrackblock(buffer, size);
+ const AliHLTMUONTrackStruct* mtrack = muontrackblock.GetArray();
+ //cout<<"NofTracks : "<<muontrackblock.Nentries()<<endl;
+ for(AliHLTUInt32_t ientry = 0; ientry < muontrackblock.Nentries(); ientry++){
+
+ AliMUONTrack *muonTrack = new AliMUONTrack();
+ MakeMUONTrack(muonTrack,mtrack);
+ if(muonTrack->GetNClusters()==0){
+ delete muonTrack;
+ continue;
+ }
+
+ rt.fLabel = ientry;
+ AliEveMUONTrack* track = new AliEveMUONTrack(&rt, fullTracks->GetPropagator());
+ track->MakeMUONTrack(muonTrack);
+ //track->SetTitle(Form("HLT Track : %d, pt : %lf",ientry,TMath::Sqrt(((mtrack->fPx * mtrack->fPx) + (mtrack->fPy * mtrack->fPy)))));
+ track->SetName(Form("HLT Track : %d, pt : %lf",ientry,TMath::Sqrt(((mtrack->fPx * mtrack->fPx) + (mtrack->fPy * mtrack->fPy)))));
+ fullTracks->AddElement(track);
+
+ mtrack++;
+ }//track loop
+
+ return iResult;
+
+}