]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/EVE/AliHLTEveMuon.cxx
- adding the use of the histogram merger
[u/mrichter/AliRoot.git] / HLT / EVE / AliHLTEveMuon.cxx
CommitLineData
34ba7866 1/**************************************************************************\r
2 * This file is property of and copyright by the ALICE HLT Project *\r
3 * ALICE Experiment at CERN, All rights reserved. *\r
4 * *\r
5 * Primary Authors: Svein Lindal <slindal@fys.uio.no > *\r
6 * for The ALICE HLT Project. *\r
7 * *\r
8 * Permission to use, copy, modify and distribute this software and its *\r
9 * documentation strictly for non-commercial purposes is hereby granted *\r
10 * without fee, provided that the above copyright notice appears in all *\r
11 * copies and that both the copyright notice and this permission notice *\r
12 * appear in the supporting documentation. The authors make no claims *\r
13 * about the suitability of this software for any purpose. It is *\r
14 * provided "as is" without express or implied warranty. *\r
15 **************************************************************************/\r
16\r
17/// @file AliHLTEvePhos.cxx\r
18/// @author Svein Lindal <slindal@fys.uio.no>\r
19/// @brief Muon processor for the HLT EVE display\r
20\r
21#include "AliHLTEveMuon.h"\r
22#include "AliHLTMUONDataBlockReader.h"\r
23#include "AliHLTHOMERBlockDesc.h"\r
24#include "TCanvas.h"\r
25#include "TEveStraightLineSet.h"\r
26#include "TEvePointSet.h"\r
fd2adb88 27#include "AliEveHLTEventManager.h"\r
34ba7866 28#include "TEveManager.h"\r
29\r
30\r
31#include "TEveVSDStructs.h"\r
32#include "TGeoGlobalMagField.h"\r
33#include "AliESDMuonTrack.h"\r
34#include "AliESDMuonCluster.h"\r
35#include "AliEveMUONTrack.h"\r
36#include "AliHLTMUONConstants.h"\r
37#include "AliHLTMUONUtils.h"\r
38#include "AliMUONVCluster.h"\r
39#include "AliMUONConstants.h"\r
40#include "TEveTrackPropagator.h"\r
41\r
42using namespace std;\r
43\r
44class AliHLTMUONUtils;\r
45class AliEveMuonTrack;\r
46\r
47ClassImp(AliHLTEveMuon);\r
48\r
49AliHLTEveMuon::AliHLTEveMuon() : \r
fd2adb88 50 AliHLTEveBase("Muon"),\r
34ba7866 51 fFullTrackList(NULL),\r
52 fTracks(NULL),\r
53 fClusters(NULL)\r
54{\r
55 // Constructor.\r
933fb19e 56 SetMaxHistograms(6);\r
34ba7866 57}\r
58\r
59AliHLTEveMuon::~AliHLTEveMuon()\r
60{\r
61 //Destructor\r
62 if (fFullTrackList)\r
63 delete fFullTrackList;\r
64 fFullTrackList = NULL;\r
65 \r
66 if (fTracks)\r
67 delete fTracks;\r
68 fTracks = NULL;\r
69\r
70 if(fClusters)\r
71 delete fClusters;\r
72 fClusters = NULL;\r
73}\r
74\r
75\r
76void AliHLTEveMuon::ProcessBlock(AliHLTHOMERBlockDesc * block) {\r
77 //See header file for documentation\r
78 if ( (block->GetDataType().CompareTo("RECHITS") == 0) || (block->GetDataType().CompareTo("TRIGRECS") == 0) ) {\r
79 if(!fClusters) {\r
80 fClusters = CreateClusters();\r
fd2adb88 81 AddElement(fClusters);\r
34ba7866 82 }\r
83 ProcessClusters( block, fClusters );\r
84 \r
85 }else if(block->GetDataType().CompareTo("MANTRACK") == 0){\r
86 \r
87 if ( !fTracks ) {\r
88 fTracks = CreateTrackSet(); \r
fd2adb88 89 AddElement(fTracks);\r
34ba7866 90 }\r
91 \r
92 ProcessTracks( block, fTracks );\r
93\r
94 }else if(block->GetDataType().CompareTo("TRACKS") == 0){\r
95 \r
96 if ( !fFullTrackList ) {\r
97 fFullTrackList = CreateFullTrackList(); \r
fd2adb88 98 AddElement(fFullTrackList);\r
34ba7866 99 }\r
100 \r
101 ProcessFullTracks( block, fFullTrackList );\r
0e77fbbf 102\r
103 } else if(block->GetDataType().CompareTo("ROOTHIST") == 0) {\r
104 ProcessHistogram(block);\r
105 }\r
34ba7866 106 \r
107}\r
108\r
109TEvePointSet * AliHLTEveMuon::CreateClusters() {\r
110 //See header file for documentation\r
111 TEvePointSet * ps = new TEvePointSet("MUON RecHits");\r
112 ps->SetMainColor(kBlue);\r
113 ps->SetMarkerStyle(20);\r
114 return ps;\r
115}\r
116\r
117TEveStraightLineSet * AliHLTEveMuon::CreateTrackSet() {\r
118 // See header file\r
fd2adb88 119 TEveStraightLineSet * lineset = new TEveStraightLineSet("MUON Tracks");\r
120 lineset->SetMainColor(kRed);\r
121 lineset->SetLineWidth(3);\r
122 return lineset;\r
34ba7866 123}\r
124\r
125TEveTrackList * AliHLTEveMuon::CreateFullTrackList(){\r
126 // See header file\r
fd2adb88 127 TEveTrackList * lineset = new TEveTrackList("MUON Full Tracks");\r
128 lineset->SetMainColor(kBlue);\r
129 return lineset;\r
34ba7866 130}\r
131\r
132void AliHLTEveMuon::ProcessHistogram(AliHLTHOMERBlockDesc * block ) {\r
133 //See header file for documentation\r
134 if(!fCanvas) {\r
135 fCanvas = CreateCanvas("MUON QA", "MUON QA");\r
136 fCanvas->Divide(3, 2);\r
137 }\r
138 AddHistogramsToCanvas(block, fCanvas, fHistoCount);\r
139}\r
140\r
141void AliHLTEveMuon::UpdateElements() {\r
142 //See header file for documentation\r
143 if(fCanvas) fCanvas->Update();\r
144 if(fClusters) fClusters->ResetBBox();\r
145 if(fTracks) fTracks->ElementChanged();\r
146}\r
147\r
148void AliHLTEveMuon::ResetElements(){\r
149 //See header file for documentation\r
150 fHistoCount = 0;\r
151 \r
152 if ( fClusters ) fClusters->Reset();\r
153 if ( fTracks ){\r
154 fTracks->Destroy();\r
155 fTracks = NULL;\r
156 }\r
157 if ( fFullTrackList ){\r
158 fFullTrackList->Destroy();\r
159 fFullTrackList = NULL;\r
160 }\r
161\r
162\r
163}\r
164\r
165void AliHLTEveMuon::ProcessClusters(AliHLTHOMERBlockDesc * block, TEvePointSet * clusters) {\r
166 //See header file for documentation\r
167 unsigned long size = block->GetSize();\r
168 Int_t * buffer ;\r
169 \r
170 buffer = (Int_t *)block->GetData();\r
171 //cout<<"block size : "<<size<<", buffer : "<<buffer<<", DataType : "<<block->GetDataType()<<endl;\r
172\r
173 if(block->GetDataType().CompareTo("RECHITS") == 0){\r
174 \r
175 AliHLTMUONRecHitsBlockReader trackblock((char*)buffer, size);\r
176 const AliHLTMUONRecHitStruct* hit = trackblock.GetArray();\r
177 \r
178 for(AliHLTUInt32_t ientry = 0; ientry < trackblock.Nentries(); ientry++){\r
179 if(hit->fX!=0.0 && hit->fY!=0.0 && hit->fZ!=0.0)\r
180 clusters->SetNextPoint(hit->fX,hit->fY,hit->fZ);\r
181 hit++;\r
182 \r
183 }// track hit loop\r
184 }\r
185 \r
186 else{// if rechits\r
187 // if(!strcmp((BlockType(ULong64_t(reader->GetBlockDataType(i)))).Data(),"TRIGRECS")){\r
188 \r
189 AliHLTMUONTriggerRecordsBlockReader trigblock(buffer, size);\r
190 const AliHLTMUONTriggerRecordStruct* trigrec = trigblock.GetArray();\r
191 for(AliHLTUInt32_t ientry = 0; ientry < trigblock.Nentries(); ientry++){\r
192 \r
193 const AliHLTMUONRecHitStruct* hit = &trigrec->fHit[0];\r
194 for(AliHLTUInt32_t ch = 0; ch < 4; ch++)\r
195 {\r
196 if(hit->fX!=0.0 && hit->fY!=0.0 && hit->fZ!=0.0)\r
197 clusters->SetNextPoint(hit->fX,hit->fY,hit->fZ);\r
198 hit++;\r
199 }// trig chamber loop\r
200 trigrec++;\r
201 }//trig hit loop\r
202 }//else trigger\r
203 \r
204}\r
205\r
206void AliHLTEveMuon::ProcessTracks(AliHLTHOMERBlockDesc * block, TEveStraightLineSet * tracks) {\r
207 //See header file for documentation \r
208 unsigned long size = block->GetSize();\r
209 Int_t * buffer = (Int_t *)block->GetData();\r
210 AliHLTMUONRecHitStruct hit1,hit2;\r
211 hit1.fX = hit1.fY = hit1.fZ = hit2.fX = hit2.fY = hit2.fZ = 0;\r
212 Int_t ch1=0, ch2=0;\r
213 Float_t x0=0.0,y0=0.0,z0=0.0;\r
214 Float_t x3=0.0,y3=0.0,z3=0.0;\r
215 if(block->GetDataType().CompareTo("MANTRACK") == 0){ \r
216 AliHLTMUONMansoTracksBlockReader mantrackblock(buffer, size);\r
217 const AliHLTMUONMansoTrackStruct* mtrack = mantrackblock.GetArray();\r
218 for(AliHLTUInt32_t ientry = 0; ientry < mantrackblock.Nentries(); ientry++){\r
219 const AliHLTMUONRecHitStruct* hit = &mtrack->fHit[0];\r
220 for(AliHLTUInt32_t ch = 0; ch < 4; ch++){\r
221 // cout << setw(10) << left << ch + 7 << setw(0);\r
222 // cout << setw(13) << left << hit->fX << setw(0);\r
223 // cout << setw(13) << left << hit->fY << setw(0);\r
224 // cout << hit->fZ << setw(0) << endl;\r
225 if(hit->fZ != 0.0){\r
226 if(ch==0 || ch==1){\r
227 hit1 = *hit; ch1 = ch+6;\r
228 }else{\r
229 hit2 = *hit; ch2 = ch+6;\r
230 }\r
231 }\r
232 hit++;\r
233 }// trig chamber loop\r
234 // printf("ch : %d, (X,Y,Z) : (%f,%f,%f)\n",ch1,hit1.fX,hit1.fY,hit1.fZ);\r
235 // printf("ch : %d, (X,Y,Z) : (%f,%f,%f)\n",ch2,hit2.fX,hit2.fY,hit2.fZ);\r
236 // meminfo();\r
237 z3 = AliMUONConstants::DefaultChamberZ(ch2+4);\r
238 y3 = hit1.fY - (hit1.fZ-z3)*(hit1.fY - hit2.fY)/(hit1.fZ - hit2.fZ) ;\r
239 x3 = hit1.fX - (hit1.fZ-z3)*(hit1.fX - hit2.fX)/(hit1.fZ - hit2.fZ) ;\r
240\r
241 z0 = AliMUONConstants::DefaultChamberZ(ch1);\r
242 y0 = hit1.fY - (hit1.fZ-z0)*(hit1.fY - hit2.fY)/(hit1.fZ - hit2.fZ) ;\r
243 x0 = hit1.fX - (hit1.fZ-z0)*(hit1.fX - hit2.fX)/(hit1.fZ - hit2.fZ) ;\r
244 \r
245\r
246 tracks->AddLine(x0,y0,z0,x3,y3,z3);\r
247 mtrack++;\r
248 }\r
249 // cout<<"NofManso Tracks : "<<mantrackblock.Nentries()<<endl;\r
250 }\r
251}\r
252\r
253int AliHLTEveMuon::MakeMUONESDTrack(AliESDMuonTrack *muonESDTrack, const AliHLTMUONTrackStruct *muonHLTTrack)\r
254{\r
255 // See header for documentation\r
256 AliHLTUInt32_t clusterIndex = 0; // for the cluster unique ID. \r
257 AliHLTMUONParticleSign sign;\r
258 bool hitset[16];\r
259 AliHLTMUONUtils::UnpackTrackFlags(\r
260 muonHLTTrack->fFlags, sign, hitset\r
261 );\r
262 \r
263 TVector3 mom(muonHLTTrack->fPx, muonHLTTrack->fPy, muonHLTTrack->fPz);\r
264 if (mom.Mag() != 0)\r
265 muonESDTrack->SetInverseBendingMomentum(muonHLTTrack->fInverseBendingMomentum);\r
266 else\r
267 muonESDTrack->SetInverseBendingMomentum(0.);\r
268 muonESDTrack->SetThetaX(muonHLTTrack->fThetaX);\r
269 muonESDTrack->SetThetaY(muonHLTTrack->fThetaY);\r
270 muonESDTrack->SetZ(muonHLTTrack->fZ);\r
271 muonESDTrack->SetBendingCoor(muonHLTTrack->fY);\r
272 muonESDTrack->SetNonBendingCoor(muonHLTTrack->fX);\r
273\r
274 //printf("(X,Y,Z) : (%8.3f,%8.3f,%8.3f)\n",muonHLTTrack->fX,muonHLTTrack->fY,muonHLTTrack->fZ);\r
275\r
276 muonESDTrack->SetChi2(muonHLTTrack->fChi2);\r
277\r
278 Int_t nHits = 0;\r
279 for (int i = 0; i < 16; i++)\r
280 {\r
281 if (not hitset[i]) continue;\r
282 \r
283 AliHLTUInt8_t chamber;\r
284 AliHLTUInt16_t detElemId;\r
285 AliHLTMUONUtils::UnpackRecHitFlags((muonHLTTrack->fHit[i]).fFlags, chamber, detElemId);\r
286 \r
287 AliESDMuonCluster cluster;\r
288 cluster.SetUniqueID(AliMUONVCluster::BuildUniqueID(chamber, detElemId, clusterIndex++));\r
289 cluster.SetXYZ((muonHLTTrack->fHit[i]).fX, (muonHLTTrack->fHit[i]).fY, (muonHLTTrack->fHit[i]).fZ);\r
290 cluster.SetErrXY( // Use nominal values.\r
291 AliHLTMUONConstants::DefaultNonBendingReso(),\r
292 AliHLTMUONConstants::DefaultBendingReso()\r
293 );\r
294 cluster.SetCharge(-1.); // Indicate no total charge calculated.\r
295 cluster.SetChi2(-1.); // Indicate no fit made.\r
296 muonESDTrack->AddCluster(cluster);\r
297 nHits++;\r
298 muonESDTrack->AddInMuonClusterMap(chamber);\r
299 }\r
300 \r
301 muonESDTrack->SetNHit(nHits);\r
302\r
303 return 0;\r
304}\r
305\r
306Int_t AliHLTEveMuon::ProcessFullTracks(AliHLTHOMERBlockDesc * block, TEveTrackList * fullTracks) {\r
307\r
308 // See header for documentation \r
309\r
310 Int_t iResult = 0;\r
311\r
312 Double_t b[3], x[3];\r
313 x[0] = 0.0 ; x[1] = 0.0 ; x[2] = -950.0;\r
314 TGeoGlobalMagField::Instance()->Field(x,b);\r
315 //" Field at (0.0, 0.0, -950.0) [at the middle of dipole magnet] \r
316 //should be (6.79, 0.03, -0.17) or similar value with change of sign"\r
317 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
318 printf("At (X,Y,Z) : (%6.2lf,%6.2lf,%6.2lf) Field (Bx,By,Bz) is (%6.2lf,%6.2lf,%6.2lf)\n",\r
319 x[0],x[1],x[2],b[0],b[1],b[2]); \r
320 cerr<<"Magnetic field is not properly set, MUON tracking will not possble"<<endl;\r
321 return 1;\r
322 }\r
323 \r
324 \r
325\r
326 TEveRecTrack rt;\r
327 \r
328 unsigned long size = block->GetSize();\r
329 Int_t * buffer = (Int_t *)block->GetData();\r
330\r
331 AliHLTMUONTracksBlockReader muontrackblock(buffer, size);\r
332 const AliHLTMUONTrackStruct* mtrack = muontrackblock.GetArray();\r
333 //cout<<"NofTracks : "<<muontrackblock.Nentries()<<endl;\r
334 for(AliHLTUInt32_t ientry = 0; ientry < muontrackblock.Nentries(); ientry++){\r
335 \r
336 AliESDMuonTrack *muonESDTrack = new AliESDMuonTrack();\r
337 MakeMUONESDTrack(muonESDTrack,mtrack);\r
338 if(muonESDTrack->GetNHit()==0){\r
339 muonESDTrack->Delete();\r
340 continue;\r
341 }\r
342 \r
343 rt.fLabel = ientry;\r
344 AliEveMUONTrack* track = new AliEveMUONTrack(&rt, fullTracks->GetPropagator());\r
345 track->MakeESDTrack(muonESDTrack);\r
346 //track->SetTitle(Form("HLT Track : %d, pt : %lf",ientry,TMath::Sqrt(((mtrack->fPx * mtrack->fPx) + (mtrack->fPy * mtrack->fPy)))));\r
347 track->SetName(Form("HLT Track : %d, pt : %lf",ientry,TMath::Sqrt(((mtrack->fPx * mtrack->fPx) + (mtrack->fPy * mtrack->fPy)))));\r
fd2adb88 348 fullTracks->AddElement(track);\r
34ba7866 349 \r
350 mtrack++;\r
351 }//track loop\r
352 \r
353 return iResult;\r
354\r
355}\r