1 #if !defined(__CINT__) || defined(__MAKECINT__)
5 #include "TClonesArray.h"
19 #include "TGraphErrors.h"
27 #include "AliRunLoader.h"
28 #include "AliHeader.h"
29 #include "AliLoader.h"
30 #include "AliTracker.h"
32 #include "AliMagFMaps.h"
37 #include "AliMUONData.h"
38 #include "AliMUONConstants.h"
40 #include "AliMUONHit.h"
41 #include "AliMUONHitForRec.h"
42 #include "AliMUONRawCluster.h"
43 #include "AliMUONTrack.h"
44 #include "AliMUONTrackParam.h"
45 #include "AliMUONTrackExtrap.h"
47 #include "AliMpVSegmentation.h"
48 #include "AliMpIntPair.h"
49 #include "AliMpDEManager.h"
53 //Macro to calculate the resolution and the efficiency of chamber(s) chosen in function
54 //of Phi (angle on the chamber between the X axis and the straight line created by the
55 //center of the chamber and the impact of particles on this chamber, the azimuthal angle)
56 //and Theta (the polar angle), or in function of ThetaI (angle of incidence of particles
62 const Double_t kInvPi = 1./3.14159265;
68 Int_t nEvents, iEvent;
70 Int_t nTracks, iTrack;
74 Int_t firstChamber, lastChamber;
77 AliMUONTrack * track ;
78 AliMUONHitForRec * hit = 0;
79 AliMUONTrackParam * trackParam = 0;
81 TClonesArray * tracks ;
82 TClonesArray * trackParams;
90 /*****************************************************************************************************************/
91 /*****************************************************************************************************************/
94 void efficiency( Int_t event2Check=0, char * filename="galice.root" )
96 cout<<"\nChamber(s) chosen;\nFirst chamber:";
98 cout<<"Last chamber:";
102 //Creating Run Loader and openning file containing Hits
103 //--------------------------------------------------------------------------------------------------------------
104 AliRunLoader * RunLoader = AliRunLoader::Open(filename,"MUONFolder","READ");
105 if (RunLoader == 0x0) {printf(">>> Error : Error Opening %s file \n",filename);return;}
109 //--------------------------------------------------------------------------------------------------------------
110 AliLoader * MUONLoader = RunLoader -> GetLoader("MUONLoader");
111 MUONLoader -> LoadTracks("READ");
112 MUONLoader -> LoadRecPoints("READ");
115 //Creating a MUON data container
116 //--------------------------------------------------------------------------------------------------------------
117 AliMUONData muondata(MUONLoader,"MUON","MUON");
120 nEvents = (Int_t) RunLoader -> GetNumberOfEvents();
124 Int_t chamber[10] = {0};
125 Int_t detEltNew, detElt;
128 for ( iEvent = 0; iEvent < nEvents; ++iEvent )
130 if ( event2Check!=0 )
132 printf("\r>>> Event %d ",iEvent);
133 RunLoader -> GetEvent(iEvent);
135 muondata.SetTreeAddress("RT");
136 muondata.GetRecTracks();
137 tracks = muondata.RecTracks();
140 nTracks = (Int_t) tracks -> GetEntriesFast();
141 for ( iTrack = 0; iTrack < nTracks; ++iTrack )
143 track = (AliMUONTrack*) tracks -> At(iTrack);
144 hits = track -> GetHitForRecAtHit();
147 nHits = (Int_t) hits -> GetEntriesFast();
149 for ( iHit = 0; iHit < nHits; ++iHit )
151 hit = (AliMUONHitForRec*) hits -> At(iHit);
152 chamberNbr = hit -> GetChamberNumber();
153 detElt = hit -> GetDetElemId();
154 detEltNew = int(detElt/100);
155 if( chamberNbr >= firstChamber-1 ) {
156 if( chamberNbr < lastChamber ) {
157 if( detEltNew == detEltOld )
160 chamber[chamberNbr] = chamber[chamberNbr] + 1;
161 detEltOld = detEltNew;
170 muondata.ResetRecTracks();
171 if (event2Check != 0)
173 trackNb = trackNb + nTracks;
176 //--------------------------------------------------------------------------------------------------------------
179 for (Int_t i = firstChamber-1; i < lastChamber; ++i )
181 printf ("\nChamber %d has responded %d times on %d tracks", i+1, chamber[i], trackNb);
183 cout<<"\nEfficiency = ? (IS UNKNOWN)\n";
185 Double_t eff = chamber[i]*100./trackNb; cout<<"\nEfficiency = "<<eff<<" %\n";
189 MUONLoader->UnloadTracks();
196 /*****************************************************************************************************************/
197 /*****************************************************************************************************************/
198 /*EFFICIENCY IN FUNCTION OF THETA AND PHI*/
200 void efficiencyThetaPhi( Int_t event2Check=0, char * filename="galice.root" )
202 cout<<"\nChamber(s) chosen;\nFirst chamber:";
204 cout<<"Last chamber:";
208 Int_t eff [54] = {0};
209 Int_t trackN [54] = {0};
213 //Creating Run Loader and openning file containing Hits
214 //--------------------------------------------------------------------------------------------------------------
215 AliRunLoader * RunLoader = AliRunLoader::Open(filename,"MUONFolder","READ");
216 if (RunLoader == 0x0) {printf(">>> Error : Error Opening %s file \n",filename);return;}
220 //--------------------------------------------------------------------------------------------------------------
221 AliLoader * MUONLoader = RunLoader -> GetLoader("MUONLoader");
222 MUONLoader -> LoadTracks("READ");
223 MUONLoader -> LoadRecPoints("READ");
226 //--------------------------------------------------------------------------------------------------------------
227 //Set mag field; waiting for mag field in CDB
228 printf("Loading field map...\n");
229 if (!AliTracker::GetFieldMap()) {
230 AliMagFMaps* field = new AliMagFMaps("Maps","Maps", 1, 1., 10., AliMagFMaps::k5kG);
231 AliTracker::SetFieldMap(field, kFALSE);}
234 //--------------------------------------------------------------------------------------------------------------
235 //Set Field Map for track extrapolation
236 AliMUONTrackExtrap::SetField(AliTracker::GetFieldMap());
239 //Creating a MUON data container
240 //--------------------------------------------------------------------------------------------------------------
241 AliMUONData muondata(MUONLoader,"MUON","MUON");
244 nEvents = (Int_t) RunLoader -> GetNumberOfEvents();
247 for ( iEvent = 0; iEvent < nEvents; ++iEvent )
249 if ( event2Check!=0 )
251 printf("\r>>> Event %d ",iEvent);
252 RunLoader->GetEvent(iEvent);
255 muondata.SetTreeAddress("RT");
256 muondata.GetRecTracks();
257 tracks = muondata.RecTracks();
260 nTracks = (Int_t) tracks -> GetEntriesFast();
261 for ( iTrack = 0; iTrack < nTracks; ++iTrack )
263 track = (AliMUONTrack*) tracks ->At(iTrack) ;
264 trackParams = track ->GetTrackParamAtHit();
265 hits = track ->GetHitForRecAtHit() ;
266 chamber = firstChamber-1;
271 nHits = (Int_t) hits->GetEntriesFast();
272 for ( iHit = 0; iHit<nHits; ++iHit )
274 trackParam = (AliMUONTrackParam*) trackParams -> At(iHit);
275 hit = (AliMUONHitForRec* ) hits -> At(iHit);
276 chamberNbr = hit -> GetChamberNumber();
278 if ( chamberNbr == oldChamber )
281 oldChamber = chamberNbr;
282 if ( chamberNbr > chamber - k ) {
283 if ( chamber < lastChamber ) {
284 if ( chamberNbr == chamber ) {
286 Double_t traX, traY, traZ;
287 Double_t hitX, hitY, hitZ;
288 Double_t aveX, aveY ;
296 traX = trackParam -> GetNonBendingCoor();
297 traY = trackParam -> GetBendingCoor() ;
298 traZ = trackParam -> GetZ() ;
300 hitX = hit -> GetNonBendingCoor();
301 hitY = hit -> GetBendingCoor() ;
302 hitZ = hit -> GetZ() ;
304 aveX = 1./2.*(traX + hitX);
305 aveY = 1./2.*(traY + hitY);
307 //The calculation of phi:
308 phi = 180. * kInvPi * (TMath::ATan2( aveY, aveX ));
310 //The calculation of theta, theta is in fact 180 - Theta(The polar angle):
311 theta = 180. * kInvPi * (TMath::ATan2( sqrt(aveX*aveX+aveY*aveY), -hitZ ));
313 if ( phi < 0.) phi = 360 - abs(phi);
314 iPhi = int( phi/72. );
315 iTheta = int( theta );
316 if( theta > 10 ) iTheta = 9;
317 if( theta < 1 ) iTheta = 1;
319 eff [9*iPhi+iTheta-1] = eff [9*iPhi+iTheta-1] + 1;
320 trackN [9*iPhi+iTheta-1] = trackN [9*iPhi+iTheta-1] + 1;
321 chamber = chamber + 1;
326 Double_t chamberZpos;
327 Double_t exXpos, exYpos;
335 chamberZpos = AliMUONConstants::DefaultChamberZ(chamber);
336 AliMUONTrackExtrap::ExtrapToZ(trackParam,chamberZpos);
337 exXpos = (Double_t) trackParam->GetNonBendingCoor();
338 exYpos = (Double_t) trackParam->GetBendingCoor();
340 //The calculation of phi:
341 phi = 180. * kInvPi * (TMath::ATan2( exYpos, exXpos ));
343 //The calculation of theta, theta is in fact 180 - Theta(The polar angle):
344 theta = 180. * kInvPi * (TMath::ATan2( sqrt(exXpos*exXpos+exYpos*exYpos), - chamberZpos ));
346 if ( phi < 0.) phi = 360 - abs(phi);
347 iPhi = int( phi/72. );
348 iTheta = int( theta );
349 if( theta > 10 ) iTheta = 9;
350 if( theta < 1 ) iTheta = 1;
352 eff [9*iPhi+iTheta-1] = eff [9*iPhi+iTheta-1] + 0;
353 trackN [9*iPhi+iTheta-1] = trackN [9*iPhi+iTheta-1] + 1;
354 chamber = chamber + 1;
361 if ( iHit == nHits-1 ) {
362 if ( chamber == lastChamber )
376 muondata.ResetRecTracks();
377 if ( event2Check!=0 )
383 TCanvas * c1 = new TCanvas();
384 TGraph2D* effPhiTheta = new TGraph2D();
385 Double_t efficiency = 0;
387 if ( firstChamber == lastChamber )
389 for ( Int_t ph = 0; ph < 5; ++ph )
391 for ( Int_t th = 1; th < 10; ++th )
394 cout<<"\nFor Phi = ["<<ph*72<<","<<ph*72+72<<"] and Theta = ["<<179-th<<","<<180-th<<"]:";
395 cout<<"\nThe chamber "<<firstChamber<<" has responded "<<eff[i]<<" times on "<<trackN[i]<<" tracks\n";
397 Double_t e = eff [i] ;
398 Double_t n = trackN[i] ;
399 Double_t p = ph*72.+36.;
400 Double_t t = th*1. +0.5;
402 if ( trackN[i] == 0 ) {
404 cout<<"Efficiency = ? % ( IS UNKNOWN )\n";
407 efficiency = 100.*e/n;
408 cout<<"Efficiency = "<<efficiency<<" %\n";
411 effPhiTheta -> SetPoint( i, p, t, efficiency);
417 for ( Int_t ph = 0; ph < 5; ++ph )
419 for ( Int_t th = 1; th < 10; ++th )
422 cout<<"\nFor Phi = ["<<ph*72<<","<<ph*72+72<<"] and Theta = ["<<179-th<<","<<180-th<<"]:";
423 cout<<"\nThe chambers "<<firstChamber<<" to "<<lastChamber<<" have responded "<<eff[i]<<" times on "<<trackN[i]<<" tracks\n";
425 Double_t e = eff [i] ;
426 Double_t n = trackN[i] ;
427 Double_t p = ph*72.+36.;
428 Double_t t = th*1. +0.5;
430 if ( trackN[i] == 0 ) {
432 cout<<"Efficiency = ? % ( IS UNKNOWN )\n";
435 efficiency = 100.*e/n;
436 cout<<"Efficiency = "<<efficiency<<" %\n";
439 effPhiTheta -> SetPoint( i, p, t, efficiency);
444 gStyle->SetPalette(1);
445 effPhiTheta -> Draw("surf1");
448 MUONLoader->UnloadTracks();
459 /*****************************************************************************************************************/
460 /*****************************************************************************************************************/
461 /*EFFICIENCY IN FUNCTION OF THETA OF INCIDENCE*/
464 void efficiencyThetaI( Int_t event2Check=0, char * filename="galice.root" )
466 cout<<"\nChamber(s) chosen;\nFirst chamber:";
468 cout<<"Last chamber:";
472 Int_t eff [12] = {0};
473 Int_t trackN [12] = {0};
478 //Creating Run Loader and openning file containing Hits
479 //--------------------------------------------------------------------------------------------------------------
480 AliRunLoader * RunLoader = AliRunLoader::Open(filename,"MUONFolder","READ");
481 if (RunLoader == 0x0) {printf(">>> Error : Error Opening %s file \n",filename);return;}
485 //--------------------------------------------------------------------------------------------------------------
486 AliLoader * MUONLoader = RunLoader -> GetLoader("MUONLoader");
487 MUONLoader -> LoadTracks("READ");
488 MUONLoader -> LoadRecPoints("READ");
491 //--------------------------------------------------------------------------------------------------------------
492 //Set mag field; waiting for mag field in CDB
493 printf("Loading field map...\n");
494 if (!AliTracker::GetFieldMap()) {
495 AliMagFMaps* field = new AliMagFMaps("Maps","Maps", 1, 1., 10., AliMagFMaps::k5kG);
496 AliTracker::SetFieldMap(field, kFALSE);}
499 //--------------------------------------------------------------------------------------------------------------
500 //Set Field Map for track extrapolation
501 AliMUONTrackExtrap::SetField(AliTracker::GetFieldMap());
504 //Creating a MUON data container
505 //--------------------------------------------------------------------------------------------------------------
506 AliMUONData muondata(MUONLoader,"MUON","MUON");
509 nEvents = (Int_t) RunLoader -> GetNumberOfEvents();
512 for ( iEvent = 0; iEvent < nEvents; ++iEvent )
514 if ( event2Check!=0 )
516 printf("\r>>> Event %d ",iEvent);
517 RunLoader->GetEvent(iEvent);
520 muondata.SetTreeAddress("RT");
521 muondata.GetRecTracks();
522 tracks = muondata.RecTracks();
525 nTracks = (Int_t) tracks -> GetEntriesFast();
526 for ( iTrack = 0; iTrack < nTracks; ++iTrack )
528 track = (AliMUONTrack*) tracks ->At(iTrack) ;
529 trackParams = track ->GetTrackParamAtHit();
530 hits = track ->GetHitForRecAtHit() ;
531 chamber = firstChamber - 1;
536 nHits = (Int_t) hits -> GetEntriesFast();
537 for ( iHit = 0; iHit < nHits; ++iHit )
539 trackParam = (AliMUONTrackParam*) trackParams -> At(iHit);
540 hit = (AliMUONHitForRec*) hits -> At(iHit);
541 chamberNbr = hit -> GetChamberNumber();
543 if ( chamberNbr == oldChamber )
546 oldChamber = chamberNbr;
547 if ( chamberNbr > chamber - k ) {
548 if ( chamber < lastChamber ) {
549 if ( chamberNbr == chamber ) {
551 Double_t Px, Py, Pz, Pr;
557 Px = trackParam -> Px() ;
558 Py = trackParam -> Py() ;
559 Pz = trackParam -> Pz() ;
560 Pr = sqrt( Px*Px + Py*Py );
562 //The calculation of theta, the angle of incidence:
563 theta = 180. * kInvPi * (TMath::ATan( - Pz / Pr));
565 if ( theta < 79 ) iTheta = 11;
566 else if ( theta < 90 ) iTheta = int( theta - 79.);
569 eff [iTheta] = eff [iTheta] + 1;
570 trackN [iTheta] = trackN [iTheta] + 1;
571 chamber = chamber + 1;
576 Double_t chamberZpos;
579 Double_t Px, Py, Pz, Pr;
585 chamberZpos = AliMUONConstants::DefaultChamberZ(chamber);
586 AliMUONTrackExtrap::ExtrapToZ(trackParam,chamberZpos);
588 Px = trackParam -> Px() ;
589 Py = trackParam -> Py() ;
590 Pz = trackParam -> Pz() ;
591 Pr = sqrt( Px*Px + Py*Py );
593 //The calculation of thetaI, the angle of incidence:
594 theta = 180. * kInvPi * (TMath::ATan( - Pz / Pr));
596 if ( theta < 79 ) iTheta = 11;
597 else if ( theta < 90 ) iTheta = int( theta - 79.);
600 eff [iTheta] = eff [iTheta] + 0;
601 trackN [iTheta] = trackN [iTheta] + 1;
602 chamber = chamber + 1;
609 if ( iHit == nHits-1 ) {
610 if ( chamber == lastChamber )
624 muondata.ResetRecTracks();
625 if ( event2Check!=0 )
631 Double_t efficiency [11];
635 TGraph * effTheta = new TGraph ();
637 if ( firstChamber == lastChamber ) {
638 for ( th = 0; th < 11; ++th )
640 cout<<"\nFor Theta (angle of incidence) = ["<<th+79<<","<<th+80<<"]:\n";
641 cout<<"The chamber "<<firstChamber<<" has responded "<<eff [th]<<" times on "<<trackN [th]<<" tracks\n";
644 Double_t e = eff [th];
645 Double_t n = trackN [th];
648 efficiency [th] = 0.;
649 cout<<"Efficiency = ? % (IS UNKNOWN) \n";
652 efficiency [th] = 100.*e/n;
653 cout<<"Efficiency = "<<efficiency [th]<<" %\n";
659 for ( th = 0; th < 11; ++th )
661 cout<<"\nFor Theta (angle of incidence) = ["<<th+79<<","<<th+80<<"]:\n";
662 cout<<"The chambers "<<firstChamber<<" to "<<lastChamber<<" have responded "<<eff [th]<<" times on "<<trackN [th]<<" tracks\n";
665 Double_t e = eff [th];
666 Double_t n = trackN [th];
669 efficiency [th] = 0.;
670 cout<<"Efficiency = ? % (IS UNKNOWN) \n";
673 efficiency [th] = 100.*e/n;
674 cout<<"Efficiency = "<<efficiency [th]<<" %\n";
679 TCanvas * c1 = new TCanvas ();
680 effTheta = new TGraph( i, t, efficiency );
682 effTheta -> Draw("ALP");
684 MUONLoader->UnloadTracks();
693 /*****************************************************************************************************************/
694 /*****************************************************************************************************************/
697 void resolution( Int_t event2Check=0, char * filename="galice.root" )
699 cout<<"\nChamber(s) chosen;\nFirst chamber:";
701 cout<<"Last chamber:";
709 hDeltax = new TH1F ("hDeltax " , "No Interest", 100, -0.3, 0.3);
710 hDeltay = new TH1F ("hDeltay " , "No Interest", 500, -0.1, 0.1);
711 hDelta3D = new TH2F ("hDelta3D" , "No Interest", 100, -0.3, 0.3, 500, -0.1, 0.1);
714 //Creating Run Loader and openning file containing Hits
715 //--------------------------------------------------------------------------------------------------------------
716 AliRunLoader * RunLoader = AliRunLoader::Open(filename,"MUONFolder","READ");
717 if (RunLoader == 0x0) {printf(">>> Error : Error Opening %s file \n",filename);return;}
721 //--------------------------------------------------------------------------------------------------------------
722 AliLoader * MUONLoader = RunLoader -> GetLoader("MUONLoader");
723 MUONLoader -> LoadTracks("READ");
724 MUONLoader -> LoadRecPoints("READ");
727 //Creating a MUON data container
728 //--------------------------------------------------------------------------------------------------------------
729 AliMUONData muondata(MUONLoader,"MUON","MUON");
732 nEvents = (Int_t) RunLoader -> GetNumberOfEvents();
735 for ( iEvent = 0; iEvent < nEvents; ++iEvent )
739 printf("\r>>> Event %d ",iEvent);
740 RunLoader->GetEvent(iEvent);
743 muondata.SetTreeAddress("RT");
744 muondata.GetRecTracks();
745 tracks = muondata.RecTracks();
748 nTracks = (Int_t) tracks -> GetEntriesFast();
749 for ( iTrack = 0; iTrack < nTracks; ++iTrack )
751 track = (AliMUONTrack*) tracks ->At(iTrack) ;
752 trackParams = track ->GetTrackParamAtHit();
753 hits = track ->GetHitForRecAtHit() ;
756 nHits = (Int_t) hits -> GetEntriesFast();
757 for ( iHit = 0; iHit < nHits; ++iHit )
759 trackParam = (AliMUONTrackParam*) trackParams -> At(iHit);
760 hit = (AliMUONHitForRec*) hits -> At(iHit);
761 chamberNbr = hit -> GetChamberNumber();
762 if ( chamberNbr >= firstChamber-1 ) {
763 if ( chamberNbr < lastChamber ) {
769 Double_t deltaX, deltaY;
771 traX = trackParam -> GetNonBendingCoor();
772 traY = trackParam -> GetBendingCoor();
773 hitX = hit -> GetNonBendingCoor();
774 hitY = hit -> GetBendingCoor();
776 deltaX = traX - hitX;
777 deltaY = traY - hitY;
779 hDeltax -> Fill (deltaX);
780 hDeltay -> Fill (deltaY);
781 hDelta3D -> Fill (deltaX, deltaY);
788 muondata.ResetRecTracks();
789 if ( event2Check!=0 )
798 if ( firstChamber == lastChamber ) {
799 sprintf(hXtitle,"DeltaX Chamber %d",firstChamber);
800 sprintf(hYtitle,"DeltaY Chamber %d",lastChamber);
801 sprintf(h3title,"DeltaX and Delta Y Chamber %d",lastChamber);
804 sprintf(hXtitle,"DeltaX Chamber %d to %d",firstChamber,lastChamber);
805 sprintf(hYtitle,"DeltaY Chamber %d to %d",firstChamber,lastChamber);
806 sprintf(h3title,"DeltaX and Delta Y Chamber %d to %d",firstChamber,lastChamber);
810 hDeltax -> SetTitle (hXtitle);
811 hDeltay -> SetTitle (hYtitle);
812 hDelta3D -> SetTitle (h3title);
814 Double_t rmsX = hDeltax -> GetRMS ();
815 Double_t errX = hDeltax -> GetRMSError();
817 TF1 *fY = new TF1("fY","gaus",-0.3, 0.3);
818 hDeltay -> Fit("fY","R","E");
819 Double_t sigY = fY -> GetParameter(2);
820 Double_t errY = fY -> GetParError (2);
822 if ( firstChamber == lastChamber ) {
823 cout<<"\nThe resolution (Non Bending plane) of the chamber "<<firstChamber<<" = "<<rmsX<<" cm +-"<<errX;
824 cout<<"\nThe resolution (Bending plane) of the chamber "<<firstChamber<<" = "<<sigY<<" cm +- "<<errY;
827 cout<<"\nThe resolution (Non Bending plane) of the chambers "<<firstChamber<<" to "<<lastChamber<<" = "<<rmsX<<" cm +- "<<errX;
828 cout<<"\nThe resolution (Bending plane) of the chambers "<<firstChamber<<" to "<<lastChamber<<" = "<<sigY<<" cm +- "<<errY;
832 MUONLoader->UnloadTracks();
842 /*****************************************************************************************************************/
843 /*****************************************************************************************************************/
844 /*RESOLUTION IN FUNCTION OF PHI*/
846 void resolutionPhi( Int_t event2Check=0, char * filename="galice.root" )
848 cout<<"\nChamber(s) chosen;\nFirst chamber:";
850 cout<<"Last chamber:";
857 hDeltaX[0] = new TH1F ("hDeltaX0" , "No Interest", 100, -0.3, 0.3);
858 hDeltaX[1] = new TH1F ("hDeltaX1" , "No Interest", 100, -0.3, 0.3);
859 hDeltaX[2] = new TH1F ("hDeltaX2" , "No Interest", 100, -0.3, 0.3);
860 hDeltaX[3] = new TH1F ("hDeltaX3" , "No Interest", 100, -0.3, 0.3);
861 hDeltaX[4] = new TH1F ("hDeltaX4" , "No Interest", 100, -0.3, 0.3);
863 hDeltaY[0] = new TH1F ("hDeltaY0" , "No Interest", 500, -0.1, 0.1);
864 hDeltaY[1] = new TH1F ("hDeltaY1" , "No Interest", 500, -0.1, 0.1);
865 hDeltaY[2] = new TH1F ("hDeltaY2" , "No Interest", 500, -0.1, 0.1);
866 hDeltaY[3] = new TH1F ("hDeltaY3" , "No Interest", 500, -0.1, 0.1);
867 hDeltaY[4] = new TH1F ("hDeltaY4" , "No Interest", 500, -0.1, 0.1);
870 //Creating Run Loader and openning file containing Hits
871 //--------------------------------------------------------------------------------------------------------------
872 AliRunLoader * RunLoader = AliRunLoader::Open(filename,"MUONFolder","READ");
873 if (RunLoader == 0x0) {printf(">>> Error : Error Opening %s file \n",filename);return;}
877 //--------------------------------------------------------------------------------------------------------------
878 AliLoader * MUONLoader = RunLoader -> GetLoader("MUONLoader");
879 MUONLoader -> LoadTracks("READ");
880 MUONLoader -> LoadRecPoints("READ");
883 //Creating a MUON data container
884 //--------------------------------------------------------------------------------------------------------------
885 AliMUONData muondata(MUONLoader,"MUON","MUON");
888 nEvents = (Int_t) RunLoader -> GetNumberOfEvents();
891 for ( iEvent = 0; iEvent < nEvents; ++iEvent )
893 if ( event2Check!=0 )
895 printf("\r>>> Event %d ",iEvent);
896 RunLoader->GetEvent(iEvent);
899 muondata.SetTreeAddress("RT");
900 muondata.GetRecTracks();
901 tracks = muondata.RecTracks();
904 nTracks = (Int_t) tracks -> GetEntriesFast();
905 for ( iTrack = 0; iTrack < nTracks; ++iTrack )
907 track = (AliMUONTrack*) tracks ->At(iTrack) ;
908 trackParams = track ->GetTrackParamAtHit();
909 hits = track ->GetHitForRecAtHit() ;
912 nHits = (Int_t) hits -> GetEntriesFast();
913 for ( iHit = 0; iHit < nHits; ++iHit )
915 trackParam = (AliMUONTrackParam*) trackParams -> At(iHit);
916 hit = (AliMUONHitForRec* ) hits -> At(iHit);
917 chamberNbr = hit -> GetChamberNumber();
918 if ( chamberNbr >= firstChamber -1 ) {
919 if ( chamberNbr < lastChamber ) {
933 traX = trackParam -> GetNonBendingCoor();
934 traY = trackParam -> GetBendingCoor() ;
936 hitX = hit -> GetNonBendingCoor();
937 hitY = hit -> GetBendingCoor() ;
939 aveX = 1./2.*(traX + hitX);
940 aveY = 1./2.*(traY + hitY);
942 //The calculation of phi:
943 phi = 180. * kInvPi * (TMath::ATan2( aveY, aveX ));
945 if ( phi < 0.) phi = 360 - abs(phi);
946 iPhi = int( phi/72. );
948 deltaX = traX - hitX;
949 deltaY = traY - hitY;
951 hDeltaX [iPhi] -> Fill( deltaX );
952 hDeltaY [iPhi] -> Fill( deltaY );
961 muondata.ResetRecTracks();
962 if ( event2Check!=0 )
971 Int_t phiMin, phiMax;
980 for ( iPhi = 0; iPhi < iPhiMax; ++iPhi )
986 phiMax = 72*iPhi + 72;
988 TF1 *fY = new TF1("fY","gaus",-0.3, 0.3);
990 if ( firstChamber == lastChamber ) {
991 sprintf(hXtitle,"DeltaX (phi=[%d, %d]) Chamber %d",phiMin,phiMax,firstChamber);
992 sprintf(hYtitle,"DeltaY (phi=[%d, %d]) Chamber %d",phiMin,phiMax,lastChamber);
995 sprintf(hXtitle,"DeltaX (phi=[%d, %d]) Chamber %d to %d",phiMin,phiMax,firstChamber,lastChamber);
996 sprintf(hYtitle,"DeltaY (phi=[%d, %d]) Chamber %d to %d",phiMin,phiMax,firstChamber,lastChamber);
999 hDeltaY [iPhi] -> SetTitle(hYtitle);
1000 hDeltaX [iPhi] -> SetTitle(hXtitle);
1002 hDeltaY [iPhi] -> Fit("fY","R","E");
1003 sigmaY [iPhi] = fY -> GetParameter(2) ;
1004 errSY [iPhi] = fY -> GetParError(2) ;
1006 rmsX [iPhi] = hDeltaX [iPhi] -> GetRMS();
1007 errSX [iPhi] = hDeltaX [iPhi] -> GetRMSError();
1009 phi [iPhi] = 72*iPhi + 36 ;
1013 //--------------------------------------------------------------------------------------------------------------
1014 //For plotting resolution in function of the angle of incidence
1016 TCanvas * c1 = new TCanvas("c1","",200,10,700,500);
1020 TGraphErrors * GraphX = new TGraphErrors( iPhiMax, phi, rmsX, errPh, errSX);
1021 GraphX->SetTitle("Resolution en X (Phi)");
1022 GraphX->Draw("ALP");
1025 TGraphErrors * GraphY = new TGraphErrors( iPhiMax, phi, sigmaY, errPh, errSY);
1026 GraphY->SetTitle("Resolution en Y (Phi)");
1027 GraphY->Draw("ALP");
1031 MUONLoader->UnloadTracks();
1041 /*****************************************************************************************************************/
1042 /*****************************************************************************************************************/
1043 /*RESOLUTION IN FUNCTION OF THETA*/
1045 void resolutionTheta( Int_t event2Check=0, char * filename="galice.root" )
1047 cout<<"\nChamber(s) chosen;\nFirst chamber:";
1049 cout<<"Last chamber:";
1056 hDeltaX[0] = new TH1F ("hDeltaX0" , "No Interest", 100, -0.3, 0.3);
1057 hDeltaX[1] = new TH1F ("hDeltaX1" , "No Interest", 100, -0.3, 0.3);
1058 hDeltaX[2] = new TH1F ("hDeltaX2" , "No Interest", 100, -0.3, 0.3);
1059 hDeltaX[3] = new TH1F ("hDeltaX3" , "No Interest", 100, -0.3, 0.3);
1060 hDeltaX[4] = new TH1F ("hDeltaX4" , "No Interest", 100, -0.3, 0.3);
1061 hDeltaX[5] = new TH1F ("hDeltaX5" , "No Interest", 100, -0.3, 0.3);
1062 hDeltaX[6] = new TH1F ("hDeltaX6" , "No Interest", 100, -0.3, 0.3);
1063 hDeltaX[7] = new TH1F ("hDeltaX7" , "No Interest", 100, -0.3, 0.3);
1064 hDeltaX[8] = new TH1F ("hDeltaX8" , "No Interest", 100, -0.3, 0.3);
1066 hDeltaY[0] = new TH1F ("hDeltaY0" , "No Interest", 500, -0.1, 0.1);
1067 hDeltaY[1] = new TH1F ("hDeltaY1" , "No Interest", 500, -0.1, 0.1);
1068 hDeltaY[2] = new TH1F ("hDeltaY2" , "No Interest", 500, -0.1, 0.1);
1069 hDeltaY[3] = new TH1F ("hDeltaY3" , "No Interest", 500, -0.1, 0.1);
1070 hDeltaY[4] = new TH1F ("hDeltaY4" , "No Interest", 500, -0.1, 0.1);
1071 hDeltaY[5] = new TH1F ("hDeltaY5" , "No Interest", 500, -0.1, 0.1);
1072 hDeltaY[6] = new TH1F ("hDeltaY6" , "No Interest", 500, -0.1, 0.1);
1073 hDeltaY[7] = new TH1F ("hDeltaY7" , "No Interest", 500, -0.1, 0.1);
1074 hDeltaY[8] = new TH1F ("hDeltaY8" , "No Interest", 500, -0.1, 0.1);
1077 //Creating Run Loader and openning file containing Hits
1078 //--------------------------------------------------------------------------------------------------------------
1079 AliRunLoader * RunLoader = AliRunLoader::Open(filename,"MUONFolder","READ");
1080 if (RunLoader == 0x0) {printf(">>> Error : Error Opening %s file \n",filename);return;}
1083 //Getting MUONLoader
1084 //--------------------------------------------------------------------------------------------------------------
1085 AliLoader * MUONLoader = RunLoader -> GetLoader("MUONLoader");
1086 MUONLoader -> LoadTracks("READ");
1087 MUONLoader -> LoadRecPoints("READ");
1090 //Creating a MUON data container
1091 //--------------------------------------------------------------------------------------------------------------
1092 AliMUONData muondata(MUONLoader,"MUON","MUON");
1095 nEvents = (Int_t) RunLoader -> GetNumberOfEvents();
1098 for ( iEvent = 0; iEvent < nEvents; ++iEvent )
1100 if ( event2Check!=0 )
1102 printf("\r>>> Event %d ",iEvent);
1103 RunLoader->GetEvent(iEvent);
1106 muondata.SetTreeAddress("RT");
1107 muondata.GetRecTracks();
1108 tracks = muondata.RecTracks();
1111 nTracks = (Int_t) tracks -> GetEntriesFast();
1112 for ( iTrack = 0; iTrack < nTracks; ++iTrack )
1114 track = (AliMUONTrack*) tracks ->At(iTrack) ;
1115 trackParams = track ->GetTrackParamAtHit();
1116 hits = track ->GetHitForRecAtHit() ;
1119 nHits = (Int_t) hits -> GetEntriesFast();
1120 for ( iHit = 0; iHit < nHits; ++iHit )
1122 trackParam = (AliMUONTrackParam*) trackParams -> At(iHit);
1123 hit = (AliMUONHitForRec* ) hits -> At(iHit);
1124 chamberNbr = hit -> GetChamberNumber();
1125 if ( chamberNbr >= firstChamber -1 ) {
1126 if ( chamberNbr < lastChamber ) {
1128 Double_t traX, traY;
1129 Double_t hitX, hitY, hitZ;
1130 Double_t aveY, aveX;
1140 traX = trackParam -> GetNonBendingCoor();
1141 traY = trackParam -> GetBendingCoor() ;
1143 hitX = hit -> GetNonBendingCoor();
1144 hitY = hit -> GetBendingCoor() ;
1145 hitZ = hit -> GetZ();
1147 aveX = 1./2.*(traX + hitX);
1148 aveY = 1./2.*(traY + hitY);
1150 //The calculation of theta, theta is in fact 180 - Theta(The polar angle):
1151 theta = 180. * kInvPi * (TMath::ATan2( sqrt(aveX*aveX+aveY*aveY), -hitZ ));
1153 iTheta = int( theta );
1154 if( theta > 10 ) iTheta = 9;
1155 if( theta < 1 ) iTheta = 1;
1157 deltaX = traX - hitX;
1158 deltaY = traY - hitY;
1160 hDeltaX [iTheta-1] -> Fill( deltaX );
1161 hDeltaY [iTheta-1] -> Fill( deltaY );
1169 //End loop on tracks
1170 muondata.ResetRecTracks();
1171 if ( event2Check!=0 )
1175 //End loop on events
1179 Int_t iThetaMax = 9;
1180 Int_t thetaMin, thetaMax;
1189 for ( iTheta = 0; iTheta < iThetaMax; ++iTheta )
1194 //To find the polar angle
1195 thetaMin = 178 - iTheta;
1196 thetaMax = 179 - iTheta;
1198 TF1 *fY = new TF1("fY","gaus",-0.3, 0.3);
1200 if ( firstChamber == lastChamber ) {
1201 sprintf(hXtitle,"DeltaX (theta=[%d, %d]) Chamber %d",thetaMin,thetaMax,firstChamber);
1202 sprintf(hYtitle,"DeltaY (theta=[%d, %d]) Chamber %d",thetaMin,thetaMax,lastChamber);
1205 sprintf(hXtitle,"DeltaX (theta=[%d, %d]) Chamber %d to %d",thetaMin,thetaMax,firstChamber,lastChamber);
1206 sprintf(hYtitle,"DeltaY (theta=[%d, %d]) Chamber %d to %d",thetaMin,thetaMax,firstChamber,lastChamber);
1209 hDeltaY [iTheta] -> SetTitle(hYtitle);
1210 hDeltaX [iTheta] -> SetTitle(hXtitle);
1212 hDeltaY [iTheta] -> Fit("fY","R","E");
1213 sigmaY [iTheta] = fY -> GetParameter(2) ;
1214 errSY [iTheta] = fY -> GetParError(2) ;
1216 rmsX [iTheta] = hDeltaX [iTheta] -> GetRMS();
1217 errSX [iTheta] = hDeltaX [iTheta] -> GetRMSError();
1219 theta [iTheta] = 178.5 - iTheta;
1220 ErrTh [iTheta] = 0.5;
1223 //--------------------------------------------------------------------------------------------------------------
1224 //For plotting resolution in function of the angle of incidence
1226 TCanvas * c1 = new TCanvas("c1","",200,10,700,500);
1230 TGraphErrors * GraphX = new TGraphErrors( iThetaMax, theta, rmsX, ErrTh, errSX);
1231 GraphX->SetTitle("Resolution en X (Theta)");
1232 GraphX->Draw("ALP");
1235 TGraphErrors * GraphY = new TGraphErrors( iThetaMax, theta, sigmaY, ErrTh, errSY);
1236 GraphY->SetTitle("Resolution en Y (Theta)");
1237 GraphY->Draw("ALP");
1240 MUONLoader->UnloadTracks();
1248 /*****************************************************************************************************************/
1249 /*****************************************************************************************************************/
1250 /*RESOLUTION IN FUNCTION OF THETA OF INCIDENCE*/
1252 void resolutionThetaI( Int_t event2Check=0, char * filename="galice.root" )
1254 cout<<"\nChamber(s) chosen;\nFirst chamber:";
1256 cout<<"Last chamber:";
1263 hDeltaX[0] = new TH1F ("hDeltaX0" , "No Interest", 100, -0.3, 0.3);
1264 hDeltaX[1] = new TH1F ("hDeltaX1" , "No Interest", 100, -0.3, 0.3);
1265 hDeltaX[2] = new TH1F ("hDeltaX2" , "No Interest", 100, -0.3, 0.3);
1266 hDeltaX[3] = new TH1F ("hDeltaX3" , "No Interest", 100, -0.3, 0.3);
1267 hDeltaX[4] = new TH1F ("hDeltaX4" , "No Interest", 100, -0.3, 0.3);
1268 hDeltaX[5] = new TH1F ("hDeltaX5" , "No Interest", 100, -0.3, 0.3);
1269 hDeltaX[6] = new TH1F ("hDeltaX6" , "No Interest", 100, -0.3, 0.3);
1270 hDeltaX[7] = new TH1F ("hDeltaX7" , "No Interest", 100, -0.3, 0.3);
1271 hDeltaX[8] = new TH1F ("hDeltaX8" , "No Interest", 100, -0.3, 0.3);
1272 hDeltaX[9] = new TH1F ("hDeltaX9" , "No Interest", 100, -0.3, 0.3);
1273 hDeltaX[10]= new TH1F ("hDeltaX10", "No Interest", 100, -0.3, 0.3);
1275 hDeltaY[0] = new TH1F ("hDeltaY0" , "No Interest", 500, -0.1, 0.1);
1276 hDeltaY[1] = new TH1F ("hDeltaY1" , "No Interest", 500, -0.1, 0.1);
1277 hDeltaY[2] = new TH1F ("hDeltaY2" , "No Interest", 500, -0.1, 0.1);
1278 hDeltaY[3] = new TH1F ("hDeltaY3" , "No Interest", 500, -0.1, 0.1);
1279 hDeltaY[4] = new TH1F ("hDeltaY4" , "No Interest", 500, -0.1, 0.1);
1280 hDeltaY[5] = new TH1F ("hDeltaY5" , "No Interest", 500, -0.1, 0.1);
1281 hDeltaY[6] = new TH1F ("hDeltaY6" , "No Interest", 500, -0.1, 0.1);
1282 hDeltaY[7] = new TH1F ("hDeltaY7" , "No Interest", 500, -0.1, 0.1);
1283 hDeltaY[8] = new TH1F ("hDeltaY8" , "No Interest", 500, -0.1, 0.1);
1284 hDeltaY[9] = new TH1F ("hDeltaY9" , "No Interest", 500, -0.1, 0.1);
1285 hDeltaY[10]= new TH1F ("hDeltaY10", "No Interest", 500, -0.1, 0.1);
1288 //Creating Run Loader and openning file containing Hits
1289 //--------------------------------------------------------------------------------------------------------------
1290 AliRunLoader * RunLoader = AliRunLoader::Open(filename,"MUONFolder","READ");
1291 if (RunLoader == 0x0) {printf(">>> Error : Error Opening %s file \n",filename);return;}
1294 //Getting MUONLoader
1295 //--------------------------------------------------------------------------------------------------------------
1296 AliLoader * MUONLoader = RunLoader -> GetLoader("MUONLoader");
1297 MUONLoader -> LoadTracks("READ");
1298 MUONLoader -> LoadRecPoints("READ");
1301 //Creating a MUON data container
1302 //--------------------------------------------------------------------------------------------------------------
1303 AliMUONData muondata(MUONLoader,"MUON","MUON");
1306 nEvents = (Int_t) RunLoader -> GetNumberOfEvents();
1309 for ( iEvent = 0; iEvent < nEvents; ++iEvent )
1311 if ( event2Check!=0 )
1313 printf("\r>>> Event %d ",iEvent);
1314 RunLoader->GetEvent(iEvent);
1317 muondata.SetTreeAddress("RT");
1318 muondata.GetRecTracks();
1319 tracks = muondata.RecTracks();
1322 nTracks = (Int_t) tracks -> GetEntriesFast();
1323 for ( iTrack = 0; iTrack < nTracks; ++iTrack )
1325 track = (AliMUONTrack*) tracks ->At(iTrack) ;
1326 trackParams = track ->GetTrackParamAtHit();
1327 hits = track ->GetHitForRecAtHit() ;
1330 nHits = (Int_t) hits -> GetEntriesFast();
1331 for ( iHit = 0; iHit < nHits; ++iHit )
1333 trackParam = (AliMUONTrackParam*) trackParams -> At(iHit);
1334 hit = (AliMUONHitForRec* ) hits -> At(iHit);
1335 chamberNbr = hit -> GetChamberNumber();
1336 if ( chamberNbr >= firstChamber - 1 ) {
1337 if ( chamberNbr < lastChamber ) {
1339 Double_t Px, Py, Pz, Pr;
1342 Double_t traX, traY;
1343 Double_t hitX, hitY;
1353 Px = trackParam -> Px() ;
1354 Py = trackParam -> Py() ;
1355 Pz = trackParam -> Pz() ;
1356 Pr = sqrt( Px*Px + Py*Py );
1358 traX = trackParam -> GetNonBendingCoor();
1359 traY = trackParam -> GetBendingCoor();
1361 hitX = hit -> GetNonBendingCoor();
1362 hitY = hit -> GetBendingCoor();
1364 //The calculation of theta, the angle of incidence:
1365 theta = 180. * kInvPi * (TMath::ATan( - Pz / Pr))
1367 if ( theta < 79 ) iTheta = 0;
1368 else iTheta = int( theta - 79.);
1370 deltaX = traX - hitX;
1371 deltaY = traY - hitY;
1373 hDeltaX [iTheta] -> Fill (deltaX);
1374 hDeltaY [iTheta] -> Fill (deltaY);
1382 //End loop on tracks
1383 muondata.ResetRecTracks();
1384 if ( event2Check!=0 )
1388 //End loop on events
1392 Int_t iThetaMax = 11;
1393 Int_t thetaMin, thetaMax;
1402 for ( iTheta = 0; iTheta < iThetaMax; ++iTheta )
1407 thetaMin = iTheta + 79;
1408 thetaMax = iTheta + 80;
1410 TF1 *fY = new TF1("fY","gaus",-0.3, 0.3);
1412 if ( firstChamber == lastChamber ) {
1413 sprintf(hXtitle,"DeltaX (theta=[%d, %d]) Chamber %d",thetaMin,thetaMax,firstChamber);
1414 sprintf(hYtitle,"DeltaY (theta=[%d, %d]) Chamber %d",thetaMin,thetaMax,lastChamber);
1417 sprintf(hXtitle,"DeltaX (theta=[%d, %d]) Chamber %d to %d",thetaMin,thetaMax,firstChamber,lastChamber);
1418 sprintf(hYtitle,"DeltaY (theta=[%d, %d]) Chamber %d to %d",thetaMin,thetaMax,firstChamber,lastChamber);
1421 hDeltaY [iTheta] -> SetTitle(hYtitle);
1422 hDeltaX [iTheta] -> SetTitle(hXtitle);
1424 hDeltaY [iTheta] -> Fit("fY","R","E");
1425 sigmaY [iTheta] = fY -> GetParameter(2) ;
1426 errSY [iTheta] = fY -> GetParError(2) ;
1428 rmsX [iTheta] = hDeltaX [iTheta] -> GetRMS();
1429 errSX [iTheta] = hDeltaX [iTheta] -> GetRMSError();
1431 theta [iTheta] = iTheta + 79.5 ;
1432 errTh [iTheta] = 0.5;
1435 //--------------------------------------------------------------------------------------------------------------
1436 //For plotting resolution in function of the angle of incidence
1438 TCanvas * c1 = new TCanvas("c1","",200,10,700,500);
1442 TGraphErrors * GraphX = new TGraphErrors( iThetaMax, theta, rmsX, errTh, errSX);
1443 GraphX->SetTitle("Resolution en X (Theta)");
1444 GraphX->Draw("ALP");
1447 TGraphErrors * GraphY = new TGraphErrors( iThetaMax, theta, sigmaY, errTh, errSY);
1448 GraphY->SetTitle("Resolution en Y (Theta)");
1449 GraphY->Draw("ALP");
1452 MUONLoader->UnloadTracks();