]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITSTrigger.cxx
Fix for Bug: 58726 including a new QA histogram for ACORDE ESDs (Multiplicity of...
[u/mrichter/AliRoot.git] / ITS / AliITSTrigger.cxx
index 9940b28c267bbc677ffcd1dd6dcbf5bc15af0a68..84c42dff67e5eab329b86cb25f7a8194471a81a6 100644 (file)
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
-/* $Id$ */
-
 
-//////////////////////////////////////////////////////////////////////
-//
-//  ITS SPD Trigger Detector Class
-//
-//  Several Fast-OR Algoritm are implemented
-//
-//  Ref: ALICE-INT-2005-025
-//  (J. Conrad, J. G. Contreras and C. E. Jorgensen)
-//
-//////////////////////////////////////////////////////////////////////
+/* $Id$ */
 
+////////////////////////////////////////////////////////////////////////
+//                                                                    //
+// Simulates generation of Fast-OR signals from SPD (if needed).      //
+// Processes the Fast-OR signals generated in AliITSsimulationSPD.    //
+// Provides inputs for AliCentralTrigger.                             //
+//                                                                    //
+// Version 2, Henrik Tydesjo, Feb 2009                                //
+// Version 1, D. Elia, C. Jorgensen, Mar 2006                         //
+// Version 0, J. Conrad, E. Lopez Torres, Oct 2005                    //
+//                                                                    //
+////////////////////////////////////////////////////////////////////////
 
+#include "AliITSTrigger.h"
 #include "AliLog.h"
 #include "AliRun.h"
 #include "AliRunLoader.h"
 #include "AliITSLoader.h"
-#include "AliITSgeom.h"
-#include "AliITSdigitSPD.h"
-
 #include "AliTriggerInput.h"
-#include "AliITSTrigger.h"
 
-//______________________________________________________________________
 ClassImp(AliITSTrigger)
 
 //______________________________________________________________________
-AliITSTrigger::AliITSTrigger()
-  : AliTriggerDetector()
+AliITSTrigger::AliITSTrigger() : 
+  AliTriggerDetector(),
+  fPITprocessor()
 {
-   SetName("ITS");
-   CreateInputs();
+  //standard constructor
+  SetName("ITS");
 }
-
 //______________________________________________________________________
-void AliITSTrigger::CreateInputs()
+AliITSTrigger::AliITSTrigger(AliITSTriggerConditions* cond) : 
+  AliTriggerDetector(),
+  fPITprocessor(cond)
 {
-   // inputs
-
-   // Do not create inputs again!!
-   if( fInputs.GetEntriesFast() > 0 ) return;
-   
-   fInputs.AddLast( new AliTriggerInput( "ITS_SPD_GFO_L0",     "Global, Fast OR all detectors", 0x01 ) );
-   fInputs.AddLast( new AliTriggerInput( "ITS_SPD_LAYER_L0",   "Layer, hit in each layer",      0x02 ) );
-   fInputs.AddLast( new AliTriggerInput( "ITS_SPD_SECTOR_L0",  "Sector, hit coincidence in one sector", 0x04 ) );
-   fInputs.AddLast( new AliTriggerInput( "ITS_SPD_HSECTOR_L0", "Half Sector, hit coincidence in one half sector", 0x08 ) );
-   fInputs.AddLast( new AliTriggerInput( "ITS_SPD_SW1_L0",     "Sliding Window 1, hit coincidence on phi windows",  0x10 ) );
-   fInputs.AddLast( new AliTriggerInput( "ITS_SPD_SW2_L0",     "Sliding Window 2, hit coincidence on phi windows",  0x20 ) );
-   fInputs.AddLast( new AliTriggerInput( "ITS_SPD_VERTEX_L0",  "Vertex, hit coincidence on theta windows", 0x40 ) );
-   fInputs.AddLast( new AliTriggerInput( "ITS_SPD_SVERTEX_L0", "Sector+Vertex, hit coincidence on one sector and theta windows", 0x80 ) );
-   fInputs.AddLast( new AliTriggerInput( "ITS_SPD_HSVERTEX_L0","Half Sector+Vertex, hit coincidence on one half sector and theta windows", 0x100 ) );
-   fInputs.AddLast( new AliTriggerInput( "ITS_SPD_SWVERTEX_L0","Sliding Window+Vertex, hit coincidence on phi windows and theta windows", 0x200 ) );
-   fInputs.AddLast( new AliTriggerInput( "ITS_SPD_LUCUT_L0",   "Layer+Upper Cut, hit in each layer and FO occupancy cut", 0x400 ) );
-   // Not yet implemented
-   fInputs.AddLast( new AliTriggerInput( "ITS_SPD_HMULT_L0",   "High Multiplicity, to be defined!!", 0x600 ) );
-
+  // optional constructor
+  SetName("ITS");
 }
-
 //______________________________________________________________________
-void AliITSTrigger::Trigger()
-{
-
-   //  ********** Get run loader for the current event **********
-   AliRunLoader* runLoader = gAlice->GetRunLoader();
-
-   AliITSLoader * loader = (AliITSLoader* )runLoader->GetLoader( "ITSLoader" );
-   AliITSgeom* geom = loader->GetITSgeom();
-   loader->LoadDigits("READ");
-   TTree *treeD = loader->TreeD();
-
-   TObjArray *digDet = 0;
-   digDet = new TObjArray(3);
-
-   Int_t startSPD = geom->GetStartSPD();
-   Int_t lastSPD  = geom->GetLastSPD();
-
-   // Cut on Signal In the Pixel Detector
-   TBranch * br = treeD->GetBranch( "ITSDigitsSPD" );
-   br->SetAddress( &((*digDet)[0]) );
-   ((TClonesArray*)(digDet->At(0)))->Clear();
-
-   Int_t ndig = 0;
-   Int_t ndigfo = 0;
-   Int_t singhitthreshold = 1; // single hit threshold
-   Int_t threshold = 1;
-
-//   const Int_t nlay = 2;      // not used
-//   const Int_t nlad = 240;    // not used
-//   const Int_t nstave = 40;   // not used
-//   const Int_t ndet = 4;      // not used
-//   const Int_t nchip = 5;     // not used
-//   const Int_t ntotal = 1200;
-
-   Int_t ndigA[5];
-   Int_t iFOperlayer[2];
-   Int_t iFOperladder[240];
-   Int_t iFOperstave[40][2];
-//   Int_t iFOperchip[ntotal];   // not used
-   Int_t iFOperChipinStave[20][40][2];
-
-   for (Int_t m=startSPD;m<lastSPD;m++) {
-      iFOperladder[m] = 0;
-   }
-
-   for (Int_t k = 0;k<2;k++){
-      iFOperlayer[k] = 0;
-      for (Int_t o=0; o<40; o++) {
-         iFOperstave[o][k] = 0;
-         for (Int_t ich=0; ich<20; ich++) {
-            iFOperChipinStave[ich][o][k] = 0;
-         }
-      }
-   }
-
-   // nFO = 0.0;
-   Int_t mInStaveCounter = 0;
-   Int_t checkStave = 0;
-
-   for (Int_t m=startSPD; m<lastSPD; m++) {
-      treeD->GetEvent( m );
-      TClonesArray* digits = (TClonesArray*) (digDet->At(0)); // SPD only.
-      Int_t lay, stav, det;
-      geom->GetModuleId(m,lay,stav,det);
-      ndig = digits->GetEntriesFast();
-      for( Int_t l=0; l<5; l++ ) {
-         ndigA[l] = 0 ;
-      }
-      for( Int_t dig=0; dig<ndig; dig++) {
-         AliITSdigitSPD* dp = (AliITSdigitSPD*) digits->At(dig);
-         Int_t column = dp->GetCoord1();
-         //   Int_t row = dp->GetCoord2();
-         Int_t chip = Int_t(column/32.);
-         ndigA[chip]++;
-      }
-
-      if (checkStave != stav) {
-         mInStaveCounter = 0;
-      } else {
-         mInStaveCounter += 1;
-      }
-
-      // m 0,.., 239
-      // stav 1,..,40
-      // mInStave 0,..,3
-      // chipInStave 0,..,19
-
-
-      for (Int_t ichip=0; ichip<5; ichip++) {
-         //Int_t seq = (m*5+ichip);
-         Int_t chipInStave = (mInStaveCounter *5) + ichip;
-
-         if (ndigA[ichip] >= 1) {
-            iFOperladder[m]++;
-            iFOperlayer[lay-1]++;
-            iFOperstave[stav-1][lay-1]++;
-            //iFOperHstave[hstav-1][lay-1]++;
-            iFOperChipinStave[chipInStave][stav-1][lay-1]++;
-        //    nFO++;
-         }
-      }
-      // SIMPLE FO ---> ANY HIT TRIGGERS
-      ndigfo += ndig;
-      checkStave = stav;
-   } // endl loop over SPD's
-
-
-   //Int_t bit1 = 0;
-   Int_t upper_cut = 120;
-
-   if ( ndigfo >= singhitthreshold ) {
-      // Set input GLOBAL FO
-      SetInput( "ITS_SPD_GFO_L0" );
-      // or SetInput( "0x01" );
-      // or ((AliTriggerInput*)fInputs.At(0))->Set();
-      // bit1 |= (1 << 1);
-   }
-
-   //  if ( ndigfo <= upper_cut) { bit1 |= (1 << 10); }
-
-   if (iFOperlayer[0] >= threshold && iFOperlayer[1] >=threshold) {
-      // Set input LAYER
-      //bit1 |= (1 << 2);
-      SetInput( "ITS_SPD_LAYER_L0" );
-      if ( ndigfo <= upper_cut) {
-         //bit1 |= (1 << 10);
-         //  LAYER and UPPER CUT
-         SetInput( "ITS_SPD_LUCUT_L0" );
-      }
-   }
-
-   // Sector coincidence
-
-   // Int_t nsec = 0;
-   Int_t finstav = 0;
-   Int_t istav;
-   Int_t jstav;
-
-   // staves layer 1  1-20
-   // staves layer 2: 0-39
-   for (istav=1; istav<21; istav++) {
-      for (jstav = finstav; jstav<finstav+4; jstav++) {
-         if ((iFOperstave[istav-1][0] >= threshold) &&
-             (iFOperstave[jstav][1] >= threshold)) {
-            // Set input SECTOR
-            //bit1 |= (1 << 3);
-            SetInput( "ITS_SPD_SECTOR_L0" );
-            if ( RequireZ10cm( iFOperChipinStave, istav-1, jstav ) == kTRUE ) {
-               // Set input SECTOR & VERTEX
-               // bit1 |= (1 << 7);
-               SetInput( "ITS_SPD_SVERTEX_L0" );
-            }
-         }
-
-      }
-      if (TMath::Even(istav)) {
-         finstav = jstav;
-      }
-
-   }
-
-   // half sector coincidence
-
-   finstav = 0;
-   for (istav=1; istav<21; istav++){
-      for (jstav = finstav; jstav<finstav+2; jstav++) {
-         if (iFOperstave[istav-1][0] >= threshold && iFOperstave[jstav][1] >= threshold) {
-            // Set input HALF SECTOR
-            //bit1 |= (1 << 4);
-            SetInput( "ITS_SPD_HSECTOR_L0" );
-            if (RequireZ10cm(iFOperChipinStave,istav-1,jstav) == kTRUE) {
-               // Set input HALF SECTOR & VERTEX
-               SetInput( "ITS_SPD_HSVERTEX_L0" );
-               //bit1 |= (1 << 8);
-            }
-         }
-      }
-      finstav = jstav;
-   }
-
-   finstav = 0;
-   for (istav=1; istav<21; istav++) {
-      for (jstav = finstav-1; jstav<finstav+3; jstav++) {
-         Int_t probe_stav = jstav;
-         if (jstav == -1) probe_stav = 39;
-         if (jstav == 40) probe_stav = 0;
-         if (iFOperstave[istav-1][0] >= threshold && iFOperstave[probe_stav][1] >= threshold) {
-            // Set input SLIDING WINDOW1
-            SetInput( "ITS_SPD_SW1_L0" );
-            //bit1 |= (1 << 5);
-         }
-      }
-      finstav = jstav-1;
-   }
-
-  // sliding window coincidence (symmetric): 1 (layer 1), 5 (layer 2)
-
-   finstav = 0;
-   for (istav=1;istav<21; istav++) {
-      for (jstav = finstav-2; jstav<finstav+3; jstav++) {
-         Int_t probe_stav = jstav;
-         if (jstav == -2) probe_stav = 38;
-         if (jstav == -1) probe_stav = 39;
-         if (jstav == 40) probe_stav = 0;
-         if (jstav == 41) probe_stav = 1;
-
-         if ((iFOperstave[istav-1][0] >= threshold) && (iFOperstave[probe_stav][1] >= threshold)) {
-            // Set input SLIDING WINDOW 2
-            SetInput( "ITS_SPD_SW2_L0" );
-            // bit1 |= (1 << 6);
-            if (RequireZ10cm(iFOperChipinStave,istav-1,probe_stav) == kTRUE) {
-               // Set input SLIDING WINDOW & VERTEX
-               SetInput( "ITS_SPD_SWVERTEX_L0" );
-               //bit1 |= (1 << 9);
-            }
-         }
-      }
-      finstav = jstav-1;
-   }
-
+void AliITSTrigger::SetTriggerConditions(AliITSTriggerConditions* cond) {
+  // Sets the trigger conditions, normally coming from OCDB
+  fPITprocessor.SetTriggerConditions(cond);
 }
-
-
-
 //______________________________________________________________________
-Bool_t AliITSTrigger::RequireZ10cm(Int_t iFOperChipinStave[][40][2], Int_t stave1, Int_t stave2)
-{
-   // z  sliding window
-   // Bool_t zFlag = kFALSE;
-
-   Int_t threshold = 1;
-   Int_t start1 = 1;
-   Int_t start2 = 3;
-   Int_t start3 = 6;
-   Int_t start4 = 7;
- //  Int_t i = 1;
-
-   for (Int_t ic=0; ic<=19; ic++) {
-      if (ic <= 5) {
-         for (Int_t jc=0;jc<=ic-1;jc++) {
-            if (iFOperChipinStave[ic][stave1][0] >=threshold) {
-               if (iFOperChipinStave[jc][stave2][1] >= threshold){
-                  return kTRUE; // zFlag = kTRUE;
-               }
-            }
-         }
-      }
-      if (ic >= 6 && ic <= 8) {
-         for (Int_t jc=(2*start1-1);jc<=(2*start1-1)+5;jc++) {
-            if (iFOperChipinStave[ic][stave1][0] >=threshold) {
-               if  (iFOperChipinStave[jc][stave2][1] >= threshold) {
-                  return kTRUE; // zFlag = kTRUE;
-               }
-            }
-         }
-         start1++;
-      }
-      if (ic >= 9 && ic <= 11) {
-         for (Int_t jc=(2*start2); jc<=(2*start2+5); jc++) {
-            if (iFOperChipinStave[ic][stave1][0] >= threshold) {
-               if (iFOperChipinStave[jc][stave2][1] >= threshold) {
-                  return kTRUE; // zFlag = kTRUE;
-               }
-            }
-         }
-         start2++;
-      }
-      if (ic >= 12 && ic <= 13) {
-         for (Int_t jc=(2*start3-1);jc<=(2*start3-1)+5;jc++) {
-            if (iFOperChipinStave[ic][stave1][0] >= threshold) {
-               if  (iFOperChipinStave[jc][stave2][1] >= threshold){
-                  return kTRUE; // zFlag = kTRUE;
-               }
-            }
-         }
-         start3++;
-      }
-      if (ic >= 14) {
-         for (Int_t jc=(2*start4);jc<=19;jc++) {
-            if (iFOperChipinStave[ic][stave1][0] >= threshold) {
-               if  (iFOperChipinStave[jc][stave2][1] >= threshold){
-                  return kTRUE; // zFlag = kTRUE;
-               }
-            }
-         }
-         start4++;
-      }
-   }
-
-   return kFALSE; // zFlag;
+void AliITSTrigger::CreateInputs() {
+  // Create inputs, based on OCDB Pixel Trigger Conditions
+  if( fInputs.GetEntriesFast() > 0 ) return; // Inputs already created, no need to proceed
+  
+  // Load trigger conditions from OCDB if needed
+  if (! fPITprocessor.TriggerConditionsSet() ) {
+    AliError("Trigger conditions not set. No inputs created.");
+    return;
+  }
+
+  UInt_t numInputs = fPITprocessor.GetNumOutputs();
+  AliInfo(Form("Number of trigger inputs: %d",numInputs));
+  for (UInt_t inp=0; inp<numInputs; inp++) {
+    fInputs.AddLast( new AliTriggerInput(fPITprocessor.GetOutputLabel(inp), "SPD", 0) );
+  }
 }
+//______________________________________________________________________
+void AliITSTrigger::Trigger() {
+  // Performs Pixel Trigger processing of the simulated fast-or signals
+
+  // Get the FO signals for this event
+  AliITSFOSignalsSPD* foSignals = NULL;
+  AliRunLoader* runLoader = AliRunLoader::Instance();
+  runLoader->LoadDigits();
+  AliITSLoader* itsLoader = (AliITSLoader*) runLoader->GetLoader("ITSLoader");
+  if (!itsLoader) {
+    AliError("ITS loader is NULL.");
+  }
+
+   else {
+      TTree *tree = itsLoader->TreeD();
+      if(!tree) {
+        AliError("TreeD not available");
+        return;
+      }
+      foSignals = (AliITSFOSignalsSPD*)tree->GetUserInfo()->FindObject("AliITSFOSignalsSPD");
+      if(!foSignals) AliError("FO signals not retrieved");
+     }
+
+  // Process the FO signals
+  if (foSignals) {
+    fPITprocessor.PreprocessFOSignals(foSignals);
+    UInt_t numInputs = fPITprocessor.GetNumOutputs();
+    for (UInt_t inp=0; inp<numInputs; inp++) {
+      if (fPITprocessor.ProcessFOSignalsIndex(inp, foSignals)) {
+       SetInput(fPITprocessor.GetOutputLabel(inp));
+      }
+    }
+  }
+  else {
+    AliError("Fast-OR signals not available. No trigger processing done.");
+  }
 
-
+}