]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - HMPID/Hmenu.C
area of Mathieson parametrized; hit ctor change eloss to qdc; Helix removed
[u/mrichter/AliRoot.git] / HMPID / Hmenu.C
... / ...
CommitLineData
1AliRun *a; AliRunLoader *al; TGeoManager *g; //globals for easy manual manipulations
2AliHMPID *h; AliLoader *hl; AliHMPIDParam *hp;
3Bool_t isGeomType=kFALSE;
4
5Int_t nCurEvt=0;
6Int_t nMaxEvt=0;
7TControlBar *pMenu=0;
8//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
9void GetParam()
10{
11 isGeomType=!isGeomType;
12 if(g) delete g; if(hp) delete hp; //delete current TGeoManager and AliHMPIDParam
13 if(isGeomType) g=TGeoManager::Import("geometry.root");
14 else g=TGeoManager::Import("misaligned_geometry.root");
15 hp=AliHMPIDParam::Instance();
16}//GetParam()
17//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
18void Hmenu()
19{
20 TString status="Status: ";
21 if(gSystem->IsFileInIncludePath("galice.root")){
22 status+="galice.root: ";
23 al=AliRunLoader::Open(); //try to open galice.root from current dir
24 if(gAlice) delete gAlice; //in case we execute this in aliroot delete default AliRun object
25 al->LoadgAlice(); a=al->GetAliRun(); //take new AliRun object from galice.root
26 hl=al->GetDetectorLoader("HMPID"); h=(AliHMPID*)a->GetDetector("HMPID"); //get HMPID object from galice.root
27
28 status+=(h)? "HMPID": "PROBLEM PROBLEM PROBLEM- no HMPID";
29 nMaxEvt=al->GetNumberOfEvents()-1;
30 status+=Form(" Event(s) 0-%i",nMaxEvt);
31 }else
32 status+="PROBLEM PROBLEM PROBLEM no galice.root";
33
34 status+=Form(" curent event %i",nCurEvt);
35 GetParam();
36 pMenu = new TControlBar("horizontal",status.Data(),0,0);
37 pMenu->AddButton(" ","","");
38 pMenu->AddButton(" General ","General()" ,"general items which do not depend on any files");
39 pMenu->AddButton(" ","" ,"");
40 pMenu->AddButton(" Sim data ","SimData()" ,"items which expect to have simulated files" );
41 pMenu->AddButton(" ","" ,"");
42 pMenu->AddButton(" Raw data ","RawData()" ,"items which expect to have raw files" );
43 pMenu->AddButton(" "," " ,"");
44 pMenu->AddButton(" Test ","Test()" ,"all test utilities");
45 pMenu->AddButton(" PREV EVENT ","PrevEvent()" ,"Set the previous event" );
46 pMenu->AddButton(" NEXT EVENT ","NextEvent()","Set the next event" );
47 pMenu->AddButton(" Quit ",".q" ,"close session" );
48 pMenu->Show();
49}//Menu()
50//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
51void General()
52{
53 TControlBar *pMenu = new TControlBar("vertical","General purpose",100,50);
54 pMenu->AddButton("Debug ON","don();" ,"Switch debug on-off" );
55 pMenu->AddButton("Debug OFF","doff();" ,"Switch debug on-off" );
56 pMenu->AddButton("Geo GUI","geo();" ,"Shows geometry" );
57 pMenu->AddButton("Browser","new TBrowser;" ,"Start ROOT TBrowser" );
58 pMenu->Show();
59}//General()
60//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
61void SimData()
62{
63 TControlBar *pSim = new TControlBar("vertical","Sim data",310,50);
64 pSim->AddButton("Display ","hed();" ,"Display Fast");
65 pSim->AddButton("HITS QA" ,"hqa()" ,"QA plots for hits: hqa()");
66 pSim->AddButton("Print stack" ,"stack();" ,"To print hits: hp(evt)");
67 pSim->AddButton("Print hits" ,"hp(nCurEvt);" ,"To print hits: hp(evt)");
68 pSim->AddButton("Print sdigits" ,"sp(nCurEvt);" ,"To print sdigits: sp(evt)");
69 pSim->AddButton("Print digits" ,"dp(nCurEvt);" ,"To print digits: dp(evt)");
70 pSim->AddButton("Print clusters" ,"cp(nCurEvt);" ,"To print clusters: cp(evt)");
71 pSim->Show();
72}//SimData()
73//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
74void RawData()
75{
76 TControlBar *pMenu = new TControlBar("vertical","Raw data",580,50);
77 pMenu->AddButton("ESD print" ,"ep();" ,"To print ESD info: ep()" );
78 pMenu->AddButton("ESD QA" ,"eq();" ,"To draw ESD hists: eq()" );
79 pMenu->AddButton("Clusters print" ,"cp();" ,"To print clusters: cp()" );
80 pMenu->AddButton("Clusters QA" ,"cq();" ,"To draw clusters hists: cq()" );
81 pMenu->AddButton("Print Matrix" ,"mp();" ,"To print prob matrix: mp()" );
82 pMenu->AddButton("Print occupancy" ,"r->OccupancyPrint(-1);" ,"To print occupancy" );
83 pMenu->AddButton("Print event summary " ,"r->SummaryOfEvent();" ,"To print a summary of the event" );
84 pMenu->Show();
85}//RawData()
86//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
87void Test()
88{
89 TControlBar *pTst = new TControlBar("vertical","Test",625,50);
90 pTst->AddButton("TEST Display " ,"sed();" ,"Display Fast");
91 pTst->AddButton("Test all" ,"tst();" ,"test hits->sdigits->digits" );
92 pTst->AddButton("Segmentation" ,"ts()" ,"test segmentation methods" );
93 pTst->AddButton("Test response" ,"AliHMPIDParam::TestResp();","Test AliHMPIDParam response methods" );
94 pTst->AddButton("Print map" ,"PrintMap();" ,"Test AliHMPIDParam transformation methods" );
95 pTst->AddButton("Test Recon" ,"rec();" ,"Test AliHMPIDRecon" );
96 pTst->Show();
97}//Test()
98//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
99
100
101void doff(){ Printf("DebugOFF"); AliLog::SetGlobalDebugLevel(0);}
102void don() { Printf("DebugON"); AliLog::SetGlobalDebugLevel(AliLog::kDebug);}
103
104void geo ( ) {gGeoManager->GetTopVolume()->Draw("ogl");}
105
106void du ( ) {h->Dump ( );} //utility display
107
108void PrevEvent() {nCurEvt--;if(nCurEvt<0 )nCurEvt=0 ;pMenu->SetTitle(Form("Event(s): 0-%i Current event %i",nMaxEvt,nCurEvt));}
109void NextEvent() {nCurEvt++;if(nCurEvt>=nMaxEvt)nCurEvt=nMaxEvt;pMenu->SetTitle(Form("Event(s): 0-%i Current event %i",nMaxEvt,nCurEvt));}
110void stack( ) {AliHMPIDParam::Stack();}
111void tid (Int_t tid,Int_t evt=0) {AliHMPIDParam::Stack(evt,tid);}
112//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
113void PrintMap()
114{
115
116 Double_t r2d=TMath::RadToDeg();
117
118 Double_t x=AliHMPIDDigit::SizeAllX(),y=AliHMPIDDigit::SizeAllY();
119
120 Printf("\n\n\n");
121
122 for(int ch=6;ch>=0;ch--){
123 AliHMPIDDigit dL,dR; dL.Manual2(ch,2,0 ,24);
124 dR.Manual2(ch,3,79,24);
125 TVector3 lt=rp->Lors2Mars(ch,0,y); TVector3 rt=rp->Lors2Mars(ch,x,y);
126 TVector3 ce=rp->Lors2Mars(ch,x/2,y/2);
127 TVector3 lb=rp->Lors2Mars(ch,0,0); TVector3 rb=rp->Lors2Mars(ch,x,0);
128
129 Printf(" ____________________________");
130 Printf("|%6.2fcm %6.2fcm|" ,lt.Mag() , rt.Mag() );
131 Printf("|%6.2fde %6.2fde|" ,lt.Theta()*r2d , rt.Theta()*r2d );
132 Printf("|%6.2fde %6.2fde|" ,lt.Phi()*r2d , rt.Phi()*r2d );
133 Printf("| |" );
134 Printf("|DDL %2i %7.2fcm DDL %2i|" ,dL.DdlIdx() , ce.Mag() , dR.DdlIdx() );
135 Printf("| 0x%x %7.2fdeg 0x%x|" ,dL.DdlId() , ce.Theta()*r2d , dR.DdlId() );
136 Printf("| %7.2fdeg |" , ce.Phi()*r2d );
137 Printf("| |");
138 Printf("|%6.2fcm %6.2fcm|" ,lb.Mag() , rb.Mag() );
139 Printf("|%6.2fde %6.2fde|" ,lb.Theta()*r2d , rb.Theta()*r2d );
140 Printf("|%6.2fde Ch%i %6.2fde|" ,lb.Phi()*r2d , ch , rb.Phi()*r2d );
141 Printf(" ----------------------------");
142 }
143
144 Double_t m[3];
145 for(int i=0;i<1000;i++){
146 Float_t xout=0,xin=gRandom->Rndm()*130.60;
147 Float_t yout=0,yin=gRandom->Rndm()*126.16;
148 Int_t c=gRandom->Rndm()*6;
149 rp->Lors2Mars(c,xin,yin,m);
150 rp->Mars2Lors(c,m,xout,yout);
151 if( (xin-xout) != 0) Printf("Problem in X");
152 if( (yin-yout) != 0) Printf("Problem in Y");
153 }
154
155 Int_t ddl,r,d,a,ch,raw,pc,px,py; AliHMPIDDigit dd;
156
157 ddl=0;raw=0x2214000;r= 8;d=8;a=20;
158 ddl=1;raw=0x2214000;r= 8;d=8;a=20;
159
160
161 ddl=2;raw=0x08d6000;r= 2;d=3;a=22;
162 ddl=3;raw=0x08d6000;r= 2;d=3;a=22;
163
164
165 ddl=6;raw=0x592e000;r=22;d=4;a=46;ch=3;pc=4;px=55;py=5;dd.Raw(ddl,raw);
166 Printf("(ch=%i,pc=%i,x=%2i,y=%2i) ddl=%i raw=0x%h (r=%2i,d=%2i,a=%2i)",
167 ch, pc, px, py, ddl, raw, r, d, a); dd.Print();
168 ddl=7;raw=0x592e000;r=22;d=4;a=46;ch=3;pc=1;
169}//PrintMap()
170//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
171void DrawSeg()
172{
173 TCanvas *pC=new TCanvas("seg","Segmentation as seen from electronics side");
174 DrawPc(1);
175 new TGedEditor(pC);
176 pC->ToggleEventStatus();
177 pC->SetEditable(0);
178 pC->AddExec("status","DrawStatus()");
179}
180//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
181void DrawStatus()
182{// Show info about current cursur position in status bar of the canvas
183// Printf("event %i",gPad->GetEvent()); return;
184 TPad *pad=gPad;
185 TCanvas *pC=(TCanvas*)pad;
186 TRootCanvas *pRC= (TRootCanvas*)pC->GetCanvasImp();
187 TGStatusBar *pBar=pRC->GetStatusBar();
188 pBar->SetParts(5);
189 Float_t x=pad->AbsPixeltoX(pad->GetEventX()); Float_t y=pad->AbsPixeltoY(pad->GetEventY());
190 if(AliHMPIDDigit::IsInDead(x,y))
191 pBar->SetText("Out of sensitive area",4);
192 else{
193 Int_t pc,px,py,w32,ddl,r,d,a; AliHMPIDDigit::Lors2Pad(x,y,pc,px,py); AliHMPIDDigit dig; dig.Set(1,pc,px,py); dig.Raw(w32,ddl,r,d,a);
194 pBar->SetText(Form("(pc%i,px%i,py%i) (r%i,d%i,a%i) (%.2f,%.2f)",
195 pc ,px ,py, r ,d ,a ,dig.LorsX(),dig.LorsY()),4);
196 }
197// if(pad->GetEvent()==1){
198// new TCanvas("zoom",Form("Row %i DILOGIC %i",dig.Row(),dig.Dilogic()));
199// }
200}//DrawStatus()
201//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
202void DrawPc(Bool_t isFill)
203{
204 gPad->Range(-10,-10,AliHMPIDDigit::SizeAllX()+5,AliHMPIDDigit::SizeAllY()+5);
205
206
207 Float_t dX2=0.5*AliHMPIDDigit::SizePadX(),
208 dY2=0.5*AliHMPIDDigit::SizePadY() ;
209
210 TLatex txt; txt.SetTextSize(0.01);
211 TLine *pL;
212
213 AliHMPIDDigit dig; UInt_t w32; Int_t ddl,r,d,a;
214
215 for(Int_t iPc=AliHMPIDDigit::kMinPc;iPc<=AliHMPIDDigit::kMaxPc;iPc++){
216 TBox *pBox=new TBox(AliHMPIDDigit::fMinPcX[iPc],AliHMPIDDigit::fMinPcY[iPc],
217 AliHMPIDDigit::fMaxPcX[iPc],AliHMPIDDigit::fMaxPcY[iPc]);
218
219 if(iPc==0||iPc==2||iPc==4) pBox->SetFillColor(29);
220 else pBox->SetFillColor(41);
221 pBox->Draw();
222
223 if(!isFill) continue;
224
225// if(iPc%2) {dig.Set(0,iPc,79,25); txt.DrawText(dig.LorsX()+2,dig.LorsY(),Form("PC%i",dig.Pc()));}//print PC#
226
227 txt.SetTextAlign(32);
228 for(Int_t iRow=0;iRow<8 ;iRow++){//draw row lines (horizontal)
229 dig.Set(0,iPc,0,iRow*6); dig.Raw(w32,ddl,r,d,a); //set digit to the left-down pad of this row
230
231 if(iPc%2) txt.DrawText(dig.LorsX()-1 ,dig.LorsY(),Form("%i",dig.PadPcY())); //print PadY#
232 txt.DrawText(dig.LorsX()-1+(iPc%2)*67,dig.LorsY()+2,Form("r%i",r)); //print Row#
233 pL=new TLine(dig.LorsX()-dX2,dig.LorsY()-dY2,dig.LorsX()+AliHMPIDDigit::SizePcX()-dX2,dig.LorsY()-dY2);//draw horizontal line
234 if(iRow!=0) pL->Draw();
235 }//row loop
236
237 txt.SetTextAlign(13);
238 for(Int_t iDil=0;iDil<10;iDil++){//draw dilogic lines (vertical)
239 dig.Set(0,iPc,iDil*8,0); dig.Raw(w32,ddl,r,d,a); //set this digit to the left-down pad of this dilogic
240
241 txt.DrawText(dig.LorsX() ,dig.LorsY()-1,Form("%i",dig.PadPcX())); //print PadX#
242 if(iPc==4 || iPc==5) txt.DrawText(dig.LorsX()+2,dig.LorsY()+42,Form("d%i",d)); //print Dilogic#
243 pL=new TLine(dig.LorsX()-dX2,dig.LorsY()-dY2,dig.LorsX()-dX2,dig.LorsY()+AliHMPIDDigit::SizePcY()-dY2); //draw vertical line
244 if(iDil!=0)pL->Draw();
245 }//dilogic loop
246 }//PC loop
247}//DrawPc()
248//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
249void hed()
250{//event display from files
251 static TCanvas *pC=0;
252 static Int_t iEvt=0;
253 static Int_t iEvtTot=999;
254 static TFile *pEsdFl=0;
255 static TTree *pEsdTr=0;
256 static AliESD *pEsd=0;
257
258
259
260
261 if(!pC&&iEvt<iEvtTot){
262 iEvt=0;
263 iEvtTot=999;
264 if(hl==0) {Printf("hed: no HMPID loader");return;}
265 Printf("Opening session");
266 pEsdFl=TFile::Open("AliESDs.root"); if(!pEsdFl || !pEsdFl->IsOpen()) return;//open AliESDs.root
267 pEsdTr=(TTree*) pEsdFl->Get("esdTree"); if(!pEsdTr) return;//get ESD tree
268 pEsdTr->SetBranchAddress("ESD", &pEsd);
269 hl->LoadHits(); hl->LoadDigits(); hl->LoadRecPoints();
270 iEvtTot=pEsdTr->GetEntries();
271 pC=new TCanvas("hed","View from electronics side, IP is behind the picture.",1000,900); pC->ToggleEventStatus(); pC->Divide(3,3);
272 pC->cd(7); TButton *pBtn=new TButton("Next","hed()",0,0,0.2,0.1); pBtn->Draw();
273 pC->cd(7); TButton *pBtn=new TButton("Quit","Close_hed()",0.2,0,0.4,0.1); pBtn->Draw();
274 new TGedEditor(pC);
275 }
276
277 TLatex txt; txt.SetTextSize(0.1);
278 TClonesArray hits("AliHMPIDHit");
279
280 if(iEvt<iEvtTot){
281 pEsdTr->GetEntry(iEvt); al->GetEvent(iEvt);
282 hl->TreeD()->GetEntry(0); hl->TreeR()->GetEntry(0);
283 ReadHits(&hits);
284
285 pC->cd(3); gPad->Clear(); txt.DrawLatex(0.2,0.2,Form("Event %i (total %i)",iEvt,iEvtTot));
286 DrawEvt(pC,&hits,h->DigLst(),h->CluLst(),pEsd);
287
288 iEvt++;
289 }else{
290 Printf("--- No more events available...Bye.");
291 pC->Close();
292 pC=0x0;
293 iEvt=0;
294 iEvtTot=999;
295 }
296}//hed()
297//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
298void Close_hed()
299{
300 TCanvas *pC = ((TCanvas*)gROOT->FindObject("hed"));if(!pC) return;
301 pC->Close();
302 pC=0x0;
303}
304//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
305void ReadHits(TClonesArray *pHitLst)
306{
307 pHitLst->Delete(); Int_t cnt=0;
308 for(Int_t iEnt=0;iEnt<hl->TreeH()->GetEntries();iEnt++){ //TreeH loop
309 hl->TreeH()->GetEntry(iEnt); //get current entry (prim)
310 for(Int_t iHit=0;iHit<h->Hits()->GetEntries();iHit++){ //hits loop
311 AliHMPIDHit *pHit = (AliHMPIDHit*)h->Hits()->At(iHit); //get current hit
312 new((*pHitLst)[cnt++]) AliHMPIDHit(*pHit);
313 }//hits loop for this entry
314 }//tree entries loop
315
316}//ReadHits()
317//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
318void sed()
319{
320
321 static TCanvas *pC1=0;
322
323 if(!pC1){
324 pC1=new TCanvas("hed","Simulated evets-View from electronics side, IP is behind the picture.",1000,900); pC1->Divide(3,3);
325 pC1->cd(7); TButton *pBtn=new TButton("Next","sed()",0,0,0.2,0.1); pBtn->Draw();
326 }
327
328
329
330 AliHMPIDRecon rec;
331
332 TClonesArray lh("AliHMPIDHit");
333 TClonesArray ls("AliHMPIDDigit");
334 TObjArray ld(7); for(Int_t i=0;i<7;i++) ld.AddAt(new TClonesArray("AliHMPIDDigit"),i);
335 TObjArray lc(7); for(Int_t i=0;i<7;i++) lc.AddAt(new TClonesArray("AliHMPIDCluster"),i);
336 AliESD esd;
337
338
339 SimEsd(&esd);
340 HitsFromEsd(&esd,&lh);
341
342
343
344
345 AliHMPIDv1::Hit2Sdi(&lh,&ls);
346 AliHMPIDDigitizer::Sdi2Dig(&ls,&ld);
347 AliHMPIDReconstructor::Dig2Clu(&ld,&lc);
348// AliHMPIDTracker::Recon(&esd,&cl);
349
350 DrawEvt(pC1,&lh,&ld,&lc,&esd);
351}//SimEvt()
352//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
353void DrawEvt(TCanvas *pC,TClonesArray *pHitLst,TObjArray *pDigLst,TObjArray *pCluLst,AliESD *pEsd)
354{//draws all the objects of current event
355
356 AliHMPIDRecon rec;
357 TPolyMarker *pTxC[7]; TPolyMarker *pRin[7]; //intesections and rings
358 for(Int_t ch=0;ch<7;ch++){
359 pTxC[ch]=new TPolyMarker; pTxC[ch]->SetMarkerStyle(2); pTxC[ch]->SetMarkerColor(kRed); pTxC[ch]->SetMarkerSize(3);
360 pRin[ch]=new TPolyMarker; pRin[ch]->SetMarkerStyle(6); pRin[ch]->SetMarkerColor(kMagenta);
361 }
362
363
364 for(Int_t iTrk=0;iTrk<pEsd->GetNumberOfTracks();iTrk++){//tracks loop to collect cerenkov rings and intersection points
365 AliESDtrack *pTrk=pEsd->GetTrack(iTrk);
366 Int_t ch=pTrk->GetHMPIDcluIdx();
367 if(ch<0) continue; //this track does not hit HMPID
368 ch/=1000000;
369 Float_t th,ph,xPc,yPc; pTrk->GetHMPIDtrk(xPc,yPc,th,ph); //get info on current track
370 pTxC[ch]->SetNextPoint(xPc,yPc); //add new intersection point
371
372 Float_t ckov=pTrk->GetHMPIDsignal(); Float_t err=TMath::Sqrt(pTrk->GetHMPIDchi2());
373
374 if(ckov>0){
375 rec.SetTrack(xPc,yPc,th,ph);
376 TVector2 pos; for(int j=0;j<100;j++){rec.TracePhot(ckov,j*0.0628,pos); pRin[ch]->SetNextPoint(pos.X(),pos.Y());}
377 }
378 }//tracks loop
379
380 for(Int_t iCh=0;iCh<7;iCh++){//chambers loop
381 switch(iCh){
382 case 6: pC->cd(1); break; case 5: pC->cd(2); break;
383 case 4: pC->cd(4); break; case 3: pC->cd(5); break; case 2: pC->cd(6); break;
384 case 1: pC->cd(8); break; case 0: pC->cd(9); break;
385 }
386 gPad->SetEditable(kTRUE); gPad->Clear();
387 DrawPc(0);
388 for(Int_t iHit=0;iHit<pHitLst->GetEntries();iHit++){
389 AliHMPIDHit *pHit=(AliHMPIDHit*)pHitLst->At(iHit);
390 if(pHit->Ch()==iCh) pHit->Draw(); //draw hits
391 }
392 ((TClonesArray*)pDigLst->At(iCh))->Draw(); //draw digits
393 ((TClonesArray*)pCluLst->At(iCh))->Draw(); //draw clusters
394 pTxC[iCh]->Draw(); //draw intersections
395 pRin[iCh]->Draw(); //draw rings
396 gPad->SetEditable(kFALSE);
397// gPad->AddExec("zoom","DrawZoom()");
398 }//chambers loop
399
400
401// TLatex txt; txt.SetTextSize(0.02);
402// txt.DrawLatex(20,-5,Form("#theta=%.4f#pm%.5f with %2i #check{C}" ,simCkov,simErr,simN));
403// txt.DrawLatex(25,-5,Form("#theta=%.4f#pm%.5f with %2i #check{C}" ,recCkov,recErr,recN));
404// txt.DrawLatex(0 ,127,Form("#theta=%.2f#circ #phi=%.2f#circ @(%.2f,%.2f) ",th*TMath::RadToDeg(),ph*TMath::RadToDeg(),radx,rady));
405// Printf("DIG------DIG---------DIG--------DIG------DIG------DIG");pDigLst->Print();Printf("");
406}//DrawEvt()
407//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
408void DrawZoom()
409{
410 TPad *pad=gPad; Float_t x=gPad->AbsPixeltoX(pad->GetEventX()); Float_t y=gPad->AbsPixeltoY(pad->GetEventY());
411 TCanvas *zoom = (TCanvas*)gROOT->GetListOfCanvases()->FindObject("zoom");
412 if(!zoom) zoom=new TCanvas("zoom","");
413 zoom->SetTitle(Form("Zoom view around %.2f %.2f",x,y));
414 gPad->Range(x-20,y-20,x+20,y+20);
415 zoom->Update();
416}
417void t1(Int_t case=1)
418{
419 AliHMPIDDigit *d[10]; for(Int_t i=0;i<10;i++) d[i]=new AliHMPIDDigit;
420
421
422 Int_t iNdig;
423
424 if(case==1){
425 iNdig=9;
426
427 d[0]->Manual2(1,2,67,26, 33);
428 d[1]->Manual2(1,2,66,25,431); d[2]->Manual2(1,2,67,25, 21);
429 d[3]->Manual2(1,2,65,24,127); d[4]->Manual2(1,2,66,24, 54); d[5]->Manual2(1,2,67,24, 5);
430 d[6]->Manual2(1,2,65,23, 20); d[7]->Manual2(1,2,66,23, 5); d[8]->Manual2(1,2,67,23, 6);
431 }else if(case==2){
432 iNdig=3;
433 d[0]->Manual2(0,0,36,14, 8);
434 d[1]->Manual2(0,0,36,13, 33); d[2]->Manual2(0,0,37,13, 22);
435 }
436
437 AliHMPIDCluster c;
438 for(int i=0;i<iNdig;i++) c.DigAdd(d[i]); c.Print();
439
440
441 TClonesArray *cl=new TClonesArray("AliHMPIDCluster");
442
443 c.Solve(cl,kTRUE);
444 Printf("");
445
446 cl->Print();
447}//t1()
448//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
449void SimEsd(AliESD *pEsd)
450{
451 TParticle part; TLorentzVector mom;
452 for(Int_t iTrk=0;iTrk<25;iTrk++){//stack loop
453 part.SetPdgCode(kProton);
454 part.SetProductionVertex(0,0,0,0);
455 Double_t eta= -0.4+gRandom->Rndm()*0.8; //rapidity is random [-0.4,+0.4]
456 Double_t phi= gRandom->Rndm()*1.4; //phi is random [ 0 , 80 ] degrees
457 mom.SetPtEtaPhiM(2,eta,phi,part.GetMass());
458 part.SetMomentum(mom);
459 AliESDtrack trk(&part);
460 pEsd->AddTrack(&trk);
461 }//stack loop
462}//EsdFromStack()
463//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
464void EsdFromStack(AliESD *pEsd)
465{
466 al->LoadHeader();al->LoadKinematics();
467 AliStack *pStk=al->Stack();
468
469 for(Int_t iTrk=0;iTrk<pStk->GetNtrack();iTrk++){//stack loop
470 TParticle *pPart=pStk->Particle(iTrk);
471 if(pPart->GetPDG()->Charge()==0) continue; //neutral particles are not reconstructed
472 if(pPart->GetFirstMother()>0) continue; //do not consider secondaries
473 AliESDtrack trk(pPart);
474 pEsd->AddTrack(&trk);
475 }//stack loop
476}//EsdFromStack()
477//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
478void HitsFromEsd(AliESD *pEsd, TClonesArray *pHitLst)
479{
480 AliHMPIDRecon rec;
481 const Int_t kCerenkov=50000050,kFeedback=50000051;
482 Int_t hc=0; TVector2 pos;
483 for(Int_t iTrk=0;iTrk<pEsd->GetNumberOfTracks();iTrk++){//tracks loop
484 AliESDtrack *pTrk=pEsd->GetTrack(iTrk);
485 Float_t xRa,yRa;
486 Int_t ch=AliHMPIDTracker::IntTrkCha(pTrk,xRa,yRa);
487 if(ch<0) continue; //this track does not hit HMPID
488 Float_t ckov=0.63;
489
490 Float_t th,ph,xPc,yPc,; pTrk->GetHMPIDtrk(xPc,yPc,th,ph); rec.SetTrack(xRa,yRa,th,ph);
491
492 if(!AliHMPIDDigit::IsInDead(xPc,yPc)) new((*pHitLst)[hc++]) AliHMPIDHit(ch,200e-9,kProton ,iTrk,xPc,yPc); //mip hit
493// for(int i=0;i<4;i++) new((*pHitLst)[hc++]) AliHMPIDHit(ch,7.5e-9,kFeedback,iTrk,gRandom->Rndm()*130,gRandom->Rndm()*126); //bkg hits 4 per track
494// for(int i=0;i<16;i++){
495// rec.TracePhot(ckov,gRandom->Rndm()*TMath::TwoPi(),pos);
496// new((*pHitLst)[hc++]) AliHMPIDHit(ch,7.5e-9,kCerenkov,iTrk,pos.X(),pos.Y());} //photon hits
497 }//tracks loop
498}//HitsFromEsd()
499//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
500void tst(Int_t nEvts=10000,Int_t type=999)
501{
502
503 TLegend *lQ=new TLegend(0.5,0.5,0.9,0.9);
504
505 TH1F *hQ7 =new TH1F("hQ7" ,"" ,300,-50,2000); hQ7 ->SetLineColor(kRed); lQ->AddEntry(hQ7 ,"Ckov 7 eV"); hQ7->SetStats(0);
506 TH1F *hQ200=new TH1F("hQ200","" ,300,-50,2000); hQ200->SetLineColor(kBlack); lQ->AddEntry(hQ200,"mip 200 eV");
507 TH1F *hQ500=new TH1F("hQ500","" ,300,-50,2000); hQ500->SetLineColor(kCyan); lQ->AddEntry(hQ500,"mip 500 eV");
508 TH1F *hQ900=new TH1F("hQ900","" ,300,-50,2000); hQ900->SetLineColor(kGreen); lQ->AddEntry(hQ900,"mip 900 eV");
509
510 TH1F *hCluPerEvt=new TH1F("hCluPerEvt","# clusters per event",11,-0.5,10.5);
511 TH1F *hCluChi2 =new TH1F("hChi2","Chi2 ",1000,0,100);
512 TH1F *hCluFlg =new TH1F("hCluFlg","Cluster flag",14,-1.5,12.5); hCluFlg->SetFillColor(5);
513 TH1F *hCluRawSize= new TH1F("hCluRawSize","Raw cluster size ",100,0,100);
514
515 TH2F *pCluMapSi1=new TH2F("cluMSi1","Size 1 map",1700,-10,160,1700,-10,160);
516 TH2F *pCluMapLo1=new TH2F("cluMLo1","Loc Max 1 map",1700,-10,160,1700,-10,160);
517 TH2F *pCluMapEmp=new TH2F("cluMEmp","Should be empty",1700,-10,160,1700,-10,160);
518 TH2F *pCluMapUnf=new TH2F("cluMUnf","Unfolded map",1700,-10,160,1700,-10,160);
519 TH2F *pCluMapMax=new TH2F("cluMMax","Max Loc Max map",1700,-10,160,1700,-10,160);
520 TH2F *pCluMapAbn=new TH2F("cluMAbn","Fit failed map",1700,-10,160,1700,-10,160);
521 TH2F *pCluMapEdg=new TH2F("cluMEdg","On edge map",1700,-10,160,1700,-10,160);
522 TH2F *pCluMapNoLoc=new TH2F("cluMNoLoc","No Loc map",1700,-10,160,1700,-10,160);
523 TH2F *pCluMapCoG=new TH2F("cluMCoG","CoG map",1700,-10,160,1700,-10,160);
524
525 TH1F *hHitCluDifX = new TH1F("hHitCluDifX" ,";entries;x_{Hit}-x_{Clu} [cm]" ,2000,-2,2); hHitCluDifX->Sumw2(); hHitCluDifX->SetFillColor(kYellow);
526 TH1F *hHitCluDifY = new TH1F("hHitCluDifY" ,";entries;y_{Hit}-y_{Clu} [cm]" ,2000,-2,2); hHitCluDifY->Sumw2(); hHitCluDifY->SetFillColor(kYellow);
527 TH2F *hHitCluDifXY= new TH2F("hHitCluDifXY",";x_{Hit}-x_{Clu};y_{Hit}-y_{Clu}",2000,-2,2,2000,-2,2);hHitCluDifXY->Sumw2();
528 TH1F *hHitCluDifQ = new TH1F("hHitCluDifQ" ,";entries;Q_{Hit}-Q_{Clu}" ,200 ,-100,100); hHitCluDifQ->Sumw2(); hHitCluDifQ->SetFillColor(kYellow);
529
530 Float_t e200=200e-9,e500=500e-9,e900=900e-9,e7=7e-9;//predefined Eloss
531
532 AliHMPIDHit hit(0,0,kProton,0,0,0);
533 TClonesArray hits("AliHMPIDHit"); TClonesArray sdigs("AliHMPIDDigit");
534 TObjArray digs(7); for(Int_t i=0;i<7;i++) digs.AddAt(new TClonesArray("AliHMPIDDigit"),i);
535 TObjArray clus(7); for(Int_t i=0;i<7;i++) clus.AddAt(new TClonesArray("AliHMPIDCluster"),i);
536
537
538 for(Int_t iEvt=0;iEvt<nEvts;iEvt++){//events loop
539 Printf("============> iEvt = %d ",iEvt);
540 Int_t nHits=(type==999)?1:40;
541 Int_t ch,pid; Float_t e,hitx,hity,hitq;
542 for(Int_t iHit=0;iHit<nHits;iHit++){//hits loop for the current event
543 Printf("In loop");
544 switch(iHit){
545 case 0: ch=0;pid=kProton;e=e200;hitx=16.0+gRandom->Rndm()*0.8;hity= 16.8+gRandom->Rndm()*0.84;break; //mip ramdomly distributed in one pad in the middle
546 case 1: ch=0;pid=kProton;e=e200;hitx=0.4;hity=0.42;break; //mip in left-hand bottom coner of chamber 0
547 case 2: ch=0;pid=kProton;e=e200;hitx=0.4;hity=30 ;break; //mip on left edge of chamber 0
548 case 3: ch=0;pid=kProton;e=e200;hitx=40; hity=0.42;break; //mip on bottom edge of chamber 0
549 default: ch=gRandom->Rndm()*6; pid=(gRandom->Rndm()>0.9)? kProton:kCerenkov;
550 if(pid==kProton)
551 e=gRandom->Rndm()*900e-9;
552 else
553 e=5.5e-9+3e-9*gRandom->Rndm();
554 x=gRandom->Rndm()*AliHMPIDDigit::SizeAllX(); y=gRandom->Rndm()*AliHMPIDDigit::SizeAllY();break; //random hit
555 }
556 new(hits[iHit]) AliHMPIDHit(ch,e,pid,iHit,hitx,hity);
557 hitq=e;
558 hQ200->Fill(hit.QdcTot(e200));
559 hQ500->Fill(hit.QdcTot(e500));
560 hQ900->Fill(hit.QdcTot(e900));
561 hQ7 ->Fill(hit.QdcTot(e7));
562 }//hits loop
563
564 hits.Print();
565
566 AliHMPIDv1::Hit2Sdi(&hits,&sdigs);
567 AliHMPIDDigitizer::Sdi2Dig(&sdigs,&digs);
568 AliHMPIDReconstructor::Dig2Clu(&digs,&clus);
569
570 for(Int_t iCh=AliHMPIDDigit::kMinCh;iCh<=AliHMPIDDigit::kMaxCh;iCh++){//chambers loop
571 TClonesArray *pDigs=(TClonesArray *)digs.UncheckedAt(iCh);
572 TClonesArray *pClus=(TClonesArray *)clus.UncheckedAt(iCh);
573
574 hCluPerEvt->Fill(pClus->GetEntriesFast());
575 for(Int_t iClu=0;iClu<pClus->GetEntriesFast();iClu++){//clusters loop
576 AliHMPIDCluster *pClu=(AliHMPIDCluster*)pClus->UncheckedAt(iClu);
577 Float_t clux=pClu->X(); Float_t cluy=pClu->Y(); Float_t cluq=pClu->Q();
578 hCluFlg->Fill(pClu->Status());
579 hCluChi2->Fill(pClu->Chi2());
580 hCluRawSize->Fill(pClu->Size());
581
582 switch(pClu->Status()){
583 case AliHMPIDCluster::kSi1: pCluMapSi1->Fill(clux,cluy); break;
584 case AliHMPIDCluster::kLo1: pCluMapLo1->Fill(clux,cluy); break;
585 case AliHMPIDCluster::kUnf: pCluMapUnf->Fill(clux,cluy); break;
586 case AliHMPIDCluster::kAbn: pCluMapAbn->Fill(clux,cluy); break;
587 case AliHMPIDCluster::kMax: pCluMapMax->Fill(clux,cluy); break;
588 case AliHMPIDCluster::kEdg: pCluMapEdg->Fill(clux,cluy); break;
589 case AliHMPIDCluster::kCoG: pCluMapCoG->Fill(clux,cluy); break;
590 case AliHMPIDCluster::kNoLoc: pCluMapNoLoc->Fill(clux,cluy); break;
591 default: pCluMapEmp->Fill(clux,cluy); break;
592 }
593
594 hHitCluDifX->Fill(hitx-clux); hHitCluDifY->Fill(hity-cluy); hHitCluDifXY->Fill(hitx-clux,hity-cluy); hHitCluDifQ->Fill(hitq-cluq);
595
596 }//clusters loop
597
598 }//chambers loop
599
600 hits.Delete(); sdigs.Delete(); for(int i = 0;i<7;i++){((TClonesArray*)digs.At(i))->Delete();((TClonesArray*)clus.At(i))->Delete();}
601 }//events loop
602
603 gStyle->SetPalette(1);
604 TCanvas *pC2=new TCanvas("Digit canvas","Digit canvas",1280,800); pC2->Divide(3,3);
605 pC2->cd(1);gPad->SetLogy(1);hHitCluDifX->Draw("hist");
606 pC2->cd(2);gPad->SetLogy(1);hHitCluDifY->Draw("hist");
607 pC2->cd(3);gPad->SetLogz(1);hHitCluDifXY->Draw("colz");
608 pC2->cd(4);gPad->SetLogy(1);hHitCluDifQ->Draw("hist");
609 pC2->cd(5);gPad->SetLogy(1);hCluFlg->Draw();
610 pC2->cd(6);gPad->SetLogy(1);hCluChi2->Draw();
611 pC2->cd(7); hCluRawSize->Draw();
612 pC2->cd(8); hCluPerEvt->Draw("colz");
613 pC2->cd(9); hQckov->Draw(); hQm200->Draw("same"); hQm500->Draw("same"); hQm900->Draw("same"); lQ->Draw();
614 TCanvas *pC1=new TCanvas("ClusterMaps","Cluster maps",1280,800); pC1->Divide(3,3);
615 pC1->cd(1); pCluMapSi1->Draw(); DrawPc(kFALSE);
616 pC1->cd(2); pCluMapLo1->Draw(); DrawPc(kFALSE);
617 pC1->cd(3); pCluMapUnf->Draw(); DrawPc(kFALSE);
618 pC1->cd(4); pCluMapAbn->Draw(); DrawPc(kFALSE);
619 pC1->cd(5); pCluMapMax->Draw(); DrawPc(kFALSE);
620 pC1->cd(6); pCluMapEdg->Draw(); DrawPc(kFALSE);
621 pC1->cd(7); pCluMapCoG->Draw(); DrawPc(kFALSE);
622 pC1->cd(8); pCluMapNoLoc->Draw();DrawPc(kFALSE);
623 pC1->cd(9); pCluMapEmp->Draw(); DrawPc(kFALSE);
624
625 pC1->SaveAs("$HOME/HitMaps.png"); //?????
626 pC2->SaveAs("$HOME/HitCluDif.gif");
627
628 Printf("Digits - raw -digits conversion...");
629
630 AliHMPIDDigit d1,d2; Int_t ddl,r,d,a;UInt_t w32;
631 for(Int_t iCh=AliHMPIDDigit::kMinCh;iCh<=AliHMPIDDigit::kMaxCh;iCh++)
632 for(Int_t iPc=AliHMPIDDigit::kMinPc;iPc<=AliHMPIDDigit::kMaxPc;iPc++)
633 for(Int_t iPx=AliHMPIDDigit::kMinPx;iPx<=AliHMPIDDigit::kMaxPx;iPx++)
634 for(Int_t iPy=AliHMPIDDigit::kMinPy;iPy<=AliHMPIDDigit::kMaxPy;iPy++){
635 d1.Set(iCh,iPc,iPx,iPy,3040); //set digit
636 d1.Raw(w32,ddl,r,d,a); //get raw word for this digit
637 d2.Raw(w32,ddl); //set another digit from that raw word
638 if(d1.Compare(&d2)) {d1.Print(); d2.Print(); Printf("");}//compare them
639 }
640 Printf("OK");
641}//tst()
642
643
644//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
645void hp(Int_t iEvt=0)
646{
647//Prints a list of HMPID hits for a given event. Default is event number 0.
648 Printf("List of HMPID hits for event %i",iEvt);
649 if(al->GetEvent(iEvt)) return;
650 if(hl->LoadHits()) return;
651
652 Int_t iTotHits=0;
653 for(Int_t iPrim=0;iPrim<hl->TreeH()->GetEntries();iPrim++){//prims loop
654 hl->TreeH()->GetEntry(iPrim);
655 h->Hits()->Print();
656 iTotHits+=h->Hits()->GetEntries();
657 }
658 hl->UnloadHits();
659 Printf("totally %i hits for event %i",iTotHits,iEvt);
660}
661//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
662void sp(Int_t iEvt=0)
663{
664//prints a list of HMPID sdigits for a given event
665 Printf("List of HMPID sdigits for event %i",iEvt);
666 if(al->GetEvent(iEvt)) return;
667 if(hl->LoadSDigits()) return;
668
669 hl->TreeS()->GetEntry(0);
670 h->SdiLst()->Print();
671 hl->UnloadSDigits();
672 Printf("totally %i sdigits for event %i",h->SdiLst()->GetEntries(),iEvt);
673}
674//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
675void dp(Int_t iEvt=0)
676{
677//prints a list of HMPID digits for a given event
678 Printf("List of HMPID digits for event %i",iEvt);
679 if(al->GetEvent(iEvt)) return;
680 if(hl->LoadDigits()) return;
681
682 hl->TreeD()->GetEntry(0);
683 h->DigLst()->Print();
684 Int_t totDigs=0;
685 for(Int_t i=0;i<7;i++) {totDigs+=h->DigLst(i)->GetEntries();}
686 hl->UnloadDigits();
687 Printf("totally %i digits for event %i",totDigs,iEvt);
688}
689//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
690void cp(Int_t iEvt=0)
691{//prints a list of HMPID clusters for a given event
692 Printf("List of HMPID clusters for event %i",iEvt);
693 if(al->GetEvent(iEvt)) return;
694 if(hl->LoadRecPoints()) return;
695
696 hl->TreeR()->GetEntry(0);
697 h->CluLst()->Print();
698
699 Int_t iCluCnt=0; for(Int_t iCh=0;iCh<7;iCh++) iCluCnt+=h->CluLst(iCh)->GetEntries();
700
701 hl->UnloadRecPoints();
702 Printf("totally %i clusters for event %i",iCluCnt,iEvt);
703}
704//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
705void Gui()
706{
707 TGMainFrame *pMF =new TGMainFrame(gClient->GetRoot(),300,400);//main frame
708//1 level widgets: button and 2 horizontal frames
709 TGedFrame *pGedF;
710 pMF->AddFrame(pGedF=new TGedFrame(pMF),new TGLayoutHints(kLHintsExpandY));
711 pMF->AddFrame(pDis1=new TGEmbeddedCanvas(pMF,kSunkenFrame));
712
713 pMF->Layout();
714 pMF->MapSubwindows();
715 pMF->Resize(pMF->GetDefaultSize());
716 pMF->MapWindow();
717}