]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONDisplay.cxx
Added protection and 2 levels for problems
[u/mrichter/AliRoot.git] / MUON / AliMUONDisplay.cxx
index 02d5c56522b702e3252003f9fb8893eb3e235ce6..d889216b9cc7888eb2a919c7b611f47a4ed5220e 100644 (file)
@@ -79,6 +79,8 @@
 #include "AliMUONGeometrySegmentation.h"
 #include "AliMUONConstants.h"
 #include "AliMUONTriggerSegmentation.h"
+#include "AliMUONSimData.h"
+#include "AliMUONRecData.h"
 
 #include "AliMpDEIterator.h"
 #include "AliMpSegmentation.h"
 #include <TButton.h>
 #include <TColor.h>
 #include <TCanvas.h>
+#if ROOT_VERSION_CODE>= 331523
+#include <TView3D.h>
+#else
 #include <TView.h>
+#endif
 #include <TText.h>
 #include <TPaveLabel.h>
 #include <TPaveText.h>
@@ -135,14 +141,17 @@ AliMUONDisplay::AliMUONDisplay()
     fPhits(0),
     fRpoints(0),
     fNextCathode(0),
-    fLoader(0), 
-    fMUONData(0)
+    fSimLoader(0), 
+    fRecLoader(0), 
+    fMUONSimData(0),
+    fMUONRecData(0)
 {
 /// Default constructor
 }
 
 //_____________________________________________________________________________
-AliMUONDisplay::AliMUONDisplay(Int_t size, AliLoader * loader)
+AliMUONDisplay::AliMUONDisplay(Int_t size, 
+                               AliLoader * simLoader, AliLoader * recLoader)
   : AliDisplay(),
     fEvent(0),
     fChamber(1),
@@ -156,8 +165,10 @@ AliMUONDisplay::AliMUONDisplay(Int_t size, AliLoader * loader)
     fPhits(0),
     fRpoints(0),
     fNextCathode(kFALSE),
-    fLoader(loader), 
-    fMUONData(0)
+    fSimLoader(simLoader), 
+    fRecLoader(recLoader), 
+    fMUONSimData(0),
+    fMUONRecData(0)
   
 {
 /// Standard constructor to create an event display object.
@@ -241,10 +252,10 @@ AliMUONDisplay::AliMUONDisplay(Int_t size, AliLoader * loader)
     fCanvas->Update();
  
     // initialize container
-    if(fLoader) 
-      fMUONData = new AliMUONData(fLoader,"MUON","MUON");
-    else
-      fMUONData =0x0;
+    if(fSimLoader) 
+      fMUONSimData = new AliMUONSimData(fSimLoader,"MUON","MUON");
+    if(fRecLoader) 
+      fMUONRecData = new AliMUONRecData(fRecLoader,"MUON","MUON");
 }
 
 //_____________________________________________________________________________
@@ -527,16 +538,16 @@ void AliMUONDisplay::PrintKinematics()
 {
 /// Print kinematic tree
 
-  AliRunLoader * runLoader;
+  if ( !fSimLoader || !fRecLoader ) {
+    AliErrorStream() << "Detector loaders are not defined." << endl;
+    return;
+  }  
+
+  AliRunLoader* runLoader = fSimLoader->GetRunLoader();
   TParticle *particle = new TParticle();
   Int_t nPart;
   Float_t vertex[3], momentum[3];
 
-  if (fLoader)
-    runLoader = fLoader->GetRunLoader();
-  else
-    runLoader = 0x0;
-  
   printf("******  Event # %d ******\n",runLoader->GetEventNumber());
   runLoader->TreeK()->GetBranch("Particles")->SetAddress(&particle);
   nPart = (Int_t)runLoader->TreeK()->GetEntries();
@@ -724,6 +735,11 @@ void AliMUONDisplay::DrawTitle(Option_t *option)
 {
 /// Draw the event title
 
+  if ( !fSimLoader || !fRecLoader ) {
+    AliErrorStream() << "Detector loaders are not defined." << endl;
+    return;
+  }  
+
     Float_t xmin = gPad->GetX1();
     Float_t xmax = gPad->GetX2();
     Float_t ymin = gPad->GetY1();
@@ -731,12 +747,7 @@ void AliMUONDisplay::DrawTitle(Option_t *option)
     Float_t dx   = xmax-xmin;
     Float_t dy   = ymax-ymin;
     
-    AliRunLoader * runLoader;
-    if (fLoader)
-      runLoader = fLoader->GetRunLoader();
-    else
-      runLoader = 0x0;
-
+    AliRunLoader * runLoader = fSimLoader->GetRunLoader();
 
     if (strlen(option) == 0) {
        TPaveText *title = new TPaveText(xmin +0.01*dx, ymax-0.09*dy, xmin +0.5*dx, ymax-0.01*dy);
@@ -779,7 +790,13 @@ void AliMUONDisplay::DrawView(Float_t theta, Float_t phi, Float_t psi)
   gPad->SetFillColor(1);
   
   Int_t iret=0;
+#if ROOT_VERSION_CODE>= 331523
+   Double_t rmin[]={-1,-1,-1};
+   Double_t rmax[]={ 1, 1, 1};
+   TView *view = new TView3D(1,rmin,rmax);
+#else
   TView *view = new TView(1);
+#endif
   
   Float_t range = fRrange*fRangeSlider->GetMaximum();
   view->SetRange(-range,-range,-range,range, range, range);
@@ -929,7 +946,13 @@ void AliMUONDisplay::DrawGlobalView(Float_t theta, Float_t phi, Float_t psi)
     
 
     Int_t iret=0;
+#if ROOT_VERSION_CODE>= 331523
+    Double_t rmin[]={-1,-1,-1};
+    Double_t rmax[]={ 1, 1, 1};
+    TView *view = new TView3D(1,rmin,rmax);
+#else
     TView *view = new TView(1);
+#endif
     
     Float_t range = fRrange*fRangeSlider->GetMaximum()*3.;
     view->SetRange(-range,-range,-range,range,range,range);
@@ -1047,18 +1070,18 @@ void AliMUONDisplay::LoadDigits(Int_t chamber, Int_t cathode)
     
     AliMUON *pMUON  =     (AliMUON*)gAlice->GetModule("MUON");
 
-    GetMUONData()->SetTreeAddress("D");
+    GetMUONSimData()->SetTreeAddress("D");
 
-    TClonesArray *muonDigits  = GetMUONData()->Digits(chamber-1);
+    TClonesArray *muonDigits  = GetMUONSimData()->Digits(chamber-1);
     if (muonDigits == 0) return;
 
     gAlice->ResetDigits();
     Int_t nent = 0;
  
-    if (GetLoader()->TreeD()) {
-       nent = (Int_t) GetLoader()->TreeD()->GetEntries();
+    if (GetSimLoader()->TreeD()) {
+       nent = (Int_t) GetSimLoader()->TreeD()->GetEntries();
        //     gAlice->TreeD()->GetEvent(nent-2+cathode-1);
-       GetMUONData()->GetDigits();
+       GetMUONSimData()->GetDigits();
     }
     
     Int_t ndigits = muonDigits->GetEntriesFast();    
@@ -1246,15 +1269,15 @@ void AliMUONDisplay::LoadCoG(Int_t chamber, Int_t /*cathode*/)
     
     ResetRpoints();
     
-    GetMUONData()->SetTreeAddress("RC");
-    TClonesArray *muonRawClusters  = GetMUONData()->RawClusters(chamber-1);
+    GetMUONRecData()->SetTreeAddress("RC");
+    TClonesArray *muonRawClusters  = GetMUONRecData()->RawClusters(chamber-1);
 
     if (muonRawClusters == 0) return;
 
     Int_t nent = 0;
-    if (GetMUONData()->TreeR()) {
-       nent=(Int_t) GetMUONData()->TreeR()->GetEntries();
-       GetMUONData()->TreeR()->GetEvent(0);
+    if (GetMUONRecData()->TreeR()) {
+       nent=(Int_t) GetMUONRecData()->TreeR()->GetEntries();
+       GetMUONRecData()->TreeR()->GetEvent(0);
     }
     
     Int_t nrawcl = muonRawClusters->GetEntriesFast();
@@ -1293,10 +1316,10 @@ void AliMUONDisplay::LoadTracks()
 
   ResetRpoints();
 
-  GetMUONData()->SetTreeAddress("RT");
-  TClonesArray* recTracksArray = GetMUONData()->RecTracks();
+  GetMUONRecData()->SetTreeAddress("RT");
+  TClonesArray* recTracksArray = GetMUONRecData()->RecTracks();
   if (recTracksArray == NULL) return;
-  GetMUONData()->GetRecTracks();
+  GetMUONRecData()->GetRecTracks();
 
   Int_t nRecTracks = 0;
   if (recTracksArray)
@@ -1323,11 +1346,8 @@ void AliMUONDisplay::LoadTracks()
     Float_t yRec=0;
     Float_t zRec=0;
 
-    trackParam = recTrack->GetTrackParamAtVertex(); 
-    xRec  = trackParam->GetNonBendingCoor();
-    yRec  = trackParam->GetBendingCoor();
-    zRec  = trackParam->GetZ();
-    points->SetPoint(iPoint,xRec,yRec,zRec);
+    // vertex unknown at the tracking level -> put it at (0,0,0)
+    points->SetPoint(iPoint,0.,0.,0.);
     iPoint++;  
 
     for (Int_t iHit = 0; iHit < nTrackHits; iHit++){
@@ -1349,32 +1369,41 @@ void AliMUONDisplay::LoadTracks()
 void AliMUONDisplay::PrintTrack(Int_t iRecTracks, AliMUONTrack *recTrack)
 {
 /// Print reconstructed track
-
+  
   AliMUONTrackParam *trackParam;
   Float_t vertex[3], momentum[3];
   Float_t pYZ, bendingSlope, nonBendingSlope, chi2dof;
   Int_t charge;
 
-  trackParam = recTrack->GetTrackParamAtVertex();
+  trackParam = recTrack->GetTrackParamAtVertex(); // meaningless since the vertex is not known at the tracking level
   vertex[0] = trackParam->GetNonBendingCoor();
   vertex[1] = trackParam->GetBendingCoor();
   vertex[2] = trackParam->GetZ();
-  pYZ =  1./TMath::Abs(trackParam->GetInverseBendingMomentum());
-  bendingSlope = trackParam->GetBendingSlope();
-  nonBendingSlope = trackParam->GetNonBendingSlope();
-  momentum[2] = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope);
-  momentum[0] = momentum[2] * nonBendingSlope;
-  momentum[1] = momentum[2] * bendingSlope;
   charge = Int_t(TMath::Sign(1.,trackParam->GetInverseBendingMomentum()));
-  chi2dof = recTrack->GetFitFMin()/(2.0 * recTrack->GetNTrackHits() - 5.);
-  
+
   printf("===================================================\n");
+  printf("//*****************************************************************//\n");
+  printf("// meaningless since the vertex is not known at the tracking level //\n");
+  printf("//*****************************************************************//\n");
   printf(" Reconstructed track # %d \n",iRecTracks);
   printf(" charge: %d \n",charge);
   printf(" vertex x,y,z (cm): %f %f %f \n",vertex[0],vertex[1],vertex[2]); 
-  printf(" momentum Px,Py,Pz (GeV/c): %f %f %f \n",momentum[0],momentum[1],momentum[2]);
+
+  if ( trackParam->GetInverseBendingMomentum() != 0. ) {
+    pYZ =  1./TMath::Abs(trackParam->GetInverseBendingMomentum());
+    bendingSlope = trackParam->GetBendingSlope();
+    nonBendingSlope = trackParam->GetNonBendingSlope();
+    momentum[2] = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope);
+    momentum[0] = momentum[2] * nonBendingSlope;
+    momentum[1] = momentum[2] * bendingSlope;
+    printf(" momentum Px,Py,Pz (GeV/c): %f %f %f \n",momentum[0],momentum[1],momentum[2]);
+  }
+  else { 
+    AliErrorStream() << "Cannot calculate momentum: pYZ = inf" << endl;
+  }  
+  chi2dof = recTrack->GetFitFMin()/(2.0 * recTrack->GetNTrackHits() - 5.);
   printf(" track chi2/dof: %f \n",chi2dof); 
-  
 }
 
 //___________________________________________
@@ -1392,23 +1421,23 @@ void AliMUONDisplay::LoadHits(Int_t chamber)
     
     Float_t zpos=AliMUONConstants::DefaultChamberZ(chamber-1);
 
-    if (GetMUONData()->TreeH()) {
-      GetMUONData()->SetTreeAddress("H");
-      Int_t ntracks = (Int_t)GetMUONData()->TreeH()->GetEntries(); //skowron
+    if (GetMUONSimData()->TreeH()) {
+      GetMUONSimData()->SetTreeAddress("H");
+      Int_t ntracks = (Int_t)GetMUONSimData()->TreeH()->GetEntries(); //skowron
       Int_t nthits  = 0;
       for (track = 0; track < ntracks; track++) {
-       GetMUONData()->ResetHits();
-       GetMUONData()->GetTrack(track);//skowron
-       TClonesArray *muonHits  = GetMUONData()->Hits();
+       GetMUONSimData()->ResetHits();
+       GetMUONSimData()->GetTrack(track);//skowron
+       TClonesArray *muonHits  = GetMUONSimData()->Hits();
        if (muonHits == 0) return;
        nthits += muonHits->GetEntriesFast();
       } 
       if (fPhits == 0) fPhits = new TObjArray(nthits);
       Int_t nhold=0;
       for (track=0; track<ntracks;track++) {
-       GetMUONData()->ResetHits();
-       GetMUONData()->GetTrack(track);//skowron
-       TClonesArray *muonHits  = GetMUONData()->Hits();
+       GetMUONSimData()->ResetHits();
+       GetMUONSimData()->GetTrack(track);//skowron
+       TClonesArray *muonHits  = GetMUONSimData()->Hits();
        if (muonHits == 0) return;
        Int_t nhits = muonHits->GetEntriesFast();
        if (nhits == 0) continue;
@@ -1513,10 +1542,10 @@ void AliMUONDisplay::Trigger()
 
   AliMUONGlobalTrigger* globalTrig;
 
-  GetMUONData()->SetTreeAddress("GLT");
-  GetMUONData()->GetTriggerD();
+  GetMUONRecData()->SetTreeAddress("GLT");
+  GetMUONRecData()->GetTriggerD();
 
-  globalTrig =  (AliMUONGlobalTrigger*)GetMUONData()->GlobalTrigger()->UncheckedAt(0);
+  globalTrig =  (AliMUONGlobalTrigger*)GetMUONRecData()->GlobalTrigger()->UncheckedAt(0);
   if (globalTrig == 0) return;
 
   globalTrig->Print("full");
@@ -1525,7 +1554,7 @@ void AliMUONDisplay::Trigger()
 //   AliMUONTriggerDecision* decision= new AliMUONTriggerDecision(GetLoader(),1);
 
 //   //  AliMUONTriggerDecision* decision= new AliMUONTriggerDecision(1);
-//   AliMUONData* muonData = decision->GetMUONData();
+//   AliMUONData* muonData = decision->GetMUONRecData();
 //   muonData->SetTreeAddress("D");
 //   decision->Trigger(); 
 }
@@ -1594,18 +1623,22 @@ void AliMUONDisplay::ShowNextEvent(Int_t delta)
 ///  -  delta =  1  shown next event
 ///  -  delta = -1 show previous event
 
-  AliRunLoader * runLoader;
-  if (fLoader)
-    runLoader = fLoader->GetRunLoader();
-  else
-    runLoader = 0x0;
+   if ( !fSimLoader || !fRecLoader ) {
+     AliErrorStream() << "Detector loaders are not defined." << endl;
+     return;
+   }  
+    
+   AliRunLoader* runSimLoader =  fSimLoader->GetRunLoader();
+   AliRunLoader* runRecLoader =  fRecLoader->GetRunLoader();
+   
     
-    if (delta) {
+   if (delta) {
       //runLoader->CleanDetectors();
       //runLoader->CleanKinematics();
-      Int_t currentEvent = runLoader->GetEventNumber();
+      Int_t currentEvent = runSimLoader->GetEventNumber();
       Int_t newEvent     = currentEvent + delta;
-      runLoader->GetEvent(newEvent);
+      runSimLoader->GetEvent(newEvent);
+      runRecLoader->GetEvent(newEvent);
       fEvent=newEvent;
     }
     LoadDigits(fChamber, fCathode);