]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDTriggerL1.cxx
Fix clonesarray for read out errors (Jochen)
[u/mrichter/AliRoot.git] / TRD / AliTRDTriggerL1.cxx
index fc4185bdca035eabc878588f3d80a30515904625..e813a32e5d4a3a26b639aaac3733f31eed8e4177 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                                  //
+// currently the Trigger() method calls the GTU tracking simulation and      //
+// runs two example triggers, namely on a single high pt particle and        //
+// on a jet.                                                                 //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
 
-#include "AliRun.h"
+
+#include "TObjArray.h"
+
+#include "AliLog.h"
 #include "AliTriggerInput.h"
+#include "AliRunLoader.h"
+#include "AliLoader.h"
 
 #include "AliTRDTriggerL1.h"
-#include "AliTRDtrigParam.h"
-#include "AliTRDtrigger.h"
-#include "AliTRDgtuTrack.h"
-#include "AliTRDgeometry.h"
-
-ClassImp(AliTRDTriggerL1)
+#include "AliTRDgtuSim.h"
+#include "AliTRDtrackGTU.h"
 
-//_____________________________________________________________________________
-AliTRDTriggerL1::AliTRDTriggerL1():AliTriggerDetector()
+AliTRDTriggerL1::AliTRDTriggerL1()
 {
-
   SetName("TRD");
+}
+
+AliTRDTriggerL1::~AliTRDTriggerL1()
+{
 
 }
 
-//_____________________________________________________________________________
 void AliTRDTriggerL1::CreateInputs()
 {
+  // create the trigger inputs for TRD
 
-  fInputs.AddLast(new AliTriggerInput( "TRD_HadrLPt_L1",          "Single hadron low pt ",        0x01 ));
-  fInputs.AddLast(new AliTriggerInput( "TRD_HadrHPt_L1",          "Single hadron high pt",        0x02 ));
-  fInputs.AddLast(new AliTriggerInput( "TRD_Unlike_EPair_L1",     "Unlike electron pair",         0x04 ));
-  fInputs.AddLast(new AliTriggerInput( "TRD_Unlike_EPair_HPt_L1", "Unlike electron pair high pt", 0x08 ));
-  fInputs.AddLast(new AliTriggerInput( "TRD_Like_EPair_L1",       "Like electron pair",           0x10 ));
-  fInputs.AddLast(new AliTriggerInput( "TRD_Like_EPair_HPt_L1",   "Like electron pair high pt",   0x20 ));
-  fInputs.AddLast(new AliTriggerInput( "TRD_Electron_L1",         "Single electron",              0x40 ));
-  fInputs.AddLast(new AliTriggerInput( "TRD_Electron_HPt_L1",     "Single electron high pt",      0x80 ));
+  if (fInputs.GetEntriesFast() > 0)
+    return;
 
+  fInputs.AddLast(new AliTriggerInput("1HSH", "TRD", 1));
+  fInputs.AddLast(new AliTriggerInput("1HJT", "TRD", 1));
 }
 
-//_____________________________________________________________________________
 void AliTRDTriggerL1::Trigger()
 {
-
-  AliRunLoader* runLoader = gAlice->GetRunLoader();
-
-  AliLoader *loader=runLoader->GetLoader("TRDLoader");
-
-  Int_t nEvents = runLoader->GetNumberOfEvents();
-
-  // Trigger (tracklets, LTU)
-
-  AliTRDgeometry *geo = AliTRDgeometry::GetGeometry(runLoader);
-
-  AliTRDtrigger trdTrigger("Trigger","Trigger class"); 
-
-  AliTRDtrigParam *trigp = new AliTRDtrigParam("TRDtrigParam","TRD Trigger parameters");
-
-  gAlice = runLoader->GetAliRun();
-  Double_t x[3] = { 0.0, 0.0, 0.0 };
-  Double_t b[3];
-  gAlice->Field(x,b);  // b[] is in kilo Gauss
-  Float_t field = b[2] * 0.1; // Tesla
-  Info("Trigger","Trigger set for magnetic field = %f Tesla \n",field);
-
-  trigp->SetField(field);
-  trigp->Init();
-
-  trdTrigger.SetParameter(trigp);
-  trdTrigger.SetRunLoader(runLoader);
-  trdTrigger.Init();
-
-  for (Int_t iEvent = 0; iEvent < nEvents; iEvent++) {
-
-    trdTrigger.Open(runLoader->GetFileName(), iEvent);
-    trdTrigger.ReadDigits();
-    trdTrigger.MakeTracklets(kTRUE);
-    trdTrigger.WriteTracklets(-1);
-
+  // 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);
+  gtusim->WriteTracksToLoader();
+  
+  TTree *trackTree = trdLoader->GetDataLoader("gtutracks")->Tree();
+  if (!trackTree) {
+    AliDebug(1,"Did not find track tree");
+    return;
   }
-
-  // Trigger (tracks, GTU)
-
-  Float_t highPt = trigp->GetHighPt();
-
-  Float_t pid, pt;
-  Int_t   det, sec;
-  Bool_t  isElectron;
-
-  const Int_t maxEle = 1000;
-
-  Int_t   electronPlus,          electronMinus;
-  Int_t   sectorElePlus[maxEle], sectorEleMinus[maxEle];
-  Float_t ptElePlus[maxEle],     ptEleMinus[maxEle];
-  Int_t   hadronLowPt, hadronHighPt;
-
-  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++;
+  TBranch *branch = trackTree->GetBranch("TRDtrackGTU");
+  AliDebug(1,Form("TRD trigger: found %lld tracks", trackTree->GetEntriesFast()));
+  
+  // trigger thresholds should go elsewhere
+  Float_t ptThreshold1 = 2;
+  Float_t ptThreshold2 = 9.9;
+  Int_t trackThreshold1 = 6;
+  Int_t trackThreshold2 = 2;
+  
+  // trigger algorithms to come, e.g.
+  Bool_t triggeredHighPt = kFALSE;
+  Bool_t triggeredJet = kFALSE;
+  
+  if (branch) {
+    AliTRDtrackGTU *trk = 0x0;
+    branch->SetAddress(&trk);
+
+    // high pt trigger
+    for (Int_t iTrack = 0; iTrack < trackTree->GetEntriesFast(); iTrack++) {
+      trackTree->GetEntry(iTrack);
+      if (TMath::Abs(trk->GetPt()) > 3.0) {
+        AliDebug(1, Form("Found track in sector %2i, stack %i with pt = %3.1f, triggered", 
+                         trk->GetSector(), trk->GetStack(), trk->GetPt()));
+        triggeredHighPt = kTRUE;
       }
-
     }
 
-  }
-
-  loader->UnloadTracks();
-
-  // hadrons
-
-  if (hadronLowPt)  SetInput("TRD_Hadr_LPt_L1");
-  if (hadronHighPt) SetInput("TRD_Hadr_HPt_L1");
-
-  // electron-positron pairs (open angle > 80 deg)
-
-  Int_t  secPlus, secMinus, 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;
-         }
-       }
-      }
+    // jet trigger
+    Int_t nTracks1[90]; // tracks above lower pt threshold
+    Int_t nTracks2[90]; // tracks above higher pt threshold
+    memset(nTracks1,0,sizeof(Int_t)*90);
+    memset(nTracks2,0,sizeof(Int_t)*90);
+    for (Int_t iTrack = 0; iTrack < trackTree->GetEntriesFast(); iTrack++) {
+      trackTree->GetEntry(iTrack);
+      if (TMath::Abs(trk->GetPt()) > ptThreshold1)
+        nTracks1[5*trk->GetSector() + trk->GetStack()]++;
+      if (TMath::Abs(trk->GetPt()) > ptThreshold2)
+        nTracks2[5*trk->GetSector() + trk->GetStack()]++;
     }
-  }
-
-  if (electronUnlikePair)    SetInput("TRD_Unlike_EPair_L1");
-  if (electronUnlikePairHPt) SetInput("TRD_Unlike_EPair_HPt_L1");
-
-  // like electron/positron pairs
-
-  Bool_t ele1, ele1HPt;
-  Bool_t ele2, 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;
-       }
-      }
+    for (Int_t iStack = 0; iStack < 90; iStack++) {
+      if ((nTracks1[iStack] >= trackThreshold1) || (nTracks2[iStack] >= trackThreshold2))
+        triggeredJet = kTRUE;
     }
   }
-
-  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;
-       }
-      }
-    }
+  else {
+    AliWarning("GTU Branch not found");
   }
 
-  if (ele1    && ele2   ) SetInput("TRD_Like_EPair_L1");
-  if (ele1HPt && ele2HPt) SetInput("TRD_Like_EPair_HPt_L1");
-  
-  // single electron/positron
+  if (triggeredHighPt) { 
+    AliInfo("Fired high-pt trigger");
+    SetInput("1HSH");
+  }
 
-  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 (triggeredJet) {
+    AliInfo("Fired jet trigger");
+    SetInput("1HJT");
   }
 
+  // cleaning up
+  delete gtusim;
 }
-