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 Muon processor for the HLT EVE display
21 #include "AliHLTEveMuon.h"
22 #include "AliHLTMUONDataBlockReader.h"
23 #include "AliHLTHOMERBlockDesc.h"
25 #include "TEveStraightLineSet.h"
26 #include "TEvePointSet.h"
27 #include "AliEveHLTEventManager.h"
28 #include "TEveManager.h"
31 #include "TEveVSDStructs.h"
32 #include "TGeoGlobalMagField.h"
33 #include "AliMUONTrack.h"
34 #include "AliMUONTrackParam.h"
35 #include "AliMUONESDInterface.h"
36 #include "AliMUONVTrackReconstructor.h"
37 #include "AliEveMUONTrack.h"
38 #include "AliHLTMUONConstants.h"
39 #include "AliHLTMUONUtils.h"
40 #include "AliMUONVCluster.h"
41 #include "AliMUONVClusterStore.h"
42 #include "AliMUONConstants.h"
43 #include "TEveTrackPropagator.h"
47 class AliHLTMUONUtils;
48 class AliEveMuonTrack;
50 ClassImp(AliHLTEveMuon);
52 AliHLTEveMuon::AliHLTEveMuon() :
53 AliHLTEveBase("Muon"),
62 AliHLTEveMuon::~AliHLTEveMuon()
66 delete fFullTrackList;
67 fFullTrackList = NULL;
79 void AliHLTEveMuon::ProcessBlock(AliHLTHOMERBlockDesc * block) {
80 //See header file for documentation
81 if ( (block->GetDataType().CompareTo("RECHITS") == 0) || (block->GetDataType().CompareTo("TRIGRECS") == 0) ) {
83 fClusters = CreateClusters();
84 AddElement(fClusters);
86 ProcessClusters( block, fClusters );
88 }else if(block->GetDataType().CompareTo("MANTRACK") == 0){
91 fTracks = CreateTrackSet();
95 ProcessTracks( block, fTracks );
97 }else if(block->GetDataType().CompareTo("TRACKS") == 0){
99 if ( !fFullTrackList ) {
100 fFullTrackList = CreateFullTrackList();
101 AddElement(fFullTrackList);
104 ProcessFullTracks( block, fFullTrackList );
106 } else if(block->GetDataType().CompareTo("ROOTHIST") == 0) {
107 ProcessHistogram(block);
112 TEvePointSet * AliHLTEveMuon::CreateClusters() {
113 //See header file for documentation
114 TEvePointSet * ps = new TEvePointSet("MUON RecHits");
115 ps->SetMainColor(kBlue);
116 ps->SetMarkerStyle(20);
120 TEveStraightLineSet * AliHLTEveMuon::CreateTrackSet() {
122 TEveStraightLineSet * lineset = new TEveStraightLineSet("MUON Tracks");
123 lineset->SetMainColor(kRed);
124 lineset->SetLineWidth(3);
128 TEveTrackList * AliHLTEveMuon::CreateFullTrackList(){
130 TEveTrackList * lineset = new TEveTrackList("MUON Full Tracks");
131 lineset->SetMainColor(kBlue);
135 void AliHLTEveMuon::ProcessHistogram(AliHLTHOMERBlockDesc * block ) {
136 //See header file for documentation
138 fCanvas = CreateCanvas("MUON QA", "MUON QA");
139 fCanvas->Divide(3, 2);
141 AddHistogramsToCanvas(block, fCanvas, fHistoCount);
144 void AliHLTEveMuon::UpdateElements() {
145 //See header file for documentation
146 if(fCanvas) fCanvas->Update();
147 if(fClusters) fClusters->ResetBBox();
148 if(fTracks) fTracks->ElementChanged();
151 void AliHLTEveMuon::ResetElements(){
152 //See header file for documentation
155 if ( fClusters ) fClusters->Reset();
160 if ( fFullTrackList ){
161 fFullTrackList->Destroy();
162 fFullTrackList = NULL;
168 void AliHLTEveMuon::ProcessClusters(AliHLTHOMERBlockDesc * block, TEvePointSet * clusters) {
169 //See header file for documentation
170 unsigned long size = block->GetSize();
173 buffer = (Int_t *)block->GetData();
174 //cout<<"block size : "<<size<<", buffer : "<<buffer<<", DataType : "<<block->GetDataType()<<endl;
176 if(block->GetDataType().CompareTo("RECHITS") == 0){
178 AliHLTMUONRecHitsBlockReader trackblock((char*)buffer, size);
179 const AliHLTMUONRecHitStruct* hit = trackblock.GetArray();
181 for(AliHLTUInt32_t ientry = 0; ientry < trackblock.Nentries(); ientry++){
182 if(hit->fX!=0.0 && hit->fY!=0.0 && hit->fZ!=0.0)
183 clusters->SetNextPoint(hit->fX,hit->fY,hit->fZ);
190 // if(!strcmp((BlockType(ULong64_t(reader->GetBlockDataType(i)))).Data(),"TRIGRECS")){
192 AliHLTMUONTriggerRecordsBlockReader trigblock(buffer, size);
193 const AliHLTMUONTriggerRecordStruct* trigrec = trigblock.GetArray();
194 for(AliHLTUInt32_t ientry = 0; ientry < trigblock.Nentries(); ientry++){
196 const AliHLTMUONRecHitStruct* hit = &trigrec->fHit[0];
197 for(AliHLTUInt32_t ch = 0; ch < 4; ch++)
199 if(hit->fX!=0.0 && hit->fY!=0.0 && hit->fZ!=0.0)
200 clusters->SetNextPoint(hit->fX,hit->fY,hit->fZ);
202 }// trig chamber loop
209 void AliHLTEveMuon::ProcessTracks(AliHLTHOMERBlockDesc * block, TEveStraightLineSet * tracks) {
210 //See header file for documentation
211 unsigned long size = block->GetSize();
212 Int_t * buffer = (Int_t *)block->GetData();
213 AliHLTMUONRecHitStruct hit1,hit2;
214 hit1.fX = hit1.fY = hit1.fZ = hit2.fX = hit2.fY = hit2.fZ = 0;
216 Float_t x0=0.0,y0=0.0,z0=0.0;
217 Float_t x3=0.0,y3=0.0,z3=0.0;
218 if(block->GetDataType().CompareTo("MANTRACK") == 0){
219 AliHLTMUONMansoTracksBlockReader mantrackblock(buffer, size);
220 const AliHLTMUONMansoTrackStruct* mtrack = mantrackblock.GetArray();
221 for(AliHLTUInt32_t ientry = 0; ientry < mantrackblock.Nentries(); ientry++){
222 const AliHLTMUONRecHitStruct* hit = &mtrack->fHit[0];
223 for(AliHLTUInt32_t ch = 0; ch < 4; ch++){
224 // cout << setw(10) << left << ch + 7 << setw(0);
225 // cout << setw(13) << left << hit->fX << setw(0);
226 // cout << setw(13) << left << hit->fY << setw(0);
227 // cout << hit->fZ << setw(0) << endl;
230 hit1 = *hit; ch1 = ch+6;
232 hit2 = *hit; ch2 = ch+6;
236 }// trig chamber loop
237 // printf("ch : %d, (X,Y,Z) : (%f,%f,%f)\n",ch1,hit1.fX,hit1.fY,hit1.fZ);
238 // printf("ch : %d, (X,Y,Z) : (%f,%f,%f)\n",ch2,hit2.fX,hit2.fY,hit2.fZ);
240 z3 = AliMUONConstants::DefaultChamberZ(ch2+4);
241 y3 = hit1.fY - (hit1.fZ-z3)*(hit1.fY - hit2.fY)/(hit1.fZ - hit2.fZ) ;
242 x3 = hit1.fX - (hit1.fZ-z3)*(hit1.fX - hit2.fX)/(hit1.fZ - hit2.fZ) ;
244 z0 = AliMUONConstants::DefaultChamberZ(ch1);
245 y0 = hit1.fY - (hit1.fZ-z0)*(hit1.fY - hit2.fY)/(hit1.fZ - hit2.fZ) ;
246 x0 = hit1.fX - (hit1.fZ-z0)*(hit1.fX - hit2.fX)/(hit1.fZ - hit2.fZ) ;
249 tracks->AddLine(x0,y0,z0,x3,y3,z3);
252 // cout<<"NofManso Tracks : "<<mantrackblock.Nentries()<<endl;
256 int AliHLTEveMuon::MakeMUONTrack(AliMUONTrack *muonTrack, const AliHLTMUONTrackStruct *muonHLTTrack)
258 // See header for documentation
259 AliHLTUInt32_t clusterIndex = 0; // for the cluster unique ID.
260 AliHLTMUONParticleSign sign;
262 AliHLTMUONUtils::UnpackTrackFlags(
263 muonHLTTrack->fFlags, sign, hitset
266 // add track parameters at vertex
267 TVector3 mom(muonHLTTrack->fPx, muonHLTTrack->fPy, muonHLTTrack->fPz);
268 AliMUONTrackParam paramAtVtx;
270 paramAtVtx.SetInverseBendingMomentum(muonHLTTrack->fInverseBendingMomentum);
272 paramAtVtx.SetInverseBendingMomentum(0.);
273 paramAtVtx.SetNonBendingSlope(TMath::Tan(muonHLTTrack->fThetaX));
274 paramAtVtx.SetBendingSlope(TMath::Tan(muonHLTTrack->fThetaY));
275 paramAtVtx.SetZ(muonHLTTrack->fZ);
276 paramAtVtx.SetBendingCoor(muonHLTTrack->fY);
277 paramAtVtx.SetNonBendingCoor(muonHLTTrack->fX);
278 muonTrack->SetTrackParamAtVertex(¶mAtVtx);
280 //printf("(X,Y,Z) : (%8.3f,%8.3f,%8.3f)\n",muonHLTTrack->fX,muonHLTTrack->fY,muonHLTTrack->fZ);
284 AliMUONVClusterStore* cStore = AliMUONESDInterface::NewClusterStore();
285 if (!cStore) return -1;
286 AliMUONVCluster* cluster = cStore->CreateCluster(0,0,0);
287 AliMUONTrackParam trackParam;
288 for (int i = 0; i < 16; i++)
290 if (not hitset[i]) continue;
292 AliHLTUInt8_t chamber;
293 AliHLTUInt16_t detElemId;
294 AliHLTMUONUtils::UnpackRecHitFlags((muonHLTTrack->fHit[i]).fFlags, chamber, detElemId);
296 cluster->SetUniqueID(AliMUONVCluster::BuildUniqueID(chamber, detElemId, clusterIndex++));
297 cluster->SetXYZ((muonHLTTrack->fHit[i]).fX, (muonHLTTrack->fHit[i]).fY, (muonHLTTrack->fHit[i]).fZ);
298 cluster->SetErrXY( // Use nominal values.
299 AliHLTMUONConstants::DefaultNonBendingReso(),
300 AliHLTMUONConstants::DefaultBendingReso()
302 cluster->SetCharge(-1.); // Indicate no total charge calculated.
303 cluster->SetChi2(-1.); // Indicate no fit made.
304 trackParam.SetZ(cluster->GetZ());
305 muonTrack->AddTrackParamAtCluster(trackParam, *cluster, kTRUE);
309 // compute track parameters at each cluster
311 AliMUONTrackParam *firstTrackParam = (AliMUONTrackParam*) muonTrack->GetTrackParamAtCluster()->First();
312 trackParam = (*firstTrackParam);
313 if (!AliMUONESDInterface::GetTracker()) AliMUONESDInterface::ResetTracker();
314 if (!AliMUONESDInterface::GetTracker()->RefitTrack(*muonTrack, kFALSE) &&
315 muonTrack->GetGlobalChi2() < AliMUONTrack::MaxChi2()) {
316 *firstTrackParam = trackParam;
317 muonTrack->UpdateCovTrackParamAtCluster();
321 muonTrack->SetGlobalChi2(muonHLTTrack->fChi2);
326 Int_t AliHLTEveMuon::ProcessFullTracks(AliHLTHOMERBlockDesc * block, TEveTrackList * fullTracks) {
328 // See header for documentation
333 x[0] = 0.0 ; x[1] = 0.0 ; x[2] = -950.0;
334 TGeoGlobalMagField::Instance()->Field(x,b);
335 //" Field at (0.0, 0.0, -950.0) [at the middle of dipole magnet]
336 //should be (6.79, 0.03, -0.17) or similar value with change of sign"
337 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)){
338 printf("At (X,Y,Z) : (%6.2lf,%6.2lf,%6.2lf) Field (Bx,By,Bz) is (%6.2lf,%6.2lf,%6.2lf)\n",
339 x[0],x[1],x[2],b[0],b[1],b[2]);
340 cerr<<"Magnetic field is not properly set, MUON tracking will not possble"<<endl;
348 unsigned long size = block->GetSize();
349 Int_t * buffer = (Int_t *)block->GetData();
351 AliHLTMUONTracksBlockReader muontrackblock(buffer, size);
352 const AliHLTMUONTrackStruct* mtrack = muontrackblock.GetArray();
353 //cout<<"NofTracks : "<<muontrackblock.Nentries()<<endl;
354 for(AliHLTUInt32_t ientry = 0; ientry < muontrackblock.Nentries(); ientry++){
356 AliMUONTrack *muonTrack = new AliMUONTrack();
357 MakeMUONTrack(muonTrack,mtrack);
358 if(muonTrack->GetNClusters()==0){
364 AliEveMUONTrack* track = new AliEveMUONTrack(&rt, fullTracks->GetPropagator());
365 track->MakeMUONTrack(muonTrack);
366 //track->SetTitle(Form("HLT Track : %d, pt : %lf",ientry,TMath::Sqrt(((mtrack->fPx * mtrack->fPx) + (mtrack->fPy * mtrack->fPy)))));
367 track->SetName(Form("HLT Track : %d, pt : %lf",ientry,TMath::Sqrt(((mtrack->fPx * mtrack->fPx) + (mtrack->fPy * mtrack->fPy)))));
368 fullTracks->AddElement(track);