]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/AliMUONCheck.cxx
Reimplemented w/o MUON(rec|sim)Data (Laurent)
[u/mrichter/AliRoot.git] / MUON / AliMUONCheck.cxx
1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 *                                                                        *
4 * Author: The ALICE Off-line Project.                                    *
5 * Contributors are mentioned in the code where appropriate.              *
6 *                                                                        *
7 * Permission to use, copy, modify and distribute this software and its   *
8 * documentation strictly for non-commercial purposes is hereby granted   *
9 * without fee, provided that the above copyright notice appears in all   *
10 * copies and that both the copyright notice and this permission notice   *
11 * appear in the supporting documentation. The authors make no claims     *
12 * about the suitability of this software for any purpose. It is          *
13 * provided "as is" without express or implied warranty.                  *
14 **************************************************************************/
15
16 // $Id$
17
18 /// \class AliMUONCheck
19 ///
20 /// This class check the ESD tree, providing the matching with the trigger
21 /// response and designing useful plots (Pt, Y, ITS vertex, multiplicity).
22 ///  Note that there is a special flag to turn on for pdc06 production. 
23 /// It also checks the TR tree giving hit densities on the two first and 
24 /// last planes of the spectrometer as well as the time of flight on these planes.
25 /// MUONkine() provides event stack and check if the event are generated with 
26 /// at least one muon and two muons (for PDC06).
27 /// DumpDigit() as a replacement of the function from MUONCheck.C macro.
28 ///
29 /// \author Frederic Yermia, INFN Torino
30
31 #include "AliMUONCheck.h"
32 #include "AliMUONConstants.h"
33 #include "AliMUONTrack.h"
34 #include "AliMUONTrackParam.h"
35 #include "AliMUONTrackExtrap.h"
36 #include "AliMUONMCDataInterface.h"
37 #include "AliMUONDataInterface.h"
38 #include "AliMpSegmentation.h"
39 #include "AliMpVSegmentation.h"
40 #include "AliMpDEManager.h"
41 #include "AliMUONVDigitStore.h"
42
43 #include "AliRunLoader.h"
44 #include "AliLoader.h"
45 #include "AliStack.h"
46 #include "AliTrackReference.h"
47 #include "AliTracker.h"
48 #include "AliESD.h"
49 #include "AliESDMuonTrack.h"
50 #include "AliMagFMaps.h"
51 #include "AliLog.h"
52
53 #include <TSystem.h>
54 #include <TCanvas.h>
55 #include <TLorentzVector.h>
56 #include <TFile.h>
57 #include <TH1.h>
58 #include <TParticle.h>
59
60 /// \cond CLASSIMP
61 ClassImp(AliMUONCheck)
62 /// \endcond
63
64 AliMUONCheck::AliMUONCheck(const char* galiceFile, const char* esdFile,Int_t firstEvent, Int_t lastEvent,const char* outDir) 
65 : TObject(),
66 fFileName(galiceFile),
67 fFileNameSim(),
68 fesdFileName(esdFile),
69 foutDir(outDir),
70 fFirstEvent(firstEvent),
71 fLastEvent(lastEvent)
72 {
73   /// ctor
74 }
75
76 //_____________________________________________________________________________
77 AliMUONCheck::AliMUONCheck(const char* galiceFile, const char* galiceFileSim,
78                            const char* esdFile,Int_t firstEvent, Int_t lastEvent,
79                            const char* outDir) 
80 : TObject(),
81 fFileName(galiceFile),
82 fFileNameSim(galiceFileSim),
83 fesdFileName(esdFile),
84 foutDir(outDir),
85 fFirstEvent(firstEvent),
86 fLastEvent(lastEvent)
87 {
88   /// ctor
89 }
90
91 //_____________________________________________________________________________
92 AliMUONCheck::~AliMUONCheck()
93 {
94   /// Destructor
95 }
96
97 //_____________________________________________________________________________
98 void
99 AliMUONCheck::CheckESD(Bool_t pdc06TriggerResponse) 
100 {
101   /// Check ESD files
102   
103   // Histograms
104   TH1F * fhMUONVertex ; //! 
105   TH1F * fhMUONMult   ; //!
106   
107   // create histograms 
108   fhMUONVertex = new TH1F("hMUONVertex","ITS Vertex"                ,100, -25., 25.);
109   fhMUONMult   = new TH1F("hMUONMult"  ,"Multiplicity of ESD tracks",10,  -0.5, 9.5);
110   
111   TH1F *hY = new TH1F("hY","Rapidity",100,-5.,-1.);
112   TH1F *hPt = new TH1F("hPt","Pt",100, 0.,20.);
113   
114   // ------------->open the ESD file
115   TFile* esdFile = TFile::Open(fesdFileName.Data());
116   
117   if (!esdFile || !esdFile->IsOpen()) 
118   {
119     AliError(Form("Error opening %s file \n",fesdFileName.Data()));
120     return;
121   }
122   
123   Int_t fSPLowpt=0     ; //!
124   Int_t fSPHighpt=0    ; //!
125   Int_t fSPAllpt=0     ; //!
126   Int_t fSMLowpt=0     ; //!
127   Int_t fSMHighpt =0   ; //!
128   Int_t fSMAllpt=0     ; //!
129   Int_t fSULowpt=0     ; //!
130   Int_t fSUHighpt=0    ; //!
131   Int_t fSUAllpt=0     ; //!
132   Int_t fUSLowpt=0     ; //!
133   Int_t fUSHighpt=0    ; //!
134   Int_t fUSAllpt=0     ; //! 
135   Int_t fLSLowpt=0     ; //!
136   Int_t fLSHighpt=0    ; //! 
137   Int_t fLSAllpt=0     ; //!
138   
139   Int_t fSLowpt=0      ; //!
140   Int_t fSHighpt=0     ; //!
141   
142   Int_t fnTrackTrig=0  ; //!
143   Int_t ftracktot=0    ; //!
144   Int_t effMatch=0     ; //!
145   
146   TLorentzVector fV1;
147   Float_t muonMass = 0.105658389;
148   Double_t thetaX, thetaY, pYZ;
149   Double_t fPxRec1, fPyRec1, fPzRec1, fE1;
150   Int_t fZ1;
151   
152   AliESD* fESD = new AliESD();
153   TTree* tree = (TTree*) esdFile->Get("esdTree");
154   if (!tree) 
155   {
156     Error("CheckESD", "no ESD tree found");
157     AliError(Form("CheckESD", "no ESD tree found"));
158     return ;
159   }
160   fESD->ReadFromTree(tree);
161   
162   Int_t fnevents = tree->GetEntries();
163   Int_t endOfLoop = fLastEvent+1;
164   
165   if ( fLastEvent == -1 ) endOfLoop = fnevents;
166   Int_t ievent=0;
167   Int_t nev=0;
168   
169   for (ievent = fFirstEvent; ievent < endOfLoop; ++ievent ) 
170   {
171     nev++;    
172     tree->GetEvent(ievent);
173     if (!fESD) 
174     {
175       Error("CheckESD", "no ESD object found for event %d", ievent);
176       return ;
177     }
178     AliESDVertex* vertex = (AliESDVertex*) fESD->GetVertex();
179     
180     Double_t zVertex = 0. ;
181     if (vertex) zVertex = vertex->GetZv();
182     
183     Int_t nTracks = (Int_t)fESD->GetNumberOfMuonTracks() ;
184     ULong64_t trigword=fESD->GetTriggerMask();
185     
186     if(pdc06TriggerResponse)
187     {
188       if (trigword & 0x01) {
189         fSPLowpt++;
190       }
191       
192       if (trigword & 0x02){
193         fSPHighpt++;
194       }
195       if (trigword & 0x04){
196         fSPAllpt++;
197       } 
198       if (trigword & 0x08){
199         fSMLowpt++;
200       }  
201       if (trigword & 0x010){
202         fSMHighpt++;
203       }
204       if (trigword & 0x020){
205         fSMAllpt++;
206       } 
207       if (trigword & 0x040){
208         fSULowpt++;
209       }  
210       if (trigword & 0x080){
211         fSUHighpt++;
212       }   
213       if (trigword & 0x100){
214         fSUAllpt++;
215       }  
216       if (trigword & 0x200){
217         fUSLowpt++;
218       }
219       
220       if (trigword & 0x400){
221         fUSHighpt++;
222       }
223       if (trigword & 0x800){
224         fUSAllpt++;
225       }
226       if (trigword & 0x1000){
227         fLSLowpt++;
228       }
229       
230       if (trigword & 0x2000){
231         fLSHighpt++;
232       }
233       
234       if (trigword & 0x4000){
235         fLSAllpt++;
236       }
237     }// if pdc06TriggerResponse
238     else {
239       if (trigword & 0x01) {
240         fSLowpt++;
241       }
242       
243       if (trigword & 0x02){
244         fSHighpt++;
245       }
246       if (trigword & 0x04){
247         fLSLowpt++;
248       } 
249       if (trigword & 0x08){
250         fLSHighpt++;
251       }  
252       if (trigword & 0x010){
253         fUSLowpt++;
254       }
255       if (trigword & 0x020){
256         fUSHighpt++;
257       }
258     }
259     
260     Int_t tracktrig=0;
261     
262     for ( Int_t iTrack1 = 0; iTrack1<nTracks; ++iTrack1 ) 
263     { //1st loop
264       AliESDMuonTrack* muonTrack = fESD->GetMuonTrack(iTrack1);
265       ftracktot++;
266       
267       thetaX = muonTrack->GetThetaX();
268       thetaY = muonTrack->GetThetaY();
269       pYZ     =  1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
270       
271       fPzRec1  = - pYZ / TMath::Sqrt(1.0 + TMath::Tan(thetaY)*TMath::Tan(thetaY));
272       fPxRec1  = fPzRec1 * TMath::Tan(thetaX);
273       fPyRec1  = fPzRec1 * TMath::Tan(thetaY);
274       fZ1 = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
275       fE1 = TMath::Sqrt(muonMass * muonMass + fPxRec1 * fPxRec1 + fPyRec1 * fPyRec1 + fPzRec1 * fPzRec1);
276       fV1.SetPxPyPzE(fPxRec1, fPyRec1, fPzRec1, fE1);
277       // -----------> transverse momentum
278       Float_t pt1 = fV1.Pt();
279       // ----------->Rapidity
280       Float_t y1 = fV1.Rapidity();
281       
282       if(muonTrack->GetMatchTrigger()) 
283       {
284         fnTrackTrig++;
285         tracktrig++;
286       }
287       hY->Fill(y1);
288       hPt->Fill(pt1);
289     } // loop on track
290     
291     fhMUONVertex->Fill(zVertex) ;
292     fhMUONMult->Fill(Float_t(nTracks)) ;
293     
294   } // loop over events
295   
296   AliInfo(Form("Terminate %s:", GetName())) ;
297   
298   effMatch=100*fnTrackTrig/ftracktot;
299   
300   if(pdc06TriggerResponse)
301   {
302     printf("=================================================================\n") ;
303     printf("================  %s ESD SUMMARY    ==============\n", GetName()) ;
304     printf("                                                   \n") ;
305     printf("         Total number of processed events  %d      \n", nev) ;
306     printf("\n")  ;
307     printf("\n")  ;
308     printf("Table 1:                                         \n") ;
309     printf(" Global Trigger output       Low pt  High pt   All\n") ;
310     printf(" number of Single Plus      :\t");
311     printf("%i\t%i\t%i\t", fSPLowpt, fSPHighpt, fSPAllpt) ;
312     printf("\n");
313     printf(" number of Single Minus     :\t");
314     printf("%i\t%i\t%i\t", fSMLowpt, fSMHighpt, fSMAllpt) ;
315     printf("\n");
316     printf(" number of Single Undefined :\t"); 
317     printf("%i\t%i\t%i\t", fSULowpt, fSUHighpt, fSUAllpt) ;
318     printf("\n");
319     printf(" number of UnlikeSign pair  :\t"); 
320     printf("%i\t%i\t%i\t", fUSLowpt, fUSHighpt, fUSAllpt) ;
321     printf("\n");
322     printf(" number of LikeSign pair    :\t");  
323     printf("%i\t%i\t%i\t", fLSLowpt, fLSHighpt, fLSAllpt) ;
324     printf("\n");
325     printf("===================================================\n") ;
326     printf("\n") ;
327     printf("matching efficiency with the trigger for single tracks = %2d %% \n", effMatch);
328     printf("================================================================\n") ;  printf("\n") ;
329     
330   }//if(pdc06TriggerResponse)
331   
332   gSystem->cd(foutDir);
333   
334   FILE *outtxt=fopen("output.txt","a");
335   freopen("output.txt","a",outtxt);
336   
337   if(pdc06TriggerResponse){
338     fprintf(outtxt,"                                                   \n");
339     fprintf(outtxt,"===================================================\n");
340     fprintf(outtxt,"================      ESD SUMMARY    ==============\n");
341     fprintf(outtxt,"                                                   \n");
342     fprintf(outtxt,"    Total number of processed events  %d      \n", nev); 
343     fprintf(outtxt,"\n");
344     fprintf(outtxt,"\n");
345     fprintf(outtxt,"Table 1:                                         \n");
346     fprintf(outtxt," Global Trigger output       Low pt  High pt   All\n");
347     fprintf(outtxt," number of Single Plus      :\t");
348     fprintf(outtxt,"%i\t%i\t%i\t",fSPLowpt,fSPHighpt,fSPAllpt);
349     fprintf(outtxt,"\n");
350     fprintf(outtxt," number of Single Minus     :\t");
351     fprintf(outtxt,"%i\t%i\t%i\t",fSMLowpt,fSMHighpt,fSMAllpt);
352     fprintf(outtxt,"\n");
353     fprintf(outtxt," number of Single Undefined :\t"); 
354     fprintf(outtxt,"%i\t%i\t%i\t",fSULowpt,fSUHighpt,fSUAllpt);
355     fprintf(outtxt,"\n");
356     fprintf(outtxt," number of UnlikeSign pair  :\t"); 
357     fprintf(outtxt,"%i\t%i\t%i\t",fUSLowpt,fUSHighpt,fUSAllpt);
358     fprintf(outtxt,"\n");
359     fprintf(outtxt," number of LikeSign pair    :\t");  
360     fprintf(outtxt,"%i\t%i\t%i\t",fLSLowpt,fLSHighpt, fLSAllpt);
361     fprintf(outtxt,"\n");
362     fprintf(outtxt,"===================================================\n");
363     fprintf(outtxt,"\n");
364     fprintf(outtxt,"matching efficiency with the trigger for single tracks = %2d %% \n", effMatch);
365   }//if(pdc06TriggerResponse)
366   
367   else {
368     
369     fprintf(outtxt,"                                                   \n");
370     fprintf(outtxt,"===================================================\n");
371     fprintf(outtxt,"================      ESD SUMMARY    ==============\n");
372     fprintf(outtxt,"                                                   \n");
373     fprintf(outtxt,"    Total number of processed events  %d      \n", nev); 
374     fprintf(outtxt,"\n");
375     fprintf(outtxt,"\n");
376     fprintf(outtxt,"Table 1:                                         \n");
377     fprintf(outtxt," Global Trigger output       Low pt  High pt     \n");
378     fprintf(outtxt," number of Single       :\t");
379     fprintf(outtxt,"%i\t%i\t",fSLowpt,fSHighpt);
380     fprintf(outtxt,"\n");
381     fprintf(outtxt," number of UnlikeSign pair :\t"); 
382     fprintf(outtxt,"%i\t%i\t",fUSLowpt,fUSHighpt);
383     fprintf(outtxt,"\n");
384     fprintf(outtxt," number of LikeSign pair    :\t");  
385     fprintf(outtxt,"%i\t%i\t",fLSLowpt,fLSHighpt);
386     fprintf(outtxt,"\n");
387     fprintf(outtxt,"===================================================\n");
388     fprintf(outtxt,"\n");
389     fprintf(outtxt,"matching efficiency with the trigger for single tracks = %2d %% \n", effMatch);
390   }//else
391   fclose(outtxt);
392   
393   TCanvas * c1 = new TCanvas("c1", "ESD", 400, 10, 600, 700) ;
394   c1->Divide(1,2) ;
395   c1->cd(1) ;
396   fhMUONVertex->Draw() ;
397   c1->cd(2) ;
398   fhMUONMult->Draw() ;  
399   c1->Print("VertexAndMul.eps") ; 
400   TCanvas *c2 = new TCanvas("c2","ESD",400,10,600,700);
401   c2->Divide(1,2);
402   c2->cd(1);
403   hY->Draw();
404   c2->cd(2);
405   hPt->Draw();
406   c2->Print("YandPt.eps") ; 
407 }
408
409 //_____________________________________________________________________________
410 void
411 AliMUONCheck::CheckKine() 
412 {
413   /// Check Stack 
414   
415   AliMUONMCDataInterface diSim(fFileNameSim.Data());
416   if (!diSim.IsValid()) return;
417   
418   Int_t fnevents = diSim.NumberOfEvents();
419   
420   Int_t endOfLoop = fLastEvent+1;
421   
422   if ( fLastEvent == -1 ) endOfLoop = fnevents;
423   
424   Int_t nev=0;
425   Int_t nmu=0;
426   Int_t nonemu=0;
427   Int_t ndimu=0;
428   
429   for ( Int_t ievent = fFirstEvent; ievent < endOfLoop; ++ievent ) 
430   {
431     Int_t nmu2=0;
432     ++nev;  
433     
434     AliStack* stack = diSim.Stack(ievent);
435     Int_t npa = stack->GetNprimary();
436     Int_t npb = stack->GetNtrack(); 
437     printf("Primary particles  %i   \n",npa); 
438     printf("Sec particles  %i   \n",npb); 
439     printf("=================================================================\n") ;
440     printf("Primary particles listing:  \n"); 
441     printf("=================================================================\n") ;
442     for (Int_t i=0; i<npa; ++i) 
443     {
444       TParticle *p  = stack->Particle(i);
445       p->Print("");
446       Int_t pdg=p->GetPdgCode(); 
447       
448       if (abs(pdg) == 13) 
449       {
450         ++nmu2;
451       }
452     }
453     printf("=================================================================\n") ;
454     printf("=================================================================\n") ;
455     
456     printf("Secondaries particles listing:  \n"); 
457     printf("=================================================================\n") ;
458     for (Int_t i=npa; i<npb; ++i) 
459     {
460       stack->Particle(i)->Print("");
461     }
462     
463     printf("=================================================================\n") ; 
464     printf(">>> Event %d, Number of primary particles is %d \n",ievent, npa); 
465     printf(">>> Event %d, Number of secondary articles is %d \n",ievent, npb-npa); 
466     printf("=================================================================\n");
467     if(nmu2>0)
468     {
469       printf(">>> Okay!!! Event %d with at least one muon on primary stack! \n",ievent); 
470       ++nonemu;
471     }
472     
473     if(nmu2==0)
474     {
475       printf(">>> Warning!!! Event %d without muon on primary stack! \n",ievent);     
476       ++nmu;
477     }
478     
479     if(nmu2>1)
480     {
481       printf(">>> Okay!!! Event %d with at least two muons on primary stack! \n",ievent); 
482       ++ndimu; 
483     }
484     printf("=================================================================\n");  
485     printf("                                                                  \n");
486     printf("                                                                  \n") ;
487   }//ievent
488   
489   printf("=================================================================\n") ;
490   printf("               Total number of processed events  %d               \n", nev) ;
491   printf("                                                                 \n") ;
492   
493   if(nmu>0)
494   {
495     printf("--->                       WARNING!!!                       <---\n"); 
496     printf(" %i events without muon on primary stack \n",nmu); 
497   }
498   
499   if(nmu==0)
500   {
501     printf("--->                          OKAY!!!                        <---\n"); 
502     printf("  %i events generated with at least one muon on primary stack \n",nonemu);
503   }
504   
505   if(ndimu>0)
506   {
507     printf("--->                          OKAY!!!                        <---\n"); 
508     printf("  %i events generated with at least two muons on primary stack \n",ndimu); 
509   }
510   
511   printf("                                                                 \n") ;
512   printf("***                       Leaving MuonKine()                 *** \n");
513   printf("**************************************************************** \n");
514   
515   gSystem->cd(foutDir);
516   FILE *outtxt=fopen("output.txt","a");
517   freopen("output.txt","a",outtxt);
518   fprintf(outtxt,"                                                   \n");
519   fprintf(outtxt,"=================================================================\n");
520   fprintf(outtxt,"================         MUONkine SUMMARY        ================\n");
521   fprintf(outtxt,"\n");
522   fprintf(outtxt,"=================================================================\n");
523   fprintf(outtxt,"               Total number of processed events  %d              \n", nev) ;
524   fprintf(outtxt,"                                                                 \n");
525   
526   if(nmu>0)
527   {
528     fprintf(outtxt,"                        ---> WARNING!!! <---                     \n"); 
529     fprintf(outtxt,"  %i events without muon on primary stack \n",nmu); 
530   }
531   
532   if(nmu==0)
533   {
534     fprintf(outtxt,"                         ---> OKAY!!! <---                       \n"); 
535     fprintf(outtxt,"  %i events generated with at least one muon on primary stack \n",nonemu); 
536   }
537   
538   if(ndimu>0)
539   {
540     fprintf(outtxt,"                         ---> OKAY!!! <---                       \n"); 
541     fprintf(outtxt,"  %i events generated with at least two muons on primary stack \n",ndimu); 
542   }
543   
544   fprintf(outtxt,"                                                                 \n") ;
545   fprintf(outtxt,"***                       Leaving MuonKine()                 *** \n");
546   fprintf(outtxt,"**************************************************************** \n");
547   fclose(outtxt);
548 }
549
550 //_____________________________________________________________________________
551 void
552 AliMUONCheck::CheckTrackRef() 
553 {
554   /// Check TrackRef files
555   
556   AliMUONMCDataInterface diSim(fFileNameSim.Data());
557   if ( !diSim.IsValid() ) return;
558   
559   Int_t flag11=0,flag12=0,flag13=0,flag14=0;
560   
561   TH1F *tof01= new TH1F("tof01","TOF for first tracking plane",100,0.,100);
562   tof01->SetXTitle("tof (ns)");
563   TH1F *tof14= new TH1F("tof14","TOF for MT22",100,0.,100);
564   tof14->SetXTitle("tof (ns)");
565   
566   TH1F   *hitDensity[4];
567   hitDensity[0] =  new TH1F("TR_dhits01","",30,0,300);
568   hitDensity[0]->SetFillColor(3);
569   hitDensity[0]->SetXTitle("R (cm)");
570   hitDensity[1] =  new TH1F("TR_dhits10","",30,0,300);
571   hitDensity[1]->SetFillColor(3);
572   hitDensity[1]->SetXTitle("R (cm)");
573   hitDensity[2] =  new TH1F("TR_dhits11","",30,0,300);
574   hitDensity[2]->SetFillColor(3);
575   hitDensity[2]->SetXTitle("R (cm)");
576   hitDensity[3] =  new TH1F("TR_dhits14","",30,0,300);
577   hitDensity[3]->SetFillColor(3);
578   hitDensity[3]->SetXTitle("R (cm)");
579   
580   Int_t fnevents = diSim.NumberOfEvents();
581   
582   Int_t endOfLoop = fLastEvent+1;
583   
584   if ( fLastEvent == -1 ) endOfLoop = fnevents;
585   
586   Int_t nev=0;
587   Int_t ntot=fLastEvent+1-fFirstEvent;
588   
589   for ( Int_t ievent = fFirstEvent; ievent < endOfLoop; ++ievent ) 
590   {
591     Int_t  save=-99;
592     ++nev;  
593     
594     Int_t nentries = diSim.NumberOfTrackRefs(ievent);
595     
596     for ( Int_t l=0; l<nentries; ++l )
597     {
598       TClonesArray* trackRefs = diSim.TrackRefs(ievent,l);
599       if (!trackRefs) continue;
600       
601       Int_t nnn = trackRefs->GetEntriesFast();
602       
603       for ( Int_t k=0; k<nnn; ++k ) 
604       {
605         AliTrackReference *tref = static_cast<AliTrackReference*>(trackRefs->UncheckedAt(k));
606         Int_t label = tref->GetTrack();
607         Float_t x     =    tref->X();        // x-pos of hit
608         Float_t y     =    tref->Y();        // y-pos
609         Float_t z     = tref->Z();
610         
611         Float_t r=TMath::Sqrt(x*x+y*y);
612         Float_t time =    tref->GetTime();  
613         
614         Float_t wgt=1/(2*10*TMath::Pi()*r)/(ntot);
615         
616         if (save!=label){
617           save=label;
618           flag11=0;
619           flag12=0;
620           flag13=0;
621           flag14=0;
622         }
623         
624         if (save==label){
625           
626           //Ch 1, z=-526.16
627           if (z<=-521&& z>=-531&&flag11==0){
628             flag11=1;
629             hitDensity[0]->Fill(r,wgt);
630             tof01->Fill(1000000000*time,1);
631           };
632           
633           //Ch 10, z=-1437.6
634           if (z<=-1432&&z>=-1442&&flag12==0){
635             flag12=1;
636             hitDensity[1]->Fill(r,wgt);
637           }
638           
639           //Ch 11, z=-1603.5
640           if (z<=-1598&& z>=-1608&&flag13==0){
641             flag13=1;
642             hitDensity[2]->Fill(r,wgt);
643           };
644           
645           //ch 14 z=-1720.5    
646           if(z<=-1715&&z>=-1725&&flag14==0){
647             flag14=1;
648             hitDensity[3]->Fill(r,wgt);
649             tof14->Fill(1000000000*time,1);
650           }; 
651           
652         }//if save==label
653         
654       }//hits de tTR
655       
656       delete trackRefs;
657       
658     }//entree de tTR 
659     
660   }//evt loop
661   
662   gSystem->cd(foutDir);
663   TCanvas *c6 = new TCanvas("c6","TOF",400,10,600,700);
664   c6->Divide(1,2);
665   c6->cd(1);
666   
667   tof01->Draw();
668   c6->cd(2);
669   tof14->Draw();
670   c6->Print("tof_on_trigger.ps");
671   
672   TCanvas *c5 = new TCanvas("c5","TRef:Hits Density",400,10,600,700);
673   c5->Divide(2,2);
674   c5->cd(1);
675   hitDensity[0]->Draw();
676   c5->cd(2);
677   hitDensity[1]->Draw();
678   c5->cd(3);
679   hitDensity[2]->Draw();
680   c5->cd(4);
681   hitDensity[3]->Draw();
682   c5->Print("TR_Hit_densities.ps");
683   printf("=================================================================\n") ;
684   printf("================  %s Tref SUMMARY    ==============\n", GetName()) ;
685   printf("                                                   \n") ;
686   printf("         Total number of processed events  %d      \n", nev) ;
687   printf("***                Leaving TRef()               *** \n");
688   printf("*************************************************** \n");
689 }
690
691 //_____________________________________________________________________________
692 void 
693 AliMUONCheck::CheckOccupancy(Bool_t perDetEle) const
694 {
695   /// Check occupancy for the first event selected
696   
697   Int_t dEoccupancyBending[14][26];
698   Int_t dEoccupancyNonBending[14][26];
699   Int_t cHoccupancyBending[14];
700   Int_t cHoccupancyNonBending[14];
701   Int_t totaloccupancyBending =0;
702   Int_t totaloccupancyNonBending =0;
703   
704   Int_t dEchannelsBending[14][26];
705   Int_t dEchannelsNonBending[14][26];
706   Int_t cHchannelsBending[14];
707   Int_t cHchannelsNonBending[14];
708   Int_t totalchannelsBending =0;
709   Int_t totalchannelsNonBending =0;
710   
711   Int_t nchambers = AliMUONConstants::NCh();
712   
713   AliMUONDataInterface di(fFileNameSim);
714   
715   AliMUONVDigitStore* digitStore = di.DigitStore(fFirstEvent);
716   
717   // Compute values
718   for (Int_t ichamber=0; ichamber<nchambers; ++ichamber) 
719   {
720     cHchannelsBending[ichamber]=0;
721     cHchannelsNonBending[ichamber]=0;
722     cHoccupancyBending[ichamber]=0;
723     cHoccupancyNonBending[ichamber]=0;
724     
725     for (Int_t idetele=0; idetele<26; idetele++) 
726     {
727       Int_t detele = 100*(ichamber +1)+idetele;
728       
729       if ( AliMpDEManager::IsValidDetElemId(detele) ) 
730       {
731         Int_t cathode(0);
732         
733         const AliMpVSegmentation* segbend = AliMpSegmentation::Instance()
734         ->GetMpSegmentation(detele, AliMp::kCath0);
735         const AliMpVSegmentation* segnonbend = AliMpSegmentation::Instance()
736           ->GetMpSegmentation(detele, AliMp::kCath1);
737         
738         if (AliMpDEManager::GetPlaneType(detele, AliMp::kCath0) != AliMp::kBendingPlane ) 
739         {
740           const AliMpVSegmentation* tmp = segbend;
741           segbend    =  segnonbend;
742           segnonbend =  tmp;
743           cathode = 1;
744         }  
745         
746         Int_t nchannels = segbend->NofPads();
747         Int_t ndigits = digitStore->GetSize(detele,cathode);
748               dEchannelsBending[ichamber][idetele] = nchannels;
749         dEoccupancyBending[ichamber][idetele] = ndigits;
750               cHchannelsBending[ichamber] += nchannels;
751         cHoccupancyBending[ichamber] += ndigits;
752               totalchannelsBending += nchannels;
753         totaloccupancyBending += ndigits;
754         
755         nchannels = segnonbend->NofPads();
756         ndigits = digitStore->GetSize(detele,1-cathode);
757         
758               dEchannelsNonBending[ichamber][idetele] = nchannels;
759         dEoccupancyBending[ichamber][idetele] = ndigits;
760               cHchannelsNonBending[ichamber] += nchannels;
761               cHoccupancyNonBending[ichamber] += ndigits;
762               totalchannelsNonBending += nchannels;
763               totaloccupancyNonBending += ndigits;
764             }
765       if (perDetEle) 
766       {
767         printf(">>> Detection element %4d has %5d channels in bending and %5d channels in nonbending \n",
768                detele, dEchannelsBending[ichamber][idetele], dEchannelsNonBending[ichamber][idetele] ); 
769       }
770     }
771     printf(">>> Chamber %2d has %6d channels in bending and %6d channels in nonbending \n",
772            ichamber+1,  cHchannelsBending[ichamber], cHchannelsNonBending[ichamber]);
773   }
774   printf(">>Spectrometer has  %7d channels in bending and %7d channels in nonbending \n",
775          totalchannelsBending, totalchannelsNonBending);
776   
777   // Output values
778   
779   for ( Int_t ichamber = 0; ichamber < 14; ++ichamber ) 
780   {
781     printf(">>> Chamber %2d  nChannels Bending %5d  nChannels NonBending %5d \n", 
782          ichamber+1, 
783          cHoccupancyBending[ichamber],
784          cHoccupancyNonBending[ichamber]);           
785     printf(">>> Chamber %2d  Occupancy Bending %5.2f %%  Occupancy NonBending %5.2f %% \n", 
786          ichamber+1, 
787          100.*((Float_t) cHoccupancyBending[ichamber])/((Float_t) cHchannelsBending[ichamber]),
788          100.*((Float_t) cHoccupancyNonBending[ichamber])/((Float_t) cHchannelsBending[ichamber])            );
789   
790     if ( perDetEle )
791     {
792       for(Int_t idetele=0; idetele<26; idetele++) 
793       {
794         Int_t detele = idetele + 100*(ichamber+1);
795         if ( AliMpDEManager::IsValidDetElemId(detele) ) 
796         {
797           printf(">>> DetEle %4d nChannels Bending %5d  nChannels NonBending %5d \n", 
798                idetele+100*(ichamber+1), 
799                dEoccupancyBending[ichamber][idetele],
800                dEoccupancyNonBending[ichamber][idetele]);  
801           printf(">>> DetEle %4d Occupancy Bending %5.2f %%  Occupancy NonBending %5.2f %% \n", 
802                idetele+100*(ichamber+1), 
803                100.*((Float_t) dEoccupancyBending[ichamber][idetele])/((Float_t) dEchannelsBending[ichamber][idetele]),
804                100.*((Float_t) dEoccupancyNonBending[ichamber][idetele])/((Float_t) dEchannelsBending[ichamber][idetele]));  
805         }
806       }
807     }
808   }
809
810   printf(">>> Muon Spectrometer  Occupancy Bending %5.2f %%  Occupancy NonBending %5.2f %% \n",  
811        100.*((Float_t) totaloccupancyBending)/((Float_t) totalchannelsBending),
812        100.*((Float_t) totaloccupancyNonBending)/((Float_t) totalchannelsNonBending)            );
813
814   delete digitStore;
815 }
816
817 //_____________________________________________________________________________
818 void 
819 AliMUONCheck::CheckRecTracks () const
820 {
821   /// Reads and dumps rec tracks objects
822   
823   AliWarning("Reimplement me ? or use AliMUONDumper simply ?");
824   
825   //  // waiting for mag field in CDB 
826   //  AliInfoStream() << "Loading field map...\n";
827   //  if (!AliTracker::GetFieldMap()) {
828   //    AliMagFMaps* field = new AliMagFMaps("Maps","Maps", 1, 1., 10., AliMagFMaps::k5kG);
829   //    AliTracker::SetFieldMap(field, kFALSE);
830   //  }
831   //  
832   //  // Loading data
833   //  fLoader->LoadTracks("READ");
834   //  
835   //  Int_t endOfLoop = fLastEvent+1;
836   //  if ( fLastEvent == -1 ) endOfLoop = fRunLoader->GetNumberOfEvents();
837   //
838   //  for (Int_t ievent=fFirstEvent; ievent<endOfLoop; ievent++) {
839   //    fRunLoader->GetEvent(ievent);
840   //    
841   //    fRecData->SetTreeAddress("RT");
842   //    fRecData->GetRecTracks();
843   //    TClonesArray* recTracks = fRecData->RecTracks();
844   //    
845   //    Int_t nrectracks = (Int_t) recTracks->GetEntriesFast(); //
846   //    printf(">>> Event %d, Number of Recconstructed tracks %d \n",ievent, nrectracks);
847   //
848   //    // Set the magnetic field for track extrapolations
849   //    AliMUONTrackExtrap::SetField(AliTracker::GetFieldMap());
850   //
851   //    // Loop over tracks
852   //    for (Int_t iRecTracks = 0; iRecTracks <  nrectracks;  iRecTracks++) {
853   //      AliMUONTrack* recTrack = (AliMUONTrack*) recTracks->At(iRecTracks);
854   //      AliMUONTrackParam* trackParam = (AliMUONTrackParam*) (recTrack->GetTrackParamAtHit())->First();
855   //      AliMUONTrackExtrap::ExtrapToZ(trackParam,0.);
856   //      recTrack->Print("full");
857   //    }
858   //    fRecData->ResetRecTracks();
859   //  }   
860   //  fLoader->UnloadTracks();
861 }
862
863 //_____________________________________________________________________________
864 void AliMUONCheck::SetEventsToCheck(Int_t firstEvent, Int_t lastEvent)
865 {
866   /// Set first and last event number to check
867   
868   fFirstEvent = firstEvent;
869   fLastEvent = lastEvent;
870 }