ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

#include <Riostream.h>
#include <TTree.h>
#include <TClonesArray.h>

#include "AliRun.h"
#include "AliRunLoader.h"
#include "AliACORDETrigger.h"
#include "AliACORDEConstants.h"

//______________________________________________________________________
using std::cout;
using std::endl;
ClassImp(AliACORDETrigger)

AliACORDETrigger::AliACORDETrigger()
  :AliTriggerDetector(),
   fSingleMuon(0),
   fMultiMuon(0)
{

  cout << " ================>>>>>>>>>>>>>>>>> AliACORDETrigger" << endl;
   SetName("ACORDE");
   CreateInputs();
   for (Int_t i=0; i<60; i++) fModuleFired[i]=kFALSE;
}

void AliACORDETrigger::CreateInputs()
{
  // Do not create inputs again!!
  if( fInputs.GetEntriesFast() > 0 ) return;

  // two acorde triggers, single muon and multicoincidence
  fInputs.AddLast( new 
		   AliTriggerInput( "0ASL", 
				    "ACORDE", 0 ) );
  fInputs.AddLast( new 
		   AliTriggerInput( "0AMU",
				    "ACORDE", 0 ) );
}

void AliACORDETrigger::Trigger()
{
  
  // 1.- Get loaders and pointers
  // 2.- Loop over all entries
  //     set temporal variables to default values
  //     start the loop
  // 3.- Loop over all digits in an entrie
  //     Fill temporal arrays
  //     Find module with lowest time
  // 4.- Loop over temporal arrays
  //     Find number of modules within the time window
  // 5.- Set the relevant trigger

  // 1.- Get loaders and pointers
  AliRunLoader* runLoader = AliRunLoader::Instance();
  AliACORDELoader* loader = 
    (AliACORDELoader* )runLoader->GetLoader( "ACORDELoader" );
  loader->LoadDigits("READ");
  TTree* acordeDigitsTree = loader->TreeD();
  if (!acordeDigitsTree) return;
  TClonesArray* acordeDigits = new TClonesArray("AliACORDEdigit",1000);
  TBranch* digitBranch = acordeDigitsTree->GetBranch("ACORDEdigit");
  digitBranch->SetAddress(&acordeDigits);

  // 2.- Loop over all entries
  //     set temporal variables to default values

  Int_t MultiMin = AliACORDEConstants::Instance()->MultiMuonThreshold();
  Float_t time_window = AliACORDEConstants::Instance()->MultiMuonWindow();
  Int_t MinTimeModule = -1;
  Float_t MinTime = 1e10;
  Float_t ModuleTimes[60];
  for (Int_t i=0; i<60; i++) ModuleTimes[i] = -1.0;

  //     start the loop
  Int_t nEntries = (Int_t)acordeDigitsTree->GetEntries();
  cout << " ===AliACORDETrigger=== nEntries  " <<nEntries << endl; 
  for (Int_t e=0; e<nEntries; e++) {
    acordeDigitsTree->GetEvent(e);
    // 3.- Loop over all digits in an entrie
    //     Fill temporal arrays
    //     Find module with lowest time
    Int_t nDigits = acordeDigits->GetEntriesFast();
    cout << " ===AliACORDETrigger=== nDigits  " <<nDigits << endl; 
    for (Int_t d=0; d<nDigits; d++) {
      AliACORDEdigit* digit = (AliACORDEdigit*)acordeDigits->At(d);
      Int_t module = digit->GetModule();
      Float_t mod_time = digit->GetTime();
      ModuleTimes[module-1]=mod_time;
      if (mod_time < MinTime) {
	MinTime = mod_time;
	MinTimeModule = module;
      }
    } // end of loop over digits
  } // end of loop over events in digits tree

  // 4.- Loop over temporal arrays
  //     Find number of modules within the time window
  if (MinTimeModule == -1) return;
  for (Int_t i=0; i<60; i++) {
    if (ModuleTimes[i]<0) continue;
    Float_t diff = ModuleTimes[i]-MinTime;
    if (diff<time_window) {
      fMultiMuon++;
      fModuleFired[i]=kTRUE;
    }
  }
  cout << " fSingleMuon " << fSingleMuon
       << " MinTime " << MinTime
       << " fMultiMuon " << fMultiMuon << endl;
  // 5.- Set the relevant trigger
  fSingleMuon = MinTimeModule;
  SetInput( "0ASL" );
  if (fMultiMuon>=MultiMin) SetInput( "0AMU" );
  return;
}
 AliACORDETrigger.cxx:1
 AliACORDETrigger.cxx:2
 AliACORDETrigger.cxx:3
 AliACORDETrigger.cxx:4
 AliACORDETrigger.cxx:5
 AliACORDETrigger.cxx:6
 AliACORDETrigger.cxx:7
 AliACORDETrigger.cxx:8
 AliACORDETrigger.cxx:9
 AliACORDETrigger.cxx:10
 AliACORDETrigger.cxx:11
 AliACORDETrigger.cxx:12
 AliACORDETrigger.cxx:13
 AliACORDETrigger.cxx:14
 AliACORDETrigger.cxx:15
 AliACORDETrigger.cxx:16
 AliACORDETrigger.cxx:17
 AliACORDETrigger.cxx:18
 AliACORDETrigger.cxx:19
 AliACORDETrigger.cxx:20
 AliACORDETrigger.cxx:21
 AliACORDETrigger.cxx:22
 AliACORDETrigger.cxx:23
 AliACORDETrigger.cxx:24
 AliACORDETrigger.cxx:25
 AliACORDETrigger.cxx:26
 AliACORDETrigger.cxx:27
 AliACORDETrigger.cxx:28
 AliACORDETrigger.cxx:29
 AliACORDETrigger.cxx:30
 AliACORDETrigger.cxx:31
 AliACORDETrigger.cxx:32
 AliACORDETrigger.cxx:33
 AliACORDETrigger.cxx:34
 AliACORDETrigger.cxx:35
 AliACORDETrigger.cxx:36
 AliACORDETrigger.cxx:37
 AliACORDETrigger.cxx:38
 AliACORDETrigger.cxx:39
 AliACORDETrigger.cxx:40
 AliACORDETrigger.cxx:41
 AliACORDETrigger.cxx:42
 AliACORDETrigger.cxx:43
 AliACORDETrigger.cxx:44
 AliACORDETrigger.cxx:45
 AliACORDETrigger.cxx:46
 AliACORDETrigger.cxx:47
 AliACORDETrigger.cxx:48
 AliACORDETrigger.cxx:49
 AliACORDETrigger.cxx:50
 AliACORDETrigger.cxx:51
 AliACORDETrigger.cxx:52
 AliACORDETrigger.cxx:53
 AliACORDETrigger.cxx:54
 AliACORDETrigger.cxx:55
 AliACORDETrigger.cxx:56
 AliACORDETrigger.cxx:57
 AliACORDETrigger.cxx:58
 AliACORDETrigger.cxx:59
 AliACORDETrigger.cxx:60
 AliACORDETrigger.cxx:61
 AliACORDETrigger.cxx:62
 AliACORDETrigger.cxx:63
 AliACORDETrigger.cxx:64
 AliACORDETrigger.cxx:65
 AliACORDETrigger.cxx:66
 AliACORDETrigger.cxx:67
 AliACORDETrigger.cxx:68
 AliACORDETrigger.cxx:69
 AliACORDETrigger.cxx:70
 AliACORDETrigger.cxx:71
 AliACORDETrigger.cxx:72
 AliACORDETrigger.cxx:73
 AliACORDETrigger.cxx:74
 AliACORDETrigger.cxx:75
 AliACORDETrigger.cxx:76
 AliACORDETrigger.cxx:77
 AliACORDETrigger.cxx:78
 AliACORDETrigger.cxx:79
 AliACORDETrigger.cxx:80
 AliACORDETrigger.cxx:81
 AliACORDETrigger.cxx:82
 AliACORDETrigger.cxx:83
 AliACORDETrigger.cxx:84
 AliACORDETrigger.cxx:85
 AliACORDETrigger.cxx:86
 AliACORDETrigger.cxx:87
 AliACORDETrigger.cxx:88
 AliACORDETrigger.cxx:89
 AliACORDETrigger.cxx:90
 AliACORDETrigger.cxx:91
 AliACORDETrigger.cxx:92
 AliACORDETrigger.cxx:93
 AliACORDETrigger.cxx:94
 AliACORDETrigger.cxx:95
 AliACORDETrigger.cxx:96
 AliACORDETrigger.cxx:97
 AliACORDETrigger.cxx:98
 AliACORDETrigger.cxx:99
 AliACORDETrigger.cxx:100
 AliACORDETrigger.cxx:101
 AliACORDETrigger.cxx:102
 AliACORDETrigger.cxx:103
 AliACORDETrigger.cxx:104
 AliACORDETrigger.cxx:105
 AliACORDETrigger.cxx:106
 AliACORDETrigger.cxx:107
 AliACORDETrigger.cxx:108
 AliACORDETrigger.cxx:109
 AliACORDETrigger.cxx:110
 AliACORDETrigger.cxx:111
 AliACORDETrigger.cxx:112
 AliACORDETrigger.cxx:113
 AliACORDETrigger.cxx:114
 AliACORDETrigger.cxx:115
 AliACORDETrigger.cxx:116
 AliACORDETrigger.cxx:117
 AliACORDETrigger.cxx:118
 AliACORDETrigger.cxx:119
 AliACORDETrigger.cxx:120
 AliACORDETrigger.cxx:121
 AliACORDETrigger.cxx:122
 AliACORDETrigger.cxx:123
 AliACORDETrigger.cxx:124
 AliACORDETrigger.cxx:125
 AliACORDETrigger.cxx:126
 AliACORDETrigger.cxx:127
 AliACORDETrigger.cxx:128
 AliACORDETrigger.cxx:129
 AliACORDETrigger.cxx:130
 AliACORDETrigger.cxx:131
 AliACORDETrigger.cxx:132