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.                  *
 **************************************************************************/
//This class produces PHOS trigger digits of one event.
//Authors: Henrik Qvigstad, Boris Polishchuk.

#include "AliPHOSTriggerRawDigiProducer.h"
#include "AliPHOSTriggerRawReader.h"
#include "AliPHOSTRURawReader.h"
#include "AliPHOSTriggerParameters.h"
#include "AliPHOSTriggerRawDigit.h"
#include "AliPHOSGeometry.h"
#include "AliRawReader.h"
#include "AliCaloRawStreamV3.h"

#include "TH1I.h"
#include "TH2I.h"

#include <iostream>
using namespace std;

ClassImp(AliPHOSTriggerRawDigiProducer)

AliPHOSTriggerRawDigiProducer::AliPHOSTriggerRawDigiProducer()
  :fModules(kNMods, false),
   fSaturationThreshold(950),
   fParameters(0),
   fRawReader(0),
   fRawStream(0),
   fTriggerReader(0)
{}

AliPHOSTriggerRawDigiProducer::AliPHOSTriggerRawDigiProducer(AliRawReader *rawReader)
  :fModules(kNMods, false),
   fSaturationThreshold(950),
   fParameters(0),
   fRawReader(rawReader),
   fRawStream(0),
   fTriggerReader(new AliPHOSTriggerRawReader)
{
  SetAnalyseModule(2);
  SetAnalyseModule(3);
  SetAnalyseModule(4);

  fRawStream = new AliCaloRawStreamV3(rawReader,"PHOS");
}

AliPHOSTriggerRawDigiProducer::~AliPHOSTriggerRawDigiProducer()
{
  delete fRawStream;
  delete fTriggerReader;
}

void AliPHOSTriggerRawDigiProducer::ProcessEvent(TClonesArray* tdigits)
{
  
  fTriggerReader->Reset();

  tdigits->Clear();
  Int_t iDigit=0 ;

  while (fRawStream->NextDDL()) {
    while (fRawStream->NextChannel()) {

      if (fRawStream->IsTRUData()) {
	fTriggerReader->ReadFromStream(fRawStream);
      }// IsTRUData
    }// NextChannel
  }//NextDDL
	
  // Loop over modules
  for(unsigned int mod = 0; mod < fModules.size(); ++mod) {
    if( fModules[mod] ) {
      
      // Loop over 4x4 cells
      for(int TRURow = 0; TRURow < kNTRURows; ++TRURow) {
	for(int branch = 0; branch < kNBranches; ++branch) {
	  
	  AliPHOSTRURawReader* truReader = fTriggerReader->GetTRU(mod, TRURow, branch);
	  if( truReader->IsActive() ) {
	    
	    for(int xIdx = 0; xIdx < kN4x4XPrTRURow; ++xIdx) {
	      for(int zIdx = 0; zIdx < kN4x4ZPrBranch; ++zIdx) {
	      
		// Determin if Trigger is flagged for any timeBin
		bool triggered = false;

		for(int timeBin = 0; timeBin < kNTRUTimeBins; ++timeBin){
		  if(truReader->IsActive(timeBin)) {
		    if( fTriggerReader->GetTRU(mod, TRURow, branch)->GetTriggerFlag(xIdx, zIdx, timeBin) ){
		      triggered = true;
		    } // end "if TriggerBit"
		  }
		}// end TimeBin loop
		
		if( triggered ){
		  // Get peak values
		  const int TSmax = Get4x4Max(fTriggerReader, fParameters, mod, TRURow, branch, xIdx, zIdx);
		  new((*tdigits)[iDigit]) AliPHOSTriggerRawDigit(mod,xIdx,zIdx,TRURow,branch,TSmax); 
		  iDigit++;
		}// end  "if triggered"
	      
	      } // end zIdx loop
	    } // end xIdx loop
	  } // truReader->IsActive
	} // end branch loop
      } // end tru loop
    } // end "if module"
  } // end mod loop
  
}

int AliPHOSTriggerRawDigiProducer::Get2x2Max(AliPHOSTriggerRawReader* reader, AliPHOSTriggerParameters* params, int mod, int xIdx, int zIdx)
{
  int max = 0;
  for(int timeBin = 0; timeBin < kNTRUTimeBins; ++timeBin) {
    const int signal = Get2x2Signal(reader, params, mod, xIdx, zIdx, timeBin);
    if( max < signal ){
      max = signal;
    }
  }
  return max;
}


int AliPHOSTriggerRawDigiProducer::Get2x2Signal(AliPHOSTriggerRawReader* reader, AliPHOSTriggerParameters* parameters, int mod, int xIdx, int zIdx, int timeBin)
{
  const int TRURow = xIdx / kN2x2XPrTRURow;
  const int branch = zIdx / kN2x2ZPrBranch;
  const int TRUX = xIdx % kN2x2XPrTRURow; // 2x2 coordinates
  const int TRUZ = zIdx % kN2x2ZPrBranch; // 2x2 coordinates

  if( reader->GetTRU(mod, TRURow, branch)->IsActive() ){
    const int signal = reader->GetTRU(mod, TRURow, branch)->GetTriggerSignal( TRUX, TRUZ, timeBin);
    if( parameters )
      return signal - parameters->GetTRUPedestal(mod, TRURow, branch, TRUX, TRUZ);
    else
      return signal - AliPHOSTRURawReader::GetDefaultSignalValue();
  }
  else
    return 0;
}

int AliPHOSTriggerRawDigiProducer::Get4x4Max(AliPHOSTriggerRawReader* reader, AliPHOSTriggerParameters* params, int mod, int TRURow, int branch, int xIdx, int zIdx)
{
  int max = 0;
  for(int timeBin = 0; timeBin < kNTRUTimeBins; ++timeBin) {
    const int signal = Get4x4Signal(reader, params, mod, TRURow, branch, xIdx, zIdx, timeBin);
    if( max < signal ){
      max = signal;
    }
  }
  return max;
}


int AliPHOSTriggerRawDigiProducer::Get4x4Signal(AliPHOSTriggerRawReader* reader, AliPHOSTriggerParameters* params, int mod, int TRURow, int branch, int xIdx, int zIdx, int timeBin)
{
  const int modX = xIdx + TRURow * kN2x2XPrTRURow;
  const int modZ = zIdx + branch * kN2x2ZPrBranch;

  const int signal
    = Get2x2Signal(reader, params, mod, modX  , modZ  , timeBin)
      + Get2x2Signal(reader, params, mod, modX+1, modZ  , timeBin)
      + Get2x2Signal(reader, params, mod, modX  , modZ+1, timeBin)
      + Get2x2Signal(reader, params, mod, modX+1, modZ+1, timeBin);
  return signal;
}

bool AliPHOSTriggerRawDigiProducer::Is2x2Active(AliPHOSTriggerRawReader* reader, int mod, int xIdx, int zIdx)
{
  const int TRURow = xIdx / kN2x2XPrTRURow;
  const int branch = zIdx / kN2x2ZPrBranch;

  return reader->GetTRU(mod, TRURow, branch)->IsActive();
}

bool AliPHOSTriggerRawDigiProducer::Is2x2Active(AliPHOSTriggerRawReader* reader, int mod, int xIdx, int zIdx, int timeBin)
{
  const int TRURow = xIdx / kN2x2XPrTRURow;
  const int branch = zIdx / kN2x2ZPrBranch;

  return reader->GetTRU(mod, TRURow, branch)->IsActive(timeBin);
}


 AliPHOSTriggerRawDigiProducer.cxx:1
 AliPHOSTriggerRawDigiProducer.cxx:2
 AliPHOSTriggerRawDigiProducer.cxx:3
 AliPHOSTriggerRawDigiProducer.cxx:4
 AliPHOSTriggerRawDigiProducer.cxx:5
 AliPHOSTriggerRawDigiProducer.cxx:6
 AliPHOSTriggerRawDigiProducer.cxx:7
 AliPHOSTriggerRawDigiProducer.cxx:8
 AliPHOSTriggerRawDigiProducer.cxx:9
 AliPHOSTriggerRawDigiProducer.cxx:10
 AliPHOSTriggerRawDigiProducer.cxx:11
 AliPHOSTriggerRawDigiProducer.cxx:12
 AliPHOSTriggerRawDigiProducer.cxx:13
 AliPHOSTriggerRawDigiProducer.cxx:14
 AliPHOSTriggerRawDigiProducer.cxx:15
 AliPHOSTriggerRawDigiProducer.cxx:16
 AliPHOSTriggerRawDigiProducer.cxx:17
 AliPHOSTriggerRawDigiProducer.cxx:18
 AliPHOSTriggerRawDigiProducer.cxx:19
 AliPHOSTriggerRawDigiProducer.cxx:20
 AliPHOSTriggerRawDigiProducer.cxx:21
 AliPHOSTriggerRawDigiProducer.cxx:22
 AliPHOSTriggerRawDigiProducer.cxx:23
 AliPHOSTriggerRawDigiProducer.cxx:24
 AliPHOSTriggerRawDigiProducer.cxx:25
 AliPHOSTriggerRawDigiProducer.cxx:26
 AliPHOSTriggerRawDigiProducer.cxx:27
 AliPHOSTriggerRawDigiProducer.cxx:28
 AliPHOSTriggerRawDigiProducer.cxx:29
 AliPHOSTriggerRawDigiProducer.cxx:30
 AliPHOSTriggerRawDigiProducer.cxx:31
 AliPHOSTriggerRawDigiProducer.cxx:32
 AliPHOSTriggerRawDigiProducer.cxx:33
 AliPHOSTriggerRawDigiProducer.cxx:34
 AliPHOSTriggerRawDigiProducer.cxx:35
 AliPHOSTriggerRawDigiProducer.cxx:36
 AliPHOSTriggerRawDigiProducer.cxx:37
 AliPHOSTriggerRawDigiProducer.cxx:38
 AliPHOSTriggerRawDigiProducer.cxx:39
 AliPHOSTriggerRawDigiProducer.cxx:40
 AliPHOSTriggerRawDigiProducer.cxx:41
 AliPHOSTriggerRawDigiProducer.cxx:42
 AliPHOSTriggerRawDigiProducer.cxx:43
 AliPHOSTriggerRawDigiProducer.cxx:44
 AliPHOSTriggerRawDigiProducer.cxx:45
 AliPHOSTriggerRawDigiProducer.cxx:46
 AliPHOSTriggerRawDigiProducer.cxx:47
 AliPHOSTriggerRawDigiProducer.cxx:48
 AliPHOSTriggerRawDigiProducer.cxx:49
 AliPHOSTriggerRawDigiProducer.cxx:50
 AliPHOSTriggerRawDigiProducer.cxx:51
 AliPHOSTriggerRawDigiProducer.cxx:52
 AliPHOSTriggerRawDigiProducer.cxx:53
 AliPHOSTriggerRawDigiProducer.cxx:54
 AliPHOSTriggerRawDigiProducer.cxx:55
 AliPHOSTriggerRawDigiProducer.cxx:56
 AliPHOSTriggerRawDigiProducer.cxx:57
 AliPHOSTriggerRawDigiProducer.cxx:58
 AliPHOSTriggerRawDigiProducer.cxx:59
 AliPHOSTriggerRawDigiProducer.cxx:60
 AliPHOSTriggerRawDigiProducer.cxx:61
 AliPHOSTriggerRawDigiProducer.cxx:62
 AliPHOSTriggerRawDigiProducer.cxx:63
 AliPHOSTriggerRawDigiProducer.cxx:64
 AliPHOSTriggerRawDigiProducer.cxx:65
 AliPHOSTriggerRawDigiProducer.cxx:66
 AliPHOSTriggerRawDigiProducer.cxx:67
 AliPHOSTriggerRawDigiProducer.cxx:68
 AliPHOSTriggerRawDigiProducer.cxx:69
 AliPHOSTriggerRawDigiProducer.cxx:70
 AliPHOSTriggerRawDigiProducer.cxx:71
 AliPHOSTriggerRawDigiProducer.cxx:72
 AliPHOSTriggerRawDigiProducer.cxx:73
 AliPHOSTriggerRawDigiProducer.cxx:74
 AliPHOSTriggerRawDigiProducer.cxx:75
 AliPHOSTriggerRawDigiProducer.cxx:76
 AliPHOSTriggerRawDigiProducer.cxx:77
 AliPHOSTriggerRawDigiProducer.cxx:78
 AliPHOSTriggerRawDigiProducer.cxx:79
 AliPHOSTriggerRawDigiProducer.cxx:80
 AliPHOSTriggerRawDigiProducer.cxx:81
 AliPHOSTriggerRawDigiProducer.cxx:82
 AliPHOSTriggerRawDigiProducer.cxx:83
 AliPHOSTriggerRawDigiProducer.cxx:84
 AliPHOSTriggerRawDigiProducer.cxx:85
 AliPHOSTriggerRawDigiProducer.cxx:86
 AliPHOSTriggerRawDigiProducer.cxx:87
 AliPHOSTriggerRawDigiProducer.cxx:88
 AliPHOSTriggerRawDigiProducer.cxx:89
 AliPHOSTriggerRawDigiProducer.cxx:90
 AliPHOSTriggerRawDigiProducer.cxx:91
 AliPHOSTriggerRawDigiProducer.cxx:92
 AliPHOSTriggerRawDigiProducer.cxx:93
 AliPHOSTriggerRawDigiProducer.cxx:94
 AliPHOSTriggerRawDigiProducer.cxx:95
 AliPHOSTriggerRawDigiProducer.cxx:96
 AliPHOSTriggerRawDigiProducer.cxx:97
 AliPHOSTriggerRawDigiProducer.cxx:98
 AliPHOSTriggerRawDigiProducer.cxx:99
 AliPHOSTriggerRawDigiProducer.cxx:100
 AliPHOSTriggerRawDigiProducer.cxx:101
 AliPHOSTriggerRawDigiProducer.cxx:102
 AliPHOSTriggerRawDigiProducer.cxx:103
 AliPHOSTriggerRawDigiProducer.cxx:104
 AliPHOSTriggerRawDigiProducer.cxx:105
 AliPHOSTriggerRawDigiProducer.cxx:106
 AliPHOSTriggerRawDigiProducer.cxx:107
 AliPHOSTriggerRawDigiProducer.cxx:108
 AliPHOSTriggerRawDigiProducer.cxx:109
 AliPHOSTriggerRawDigiProducer.cxx:110
 AliPHOSTriggerRawDigiProducer.cxx:111
 AliPHOSTriggerRawDigiProducer.cxx:112
 AliPHOSTriggerRawDigiProducer.cxx:113
 AliPHOSTriggerRawDigiProducer.cxx:114
 AliPHOSTriggerRawDigiProducer.cxx:115
 AliPHOSTriggerRawDigiProducer.cxx:116
 AliPHOSTriggerRawDigiProducer.cxx:117
 AliPHOSTriggerRawDigiProducer.cxx:118
 AliPHOSTriggerRawDigiProducer.cxx:119
 AliPHOSTriggerRawDigiProducer.cxx:120
 AliPHOSTriggerRawDigiProducer.cxx:121
 AliPHOSTriggerRawDigiProducer.cxx:122
 AliPHOSTriggerRawDigiProducer.cxx:123
 AliPHOSTriggerRawDigiProducer.cxx:124
 AliPHOSTriggerRawDigiProducer.cxx:125
 AliPHOSTriggerRawDigiProducer.cxx:126
 AliPHOSTriggerRawDigiProducer.cxx:127
 AliPHOSTriggerRawDigiProducer.cxx:128
 AliPHOSTriggerRawDigiProducer.cxx:129
 AliPHOSTriggerRawDigiProducer.cxx:130
 AliPHOSTriggerRawDigiProducer.cxx:131
 AliPHOSTriggerRawDigiProducer.cxx:132
 AliPHOSTriggerRawDigiProducer.cxx:133
 AliPHOSTriggerRawDigiProducer.cxx:134
 AliPHOSTriggerRawDigiProducer.cxx:135
 AliPHOSTriggerRawDigiProducer.cxx:136
 AliPHOSTriggerRawDigiProducer.cxx:137
 AliPHOSTriggerRawDigiProducer.cxx:138
 AliPHOSTriggerRawDigiProducer.cxx:139
 AliPHOSTriggerRawDigiProducer.cxx:140
 AliPHOSTriggerRawDigiProducer.cxx:141
 AliPHOSTriggerRawDigiProducer.cxx:142
 AliPHOSTriggerRawDigiProducer.cxx:143
 AliPHOSTriggerRawDigiProducer.cxx:144
 AliPHOSTriggerRawDigiProducer.cxx:145
 AliPHOSTriggerRawDigiProducer.cxx:146
 AliPHOSTriggerRawDigiProducer.cxx:147
 AliPHOSTriggerRawDigiProducer.cxx:148
 AliPHOSTriggerRawDigiProducer.cxx:149
 AliPHOSTriggerRawDigiProducer.cxx:150
 AliPHOSTriggerRawDigiProducer.cxx:151
 AliPHOSTriggerRawDigiProducer.cxx:152
 AliPHOSTriggerRawDigiProducer.cxx:153
 AliPHOSTriggerRawDigiProducer.cxx:154
 AliPHOSTriggerRawDigiProducer.cxx:155
 AliPHOSTriggerRawDigiProducer.cxx:156
 AliPHOSTriggerRawDigiProducer.cxx:157
 AliPHOSTriggerRawDigiProducer.cxx:158
 AliPHOSTriggerRawDigiProducer.cxx:159
 AliPHOSTriggerRawDigiProducer.cxx:160
 AliPHOSTriggerRawDigiProducer.cxx:161
 AliPHOSTriggerRawDigiProducer.cxx:162
 AliPHOSTriggerRawDigiProducer.cxx:163
 AliPHOSTriggerRawDigiProducer.cxx:164
 AliPHOSTriggerRawDigiProducer.cxx:165
 AliPHOSTriggerRawDigiProducer.cxx:166
 AliPHOSTriggerRawDigiProducer.cxx:167
 AliPHOSTriggerRawDigiProducer.cxx:168
 AliPHOSTriggerRawDigiProducer.cxx:169
 AliPHOSTriggerRawDigiProducer.cxx:170
 AliPHOSTriggerRawDigiProducer.cxx:171
 AliPHOSTriggerRawDigiProducer.cxx:172
 AliPHOSTriggerRawDigiProducer.cxx:173
 AliPHOSTriggerRawDigiProducer.cxx:174
 AliPHOSTriggerRawDigiProducer.cxx:175
 AliPHOSTriggerRawDigiProducer.cxx:176
 AliPHOSTriggerRawDigiProducer.cxx:177
 AliPHOSTriggerRawDigiProducer.cxx:178
 AliPHOSTriggerRawDigiProducer.cxx:179
 AliPHOSTriggerRawDigiProducer.cxx:180
 AliPHOSTriggerRawDigiProducer.cxx:181
 AliPHOSTriggerRawDigiProducer.cxx:182
 AliPHOSTriggerRawDigiProducer.cxx:183
 AliPHOSTriggerRawDigiProducer.cxx:184
 AliPHOSTriggerRawDigiProducer.cxx:185
 AliPHOSTriggerRawDigiProducer.cxx:186
 AliPHOSTriggerRawDigiProducer.cxx:187
 AliPHOSTriggerRawDigiProducer.cxx:188
 AliPHOSTriggerRawDigiProducer.cxx:189
 AliPHOSTriggerRawDigiProducer.cxx:190
 AliPHOSTriggerRawDigiProducer.cxx:191
 AliPHOSTriggerRawDigiProducer.cxx:192
 AliPHOSTriggerRawDigiProducer.cxx:193
 AliPHOSTriggerRawDigiProducer.cxx:194
 AliPHOSTriggerRawDigiProducer.cxx:195
 AliPHOSTriggerRawDigiProducer.cxx:196
 AliPHOSTriggerRawDigiProducer.cxx:197