* 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;
}
-