#include <TTree.h>
#include "AliLog.h"
#include "AliRun.h"
#include "AliLoader.h"
#include "AliRunLoader.h"
#include "AliTriggerInput.h"
#include "AliZDC.h"
#include "AliZDCDigit.h"
#include "AliZDCTrigger.h"
using std::cerr;
ClassImp(AliZDCTrigger)
AliZDCTrigger::AliZDCTrigger() :
AliTriggerDetector(),
fZDCLeftMinCut(0),
fZDCRightMinCut(0),
fZEMMinCut(0),
fZDCLeftMBCut(0),
fZDCRightMBCut(0),
fZDCLeftCentrCut(0),
fZDCRightCentrCut(0),
fZDCLeftSemiCentrCut(0),
fZDCRightSemiCentrCut(0),
fZEMCentrCut(0)
{
SetName("ZDC");
CreateInputs();
SetZDCLeftEMDCuts(0,0);
SetZDCRightEMDCuts(0,0);
}
void AliZDCTrigger::CreateInputs()
{
if( fInputs.GetEntriesFast() > 0 ) return;
fInputs.AddLast(new AliTriggerInput("ZDC_1_L1", "ZDC", 1));
fInputs.AddLast(new AliTriggerInput("ZDC_2_L1", "ZDC", 1));
fInputs.AddLast(new AliTriggerInput("ZDC_3_L1", "ZDC", 1));
fInputs.AddLast(new AliTriggerInput("ZDC_EMD_L1", "ZDC", 1));
}
void AliZDCTrigger::Trigger()
{
AliRunLoader *runLoader = AliRunLoader::Instance();
AliLoader *aZDCLoader = runLoader->GetLoader("ZDCLoader");
aZDCLoader->LoadDigits("READ");
AliZDCDigit digit;
AliZDCDigit* pdigit = &digit;
TTree* tD = aZDCLoader->TreeD();
if (!tD) {
cerr<<"AliZDCTrigger: digits tree not found\n";
return;
}
tD->SetBranchAddress("ZDC", &pdigit);
Float_t signalZNLeft[]={0,0}, signalZPLeft[]={0,0}, signalZDCLeftSum[]={0,0};
Float_t signalZNRight[]={0,0}, signalZPRight[]={0,0}, signalZDCRightSum[]={0,0};
Float_t signalZEMSum[]={0,0};
for(Int_t iDigit=0; iDigit<tD->GetEntries(); iDigit++){
tD->GetEntry(iDigit);
if(digit.GetSector(0)==1)
for(Int_t i=0; i<2; i++){
signalZNLeft[i] += digit.GetADCValue(i);
signalZDCLeftSum[i] += digit.GetADCValue(i);
}
else if(digit.GetSector(0)==2)
for(Int_t i=0; i<2; i++){
signalZPLeft[i] += digit.GetADCValue(i);
signalZDCLeftSum[i] += digit.GetADCValue(i);
}
else if(digit.GetSector(0)==3)
for(Int_t i=0; i<2; i++) signalZEMSum[i] += digit.GetADCValue(i);
else if(digit.GetSector(0)==4)
for(Int_t i=0; i<2; i++){
signalZNRight[i] += digit.GetADCValue(i);
signalZDCRightSum[i] += digit.GetADCValue(i);
}
else if(digit.GetSector(0)==5)
for(Int_t i=0; i<2; i++){
signalZPRight[i] += digit.GetADCValue(i);
signalZDCRightSum[i] += digit.GetADCValue(i);
}
}
if(signalZDCLeftSum[1]>fZDCLeftMBCut && signalZDCRightSum[1]>fZDCRightMBCut)
SetInput("ZDC_1_L1");
if(signalZDCLeftSum[1]>fZDCLeftCentrCut && signalZDCLeftSum[1]<fZDCLeftSemiCentrCut &&
signalZDCRightSum[1]>fZDCRightCentrCut && signalZDCRightSum[1]<fZDCRightSemiCentrCut
&& signalZEMSum[1]>fZEMCentrCut)
SetInput("ZDC_2_L1");
if(signalZDCLeftSum[1]>fZDCLeftMinCut && signalZDCLeftSum[1]<fZDCLeftCentrCut &&
signalZDCRightSum[1]>fZDCRightMinCut && signalZDCRightSum[1]<fZDCRightCentrCut &&
signalZEMSum[1]>fZEMCentrCut)
SetInput("ZDC_3_L1");
if(signalZNLeft[0]>fZDCLeftEMDCuts[0] && signalZNLeft[0]<fZDCLeftEMDCuts[1] &&
signalZNRight[0]>fZDCRightEMDCuts[0] && signalZNRight[0]<fZDCRightEMDCuts[1] &&
signalZEMSum[1]<fZEMMinCut){
SetInput("ZDC_EMD_L1");
}
}
void AliZDCTrigger::SetZDCLeftMinCut(Float_t ZDCLeftMinCut)
{
if(ZDCLeftMinCut) fZDCLeftMinCut = ZDCLeftMinCut;
else fZDCLeftMinCut = 800.;
}
void AliZDCTrigger::SetZDCRightMinCut(Float_t ZDCRightMinCut)
{
if(ZDCRightMinCut) fZDCRightMinCut = ZDCRightMinCut;
else fZDCRightMinCut = 800.;
}
void AliZDCTrigger::SetZEMMinCut(Float_t ZEMMinCut)
{
if(ZEMMinCut) fZEMMinCut = ZEMMinCut;
else fZEMMinCut = 80.;
}
void AliZDCTrigger::SetZDCLeftEMDCuts(Float_t* ZDCLeftEMDCuts)
{
if(ZDCLeftEMDCuts) for(int j=0; j<2; j++) fZDCLeftEMDCuts[j] = ZDCLeftEMDCuts[j];
else{
fZDCLeftEMDCuts[0] = 600.;
fZDCLeftEMDCuts[1] = 1000.;
}
}
void AliZDCTrigger::SetZDCLeftEMDCuts(Float_t ZDCLeftEMDCutInf,
Float_t ZDCLeftEMDCutSup)
{
if(ZDCLeftEMDCutInf && ZDCLeftEMDCutSup){
fZDCLeftEMDCuts[0]=ZDCLeftEMDCutInf;
fZDCLeftEMDCuts[1]=ZDCLeftEMDCutSup;
}
else{
fZDCLeftEMDCuts[0] = 600.;
fZDCLeftEMDCuts[1] = 1000.;
}
}
void AliZDCTrigger::SetZDCRightEMDCuts(Float_t* ZDCRightEMDCuts)
{
if(ZDCRightEMDCuts) for(int j=0; j<2; j++) fZDCRightEMDCuts[j] = ZDCRightEMDCuts[j];
else{
fZDCRightEMDCuts[0] = 600.;
fZDCRightEMDCuts[1] = 1000.;
}
}
void AliZDCTrigger::SetZDCRightEMDCuts(Float_t ZDCRightEMDCutInf,
Float_t ZDCRightEMDCutSup)
{
if(ZDCRightEMDCutInf && ZDCRightEMDCutSup){
fZDCRightEMDCuts[0]=ZDCRightEMDCutInf;
fZDCRightEMDCuts[1]=ZDCRightEMDCutSup;
}
else{
fZDCRightEMDCuts[0] = 600.;
fZDCRightEMDCuts[1] = 1000.;
}
}
void AliZDCTrigger::SetZDCLeftMBCut(Float_t ZDCLeftMBCut)
{
if(ZDCLeftMBCut) fZDCLeftMBCut = ZDCLeftMBCut;
else fZDCLeftMBCut = 800.;
}
void AliZDCTrigger::SetZDCRightMBCut(Float_t ZDCRightMBCut)
{
if(ZDCRightMBCut) fZDCRightMBCut = ZDCRightMBCut;
else fZDCRightMBCut = 800.;
}
void AliZDCTrigger::SetZDCLeftCentrCut(Float_t ZDCLeftCentrCut)
{
if(ZDCLeftCentrCut) fZDCLeftCentrCut = ZDCLeftCentrCut;
else fZDCLeftCentrCut = 10000.;
}
void AliZDCTrigger::SetZDCRightCentrCut(Float_t ZDCRightCentrCut)
{
if(ZDCRightCentrCut) fZDCRightCentrCut = ZDCRightCentrCut;
else fZDCRightCentrCut = 10000.;
}
void AliZDCTrigger::SetZDCLeftSemiCentrCut(Float_t ZDCLeftSemiCentrCut)
{
if(ZDCLeftSemiCentrCut) fZDCLeftSemiCentrCut = ZDCLeftSemiCentrCut;
else fZDCLeftSemiCentrCut = 18500.;
}
void AliZDCTrigger::SetZDCRightSemiCentrCut(Float_t ZDCRightSemiCentrCut)
{
if(ZDCRightSemiCentrCut) fZDCRightSemiCentrCut = ZDCRightSemiCentrCut;
else fZDCRightSemiCentrCut = 18500.;
}
void AliZDCTrigger::SetZEMCentrCut(Float_t ZEMCentrCut)
{
if(ZEMCentrCut) fZEMCentrCut = ZEMCentrCut;
else fZEMCentrCut = 210.;
}