]> git.uio.no Git - u/mrichter/AliRoot.git/blob - HLT/EVE/AliHLTEveMuon.cxx
moving AliEMCALGeoUtils to AliEMCALGeometry
[u/mrichter/AliRoot.git] / HLT / EVE / AliHLTEveMuon.cxx
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
27 #include "AliEveHLTEventManager.h"\r
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
50   AliHLTEveBase("Muon"),\r
51   fFullTrackList(NULL),\r
52   fTracks(NULL),\r
53   fClusters(NULL)\r
54 {\r
55   // Constructor.\r
56   SetMaxHistograms(6);\r
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
81       AddElement(fClusters);\r
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
89       AddElement(fTracks);\r
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
98       AddElement(fFullTrackList);\r
99     }\r
100     \r
101     ProcessFullTracks( block,  fFullTrackList );\r
102 \r
103   } else if(block->GetDataType().CompareTo("ROOTHIST") == 0) {\r
104     ProcessHistogram(block);\r
105   }\r
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
119   TEveStraightLineSet * lineset = new TEveStraightLineSet("MUON Tracks");\r
120   lineset->SetMainColor(kRed);\r
121   lineset->SetLineWidth(3);\r
122   return lineset;\r
123 }\r
124 \r
125 TEveTrackList * AliHLTEveMuon::CreateFullTrackList(){\r
126   // See header file\r
127   TEveTrackList * lineset = new TEveTrackList("MUON Full Tracks");\r
128   lineset->SetMainColor(kBlue);\r
129   return lineset;\r
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
348     fullTracks->AddElement(track);\r
349     \r
350     mtrack++;\r
351   }//track loop\r
352   \r
353   return iResult;\r
354 \r
355 }\r