]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/MUONCheck.C
remove LoOutput (Philippe)
[u/mrichter/AliRoot.git] / MUON / MUONCheck.C
index cabb5b7093358efa33f302f2f960a177e7ba7f86..d6210c0db1e581e7b338bb1b57f0de14a4d007c8 100644 (file)
 #include "TClonesArray.h"
 #include "TFile.h"
 #include "TH1.h"
+#include "TMath.h"
 #include "TParticle.h"
 #include "TTree.h"
+#include "TNtuple.h"
 
 // STEER includes
 #include "AliRun.h"
@@ -34,6 +36,8 @@
 #include "AliHeader.h"
 #include "AliLoader.h"
 #include "AliStack.h"
+#include "AliTracker.h"
+#include "AliMagFMaps.h"
 
 // MUON includes
 #include "AliMUON.h"
 #include "AliMUONGlobalTrigger.h"
 #include "AliMUONLocalTrigger.h"
 #include "AliMUONTrack.h"
+#include "AliMUONTrackParam.h"
+#include "AliMUONTrackExtrap.h"
+#include "AliMUONTriggerCircuit.h"
+#include "AliMUONTriggerCrateStore.h"
+
+#include "AliMpSegmentation.h"
+#include "AliMpVSegmentation.h"
+#include "AliMpIntPair.h"
+#include "AliMpDEManager.h"
+#include "AliMpCathodType.h"
+#include "AliMpPlaneType.h"
 #endif
 
-
-void MUONkine(char * filename="galice.root",Int_t event2Check=0)
+void MUONkine(Int_t event2Check=0, char * filename="galice.root")
 {
-  //  TClonesArray * ListOfParticles = new TClonesArray("TParticle",1000);
-  TParticle * particle = new TParticle();
+  // Stack of particle for each event
+  AliStack* stack;
   // Creating Run Loader and openning file containing Hits
   AliRunLoader * RunLoader = AliRunLoader::Open(filename,"MUONFolder","READ");
   if (RunLoader ==0x0) {
     printf(">>> Error : Error Opening %s file \n",filename);
     return;
   }
+
   RunLoader->LoadKinematics("READ");
   Int_t ievent, nevents;
   nevents = RunLoader->GetNumberOfEvents();
@@ -67,12 +82,11 @@ void MUONkine(char * filename="galice.root",Int_t event2Check=0)
     Int_t iparticle, nparticles;
     // Getting event ievent
     RunLoader->GetEvent(ievent); 
-    RunLoader->TreeK()->GetBranch("Particles")->SetAddress(&particle);
-    nparticles = (Int_t)RunLoader->TreeK()->GetEntries();
+    stack = RunLoader->Stack();
+    nparticles = (Int_t) stack->GetNtrack();
     printf(">>> Event %d, Number of particles is %d \n",ievent, nparticles);
     for(iparticle=0; iparticle<nparticles; iparticle++) {
-      RunLoader->TreeK()->GetEvent(iparticle);
-      particle->Print("");  
+      stack->Particle(iparticle)->Print("");  
     }
     if (event2Check!=0) ievent=nevents;
   }
@@ -80,7 +94,7 @@ void MUONkine(char * filename="galice.root",Int_t event2Check=0)
 }
 
 
-void MUONhits(char * filename="galice.root", Int_t event2Check=0)
+void MUONhits(Int_t event2Check=0, char * filename="galice.root")
 {
   // Creating Run Loader and openning file containing Hits
   AliRunLoader * RunLoader = AliRunLoader::Open(filename,"MUONFolder","READ");
@@ -104,28 +118,15 @@ void MUONhits(char * filename="galice.root", Int_t event2Check=0)
     Int_t itrack, ntracks;
     ntracks = (Int_t) muondata.GetNtracks();
     for (itrack=0; itrack<ntracks; itrack++) { // Track loop
-      printf(">>> Track %d \n",itrack);
-
       //Getting List of Hits of Track itrack
-      muondata.GetTrack(itrack); 
-
+      muondata.GetTrack(itrack);
       Int_t ihit, nhits;
       nhits = (Int_t) muondata.Hits()->GetEntriesFast();
-      printf(">>> Number of hits  %d \n",nhits);
+      printf(">>> Track %d, Number of hits %d \n",itrack,nhits);
       AliMUONHit* mHit;
       for(ihit=0; ihit<nhits; ihit++) {
        mHit = static_cast<AliMUONHit*>(muondata.Hits()->At(ihit));
-       Int_t Nch      = mHit->Chamber();  // chamber number
-       Int_t hittrack = mHit->Track();
-       Float_t x      = mHit->X();
-       Float_t y      = mHit->Y();
-       Float_t z      = mHit->Z();
-       Float_t elos   = mHit->Eloss();
-       Float_t theta  = mHit->Theta();
-       Float_t phi    = mHit->Phi();
-       Float_t momentum = mHit->Momentum();
-       printf(">>> Hit %2d Chamber %2d Track %4d x %6.3f y %6.3f z %7.3f elos %g theta %6.3f phi %5.3f momentum %5.3f\n",
-              ihit, Nch,hittrack,x,y,z,elos,theta,phi, momentum);
+       mHit->Print("full");
       }
       muondata.ResetHits();
     } // end track loop
@@ -135,7 +136,7 @@ void MUONhits(char * filename="galice.root", Int_t event2Check=0)
 }
 
 
-void MUONdigits(char * filename="galice.root", Int_t event2Check=0)
+void MUONdigits(Int_t event2Check=0, char * filename="galice.root")
 {
   // Creating Run Loader and openning file containing Hits
   AliRunLoader * RunLoader = AliRunLoader::Open(filename,"MUONFolder","READ");
@@ -148,7 +149,7 @@ void MUONdigits(char * filename="galice.root", Int_t event2Check=0)
   MUONLoader->LoadDigits("READ");
   // Creating MUON data container
   AliMUONData muondata(MUONLoader,"MUON","MUON");
-
+  
   Int_t ievent, nevents;
   nevents = RunLoader->GetNumberOfEvents();
   AliMUONDigit * mDigit;
@@ -157,53 +158,230 @@ void MUONdigits(char * filename="galice.root", Int_t event2Check=0)
     if (event2Check!=0) ievent=event2Check;
     printf(">>> Event %d \n",ievent);
     RunLoader->GetEvent(ievent);
+    
+    // Addressing
+    Int_t ichamber, nchambers;
+    nchambers = AliMUONConstants::NCh(); ;
+    muondata.SetTreeAddress("D,GLT");
+    
+    muondata.GetDigits();
+    // Loop on chambers
+    for( ichamber=0; ichamber<nchambers; ichamber++) {
+      Int_t idigit, ndigits;
+      TClonesArray* digits = muondata.Digits(ichamber);
+      digits->Sort();
+      ndigits = (Int_t)digits->GetEntriesFast();
+      for(idigit=0; idigit<ndigits; idigit++) {
+        mDigit = static_cast<AliMUONDigit*>(digits->At(idigit));
+        mDigit->Print("tracks");
+      } // end digit loop
+    } // end chamber loop
+    muondata.ResetDigits();
+    if (event2Check!=0) ievent=nevents;
+  }  // end event loop
+  MUONLoader->UnloadDigits();
+}
+
+void MUONsdigits(Int_t event2Check=0, char * filename="galice.root")
+{
+  // Creating Run Loader and openning file containing Hits
+  AliRunLoader * RunLoader = AliRunLoader::Open(filename,"MUONFolder","READ");
+  if (RunLoader ==0x0) {
+    printf(">>> Error : Error Opening %s file \n",filename);
+    return;
+  }
+  // Loading MUON subsystem
+  AliLoader * MUONLoader = RunLoader->GetLoader("MUONLoader");
+  MUONLoader->LoadSDigits("READ");
+  // Creating MUON data container
+  AliMUONData muondata(MUONLoader,"MUON","MUON");
   
+  Int_t ievent, nevents;
+  nevents = RunLoader->GetNumberOfEvents();
+  AliMUONDigit * mDigit;
+  
+  for(ievent=0; ievent<nevents; ievent++) {
+    if (event2Check!=0) ievent=event2Check;
+    printf(">>> Event %d \n",ievent);
+    RunLoader->GetEvent(ievent);
+    
     // Addressing
     Int_t ichamber, nchambers;
     nchambers = AliMUONConstants::NCh(); ;
-    muondata.SetTreeAddress("D"); 
-    //    char branchname[30];    
-    Int_t icathode, ncathodes;
-    ncathodes=2;
-    //Loop on cathodes 
-    for(icathode=0; icathode<ncathodes; icathode++) {
-      printf(">>> Cathode %d\n",icathode);
-      muondata.GetCathode(icathode);
-      // Loop on chambers
-      for( ichamber=0; ichamber<nchambers; ichamber++) {
-       printf(">>> Chamber %d\n",ichamber);
-       
-       Int_t idigit, ndigits;
-       ndigits = (Int_t) muondata.Digits(ichamber)->GetEntriesFast();
-       
-       for(idigit=0; idigit<ndigits; idigit++) {
-         mDigit = static_cast<AliMUONDigit*>(muondata.Digits(ichamber)->At(idigit));
-         Int_t PadX   = mDigit->PadX();     // Pad X number
-         Int_t PadY   = mDigit->PadY();     // Pad Y number
-         Int_t Signal = mDigit->Signal();   // Physics Signal
-         Int_t Physics= mDigit->Physics();  // Physics contribution to signal
-         Int_t Hit    = mDigit->Hit();      // iHit
-         Int_t Cathode= mDigit->Cathode();  // Cathode
-         Int_t Track0 = mDigit->Track(0);
-         Int_t Track1 = mDigit->Track(1); 
-         Int_t Track2 = mDigit->Track(2);
-         Int_t TCharges0 = mDigit->TrackCharge(0);  //charge per track making this digit (up to 10)
-         Int_t TCharges1 = mDigit->TrackCharge(1);
-         Int_t TCharges2 = mDigit->TrackCharge(2);
-         
-         printf(">>> Digit %4d cathode %1d hit %4d PadX %3d PadY %3d Signal %4d Physics %4d Track0 %4d TrackCharge0 %4d Track1 %'d TrackCharge1 %4d Track2 %4d TrackCharge2 %4d \n",idigit, Cathode,Hit, PadX, PadY, Signal, Physics, 
-         Track0, TCharges0, Track1, TCharges1, Track2, TCharges2);
-       } // end digit loop
-      } // end chamber loop
-      muondata.ResetDigits();
-    } // end cathode loop
+    muondata.SetTreeAddress("S");
+    
+    muondata.GetSDigits();
+    // Loop on chambers
+    for( ichamber=0; ichamber<nchambers; ichamber++) {
+      Int_t idigit, ndigits;
+      TClonesArray* digits = muondata.SDigits(ichamber);
+      ndigits = (Int_t)digits->GetEntriesFast();
+      for(idigit=0; idigit<ndigits; idigit++) {
+        mDigit = static_cast<AliMUONDigit*>(digits->At(idigit));
+        mDigit->Print("tracks");
+      } // end digit loop
+    } // end chamber loop
+    muondata.ResetSDigits();
     if (event2Check!=0) ievent=nevents;
   }  // end event loop
+  MUONLoader->UnloadSDigits();
+
+}
+
+void MUONoccupancy(Int_t event2Check=0,  Bool_t perDetEle =kFALSE, char * filename="galice.root") {
+  // Creating Run Loader and openning file containing Hits
+  AliRunLoader * RunLoader = AliRunLoader::Open(filename,"MUONFolder","READ");
+  if (RunLoader ==0x0) {
+    printf(">>> Error : Error Opening %s file \n",filename);
+    return;
+  }
+  // Loading MUON subsystem
+  AliLoader * MUONLoader = RunLoader->GetLoader("MUONLoader");
+  MUONLoader->LoadDigits("READ");
+  // Creating MUON data container
+  AliMUONData muondata(MUONLoader,"MUON","MUON");
+  
+  Int_t ievent, nevents;
+  nevents = RunLoader->GetNumberOfEvents();
+  AliMUONDigit * mDigit =0x0;
+  const AliMpVSegmentation * segbend = 0x0;
+  const AliMpVSegmentation * segnonbend = 0x0;
+  AliMpIntPair pad(0,0);
+
+  Int_t dEoccupancy_bending[14][26];
+  Int_t dEoccupancy_nonbending[14][26];
+  Int_t cHoccupancy_bending[14];
+  Int_t cHoccupancy_nonbending[14];
+  Int_t totaloccupancy_bending =0;
+  Int_t totaloccupancy_nonbending =0;
+
+  Int_t dEchannels_bending[14][26];
+  Int_t dEchannels_nonbending[14][26];
+  Int_t cHchannels_bending[14];
+  Int_t cHchannels_nonbending[14];
+  Int_t totalchannels_bending =0;
+  Int_t totalchannels_nonbending =0;
+
+  Int_t ichamber, nchambers,idetele, detele, ix, iy;
+  nchambers = AliMUONConstants::NCh(); ;
+
+  for (ichamber=0; ichamber<nchambers; ichamber++) {
+    cHchannels_bending[ichamber]=0;
+    cHchannels_nonbending[ichamber]=0;
+    for (idetele=0; idetele<26; idetele++) {
+      detele= 100*(ichamber +1)+idetele;
+      dEchannels_bending[ichamber][idetele]=0;
+      dEchannels_nonbending[ichamber][idetele]=0;
+      dEoccupancy_bending[ichamber][idetele]=0;
+      dEoccupancy_nonbending[ichamber][idetele]=0;
+      if ( AliMpDEManager::IsValidDetElemId(detele) ) {
+       segbend    = AliMpSegmentation::Instance()
+                     ->GetMpSegmentation(detele, AliMp::kCath0);
+       segnonbend = AliMpSegmentation::Instance()
+                     ->GetMpSegmentation(detele, AliMp::kCath1);
+        if (AliMpDEManager::GetPlaneType(detele, AliMp::kCath0) != AliMp::kBendingPlane ) {
+         const AliMpVSegmentation* tmp = segbend;
+         segbend    =  segnonbend;
+         segnonbend =  tmp;
+       }  
+         
+       for(ix=0; ix<=segbend->MaxPadIndexX(); ix++) {
+         for(iy=0; iy<=segbend->MaxPadIndexY(); iy++) {
+           pad.SetFirst(ix);
+           pad.SetSecond(iy);
+           if( segbend->HasPad(pad) )   {  
+             dEchannels_bending[ichamber][idetele]++;
+             cHchannels_bending[ichamber]++;
+             totalchannels_bending++;
+           }
+         }
+       }
+       for(ix=0; ix<=segnonbend->MaxPadIndexX(); ix++) {
+         for(iy=0; iy<=segnonbend->MaxPadIndexY(); iy++) {
+           pad.SetFirst(ix);
+           pad.SetSecond(iy);
+           if(segnonbend->HasPad(pad))  {
+             dEchannels_nonbending[ichamber][idetele]++;  
+             cHchannels_nonbending[ichamber]++;
+             totalchannels_nonbending++;
+           }
+         }
+       }
+       if (perDetEle) printf(">>> Detection element %4d has %5d channels in bending and %5d channels in nonbending \n",
+            detele, dEchannels_bending[ichamber][idetele], dEchannels_nonbending[ichamber][idetele] ); 
+      }
+    }
+    printf(">>> Chamber %2d has %6d channels in bending and %6d channels in nonbending \n",
+          ichamber+1,  cHchannels_bending[ichamber], cHchannels_nonbending[ichamber]);
+  }
+  printf(">>Spectrometer has  %7d channels in bending and %7d channels in nonbending \n",
+        totalchannels_bending, totalchannels_nonbending);
+
+  ievent=event2Check;
+  printf(">>> Event %d \n",ievent);
+  RunLoader->GetEvent(ievent);
+    
+  // Addressing
+  muondata.SetTreeAddress("D"); 
+  muondata.GetDigits();
+  // Loop on chambers
+  for( ichamber=0; ichamber<nchambers; ichamber++) {
+    cHoccupancy_bending[ichamber]   = 0;
+    cHoccupancy_nonbending[ichamber]= 0;
+    Int_t idigit, ndigits;
+    ndigits = (Int_t) muondata.Digits(ichamber)->GetEntriesFast();
+    for(idigit=0; idigit<ndigits; idigit++) {
+      mDigit = static_cast<AliMUONDigit*>(muondata.Digits(ichamber)->At(idigit));
+      Int_t detele = mDigit->DetElemId();
+      Int_t idetele = detele-(ichamber+1)*100;
+      if ( mDigit->Cathode() == 0 ) {
+
+       cHoccupancy_bending[ichamber]++;
+       dEoccupancy_bending[ichamber][idetele]++;
+       totaloccupancy_bending++;
+      }
+      else {
+       cHoccupancy_nonbending[ichamber]++;
+       dEoccupancy_nonbending[ichamber][idetele]++;
+       totaloccupancy_nonbending++;
+      }
+    } // end digit loop    
+
+    printf(">>> Chamber %2d  nChannels Bending %5d  nChannels NonBending %5d \n", 
+          ichamber+1, 
+          cHoccupancy_bending[ichamber],
+          cHoccupancy_nonbending[ichamber]);           
+    printf(">>> Chamber %2d  Occupancy Bending %5.2f %%  Occupancy NonBending %5.2f %% \n", 
+          ichamber+1, 
+          100.*((Float_t) cHoccupancy_bending[ichamber])/((Float_t) cHchannels_bending[ichamber]),
+          100.*((Float_t) cHoccupancy_nonbending[ichamber])/((Float_t) cHchannels_bending[ichamber])            );
+
+
+    for(Int_t idetele=0; idetele<26; idetele++) {
+      Int_t detele = idetele + 100*(ichamber+1);
+      if ( AliMpDEManager::IsValidDetElemId(detele) ) {
+       if (perDetEle) {
+         printf(">>> DetEle %4d nChannels Bending %5d  nChannels NonBending %5d \n", 
+                idetele+100*(ichamber+1), 
+                dEoccupancy_bending[ichamber][idetele],
+                dEoccupancy_nonbending[ichamber][idetele]);  
+         printf(">>> DetEle %4d Occupancy Bending %5.2f %%  Occupancy NonBending %5.2f %% \n", 
+                idetele+100*(ichamber+1), 
+                100.*((Float_t) dEoccupancy_bending[ichamber][idetele])/((Float_t) dEchannels_bending[ichamber][idetele]),
+                100.*((Float_t) dEoccupancy_nonbending[ichamber][idetele])/((Float_t) dEchannels_bending[ichamber][idetele]));  
+       }
+      }
+    }
+  } // end chamber loop
+  printf(">>> Muon Spectrometer  Occupancy Bending %5.2f %%  Occupancy NonBending %5.2f %% \n",  
+          100.*((Float_t) totaloccupancy_bending)/((Float_t) totalchannels_bending),
+        100.*((Float_t) totaloccupancy_nonbending)/((Float_t) totalchannels_nonbending)            );
+  muondata.ResetDigits();
+  //    } // end cathode loop
   MUONLoader->UnloadDigits();
 }
 
-void MUONrecpoints(char * filename="galice.root", Int_t event2Check=0) {
+void MUONrecpoints(Int_t event2Check=0, char * filename="galice.root") {
 
   // Creating Run Loader and openning file containing Hits
   AliRunLoader * RunLoader = AliRunLoader::Open(filename,"MUONFolder","READ");
@@ -228,56 +406,19 @@ void MUONrecpoints(char * filename="galice.root", Int_t event2Check=0) {
     // Addressing
     Int_t ichamber, nchambers;
     nchambers = AliMUONConstants::NTrackingCh();
-    muondata.SetTreeAddress("RC"); 
+    muondata.SetTreeAddress("RC,TC"); 
     char branchname[30];    
     muondata.GetRawClusters();
     // Loop on chambers
     for( ichamber=0; ichamber<nchambers; ichamber++) {
-      printf(">>> Chamber %d\n",ichamber);
       sprintf(branchname,"MUONRawClusters%d",ichamber+1);
       //printf(">>>  branchname %s\n",branchname);
-  
       Int_t irecpoint, nrecpoints;
       nrecpoints = (Int_t) muondata.RawClusters(ichamber)->GetEntriesFast();
-      
+      // printf(">>> Chamber %2d, Number of recpoints = %6d \n",ichamber+1, nrecpoints);
       for(irecpoint=0; irecpoint<nrecpoints; irecpoint++) {
        mRecPoint = static_cast<AliMUONRawCluster*>(muondata.RawClusters(ichamber)->At(irecpoint));
-//     Int_t       fTracks[3];        //labels of overlapped tracks
-//     Int_t       fQ[2]  ;           // Q of cluster (in ADC counts)     
-//     Float_t     fX[2]  ;           // X of cluster
-//     Float_t     fY[2]  ;           // Y of cluster
-//     Float_t     fZ[2]  ;           // Z of cluster
-//     Int_t       fPeakSignal[2];    // Peak signal 
-//     Int_t       fIndexMap[50][2];  // indeces of digits
-//     Int_t       fOffsetMap[50][2]; // Emmanuel special
-//     Float_t     fContMap[50][2];   // Contribution from digit
-//     Int_t       fPhysicsMap[50];   // Distinguish signal and background contr.
-//     Int_t       fMultiplicity[2];  // Cluster multiplicity
-//     Int_t       fNcluster[2];      // Number of clusters
-//     Int_t       fClusterType;      // Cluster type
-//     Float_t     fChi2[2];          // Chi**2 of fit
-//     Int_t       fGhost;            // 0 if not a ghost or ghost problem solved
-//                                    // >0 if ghost problem remains because
-//                                    // 1 both (true and ghost) satify 
-//                                    //   charge chi2 compatibility
-//                                    // 2 none give satisfactory chi2
-
-       Int_t Track0 = mRecPoint->GetTrack(0);
-       Int_t Track1 = mRecPoint->GetTrack(1); 
-       Int_t Track2 = mRecPoint->GetTrack(2);
-       Int_t Q0 = mRecPoint->GetCharge(0);
-       Int_t Q1 = mRecPoint->GetCharge(1);
-       Float_t x0 = mRecPoint->GetX(0);
-       Float_t x1 = mRecPoint->GetX(1);
-       Float_t y0 = mRecPoint->GetY(0);
-       Float_t y1 = mRecPoint->GetY(1);
-       Float_t z0 = mRecPoint->GetZ(0);
-       Float_t z1 = mRecPoint->GetZ(1);
-       Float_t chi2_0 =  mRecPoint->GetChi2(0);
-       Float_t chi2_1 =  mRecPoint->GetChi2(1);
-
-       printf(">>> RecPoint %4d x %6.3f %6.3f y %6.3f %6.3f z %6.3f %6.3f Q0 %4d  Q1 %4d Hit %4d Track1 %4d Track2 %4d Chi2 %6.3f %6.3f \n",
-irecpoint, x0, x1, y0, y1, z0, z1, Q0, Q1, Track0, Track1, Track2, chi2_0, chi2_1);
+       mRecPoint->Print("full");
       } // end recpoint loop
     } // end chamber loop
     muondata.ResetRawClusters();
@@ -286,20 +427,61 @@ irecpoint, x0, x1, y0, y1, z0, z1, Q0, Q1, Track0, Track1, Track2, chi2_0, chi2_
   MUONLoader->UnloadRecPoints();
 }
 
-void MUONTestTrigger (char * filename="galice.root", Int_t event2Check=0){
-// reads and dumps trigger objects from MUON.RecPoints.root
+void MUONrectrigger (Int_t event2Check=0, char * filename="galice.root", Int_t WRITE = 0, Bool_t readFromRP = 0)
+{
+
+  // reads and dumps trigger objects from MUON.RecPoints.root
   TClonesArray * globalTrigger;
   TClonesArray * localTrigger;
   
+  // Do NOT print out all the info if the loop runs over all events 
+  Int_t PRINTOUT = (event2Check == 0 ) ? 0 : 1 ;  
+
+  // Book a ntuple for more detailled studies
+  TNtuple *TgtupleGlo = new TNtuple("TgtupleGlo","Global Trigger Ntuple","ev:global:slpt:shpt:uplpt:uphpt:lplpt:lplpt");
+  TNtuple *TgtupleLoc = new TNtuple("TgtupleLoc","Local Trigger Ntuple","ev:LoCircuit:LoStripX:LoDev:StripY:LoLpt:LoHpt:y11:y21:x11");
+
+  // counters
+  Int_t SLowpt=0,SHighpt=0;
+  Int_t USLowpt=0,USHighpt=0;
+  Int_t LSLowpt=0,LSHighpt=0;
+
   // Creating Run Loader and openning file containing Hits
   AliRunLoader * RunLoader = AliRunLoader::Open(filename,"MUONFolder","READ");
   if (RunLoader ==0x0) {
     printf(">>> Error : Error Opening %s file \n",filename);
     return;
   }
+
+  AliMUONTriggerCrateStore* crateManager = new AliMUONTriggerCrateStore();   
+  crateManager->ReadFromFile();
+
+  AliMUONGeometryTransformer* transformer = new AliMUONGeometryTransformer(kFALSE);
+  transformer->ReadGeometryData("volpath.dat", "geometry.root");
+
+  TClonesArray*  triggerCircuit = new TClonesArray("AliMUONTriggerCircuit", 234);
+
+  for (Int_t i = 0; i < AliMUONConstants::NTriggerCircuit(); i++)  {
+      AliMUONTriggerCircuit* c = new AliMUONTriggerCircuit();
+      c->SetTransformer(transformer);
+      c->Init(i,*crateManager);
+      TClonesArray& circuit = *triggerCircuit;
+      new(circuit[circuit.GetEntriesFast()])AliMUONTriggerCircuit(*c);
+      delete c;
+  }
   
+  Char_t fileName[30];
   AliLoader * MUONLoader = RunLoader->GetLoader("MUONLoader");
-  MUONLoader->LoadRecPoints("READ");
+  if (!readFromRP) {
+      cout << " reading from digits \n";
+      MUONLoader->LoadDigits("READ");
+      sprintf(fileName,"TriggerCheckFromDigits.root");
+  } else {
+      cout << " reading from RecPoints \n";
+      MUONLoader->LoadRecPoints("READ");
+      sprintf(fileName,"TriggerCheckFromRP.root");
+  }
+
   // Creating MUON data container
   AliMUONData muondata(MUONLoader,"MUON","MUON");
   
@@ -307,80 +489,108 @@ void MUONTestTrigger (char * filename="galice.root", Int_t event2Check=0){
   Int_t ievent, nevents;
   nevents = RunLoader->GetNumberOfEvents();
   
-  AliMUONGlobalTrigger *gloTrg;
-  AliMUONLocalTrigger *locTrg;
+  AliMUONGlobalTrigger *gloTrg(0x0);
+  AliMUONLocalTrigger *locTrg(0x0);
   
   for (ievent=0; ievent<nevents; ievent++) {
     if (event2Check!=0) ievent=event2Check;
+    if (ievent%100==0 || event2Check) cout << "Processing event " << ievent << endl;
     RunLoader->GetEvent(ievent);
     
-    muondata.SetTreeAddress("GLT"); 
-    muondata.GetTrigger();
-    
+    if (!readFromRP) {
+       muondata.SetTreeAddress("D,GLT"); 
+       muondata.GetTriggerD();
+    } else {    
+       muondata.SetTreeAddress("RC,TC"); 
+       muondata.GetTrigger();
+    }
+
     globalTrigger = muondata.GlobalTrigger();
     localTrigger = muondata.LocalTrigger();
     
     Int_t nglobals = (Int_t) globalTrigger->GetEntriesFast(); // should be 1
     Int_t nlocals  = (Int_t) localTrigger->GetEntriesFast(); // up to 234
-    printf("###################################################\n");
-    cout << " event " << ievent 
-        << " nglobals nlocals: " << nglobals << " " << nlocals << "\n"; 
-    
+    if (PRINTOUT) printf("###################################################\n");
+    if (PRINTOUT) printf("event %d nglobal %d nlocal %d \n",ievent,nglobals,nlocals);
+
     for (Int_t iglobal=0; iglobal<nglobals; iglobal++) { // Global Trigger
       gloTrg = static_cast<AliMUONGlobalTrigger*>(globalTrigger->At(iglobal));
       
-      printf("===================================================\n");
-      printf(" Global Trigger output       Low pt  High pt   All\n");
-      printf(" number of Single Plus      :\t");
-      printf("%i\t%i\t%i\t",gloTrg->SinglePlusLpt(),
-            gloTrg->SinglePlusHpt(),gloTrg->SinglePlusApt());
-      printf("\n");
-      printf(" number of Single Minus     :\t");
-      printf("%i\t%i\t%i\t",gloTrg->SingleMinusLpt(),
-            gloTrg->SingleMinusHpt(),gloTrg->SingleMinusApt());
-      printf("\n");
-      printf(" number of Single Undefined :\t"); 
-      printf("%i\t%i\t%i\t",gloTrg->SingleUndefLpt(),
-            gloTrg->SingleUndefHpt(),gloTrg->SingleUndefApt());
-      printf("\n");
-      printf(" number of UnlikeSign pair  :\t"); 
-      printf("%i\t%i\t%i\t",gloTrg->PairUnlikeLpt(),
-            gloTrg->PairUnlikeHpt(),gloTrg->PairUnlikeApt());
-      printf("\n");
-      printf(" number of LikeSign pair    :\t");  
-      printf("%i\t%i\t%i\t",gloTrg->PairLikeLpt(),
-            gloTrg->PairLikeHpt(),gloTrg->PairLikeApt());
-      printf("\n");
-      printf("===================================================\n");
+      SLowpt+=gloTrg->SingleLpt() ;
+      SHighpt+=gloTrg->SingleHpt() ;
+      USLowpt+=gloTrg->PairUnlikeLpt(); 
+      USHighpt+=gloTrg->PairUnlikeHpt();
+      LSLowpt+=gloTrg->PairLikeLpt(); 
+      LSHighpt+=gloTrg->PairLikeHpt();
       
+      if (PRINTOUT) gloTrg->Print("full");
+
     } // end of loop on Global Trigger
-    
+
     for (Int_t ilocal=0; ilocal<nlocals; ilocal++) { // Local Trigger
-      cout << " >>> Output for Local Trigger " << ilocal << "\n";
-      
       locTrg = static_cast<AliMUONLocalTrigger*>(localTrigger->At(ilocal));
+
+      if (locTrg->LoLpt()!=0) { // board is fired
+
+      if (PRINTOUT) locTrg->Print("full");
+      
+      AliMUONTriggerCircuit* circuit = (AliMUONTriggerCircuit*)triggerCircuit->At(locTrg->LoCircuit()-1); 
       
-      cout << "Circuit StripX Dev StripY: " 
-          << locTrg->LoCircuit() << " " 
-          << locTrg->LoStripX() << " " 
-          << locTrg->LoDev() << " " 
-          << locTrg->LoStripY() 
-          << "\n";
-      cout << "Lpt Hpt Apt: "     
-          << locTrg->LoLpt() << " "   
-          << locTrg->LoHpt() << " "  
-          << locTrg->LoApt() << "\n";
+      TgtupleLoc->Fill(ievent,locTrg->LoCircuit(),locTrg->LoStripX(),locTrg->LoDev(),locTrg->LoStripY(),locTrg->LoLpt(),locTrg->LoHpt(),circuit->GetY11Pos(locTrg->LoStripX()),circuit->GetY21Pos(locTrg->LoStripX()+locTrg->LoDev()+1),circuit->GetX11Pos(locTrg->LoStripY()));
+    } // board is fired
       
     } // end of loop on Local Trigger
+
+    // fill ntuple
+    TgtupleGlo->Fill(ievent,nglobals,gloTrg->SingleLpt(),gloTrg->SingleHpt(),gloTrg->PairUnlikeLpt(),gloTrg->PairUnlikeHpt(),gloTrg->PairLikeLpt(),gloTrg->PairLikeHpt());
+
     muondata.ResetTrigger();
     if (event2Check!=0) ievent=nevents;
   } // end loop on event  
-  MUONLoader->UnloadRecPoints();
-}
-
+  
+  // Print out summary if loop ran over all event
+  if (!event2Check){
+
+    printf("\n");
+    printf("=============================================\n");
+    printf("================  SUMMARY  ==================\n");
+    printf("\n");
+    printf("Total number of events processed %d \n", (event2Check==0) ? nevents : 1);
+    printf("\n");
+    printf(" Global Trigger output       Low pt  High pt\n");
+    printf(" number of Single           :\t");
+    printf("%i\t%i\t",SLowpt,SHighpt);
+    printf("\n");
+    printf(" number of UnlikeSign pair  :\t"); 
+    printf("%i\t%i\t",USLowpt,USHighpt);
+    printf("\n");
+    printf(" number of LikeSign pair    :\t");  
+    printf("%i\t%i\t",LSLowpt,LSHighpt);
+    printf("\n");
+    printf("=============================================\n");
+    fflush(stdout);
+  }
+  
+  if (WRITE){
+      TFile *myFile = new TFile(fileName, "RECREATE");
+      TgtupleGlo->Write();
+      TgtupleLoc->Write();
+      myFile->Close();
+  }
 
+  if (!readFromRP) {
+      MUONLoader->UnloadDigits();  
+  } else {    
+      MUONLoader->UnloadRecPoints();
+  }
+  
+  delete crateManager;
+  delete transformer;
+  delete triggerCircuit;
+  
+}
 
-void MUONRecTracks (char * filename="galice.root", Int_t event2Check=0 ){
+void MUONrectracks (Int_t event2Check=0, char * filename="galice.root"){
 // reads and dumps trigger objects from MUON.RecPoints.root
   TClonesArray * RecTracks;
   
@@ -390,7 +600,12 @@ void MUONRecTracks (char * filename="galice.root", Int_t event2Check=0 ){
     printf(">>> Error : Error Opening %s file \n",filename);
     return;
   }
-  
+    // waiting for mag field in CDB 
+  printf("Loading field map...\n");
+  if (!AliTracker::GetFieldMap()) {
+    AliMagFMaps* field = new AliMagFMaps("Maps","Maps", 1, 1., 10., AliMagFMaps::k5kG);
+    AliTracker::SetFieldMap(field, kFALSE);
+  }
   AliLoader * MUONLoader = RunLoader->GetLoader("MUONLoader");
   MUONLoader->LoadTracks("READ");
   // Creating MUON data container
@@ -412,20 +627,26 @@ void MUONRecTracks (char * filename="galice.root", Int_t event2Check=0 ){
     
     Int_t nrectracks = (Int_t) RecTracks->GetEntriesFast(); //
 
-    printf(">>> Event %d Number of Recconstructed tracks %d \n",ievent, nrectracks);
-   
+    printf(">>> Event %d, Number of Recconstructed tracks %d \n",ievent, nrectracks);
+    // loop over tracks
+
+    // setting pointer for tracks, triggertracks & trackparam at vertex
+    AliMUONTrack* recTrack = 0;
+    AliMUONTrackParam* trackParam = 0;
+
+    // set the magnetic field for track extrapolations
+    AliMUONTrackExtrap::SetField(AliTracker::GetFieldMap());
+    for (Int_t iRecTracks = 0; iRecTracks <  nrectracks;  iRecTracks++) {
+   //  // reading info from tracks
+       recTrack = (AliMUONTrack*) RecTracks->At(iRecTracks);
+       trackParam = (AliMUONTrackParam*) (recTrack->GetTrackParamAtHit())->First();
+       AliMUONTrackExtrap::ExtrapToZ(trackParam,0.);
+      recTrack->Print("full");
+    } // end loop tracks
+
     muondata.ResetRecTracks();
     if (event2Check!=0) ievent=nevents;
   } // end loop on event  
   MUONLoader->UnloadTracks();
 }
 
-
-
-
-
-
-
-
-
-