]>
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 | |
fe0324de | 33 | #include "AliMUONTrack.h"\r |
34 | #include "AliMUONTrackParam.h"\r | |
35 | #include "AliMUONESDInterface.h"\r | |
36 | #include "AliMUONVTrackReconstructor.h"\r | |
34ba7866 | 37 | #include "AliEveMUONTrack.h"\r |
38 | #include "AliHLTMUONConstants.h"\r | |
39 | #include "AliHLTMUONUtils.h"\r | |
40 | #include "AliMUONVCluster.h"\r | |
fe0324de | 41 | #include "AliMUONVClusterStore.h"\r |
34ba7866 | 42 | #include "AliMUONConstants.h"\r |
43 | #include "TEveTrackPropagator.h"\r | |
44 | \r | |
45 | using namespace std;\r | |
46 | \r | |
47 | class AliHLTMUONUtils;\r | |
48 | class AliEveMuonTrack;\r | |
49 | \r | |
50 | ClassImp(AliHLTEveMuon);\r | |
51 | \r | |
52 | AliHLTEveMuon::AliHLTEveMuon() : \r | |
fd2adb88 | 53 | AliHLTEveBase("Muon"),\r |
34ba7866 | 54 | fFullTrackList(NULL),\r |
55 | fTracks(NULL),\r | |
56 | fClusters(NULL)\r | |
57 | {\r | |
58 | // Constructor.\r | |
933fb19e | 59 | SetMaxHistograms(6);\r |
34ba7866 | 60 | }\r |
61 | \r | |
62 | AliHLTEveMuon::~AliHLTEveMuon()\r | |
63 | {\r | |
64 | //Destructor\r | |
65 | if (fFullTrackList)\r | |
66 | delete fFullTrackList;\r | |
67 | fFullTrackList = NULL;\r | |
68 | \r | |
69 | if (fTracks)\r | |
70 | delete fTracks;\r | |
71 | fTracks = NULL;\r | |
72 | \r | |
73 | if(fClusters)\r | |
74 | delete fClusters;\r | |
75 | fClusters = NULL;\r | |
76 | }\r | |
77 | \r | |
78 | \r | |
79 | void AliHLTEveMuon::ProcessBlock(AliHLTHOMERBlockDesc * block) {\r | |
80 | //See header file for documentation\r | |
81 | if ( (block->GetDataType().CompareTo("RECHITS") == 0) || (block->GetDataType().CompareTo("TRIGRECS") == 0) ) {\r | |
82 | if(!fClusters) {\r | |
83 | fClusters = CreateClusters();\r | |
fd2adb88 | 84 | AddElement(fClusters);\r |
34ba7866 | 85 | }\r |
86 | ProcessClusters( block, fClusters );\r | |
87 | \r | |
88 | }else if(block->GetDataType().CompareTo("MANTRACK") == 0){\r | |
89 | \r | |
90 | if ( !fTracks ) {\r | |
91 | fTracks = CreateTrackSet(); \r | |
fd2adb88 | 92 | AddElement(fTracks);\r |
34ba7866 | 93 | }\r |
94 | \r | |
95 | ProcessTracks( block, fTracks );\r | |
96 | \r | |
97 | }else if(block->GetDataType().CompareTo("TRACKS") == 0){\r | |
98 | \r | |
99 | if ( !fFullTrackList ) {\r | |
100 | fFullTrackList = CreateFullTrackList(); \r | |
fd2adb88 | 101 | AddElement(fFullTrackList);\r |
34ba7866 | 102 | }\r |
103 | \r | |
104 | ProcessFullTracks( block, fFullTrackList );\r | |
0e77fbbf | 105 | \r |
106 | } else if(block->GetDataType().CompareTo("ROOTHIST") == 0) {\r | |
107 | ProcessHistogram(block);\r | |
108 | }\r | |
34ba7866 | 109 | \r |
110 | }\r | |
111 | \r | |
112 | TEvePointSet * AliHLTEveMuon::CreateClusters() {\r | |
113 | //See header file for documentation\r | |
114 | TEvePointSet * ps = new TEvePointSet("MUON RecHits");\r | |
115 | ps->SetMainColor(kBlue);\r | |
116 | ps->SetMarkerStyle(20);\r | |
117 | return ps;\r | |
118 | }\r | |
119 | \r | |
120 | TEveStraightLineSet * AliHLTEveMuon::CreateTrackSet() {\r | |
121 | // See header file\r | |
fd2adb88 | 122 | TEveStraightLineSet * lineset = new TEveStraightLineSet("MUON Tracks");\r |
123 | lineset->SetMainColor(kRed);\r | |
124 | lineset->SetLineWidth(3);\r | |
125 | return lineset;\r | |
34ba7866 | 126 | }\r |
127 | \r | |
128 | TEveTrackList * AliHLTEveMuon::CreateFullTrackList(){\r | |
129 | // See header file\r | |
fd2adb88 | 130 | TEveTrackList * lineset = new TEveTrackList("MUON Full Tracks");\r |
131 | lineset->SetMainColor(kBlue);\r | |
132 | return lineset;\r | |
34ba7866 | 133 | }\r |
134 | \r | |
135 | void AliHLTEveMuon::ProcessHistogram(AliHLTHOMERBlockDesc * block ) {\r | |
136 | //See header file for documentation\r | |
137 | if(!fCanvas) {\r | |
138 | fCanvas = CreateCanvas("MUON QA", "MUON QA");\r | |
139 | fCanvas->Divide(3, 2);\r | |
140 | }\r | |
141 | AddHistogramsToCanvas(block, fCanvas, fHistoCount);\r | |
142 | }\r | |
143 | \r | |
144 | void AliHLTEveMuon::UpdateElements() {\r | |
145 | //See header file for documentation\r | |
146 | if(fCanvas) fCanvas->Update();\r | |
147 | if(fClusters) fClusters->ResetBBox();\r | |
148 | if(fTracks) fTracks->ElementChanged();\r | |
149 | }\r | |
150 | \r | |
151 | void AliHLTEveMuon::ResetElements(){\r | |
152 | //See header file for documentation\r | |
153 | fHistoCount = 0;\r | |
154 | \r | |
155 | if ( fClusters ) fClusters->Reset();\r | |
156 | if ( fTracks ){\r | |
157 | fTracks->Destroy();\r | |
158 | fTracks = NULL;\r | |
159 | }\r | |
160 | if ( fFullTrackList ){\r | |
161 | fFullTrackList->Destroy();\r | |
162 | fFullTrackList = NULL;\r | |
163 | }\r | |
164 | \r | |
165 | \r | |
166 | }\r | |
167 | \r | |
168 | void AliHLTEveMuon::ProcessClusters(AliHLTHOMERBlockDesc * block, TEvePointSet * clusters) {\r | |
169 | //See header file for documentation\r | |
170 | unsigned long size = block->GetSize();\r | |
171 | Int_t * buffer ;\r | |
172 | \r | |
173 | buffer = (Int_t *)block->GetData();\r | |
174 | //cout<<"block size : "<<size<<", buffer : "<<buffer<<", DataType : "<<block->GetDataType()<<endl;\r | |
175 | \r | |
176 | if(block->GetDataType().CompareTo("RECHITS") == 0){\r | |
177 | \r | |
178 | AliHLTMUONRecHitsBlockReader trackblock((char*)buffer, size);\r | |
179 | const AliHLTMUONRecHitStruct* hit = trackblock.GetArray();\r | |
180 | \r | |
181 | for(AliHLTUInt32_t ientry = 0; ientry < trackblock.Nentries(); ientry++){\r | |
182 | if(hit->fX!=0.0 && hit->fY!=0.0 && hit->fZ!=0.0)\r | |
183 | clusters->SetNextPoint(hit->fX,hit->fY,hit->fZ);\r | |
184 | hit++;\r | |
185 | \r | |
186 | }// track hit loop\r | |
187 | }\r | |
188 | \r | |
189 | else{// if rechits\r | |
190 | // if(!strcmp((BlockType(ULong64_t(reader->GetBlockDataType(i)))).Data(),"TRIGRECS")){\r | |
191 | \r | |
192 | AliHLTMUONTriggerRecordsBlockReader trigblock(buffer, size);\r | |
193 | const AliHLTMUONTriggerRecordStruct* trigrec = trigblock.GetArray();\r | |
194 | for(AliHLTUInt32_t ientry = 0; ientry < trigblock.Nentries(); ientry++){\r | |
195 | \r | |
196 | const AliHLTMUONRecHitStruct* hit = &trigrec->fHit[0];\r | |
197 | for(AliHLTUInt32_t ch = 0; ch < 4; ch++)\r | |
198 | {\r | |
199 | if(hit->fX!=0.0 && hit->fY!=0.0 && hit->fZ!=0.0)\r | |
200 | clusters->SetNextPoint(hit->fX,hit->fY,hit->fZ);\r | |
201 | hit++;\r | |
202 | }// trig chamber loop\r | |
203 | trigrec++;\r | |
204 | }//trig hit loop\r | |
205 | }//else trigger\r | |
206 | \r | |
207 | }\r | |
208 | \r | |
209 | void AliHLTEveMuon::ProcessTracks(AliHLTHOMERBlockDesc * block, TEveStraightLineSet * tracks) {\r | |
210 | //See header file for documentation \r | |
211 | unsigned long size = block->GetSize();\r | |
212 | Int_t * buffer = (Int_t *)block->GetData();\r | |
213 | AliHLTMUONRecHitStruct hit1,hit2;\r | |
214 | hit1.fX = hit1.fY = hit1.fZ = hit2.fX = hit2.fY = hit2.fZ = 0;\r | |
215 | Int_t ch1=0, ch2=0;\r | |
216 | Float_t x0=0.0,y0=0.0,z0=0.0;\r | |
217 | Float_t x3=0.0,y3=0.0,z3=0.0;\r | |
218 | if(block->GetDataType().CompareTo("MANTRACK") == 0){ \r | |
219 | AliHLTMUONMansoTracksBlockReader mantrackblock(buffer, size);\r | |
220 | const AliHLTMUONMansoTrackStruct* mtrack = mantrackblock.GetArray();\r | |
221 | for(AliHLTUInt32_t ientry = 0; ientry < mantrackblock.Nentries(); ientry++){\r | |
222 | const AliHLTMUONRecHitStruct* hit = &mtrack->fHit[0];\r | |
223 | for(AliHLTUInt32_t ch = 0; ch < 4; ch++){\r | |
224 | // cout << setw(10) << left << ch + 7 << setw(0);\r | |
225 | // cout << setw(13) << left << hit->fX << setw(0);\r | |
226 | // cout << setw(13) << left << hit->fY << setw(0);\r | |
227 | // cout << hit->fZ << setw(0) << endl;\r | |
228 | if(hit->fZ != 0.0){\r | |
229 | if(ch==0 || ch==1){\r | |
230 | hit1 = *hit; ch1 = ch+6;\r | |
231 | }else{\r | |
232 | hit2 = *hit; ch2 = ch+6;\r | |
233 | }\r | |
234 | }\r | |
235 | hit++;\r | |
236 | }// trig chamber loop\r | |
237 | // printf("ch : %d, (X,Y,Z) : (%f,%f,%f)\n",ch1,hit1.fX,hit1.fY,hit1.fZ);\r | |
238 | // printf("ch : %d, (X,Y,Z) : (%f,%f,%f)\n",ch2,hit2.fX,hit2.fY,hit2.fZ);\r | |
239 | // meminfo();\r | |
240 | z3 = AliMUONConstants::DefaultChamberZ(ch2+4);\r | |
241 | y3 = hit1.fY - (hit1.fZ-z3)*(hit1.fY - hit2.fY)/(hit1.fZ - hit2.fZ) ;\r | |
242 | x3 = hit1.fX - (hit1.fZ-z3)*(hit1.fX - hit2.fX)/(hit1.fZ - hit2.fZ) ;\r | |
243 | \r | |
244 | z0 = AliMUONConstants::DefaultChamberZ(ch1);\r | |
245 | y0 = hit1.fY - (hit1.fZ-z0)*(hit1.fY - hit2.fY)/(hit1.fZ - hit2.fZ) ;\r | |
246 | x0 = hit1.fX - (hit1.fZ-z0)*(hit1.fX - hit2.fX)/(hit1.fZ - hit2.fZ) ;\r | |
247 | \r | |
248 | \r | |
249 | tracks->AddLine(x0,y0,z0,x3,y3,z3);\r | |
250 | mtrack++;\r | |
251 | }\r | |
252 | // cout<<"NofManso Tracks : "<<mantrackblock.Nentries()<<endl;\r | |
253 | }\r | |
254 | }\r | |
255 | \r | |
fe0324de | 256 | int AliHLTEveMuon::MakeMUONTrack(AliMUONTrack *muonTrack, const AliHLTMUONTrackStruct *muonHLTTrack)\r |
34ba7866 | 257 | {\r |
258 | // See header for documentation\r | |
259 | AliHLTUInt32_t clusterIndex = 0; // for the cluster unique ID. \r | |
260 | AliHLTMUONParticleSign sign;\r | |
261 | bool hitset[16];\r | |
262 | AliHLTMUONUtils::UnpackTrackFlags(\r | |
263 | muonHLTTrack->fFlags, sign, hitset\r | |
264 | );\r | |
fe0324de | 265 | \r |
266 | // add track parameters at vertex\r | |
34ba7866 | 267 | TVector3 mom(muonHLTTrack->fPx, muonHLTTrack->fPy, muonHLTTrack->fPz);\r |
fe0324de | 268 | AliMUONTrackParam paramAtVtx;\r |
34ba7866 | 269 | if (mom.Mag() != 0)\r |
fe0324de | 270 | paramAtVtx.SetInverseBendingMomentum(muonHLTTrack->fInverseBendingMomentum);\r |
34ba7866 | 271 | else\r |
fe0324de | 272 | paramAtVtx.SetInverseBendingMomentum(0.);\r |
273 | paramAtVtx.SetNonBendingSlope(TMath::Tan(muonHLTTrack->fThetaX));\r | |
274 | paramAtVtx.SetBendingSlope(TMath::Tan(muonHLTTrack->fThetaY));\r | |
275 | paramAtVtx.SetZ(muonHLTTrack->fZ);\r | |
276 | paramAtVtx.SetBendingCoor(muonHLTTrack->fY);\r | |
277 | paramAtVtx.SetNonBendingCoor(muonHLTTrack->fX);\r | |
278 | muonTrack->SetTrackParamAtVertex(¶mAtVtx);\r | |
34ba7866 | 279 | \r |
280 | //printf("(X,Y,Z) : (%8.3f,%8.3f,%8.3f)\n",muonHLTTrack->fX,muonHLTTrack->fY,muonHLTTrack->fZ);\r | |
281 | \r | |
fe0324de | 282 | // add clusters\r |
34ba7866 | 283 | Int_t nHits = 0;\r |
fe0324de | 284 | AliMUONVClusterStore* cStore = AliMUONESDInterface::NewClusterStore();\r |
285 | if (!cStore) return -1;\r | |
286 | AliMUONVCluster* cluster = cStore->CreateCluster(0,0,0);\r | |
287 | AliMUONTrackParam trackParam;\r | |
34ba7866 | 288 | for (int i = 0; i < 16; i++)\r |
289 | {\r | |
290 | if (not hitset[i]) continue;\r | |
291 | \r | |
292 | AliHLTUInt8_t chamber;\r | |
293 | AliHLTUInt16_t detElemId;\r | |
294 | AliHLTMUONUtils::UnpackRecHitFlags((muonHLTTrack->fHit[i]).fFlags, chamber, detElemId);\r | |
295 | \r | |
fe0324de | 296 | cluster->SetUniqueID(AliMUONVCluster::BuildUniqueID(chamber, detElemId, clusterIndex++));\r |
297 | cluster->SetXYZ((muonHLTTrack->fHit[i]).fX, (muonHLTTrack->fHit[i]).fY, (muonHLTTrack->fHit[i]).fZ);\r | |
298 | cluster->SetErrXY( // Use nominal values.\r | |
299 | AliHLTMUONConstants::DefaultNonBendingReso(),\r | |
300 | AliHLTMUONConstants::DefaultBendingReso()\r | |
301 | );\r | |
302 | cluster->SetCharge(-1.); // Indicate no total charge calculated.\r | |
303 | cluster->SetChi2(-1.); // Indicate no fit made.\r | |
304 | trackParam.SetZ(cluster->GetZ());\r | |
305 | muonTrack->AddTrackParamAtCluster(trackParam, *cluster, kTRUE);\r | |
34ba7866 | 306 | nHits++;\r |
34ba7866 | 307 | }\r |
308 | \r | |
fe0324de | 309 | // compute track parameters at each cluster\r |
310 | if (nHits > 0) {\r | |
311 | AliMUONTrackParam *firstTrackParam = (AliMUONTrackParam*) muonTrack->GetTrackParamAtCluster()->First();\r | |
312 | trackParam = (*firstTrackParam);\r | |
313 | if (!AliMUONESDInterface::GetTracker()) AliMUONESDInterface::ResetTracker();\r | |
314 | if (!AliMUONESDInterface::GetTracker()->RefitTrack(*muonTrack, kFALSE) &&\r | |
315 | muonTrack->GetGlobalChi2() < AliMUONTrack::MaxChi2()) {\r | |
316 | *firstTrackParam = trackParam;\r | |
317 | muonTrack->UpdateCovTrackParamAtCluster();\r | |
318 | }\r | |
319 | }\r | |
34ba7866 | 320 | \r |
fe0324de | 321 | muonTrack->SetGlobalChi2(muonHLTTrack->fChi2);\r |
322 | \r | |
34ba7866 | 323 | return 0;\r |
324 | }\r | |
325 | \r | |
326 | Int_t AliHLTEveMuon::ProcessFullTracks(AliHLTHOMERBlockDesc * block, TEveTrackList * fullTracks) {\r | |
327 | \r | |
328 | // See header for documentation \r | |
329 | \r | |
330 | Int_t iResult = 0;\r | |
331 | \r | |
332 | Double_t b[3], x[3];\r | |
333 | x[0] = 0.0 ; x[1] = 0.0 ; x[2] = -950.0;\r | |
334 | TGeoGlobalMagField::Instance()->Field(x,b);\r | |
335 | //" Field at (0.0, 0.0, -950.0) [at the middle of dipole magnet] \r | |
336 | //should be (6.79, 0.03, -0.17) or similar value with change of sign"\r | |
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)){\r | |
338 | printf("At (X,Y,Z) : (%6.2lf,%6.2lf,%6.2lf) Field (Bx,By,Bz) is (%6.2lf,%6.2lf,%6.2lf)\n",\r | |
339 | x[0],x[1],x[2],b[0],b[1],b[2]); \r | |
340 | cerr<<"Magnetic field is not properly set, MUON tracking will not possble"<<endl;\r | |
341 | return 1;\r | |
342 | }\r | |
343 | \r | |
344 | \r | |
345 | \r | |
346 | TEveRecTrack rt;\r | |
347 | \r | |
348 | unsigned long size = block->GetSize();\r | |
349 | Int_t * buffer = (Int_t *)block->GetData();\r | |
350 | \r | |
351 | AliHLTMUONTracksBlockReader muontrackblock(buffer, size);\r | |
352 | const AliHLTMUONTrackStruct* mtrack = muontrackblock.GetArray();\r | |
353 | //cout<<"NofTracks : "<<muontrackblock.Nentries()<<endl;\r | |
354 | for(AliHLTUInt32_t ientry = 0; ientry < muontrackblock.Nentries(); ientry++){\r | |
355 | \r | |
fe0324de | 356 | AliMUONTrack *muonTrack = new AliMUONTrack();\r |
357 | MakeMUONTrack(muonTrack,mtrack);\r | |
358 | if(muonTrack->GetNClusters()==0){\r | |
359 | delete muonTrack;\r | |
34ba7866 | 360 | continue;\r |
361 | }\r | |
362 | \r | |
363 | rt.fLabel = ientry;\r | |
364 | AliEveMUONTrack* track = new AliEveMUONTrack(&rt, fullTracks->GetPropagator());\r | |
fe0324de | 365 | track->MakeMUONTrack(muonTrack);\r |
34ba7866 | 366 | //track->SetTitle(Form("HLT Track : %d, pt : %lf",ientry,TMath::Sqrt(((mtrack->fPx * mtrack->fPx) + (mtrack->fPy * mtrack->fPy)))));\r |
367 | track->SetName(Form("HLT Track : %d, pt : %lf",ientry,TMath::Sqrt(((mtrack->fPx * mtrack->fPx) + (mtrack->fPy * mtrack->fPy)))));\r | |
fd2adb88 | 368 | fullTracks->AddElement(track);\r |
34ba7866 | 369 | \r |
370 | mtrack++;\r | |
371 | }//track loop\r | |
372 | \r | |
373 | return iResult;\r | |
374 | \r | |
375 | }\r |