]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/EVE/AliHLTEveMuon.cxx
end-of-line normalization
[u/mrichter/AliRoot.git] / HLT / EVE / AliHLTEveMuon.cxx
index 84a9f6d9a99bfc395e717303ced0759fa6cf1ef1..6e8bb6cbdd281ddc6cc77087a829ee35c960f549 100644 (file)
-/**************************************************************************\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(&paramAtVtx);\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(&paramAtVtx);
+
+  //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;
+
+}