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