]>
Commit | Line | Data |
---|---|---|
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 | |
42 | using namespace std;\r | |
43 | \r | |
44 | class AliHLTMUONUtils;\r | |
45 | class AliEveMuonTrack;\r | |
46 | \r | |
47 | ClassImp(AliHLTEveMuon);\r | |
48 | \r | |
49 | AliHLTEveMuon::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 | |
59 | AliHLTEveMuon::~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 | |
76 | void 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 | |
109 | TEvePointSet * 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 | |
117 | TEveStraightLineSet * 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 | |
125 | TEveTrackList * 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 | |
132 | void 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 | |
141 | void 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 | |
148 | void 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 | |
165 | void 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 | |
206 | void 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 | |
253 | int 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 | |
306 | Int_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 |