* 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 "AliRunLoader.h"
-#include "AliConfig.h"
-#include "AliTracker.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()
{
- //
- // Default constructor
- //
-
SetName("TRD");
+}
+
+AliTRDTriggerL1::~AliTRDTriggerL1()
+{
}
-//_____________________________________________________________________________
void AliTRDTriggerL1::CreateInputs()
{
- //
- // See TRIGGER/DAQ/HLT/DCS Techical Design Report,
- // p. 58, Table 4.1 for the proposed inputs
- //
+ // create the trigger inputs for TRD
- 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 ));
+ if (fInputs.GetEntriesFast() > 0)
+ return;
+ fInputs.AddLast(new AliTriggerInput("1HSH", "TRD", 1));
+ fInputs.AddLast(new AliTriggerInput("1HJT", "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++;
- }
-
- if (TMath::Abs(pt) > jetLowPt ) {
- hadronJetLowPt++;
- }
- if (TMath::Abs(pt) > jetHighPt) {
- hadronJetHighPt++;
- }
-
- }
-
- }
-
- loader->UnloadTracks();
-
- // Hadrons
- if (hadronLowPt) {
- SetInput("TRD_Hadr_LPt_L1");
- }
- if (hadronHighPt) {
- SetInput("TRD_Hadr_HPt_L1");
- }
-
- // Hadrons from jets
- if (hadronJetLowPt >= AliTRDtrigParam::Instance()->GetNPartJetLow() ) {
- SetInput("TRD_Jet_LPt_L1");
- }
- if (hadronJetHighPt >= AliTRDtrigParam::Instance()->GetNPartJetHigh()) {
- SetInput("TRD_Jet_HPt_L1");
+ // 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;
}
-
- // 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;
- }
- }
+ 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;
}
}
- }
-
- 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;
- }
- }
+ // 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 (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;
- }
- }
+ for (Int_t iStack = 0; iStack < 90; iStack++) {
+ if ((nTracks1[iStack] >= trackThreshold1) || (nTracks2[iStack] >= trackThreshold2))
+ triggeredJet = kTRUE;
}
}
+ else {
+ AliWarning("GTU Branch not found");
+ }
- if (ele1 && ele2 ) {
- SetInput("TRD_Like_EPair_L1");
+ if (triggeredHighPt) {
+ AliInfo("Fired high-pt trigger");
+ SetInput("1HSH");
}
- //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 (triggeredJet) {
+ AliInfo("Fired jet trigger");
+ SetInput("1HJT");
}
+ // cleaning up
+ delete gtusim;
}
-