]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONEventReconstructor.cxx
Modifications needed by the HBT analysis (P.Skowronski)
[u/mrichter/AliRoot.git] / MUON / AliMUONEventReconstructor.cxx
index af219e38f23c98546b3ecdce6e7b3a7a64ed91e3..b09d59f7614a81c6a44be61e77e7ab4c5367937b 100644 (file)
 #include "AliMUONChamber.h"
 #include "AliMUONEventReconstructor.h"
 #include "AliMUONHitForRec.h"
+#include "AliMUONTriggerTrack.h"
+//#include "AliMUONTriggerConstants.h"
+#include "AliMUONTriggerCircuit.h"
 #include "AliMUONRawCluster.h"
+#include "AliMUONLocalTrigger.h"
 #include "AliMUONRecoEvent.h"
 #include "AliMUONSegment.h"
 #include "AliMUONTrack.h"
@@ -53,6 +57,7 @@
 #include "AliLoader.h"
 #include "AliMUONTrackK.h" //AZ
 #include <TMatrixD.h> //AZ
+#include "AliMC.h"
 
 //************* Defaults parameters for reconstruction
 static const Double_t kDefaultMinBendingMomentum = 3.0;
@@ -98,16 +103,20 @@ AliMUONEventReconstructor::AliMUONEventReconstructor(void)
   // Is 10 the right size ????
   fRecTracksPtr = new TClonesArray("AliMUONTrack", 10);
   fNRecTracks = 0; // really needed or GetEntriesFast sufficient ????
+// trigger tracks
+  fRecTriggerTracksPtr = new TClonesArray("AliMUONTriggerTrack", 10);
+  fNRecTriggerTracks = 0; // really needed or GetEntriesFast sufficient ????
   // Memory allocation for the TClonesArray of hits on reconstructed tracks
   // Is 100 the right size ????
   fRecTrackHitsPtr = new TClonesArray("AliMUONTrack", 100);
   fNRecTrackHits = 0; // really needed or GetEntriesFast sufficient ????
 
-  // Sign of fSimpleBValue according to sign of Bx value at (50,50,950).
+  // Sign of fSimpleBValue according to sign of Bx value at (50,50,-950).
   Float_t b[3], x[3];
-  x[0] = 50.; x[1] = 50.; x[2] = 950.;
+  x[0] = 50.; x[1] = 50.; x[2] = -950.;
   gAlice->Field()->Field(x, b);
   fSimpleBValue = TMath::Sign(fSimpleBValue,(Double_t) b[0]);
+  fSimpleBPosition = TMath::Sign(fSimpleBPosition,(Double_t) x[2]);
   // See how to get fSimple(BValue, BLength, BPosition)
   // automatically calculated from the actual magnetic field ????
 
@@ -197,16 +206,16 @@ void AliMUONEventReconstructor::SetReconstructionParametersToDefaults(void)
   // Maximum distance in bending plane:
   // values from TRACKF_STAT, corresponding to (J psi 20cm),
   // scaled to the real distance between chambers in a station
-  fSegmentMaxDistBending[0] = 1.5 *
-    ((&(pMUON->Chamber(1)))->Z() - (&(pMUON->Chamber(0)))->Z()) / 20.0;
-  fSegmentMaxDistBending[1] = 1.5 *
-    ((&(pMUON->Chamber(3)))->Z() - (&(pMUON->Chamber(2)))->Z()) / 20.0;
-  fSegmentMaxDistBending[2] = 3.0 *
-    ((&(pMUON->Chamber(5)))->Z() - (&(pMUON->Chamber(4)))->Z()) / 20.0;
-  fSegmentMaxDistBending[3] = 6.0 *
-    ((&(pMUON->Chamber(7)))->Z() - (&(pMUON->Chamber(6)))->Z()) / 20.0;
-  fSegmentMaxDistBending[4] = 6.0 *
-    ((&(pMUON->Chamber(9)))->Z() - (&(pMUON->Chamber(8)))->Z()) / 20.0;
+  fSegmentMaxDistBending[0] = TMath::Abs( 1.5 *
+    ((&(pMUON->Chamber(1)))->Z() - (&(pMUON->Chamber(0)))->Z()) / 20.0);
+  fSegmentMaxDistBending[1] =  TMath::Abs( 1.5 *
+    ((&(pMUON->Chamber(3)))->Z() - (&(pMUON->Chamber(2)))->Z()) / 20.0);
+  fSegmentMaxDistBending[2] =  TMath::Abs( 3.0 *
+    ((&(pMUON->Chamber(5)))->Z() - (&(pMUON->Chamber(4)))->Z()) / 20.0);
+  fSegmentMaxDistBending[3] =  TMath::Abs( 6.0 *
+    ((&(pMUON->Chamber(7)))->Z() - (&(pMUON->Chamber(6)))->Z()) / 20.0);
+  fSegmentMaxDistBending[4] =  TMath::Abs( 6.0 *
+    ((&(pMUON->Chamber(9)))->Z() - (&(pMUON->Chamber(8)))->Z()) / 20.0);
   
   fBendingResolution = kDefaultBendingResolution;
   fNonBendingResolution = kDefaultNonBendingResolution;
@@ -353,6 +362,15 @@ void AliMUONEventReconstructor::EventReconstruct(void)
   return;
 }
 
+//__________________________________________________________________________
+void AliMUONEventReconstructor::EventReconstructTrigger(void)
+{
+  // To reconstruct one event
+  if (fPrintLevel >= 1) cout << "enter EventReconstructTrigger" << endl;
+  MakeTriggerTracks();  
+  return;
+}
+
   //__________________________________________________________________________
 void AliMUONEventReconstructor::ResetHitsForRec(void)
 {
@@ -389,6 +407,17 @@ void AliMUONEventReconstructor::ResetTracks(void)
   return;
 }
 
+  //__________________________________________________________________________
+void AliMUONEventReconstructor::ResetTriggerTracks(void)
+{
+  // To reset the TClonesArray of reconstructed trigger tracks
+    if (fRecTriggerTracksPtr) fRecTriggerTracksPtr->Delete();
+  // Delete in order that the Track destructors are called,
+  // hence the space for the TClonesArray of pointers to TrackHit's is freed
+    fNRecTriggerTracks = 0;
+  return;
+}
+
   //__________________________________________________________________________
 void AliMUONEventReconstructor::ResetTrackHits(void)
 {
@@ -509,13 +538,15 @@ void AliMUONEventReconstructor::AddHitsForRecFromGEANT(TTree *TH)
     Int_t ihit, nhits=0;
       nhits = (Int_t) muondata->Hits()->GetEntriesFast();
       AliMUONHit* mHit=0x0;
+
       for(ihit=0; ihit<nhits; ihit++) {
        mHit = static_cast<AliMUONHit*>(muondata->Hits()->At(ihit));
        Int_t ipart = TMath::Abs ((Int_t) mHit->Particle()); //AZ
        if (NewHitForRecFromGEANT(mHit,track, hit, 1) && ipart == 13
            //if (NewHitForRecFromGEANT(mHit,itrack-1, hit, 1) && ipart == 13 
-           && itrack <= 2) chamBits |= BIT(mHit->Chamber()-1); //AZ - set bit
+           && itrack <= 2 && !BIT(mHit->Chamber()-1)  ) chamBits |= BIT(mHit->Chamber()-1); //AZ - set bit
       }
+
     if (chamBits&3 && chamBits>>2&3 && chamBits>>4&3 && chamBits>>6&3 && 
         chamBits>>8&3 && ((chamBits>>6&3)==3 || (chamBits>>8&3)==3)) 
       fMuons += 1; //AZ
@@ -932,6 +963,76 @@ void AliMUONEventReconstructor::MakeTracks(void)
   return;
 }
 
+  //__________________________________________________________________________
+void AliMUONEventReconstructor::MakeTriggerTracks(void)
+{
+    // To make the trigger tracks from Local Trigger
+    if (fPrintLevel >= 1) cout << "enter MakeTriggerTracks" << endl;
+    ResetTriggerTracks();
+    
+    Int_t nTRentries;
+    TClonesArray *localTrigger;
+    AliMUONLocalTrigger *locTrg;
+    AliMUONTriggerCircuit *circuit;
+    AliMUONTriggerTrack *recTriggerTrack;
+    
+    TString evfoldname = AliConfig::fgkDefaultEventFolderName;//to be interfaced properly
+    AliRunLoader* rl = AliRunLoader::GetRunLoader(evfoldname);
+    if (rl == 0x0)
+    {
+       Error("MakeTriggerTracks",
+             "Can not find Run Loader in Event Folder named %s.",
+             evfoldname.Data());
+       return;
+    }
+    AliLoader* gime = rl->GetLoader("MUONLoader");
+    if (gime == 0x0)
+    {
+       Error("MakeTriggerTracks","Can not get MUON Loader from Run Loader.");
+       return;
+    }
+    TTree* TR = gime->TreeR();
+    
+    // Loading AliRun master
+    rl->LoadgAlice();
+    gAlice = rl->GetAliRun();
+    
+    // Loading MUON subsystem
+    AliMUON * pMUON = (AliMUON *) gAlice->GetDetector("MUON");
+    
+    nTRentries = Int_t(TR->GetEntries());
+    if (nTRentries != 1) {
+       cout << "Error in AliMUONEventReconstructor::MakeTriggerTracks"
+            << endl;
+       cout << "nTRentries = " << nTRentries << " not equal to 1" << endl;
+       exit(0);
+    }
+    gime->TreeR()->GetEvent(0); // only one entry  
+
+    pMUON->GetMUONData()->SetTreeAddress("GLT");
+    pMUON->GetMUONData()->GetTrigger();
+    
+    localTrigger = pMUON->GetMUONData()->LocalTrigger();    
+    Int_t nlocals = (Int_t) (localTrigger->GetEntries());
+    Float_t z11 = ( &(pMUON->Chamber(10)) )->Z();
+    Float_t z21 = ( &(pMUON->Chamber(12)) )->Z();
+
+    for (Int_t i=0; i<nlocals; i++) { // loop on Local Trigger
+        locTrg = (AliMUONLocalTrigger*)localTrigger->UncheckedAt(i);   
+       circuit = &(pMUON->TriggerCircuit(locTrg->LoCircuit()));
+       Float_t y11 = circuit->GetY11Pos(locTrg->LoStripX()); 
+       Float_t y21 = circuit->GetY21Pos(locTrg->LoStripX());
+       Float_t x11 = circuit->GetX11Pos(locTrg->LoStripY());
+       Float_t thetax = TMath::ATan2( x11 , z11 );
+       Float_t thetay = TMath::ATan2( (y21-y11) , (z21-z11) );
+
+       recTriggerTrack = new ((*fRecTriggerTracksPtr)[fNRecTriggerTracks])
+           AliMUONTriggerTrack(x11,y11,thetax,thetay,this);
+       fNRecTriggerTracks++;
+    } // end of loop on Local Trigger
+    return;    
+}
+
   //__________________________________________________________________________
 Int_t AliMUONEventReconstructor::MakeTrackCandidatesWithTwoSegments(AliMUONSegment *BegSegment)
 {
@@ -1455,7 +1556,7 @@ void AliMUONEventReconstructor::EventDump(void)
             z, x, y, pX, pY, pZ, c);
   }
   // informations about generated particles
-  np = gAlice->GetNtrack();
+  np = gAlice->GetMCApp()->GetNtrack();
   printf(" **** number of generated particles: %d  \n", np);
   
 //    for (Int_t iPart = 0; iPart < np; iPart++) {
@@ -1466,6 +1567,31 @@ void AliMUONEventReconstructor::EventDump(void)
   return;
 }
 
+
+//__________________________________________________________________________
+void AliMUONEventReconstructor::EventDumpTrigger(void)
+{
+  // Dump reconstructed trigger event 
+  // and the particle parameters
+    
+  AliMUONTriggerTrack *triggertrack;
+  Int_t trackIndex;
+  if (fPrintLevel >= 1) cout << "****** enter EventDumpTrigger ******" << endl;
+  if (fPrintLevel >= 1) {
+      cout << " Number of Reconstructed tracks :" <<  fNRecTriggerTracks << endl;
+  }
+  // Loop over reconstructed tracks
+  for (trackIndex = 0; trackIndex < fNRecTriggerTracks; trackIndex++) {
+      triggertrack = (AliMUONTriggerTrack*) ((*fRecTriggerTracksPtr)[trackIndex]);
+      printf(" trigger track number %i x11=%f y11=%f thetax=%f thetay=%f \n",
+            trackIndex,
+            triggertrack->GetX11(),triggertrack->GetY11(),
+            triggertrack->GetThetax(),triggertrack->GetThetay());      
+  } 
+}
+
+//__________________________________________________________________________
 void AliMUONEventReconstructor::FillEvent()
 {
 // Create a new AliMUONRecoEvent, fill its track list, then add it as a