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