a2bda8c349805ff8f5b538084d91ffae65af08f3
[u/mrichter/AliRoot.git] / ACORDE / AliACORDETrigger.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 #include <Riostream.h>
17 #include <TTree.h>
18 #include <TClonesArray.h>
19
20 #include "AliRun.h"
21 #include "AliRunLoader.h"
22 #include "AliACORDETrigger.h"
23 #include "AliACORDEConstants.h"
24
25 //______________________________________________________________________
26 ClassImp(AliACORDETrigger)
27
28 AliACORDETrigger::AliACORDETrigger()
29   :AliTriggerDetector(),
30    fSingleMuon(0),
31    fMultiMuon(0)
32 {
33
34   cout << " ================>>>>>>>>>>>>>>>>> AliACORDETrigger" << endl;
35    SetName("ACORDE");
36    CreateInputs();
37    for (Int_t i=0; i<60; i++) fModuleFired[i]=kFALSE;
38 }
39
40 void AliACORDETrigger::CreateInputs()
41 {
42   // Do not create inputs again!!
43   if( fInputs.GetEntriesFast() > 0 ) return;
44
45   // two acorde triggers, single muon and multicoincidence
46   fInputs.AddLast( new 
47                    AliTriggerInput( "0ASL", 
48                                     "ACORDE", 0 ) );
49   fInputs.AddLast( new 
50                    AliTriggerInput( "0AMU",
51                                     "ACORDE", 0 ) );
52 }
53
54 void AliACORDETrigger::Trigger()
55 {
56   
57   // 1.- Get loaders and pointers
58   // 2.- Loop over all entries
59   //     set temporal variables to default values
60   //     start the loop
61   // 3.- Loop over all digits in an entrie
62   //     Fill temporal arrays
63   //     Find module with lowest time
64   // 4.- Loop over temporal arrays
65   //     Find number of modules within the time window
66   // 5.- Set the relevant trigger
67
68   // 1.- Get loaders and pointers
69   AliRunLoader* runLoader = AliRunLoader::Instance();
70   AliACORDELoader* loader = 
71     (AliACORDELoader* )runLoader->GetLoader( "ACORDELoader" );
72   loader->LoadDigits("READ");
73   TTree* acordeDigitsTree = loader->TreeD();
74   if (!acordeDigitsTree) return;
75   TClonesArray* acordeDigits = new TClonesArray("AliACORDEdigit",1000);
76   TBranch* digitBranch = acordeDigitsTree->GetBranch("ACORDEdigit");
77   digitBranch->SetAddress(&acordeDigits);
78
79   // 2.- Loop over all entries
80   //     set temporal variables to default values
81
82   Int_t MultiMin = AliACORDEConstants::Instance()->MultiMuonThreshold();
83   Float_t time_window = AliACORDEConstants::Instance()->MultiMuonWindow();
84   Int_t MinTimeModule = -1;
85   Float_t MinTime = 1e10;
86   Float_t ModuleTimes[60];
87   for (Int_t i=0; i<60; i++) ModuleTimes[i] = -1.0;
88
89   //     start the loop
90   Int_t nEntries = (Int_t)acordeDigitsTree->GetEntries();
91   cout << " ===AliACORDETrigger=== nEntries  " <<nEntries << endl; 
92   for (Int_t e=0; e<nEntries; e++) {
93     acordeDigitsTree->GetEvent(e);
94     // 3.- Loop over all digits in an entrie
95     //     Fill temporal arrays
96     //     Find module with lowest time
97     Int_t nDigits = acordeDigits->GetEntriesFast();
98     cout << " ===AliACORDETrigger=== nDigits  " <<nDigits << endl; 
99     for (Int_t d=0; d<nDigits; d++) {
100       AliACORDEdigit* digit = (AliACORDEdigit*)acordeDigits->At(d);
101       Int_t module = digit->GetModule();
102       Float_t mod_time = digit->GetTime();
103       ModuleTimes[module-1]=mod_time;
104       if (mod_time < MinTime) {
105         MinTime = mod_time;
106         MinTimeModule = module;
107       }
108     } // end of loop over digits
109   } // end of loop over events in digits tree
110
111   // 4.- Loop over temporal arrays
112   //     Find number of modules within the time window
113   if (MinTimeModule == -1) return;
114   for (Int_t i=0; i<60; i++) {
115     if (ModuleTimes[i]<0) continue;
116     Float_t diff = ModuleTimes[i]-MinTime;
117     if (diff<time_window) {
118       fMultiMuon++;
119       fModuleFired[i]=kTRUE;
120     }
121   }
122   cout << " fSingleMuon " << fSingleMuon
123        << " MinTime " << MinTime
124        << " fMultiMuon " << fMultiMuon << endl;
125   // 5.- Set the relevant trigger
126   fSingleMuon = MinTimeModule;
127   SetInput( "0ASL" );
128   if (fMultiMuon>=MultiMin) SetInput( "0AMU" );
129   return;
130 }