* 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 "AliRun.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)
{
+ // ctor
SetName("TRD");
+}
+AliTRDTriggerL1::~AliTRDTriggerL1()
+{
+ // dtor
}
-//_____________________________________________________________________________
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("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()
{
-
- 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);
+
+ 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;
-
- 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++;
+ 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()]++;
}
- } else {
-
- if (TMath::Abs(pt) < highPt) {
- hadronLowPt++;
- } else {
- hadronHighPt++;
+ 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()]++;
}
-
}
- }
+ 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 ((nTracksElA[iStack] >= fNoThresholdElA))
+ triggered1HSE = kTRUE;
- 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;
- }
- }
- }
+ if ((nTracksElB[iStack] >= fNoThresholdElB))
+ triggered1HQU = kTRUE;
}
}
+ else {
+ AliWarning("GTU Branch not found");
+ }
- 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
+ if (triggered1HCO) {
+ AliDebug(1, "Fired cosmic trigger");
+ SetInput("1HCO");
+ }
- 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 (ele1HPt && ele2HPt) SetInput("TRD_Like_EPair_HPt_L1");
-
- // single electron/positron
+ if (triggered1HQU) {
+ AliDebug(1, "Fired single electron trigger");
+ SetInput("1HQU");
+ }
- 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;
}
-