]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/EVE/AliHLTEveMuon.cxx
Improving binning hanlding in the LTM robust estimator
[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
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
45using namespace std;\r
46\r
47class AliHLTMUONUtils;\r
48class AliEveMuonTrack;\r
49\r
50ClassImp(AliHLTEveMuon);\r
51\r
52AliHLTEveMuon::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
62AliHLTEveMuon::~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
79void 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
112TEvePointSet * 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
120TEveStraightLineSet * 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
128TEveTrackList * 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
135void 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
144void 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
151void 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
168void 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
209void 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 256int 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(&paramAtVtx);\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
326Int_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