]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDTriggerL1.cxx
Merge with TRDdev.2.0
[u/mrichter/AliRoot.git] / TRD / AliTRDTriggerL1.cxx
index b25a0f78e80a5a93da0201cbf479c288c7bf7a86..59ac68d64e0bc4bf51159c26c3e159291e609903 100644 (file)
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
-///////////////////////////////////////////////////////
-//                                                   //
-//                                                   //
-//  TRD main trigger class for L1                    //
-//                                                   //
-//                                                   //
-///////////////////////////////////////////////////////
+/* $Id: AliTRDTriggerL1.cxx 31904 2009-04-08 16:42:03Z cblume $ */
 
-#include <TMath.h>
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// TRD trigger L1 (GTU) simulation steering                                  //
+// The Trigger() method calls the GTU tracking simulation and                //
+// runs the triggers for HCO, HJT, HSE, HQU, HEE                             //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
 
-#include "AliRunLoader.h"
-#include "AliConfig.h"
-#include "AliTracker.h"
-#include "AliTriggerInput.h"
 
-#include "AliTRDTriggerL1.h"
-#include "AliTRDtrigParam.h"
-#include "AliTRDtrigger.h"
-#include "AliTRDgtuTrack.h"
-#include "AliTRDgeometry.h"
+#include "TObjArray.h"
+#include <TTree.h>
 
-ClassImp(AliTRDTriggerL1)
+#include "AliLog.h"
+#include "AliTriggerInput.h"
+#include "AliRunLoader.h"
+#include "AliLoader.h"
 
-//_____________________________________________________________________________
-AliTRDTriggerL1::AliTRDTriggerL1()
-  :AliTriggerDetector()
+#include "AliTRDTriggerL1.h"
+#include "AliTRDgtuSim.h"
+#include "AliTRDtrackGTU.h"
+#include "AliTRDcalibDB.h"
+#include "AliTRDCalDCSGTU.h"
+
+AliTRDTriggerL1::AliTRDTriggerL1() :
+  AliTriggerDetector(),
+  fPtThresholdA(3.),
+  fPtThresholdB(2.),
+  fPidThresholdA(144),
+  fPidThresholdB(164),
+  fNoThreshold(1),
+  fNoThresholdA(1),
+  fNoThresholdB(1),
+  fNoThresholdJetA(3),
+  fNoThresholdJetB(250),
+  fNoThresholdElA(1),
+  fNoThresholdElB(1),
+  fNoTrklThresholdElA(5),
+  fNoTrklThresholdElB(5),
+  fLayerMaskElA(0x1),
+  fLayerMaskElB(0x1)
 {
-  //
-  // Default constructor
-  //
+  // ctor
 
   SetName("TRD");
+}
 
+AliTRDTriggerL1::~AliTRDTriggerL1()
+{
+  // dtor
 }
 
-//_____________________________________________________________________________
 void AliTRDTriggerL1::CreateInputs()
 {
-  //
-  // See TRIGGER/DAQ/HLT/DCS Techical Design Report,
-  // p. 58, Table 4.1 for the proposed inputs
-  //
-
-  fInputs.AddLast(new AliTriggerInput("TRD_Unlike_EPair_L1"
-                                     ,"TRD"
-                                     ,1 ));
-  fInputs.AddLast(new AliTriggerInput("TRD_Like_EPair_L1"
-                                     ,"TRD"
-                                     ,1 ));
-  fInputs.AddLast(new AliTriggerInput("TRD_Jet_LPt_L1"
-                                     ,"TRD"
-                                     ,1 ));
-  fInputs.AddLast(new AliTriggerInput("TRD_Jet_HPt_L1"
-                                     ,"TRD"
-                                     ,1 ));
-  fInputs.AddLast(new AliTriggerInput("TRD_Electron_L1"
-                                     ,"TRD"
-                                     ,1 ));
-  fInputs.AddLast(new AliTriggerInput("TRD_HadrLPt_L1"
-                                     ,"TRD"
-                                     ,1 ));
-  fInputs.AddLast(new AliTriggerInput("TRD_HadrHPt_L1"
-                                     ,"TRD"
-                                     ,1 ));
+  // create the trigger inputs for TRD
+
+  if (fInputs.GetEntriesFast() > 0)
+    return;
 
+  fInputs.AddLast(new AliTriggerInput("1HCO", "TRD", 1));
+  fInputs.AddLast(new AliTriggerInput("1HJT", "TRD", 1));
+  fInputs.AddLast(new AliTriggerInput("1HSE", "TRD", 1));
+  fInputs.AddLast(new AliTriggerInput("1HQU", "TRD", 1));
+  fInputs.AddLast(new AliTriggerInput("1HEE", "TRD", 1));
 }
 
-//_____________________________________________________________________________
 void AliTRDTriggerL1::Trigger()
 {
-  // 
-  // Run the online tracking and trigger
-  // 
-
-  TString          evfoldname = AliConfig::GetDefaultEventFolderName();
-  AliRunLoader    *runLoader  = AliRunLoader::GetRunLoader(evfoldname);
-  AliLoader       *loader     = runLoader->GetLoader("TRDLoader");
-  AliTRDgeometry   geo;
-
-  AliTRDtrigger trdTrigger("Trigger","Trigger class"); 
-
-  Float_t field = AliTracker::GetBz() * 0.1; // Tesla
-  AliInfo(Form("Trigger set for magnetic field = %f Tesla \n",field));
-
-  trdTrigger.SetRunLoader(runLoader);
-  trdTrigger.Init();
-
-  trdTrigger.Open(runLoader->GetFileName(), runLoader->GetEventNumber());
-  trdTrigger.ReadDigits();
-  trdTrigger.MakeTracklets(kTRUE);
-  trdTrigger.WriteTracklets(-1);
-
-  // Trigger (tracks, GTU)
-
-  Float_t highPt    = AliTRDtrigParam::Instance()->GetHighPt();
-  Float_t jetLowPt  = AliTRDtrigParam::Instance()->GetJetLowPt();
-  Float_t jetHighPt = AliTRDtrigParam::Instance()->GetJetHighPt();
-
-  Float_t pid;
-  Float_t pt;
-  Int_t   det;
-  Int_t   sec;
-  Bool_t  isElectron;
-
-  const Int_t maxEle = 1000;
-
-  Int_t   electronPlus;
-  Int_t   electronMinus;
-  Int_t   sectorElePlus[maxEle];
-  Int_t   sectorEleMinus[maxEle];
-  Float_t ptElePlus[maxEle];   
-  Float_t ptEleMinus[maxEle];
-  Int_t   hadronLowPt;
-  Int_t   hadronHighPt;
-  Int_t   hadronJetLowPt;
-  Int_t   hadronJetHighPt;
-
-  hadronJetLowPt  = 0;
-  hadronJetHighPt = 0;
-
-  hadronLowPt     = 0;
-  hadronHighPt    = 0;
-
-  electronPlus    = 0;
-  electronMinus   = 0;
-
-  AliTRDgtuTrack *gtuTrack;
-  Int_t nTracks = trdTrigger.GetNumberOfTracks();
-  for (Int_t iTrack = 0; iTrack < nTracks; iTrack++) {
-
-    gtuTrack = trdTrigger.GetTrack(iTrack);
-
-    pid        = gtuTrack->GetPID();
-    isElectron = gtuTrack->IsElectron();
-    pt         = gtuTrack->GetPt();
-    det        = gtuTrack->GetDetector();
-    sec        = geo.GetSector(det);
-
-    if (isElectron) {
-
-      if (pt < 0.0) {
-       sectorEleMinus[electronMinus] = sec;
-       ptEleMinus[electronMinus]     = pt;
-       electronMinus++;
-      } 
-      else {
-       sectorElePlus[electronPlus]   = sec;
-       ptElePlus[electronPlus]       = pt;
-       electronPlus++;
-      }
-
-    } 
-    else {
-
-      if (TMath::Abs(pt) < highPt) {
-       hadronLowPt++;
-      } 
-      else {
-       hadronHighPt++;
+  // run the trigger algorithms
+
+  AliRunLoader *runLoader = AliRunLoader::Instance();
+  if (!runLoader)
+    return;
+  AliLoader *trdLoader = runLoader->GetLoader("TRDLoader");
+  if (!trdLoader)
+    return;
+
+  // now running the GTU tracking;
+  AliTRDgtuSim *gtusim = new AliTRDgtuSim();
+  gtusim->RunGTU(trdLoader, 0x0);
+
+  TTree *trackTree = trdLoader->GetDataLoader("gtutracks")->Tree();
+  if (!trackTree) {
+    AliDebug(1,"Did not find track tree");
+    return;
+  }
+  TBranch *branch = trackTree->GetBranch("TRDtrackGTU");
+  AliDebug(1,Form("TRD trigger: found %lld tracks", trackTree->GetEntriesFast()));
+
+  // trigger algorithms to come, e.g.
+  Bool_t triggered1HCO    = kFALSE;
+  Bool_t triggered1HJT    = kFALSE;
+  Bool_t triggered1HSE    = kFALSE;
+  Bool_t triggered1HQU    = kFALSE;
+  Bool_t triggered1HEE    = kFALSE;
+
+  if (branch) {
+    AliTRDtrackGTU *trk = 0x0;
+    branch->SetAddress(&trk);
+
+    Int_t nTracks[90]      = { 0 }; // number of tracks
+    Int_t nTracksA[90]     = { 0 }; // number of tracks above pt threshold A
+    Int_t nTracksB[90]     = { 0 }; // number of tracks above pt threshold B
+    Int_t nTracksElA[90]   = { 0 }; // number of tracks above pt threshold A and PID threshold A
+    Int_t nTracksElB[90]   = { 0 }; // number of tracks above pt threshold B and PID threshold B
+
+    for (Int_t iTrack = 0; iTrack < trackTree->GetEntriesFast(); iTrack++) {
+      trackTree->GetEntry(iTrack);
+
+      nTracks[5*trk->GetSector() + trk->GetStack()]++;
+
+      if (TMath::Abs(trk->GetPt()) > fPtThresholdA) {
+        nTracksA[5*trk->GetSector() + trk->GetStack()]++;
+       if ((trk->GetPID() > fPidThresholdA) &&
+           ((trk->GetTrackletMask() & fLayerMaskElA) == fLayerMaskElA) &&
+           (trk->GetNTracklets() >= fNoTrklThresholdElA))
+         nTracksElA[5*trk->GetSector() + trk->GetStack()]++;
       }
 
-      if (TMath::Abs(pt) > jetLowPt ) {
-        hadronJetLowPt++;
+      if (TMath::Abs(trk->GetPt()) > fPtThresholdB) {
+        nTracksB[5*trk->GetSector() + trk->GetStack()]++;
+       if ((trk->GetPID() > fPidThresholdB) &&
+           ((trk->GetTrackletMask() & fLayerMaskElB) == fLayerMaskElB) &&
+           (trk->GetNTracklets() >= fNoTrklThresholdElB))
+         nTracksElB[5*trk->GetSector() + trk->GetStack()]++;
       }
-      if (TMath::Abs(pt) > jetHighPt) {
-        hadronJetHighPt++;
-      }
-
     }
 
-  }
+    for (Int_t iStack = 0; iStack < 90; iStack++) {
+      if (nTracks[iStack] >= fNoThreshold)
+       triggered1HCO = kTRUE;
 
-  loader->UnloadTracks();
+      if ((nTracksA[iStack] >= fNoThresholdJetA) || (nTracksB[iStack] >= fNoThresholdJetB))
+        triggered1HJT = kTRUE;
 
-  // Hadrons
-  if (hadronLowPt) {
-    SetInput("TRD_Hadr_LPt_L1");
-  }
-  if (hadronHighPt) {
-    SetInput("TRD_Hadr_HPt_L1");
-  }
+      if ((nTracksElA[iStack] >= fNoThresholdElA))
+        triggered1HSE = kTRUE;
 
-  // Hadrons from jets
-  if (hadronJetLowPt  >= AliTRDtrigParam::Instance()->GetNPartJetLow() ) {
-    SetInput("TRD_Jet_LPt_L1");
+      if ((nTracksElB[iStack] >= fNoThresholdElB))
+        triggered1HQU = kTRUE;
+    }
   }
-  if (hadronJetHighPt >= AliTRDtrigParam::Instance()->GetNPartJetHigh()) {
-    SetInput("TRD_Jet_HPt_L1");
+  else {
+    AliWarning("GTU Branch not found");
   }
 
-  // Electron-positron pairs (open angle > 80 deg)
-  Int_t  secPlus;
-  Int_t  secMinus;
-  Int_t  secDiff;
-  Bool_t electronUnlikePair    = kFALSE;
-  Bool_t electronUnlikePairHPt = kFALSE;
-
-  if ((electronMinus > 0) && 
-      (electronPlus  > 0)) {
-    for (Int_t iPlus = 0; iPlus < electronPlus; iPlus++) {
-      secPlus = sectorElePlus[iPlus];
-      for (Int_t iMinus = 0; iMinus < electronMinus; iMinus++) {
-       secMinus = sectorEleMinus[iMinus];
-       secDiff  = TMath::Abs(secPlus-secMinus);
-       if (secDiff >  9) {
-          secDiff = 18 - secDiff;
-       }
-       if (secDiff >= 5) {
-         electronUnlikePair = kTRUE;
-         if ((TMath::Abs(ptElePlus[iPlus]) > highPt) && 
-              (TMath::Abs(ptEleMinus[iMinus]) > highPt)) {
-           electronUnlikePairHPt = kTRUE;
-         }
-       }
-      }
-    }
+  if (triggered1HCO) {
+    AliDebug(1, "Fired cosmic trigger");
+    SetInput("1HCO");
   }
 
-  if (electronUnlikePair) {
-    SetInput("TRD_Unlike_EPair_L1");
-  }
-  //if (electronUnlikePairHPt) {
-  //  SetInput("TRD_Unlike_EPair_HPt_L1");
-  //}
-
-  // Like electron/positron pairs
-  Bool_t ele1;
-  Bool_t ele1HPt;
-  Bool_t ele2;
-  Bool_t ele2HPt;
-
-  // Positive
-  ele1    = kFALSE;
-  ele2    = kFALSE;
-  ele1HPt = kFALSE;
-  ele2HPt = kFALSE;
-  if (electronPlus > 1) {
-    for (Int_t iPlus = 0; iPlus < electronPlus; iPlus++) {
-      if      (!ele1) {
-       ele1 = kTRUE;
-      } 
-      else if (!ele2) {
-       ele2 = kTRUE;
-      }
-      if (TMath::Abs(ptElePlus[iPlus]) > highPt) {
-       if      (!ele1HPt) {
-         ele1HPt = kTRUE;
-       } 
-        else if (!ele2HPt) {
-         ele2HPt = kTRUE;
-       }
-      }
-    }
+  if (triggered1HJT) {
+    AliDebug(1, "Fired jet trigger");
+    SetInput("1HJT");
   }
 
-  if (ele1    && ele2   ) {
-    SetInput("TRD_Like_EPair_L1");
-  }
-  //if (ele1HPt && ele2HPt) {
-  //  SetInput("TRD_Like_EPair_HPt_L1");
-  //}  
-
-  // Negative
-  ele1    = kFALSE;
-  ele2    = kFALSE;
-  ele1HPt = kFALSE;
-  ele2HPt = kFALSE;
-  if (electronMinus > 1) {
-    for (Int_t iMinus = 0; iMinus < electronMinus; iMinus++) {
-      if      (!ele1) {
-       ele1 = kTRUE;
-      } 
-      else if (!ele2) {
-       ele2 = kTRUE;
-      }
-      if (TMath::Abs(ptEleMinus[iMinus]) > highPt) {
-       if      (!ele1HPt) {
-         ele1HPt = kTRUE;
-       } 
-        else if (!ele2HPt) {
-         ele2HPt = kTRUE;
-       }
-      }
-    }
+  if (triggered1HSE) {
+    AliDebug(1, "Fired single electron trigger");
+    SetInput("1HSE");
   }
 
-  if (ele1    && ele2   ) {
-    SetInput("TRD_Like_EPair_L1");
+  if (triggered1HQU) {
+    AliDebug(1, "Fired single electron trigger");
+    SetInput("1HQU");
   }
-  //if (ele1HPt && ele2HPt) {
-  //  SetInput("TRD_Like_EPair_HPt_L1");
-  //}
-  
-  // Single electron/positron
-
-  if ((electronPlus  > 0) || 
-      (electronMinus > 0)) {
-    SetInput("TRD_Electron_L1");
-    /*
-    for (Int_t iPlus = 0; iPlus < electronPlus; iPlus++) {
-      if (TMath::Abs(ptElePlus[iPlus]) > highPt) SetInput("TRD_Electron_HPt_L1");
-      break;
-    }
-    for (Int_t iMinus = 0; iMinus < electronMinus; iMinus++) {
-      if (TMath::Abs(ptEleMinus[iMinus]) > highPt) SetInput("TRD_Electron_HPt_L1");
-      break;
-    }
-    */
+
+  if (triggered1HEE) {
+    AliDebug(1, "Fired single electron trigger");
+    SetInput("1HEE");
   }
 
+  // cleaning up
+  delete gtusim;
 }
-