/* $Id$ */
+#include <TError.h>
+
#include "AliMUONTriggerCircuit.h"
#include "AliMUONTriggerDecision.h"
#include "AliMUONTriggerLut.h"
-#include "AliMUONHitMapA1.h"
-#include "AliRun.h"
#include "AliMUON.h"
+#include "AliMUONDigit.h"
+#include "AliMUONConstants.h"
+#include "AliMUONGlobalTrigger.h"
+#include "AliMUONLocalTrigger.h"
+#include "AliRun.h"
#include "AliRunLoader.h"
#include "AliLoader.h"
-#include "AliSegmentation.h"
-#include "AliMUONResponse.h"
-#include "AliMUONChamber.h"
-#include "AliMUONDigit.h"
+#include "AliRawReader.h" // for raw data
-#include <TF1.h>
-#include <TTree.h>
-#include <TCanvas.h>
-#include <TH1.h>
-#include <TPad.h>
-#include <TGraph.h>
-#include <TPostScript.h>
-#include <TMinuit.h>
-#include <Riostream.h>
-
//----------------------------------------------------------------------
ClassImp(AliMUONTriggerDecision)
//----------------------------------------------------------------------
-AliMUONTriggerDecision::AliMUONTriggerDecision(Int_t iprint)
+AliMUONTriggerDecision::AliMUONTriggerDecision(AliLoader* loader, Int_t iprint, AliMUONData* data)
+ : TObject()
{
// Constructor
fDebug = iprint; // print option
fXbit21[icirc][istrip]=fXbit22[icirc][istrip]=0;
}
}
+
+ fTriggerCircuit = new TObjArray(AliMUONConstants::NTriggerCircuit());
+
+ // initialize loader's
+ fLoader = loader;
+
+ // initialize container
+ if (data == 0)
+ Error("TriggerDecision","No MUONdata for trigger\n");
+ else
+ fMUONData = data;
+
+ // Loading AliRun master
+ AliRunLoader* runloader = fLoader->GetRunLoader();
+ if (runloader->GetAliRun() == 0x0) runloader->LoadgAlice();
+ gAlice = runloader->GetAliRun();
+
+ // getting MUON
+ fMUON = (AliMUON*) gAlice->GetDetector("MUON");
+
+ // setting circuit
+ for (icirc = 0; icirc < AliMUONConstants::NTriggerCircuit(); icirc++) {
+ AliMUONTriggerCircuit* pCir = 0;
+ pCir = &(fMUON->TriggerCircuit(icirc));
+ fTriggerCircuit->AddAt(pCir, icirc);
+ }
+
+ // setting digits
+ fDigits = new TObjArray(AliMUONConstants::NCh()); //NTriggerCh
+ for (Int_t i=0; i<AliMUONConstants::NCh() ;i++)
+ fDigits->AddAt(new TClonesArray("AliMUONDigit",10000),i);
+}
+
+//----------------------------------------------------------------------
+AliMUONTriggerDecision::AliMUONTriggerDecision()
+ : TObject(),
+ fLoader(0),
+ fTriggerCircuit(0),
+ fMUONData(0),
+ fMUON(0)
+{
+// Default constructor
+}
+
+//----------------------------------------------------------------------
+AliMUONTriggerDecision::AliMUONTriggerDecision(const AliMUONTriggerDecision& rhs)
+ : TObject(rhs)
+{
+// Protected copy constructor
+
+ Fatal("AliMUONTriggerDecision", "Not implemented.");
+}
+
+//----------------------------------------------------------------------
+void AliMUONTriggerDecision::ClearDigits()
+{
+ for ( int i=0;i<AliMUONConstants::NCh();i++ )
+ if ((*fDigits)[i]) ((TClonesArray*)fDigits->At(i))->Clear();
+}
+
+//----------------------------------------------------------------------
+TClonesArray* AliMUONTriggerDecision::Digits(Int_t DetectionPlane)
+{
+ //Getting List of Digits
+ if (fDigits)
+ return ((TClonesArray*) fDigits->At(DetectionPlane));
+ else
+ return NULL;
+}
+
+//_____________________________________________________________________________
+void AliMUONTriggerDecision::AddDigit(Int_t id, Int_t *tracks, Int_t *charges, Int_t *digits)
+{
+ //
+ // Add a MUON digit to the list of Digits of the detection plane id
+ //
+ TClonesArray &ldigits = *Digits(id);
+ new(ldigits[ldigits.GetEntriesFast()]) AliMUONDigit(tracks,charges,digits);
}
//----------------------------------------------------------------------
AliMUONTriggerDecision::~AliMUONTriggerDecision()
{
// Destructor
+ if (fTriggerCircuit){
+ fTriggerCircuit->Clear();// Sets pointers to 0 since it is not the owner
+ delete fTriggerCircuit;
+ }
+// if (fMUONData)
+// delete fMUONData;
+
+ if (fDigits) {
+ fDigits->Delete();
+ delete fDigits;
+ }
+
}
+//----------------------------------------------------------------------
+AliMUONTriggerDecision&
+AliMUONTriggerDecision::operator=(const AliMUONTriggerDecision& rhs)
+{
+// Protected assignement operator
+
+ if (this == &rhs) return *this;
+
+ Fatal("operator=", "Not implemented.");
+
+ return *this;
+}
+
+
//----------------------------------------------------------------------
void AliMUONTriggerDecision::Trigger(){
// main method of the class which calls the overall Trigger procedure
Int_t coinc44=0, resetMid=0; // initialize coincidence
- AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
AliMUONTriggerCircuit* triggerCircuit;
for (Int_t icirc=0; icirc<234; icirc++) { // loop on circuits
- triggerCircuit = &(pMUON->TriggerCircuit(icirc));
+ triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
// Int_t idCircuit=triggerCircuit->GetIdCircuit();
Int_t minDevStrip[5], minDev[5], coordY[5];
// 3) remove soft background
// 4) set the bit patterns
-
- AliMUON *pMUON = (AliMUON*)gAlice->GetDetector("MUON");
+ Int_t cathode;
AliMUONTriggerCircuit* triggerCircuit;
- AliRunLoader * rl = AliRunLoader::GetRunLoader();
- AliLoader * gime = rl->GetLoader("MUONLoader");
- for (Int_t chamber=11; chamber<15; chamber++){
- for (Int_t cathode=1; cathode<3; cathode++){
-
- AliMUONChamber* iChamber = &(pMUON->Chamber(chamber-1));
- AliSegmentation* segmentation;
- gime->TreeD()->GetEvent(cathode-1);
- TClonesArray *muonDigits = pMUON->GetMUONData()->Digits(chamber-1,0);
+ for (Int_t chamber = 11; chamber < 15; chamber++){
+ // for (Int_t cathode=1; cathode<3; cathode++){
+ // fMUONData->GetCathode(cathode-1);
+
+ TClonesArray *muonDigits = Digits(chamber-1);
Int_t ndigits = muonDigits->GetEntriesFast();
- printf("\n 1 Found %d digits in %p %d \n ", ndigits, muonDigits,chamber-1);
-// if (ndigits == 0) return;
-
-// iChamber = &(pMUON->Chamber(chamber-1));
- segmentation=iChamber->SegmentationModel(cathode);
+ if (fDebug>=3)
+ printf("\nFound %d digits in %p %d \n", ndigits, (void*)muonDigits,chamber-1);
+
AliMUONDigit *mdig;
- for (Int_t digit=0; digit<ndigits; digit++) {
+ for (Int_t digit = 0; digit < ndigits; digit++) {
mdig = (AliMUONDigit*)muonDigits->UncheckedAt(digit);
// get the center of the pad Id
Int_t ix=mdig->PadX();
Int_t iy=mdig->PadY();
- printf("digits %d ix %d iy %d \n",digit,ix,iy);
+ cathode = mdig->Cathode() + 1;
+ if (fDebug>=3)
+ printf("cathode %d ix %d iy %d \n",cathode,ix,iy);
// get the sum of the coded charge
// see coding convention in AliMUONChamberTrigger::DisIntegration
{
case 11:
for (icirc=0; icirc<234; icirc++) {
- triggerCircuit = &(pMUON->TriggerCircuit(icirc));
+ triggerCircuit = (AliMUONTriggerCircuit*) fTriggerCircuit->At(icirc);
for (istrip=0; istrip<16; istrip++) {
if (triggerCircuit->GetXcode(0,istrip)==code)
fXbit11[icirc][istrip]=1;
break;
case 12:
for (icirc=0; icirc<234; icirc++) {
- triggerCircuit = &(pMUON->TriggerCircuit(icirc));
+ triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
for (istrip=0; istrip<16; istrip++) {
if (triggerCircuit->GetXcode(1,istrip)==code)
fXbit12[icirc][istrip]=1;
break;
case 13:
for (icirc=0; icirc<234; icirc++) {
- triggerCircuit = &(pMUON->TriggerCircuit(icirc));
+ triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
for (istrip=0; istrip<32; istrip++) {
if (triggerCircuit->GetXcode(2,istrip)==code)
fXbit21[icirc][istrip]=1;
break;
case 14:
for (icirc=0; icirc<234; icirc++) {
- triggerCircuit = &(pMUON->TriggerCircuit(icirc));
+ triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
for (istrip=0; istrip<32; istrip++) {
if (triggerCircuit->GetXcode(3,istrip)==code)
fXbit22[icirc][istrip]=1;
{
case 11:
for (icirc=0; icirc<234; icirc++) {
- triggerCircuit = &(pMUON->TriggerCircuit(icirc));
+ triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
nStrip=triggerCircuit->GetNstripY();
for (istrip=0; istrip<nStrip; istrip++) {
if (triggerCircuit->GetYcode(0,istrip)==code)
break;
case 12:
for (icirc=0; icirc<234; icirc++) {
- triggerCircuit = &(pMUON->TriggerCircuit(icirc));
+ triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
nStrip=triggerCircuit->GetNstripY();
for (istrip=0; istrip<nStrip; istrip++) {
if (triggerCircuit->GetYcode(1,istrip)==code)
break;
case 13:
for (icirc=0; icirc<234; icirc++) {
- triggerCircuit = &(pMUON->TriggerCircuit(icirc));
+ triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
nStrip=triggerCircuit->GetNstripY();
for (istrip=0; istrip<nStrip; istrip++) {
if (triggerCircuit->GetYcode(2,istrip)==code)
break;
case 14:
for (icirc=0; icirc<234; icirc++) {
- triggerCircuit = &(pMUON->TriggerCircuit(icirc));
+ triggerCircuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
nStrip=triggerCircuit->GetNstripY();
for (istrip=0; istrip<nStrip; istrip++) {
if (triggerCircuit->GetYcode(3,istrip)==code)
} // if cathode
} // remove soft background
} // end loop on digit
- pMUON->GetMUONData()->ResetDigits();
- } // end loop on cathode
+ fMUONData->ResetDigits();
+ // } // end loop on cathode
} // end loop on chamber
}
// Set Y bit for up and down parts of circuits
Int_t idModule, nStripX, nStripY, iPosCircuit;
- AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
for (Int_t icirc=0; icirc<234; icirc++) {
AliMUONTriggerCircuit* circuitD; // circuit Down
AliMUONTriggerCircuit* circuitU; // circuit Up
- circuit = &(pMUON->TriggerCircuit(icirc));
+ circuit = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icirc);
idModule=circuit->GetIdModule(); // corresponding module Id.
nStripX=circuit->GetNstripX(); // number of X strips
nStripY=circuit->GetNstripY(); // number of Y strips
if (iPosCircuit==1) { // need to scan lower module
if(idModule<91&&TMath::Abs(idModule)!=41&&idModule>-91) {
Int_t icircD=circuit->GetICircuitD();
- circuitD = &(pMUON->TriggerCircuit(icircD));
+ circuitD = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icircD);
Int_t nStripD=circuitD->GetNstripY();
if (TMath::Abs(idModule)==42) { // shift of +8 bits
(iPosCircuit==3&&nStripX==48)||(iPosCircuit==4&&nStripX==64)) {
if ((idModule>17||idModule<-17)&&TMath::Abs(idModule)!=61) {
Int_t icircU=circuit->GetICircuitU();
- circuitU = &(pMUON->TriggerCircuit(icircU));
+ circuitU = (AliMUONTriggerCircuit*)fTriggerCircuit->At(icircU);
Int_t nStripU=circuitU->GetNstripY();
if (TMath::Abs(idModule)==62) { // shift of +8 bits
// returns local trigger answer for circuit icirc
Int_t i;
- AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
AliMUONTriggerCircuit* triggerCircuit;
- triggerCircuit = &(pMUON->TriggerCircuit(icirc));
+ triggerCircuit = (AliMUONTriggerCircuit*) fTriggerCircuit->At(icirc);
Int_t idCircuit=triggerCircuit->GetIdCircuit();
Int_t signDev=minDev[4];
}
if (fDebug>=1) {
- printf("\n");
printf("===================================================\n");
printf(" Global Trigger output Low pt High pt All\n");
printf(" number of Single Plus :\t");
for (i=0; i<3; i++) printf("%i\t",fGlobalPairLike[i]);
printf("\n");
printf("===================================================\n");
+ printf("\n");
}
}
Int_t istrip;
- AliMUON *pMUON = (AliMUON*)gAlice->GetModule("MUON");
AliMUONTriggerCircuit* triggerCircuit;
- triggerCircuit = &(pMUON->TriggerCircuit(icirc));
+ triggerCircuit = (AliMUONTriggerCircuit*) fTriggerCircuit->At(icirc);
Int_t idCircuit=triggerCircuit->GetIdCircuit();
Int_t nStrip=triggerCircuit->GetNstripY();
printf("\n");
printf("===============================================================\n");
}
+
//----------------------------------------------------------------------
void AliMUONTriggerDecision::PrintLocalOutput(Int_t minDevStrip[5],
Int_t minDev[5],
//----------------------------------------------------------------------
//--- methods which return member data related info
//----------------------------------------------------------------------
-Int_t AliMUONTriggerDecision::GetITrigger(Int_t icirc){
+Int_t AliMUONTriggerDecision::GetITrigger(Int_t icirc) const{
// returns Local Trigger Status
return fTrigger[icirc];
}
//----------------------------------------------------------------------
-Int_t AliMUONTriggerDecision::GetStripX11(Int_t icirc){
+Int_t AliMUONTriggerDecision::GetStripX11(Int_t icirc) const{
// returns fStripX11
return fStripX11[icirc];
}
//----------------------------------------------------------------------
-Int_t AliMUONTriggerDecision::GetDev(Int_t icirc){
+Int_t AliMUONTriggerDecision::GetDev(Int_t icirc) const{
// returns idev
return fDev[icirc];
}
//----------------------------------------------------------------------
-Int_t AliMUONTriggerDecision::GetStripY11(Int_t icirc){
+Int_t AliMUONTriggerDecision::GetStripY11(Int_t icirc) const{
// returns fStripY11;
return fStripY11[icirc];
}
//----------------------------------------------------------------------
void AliMUONTriggerDecision::GetLutOutput(Int_t icirc, Int_t lpt[2],
- Int_t hpt[2], Int_t apt[2]){
+ Int_t hpt[2], Int_t apt[2]) const {
// returns Look up Table output
for (Int_t i=0; i<2; i++) {
lpt[i]=fLutLpt[icirc][i];
Int_t singleMinus[3],
Int_t singleUndef[3],
Int_t pairUnlike[3],
- Int_t pairLike[3]){
+ Int_t pairLike[3]) const {
// returns Global Trigger information (0,1,2 : Lpt,Hpt,Apt)
+// should not be used anymore.
for (Int_t i=0; i<3; i++) {
singlePlus[i] = fGlobalSinglePlus[i];
singleMinus[i] = fGlobalSingleMinus[i];
pairLike[i] = fGlobalPairLike[i];
}
}
-//----------------------------------------------------------------------
-//--- end of methods which return member data related info
-//----------------------------------------------------------------------
-//----------------------------------------------------------------------
-/*
-void AliMUONTriggerDecision::AddLocalTrigger(const AliMUONLocalTrigger c){
-// Add a Local Trigger copy to the list
- AliMUON *MUON=(AliMUON*)gAlice->GetModule("MUON");
- MUON->AddLocalTrigger(c);
- fNLocalTriggers++;
+
+//_______________________________________________________________________
+void AliMUONTriggerDecision::Digits2Trigger(){
+// call the Trigger Algorithm and fill TreeD
+
+
+ fMUONData->ResetTrigger();
+ Trigger();
+ AliMUONGlobalTrigger* pGloTrig = new AliMUONGlobalTrigger(fGlobalSinglePlus, fGlobalSingleMinus,
+ fGlobalSingleUndef, fGlobalPairUnlike,
+ fGlobalPairLike);
+ // add a local trigger in the list
+ fMUONData->AddGlobalTrigger(*pGloTrig);
+
+ for (Int_t icirc=0; icirc<AliMUONConstants::NTriggerCircuit(); icirc++) {
+ if(GetITrigger(icirc)==1) {
+ Int_t localtr[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+ Int_t loLpt[2]={0,0}; Int_t loHpt[2]={0,0}; Int_t loApt[2]={0,0};
+ GetLutOutput(icirc, loLpt, loHpt, loApt);
+ localtr[0] = icirc;
+ localtr[1] = GetStripX11(icirc);
+ localtr[2] = GetDev(icirc);
+ localtr[3] = GetStripY11(icirc);
+ for (Int_t i = 0; i < 2; i++) { // convert the Lut output in 1 digit
+ localtr[4] += Int_t(loLpt[i]*TMath::Power(2,i));
+ localtr[5] += Int_t(loHpt[i]*TMath::Power(2,i));
+ localtr[6] += Int_t(loApt[i]*TMath::Power(2,i));
+ }
+
+ for (Int_t i = 0; i < 16; i++) { // convert X/Y bit in bit pattern
+ localtr[7] |= (fXbit11[icirc][i] << i);
+ localtr[8] |= (fXbit12[icirc][i] << i);
+
+ // 8 first and last elts correspond to neighbouring cards
+ localtr[9] |= (fXbit21[icirc][i+8] << i);
+ localtr[10] |= (fXbit22[icirc][i+8] << i);
+
+ localtr[11] |= (fYbit11[icirc][i] << i);
+ localtr[12] |= (fYbit12[icirc][i] << i);
+ localtr[13] |= (fYbit21[icirc][i] << i);
+ localtr[14] |= (fYbit22[icirc][i] << i);
+ }
+
+ AliMUONLocalTrigger* pLocTrig = new AliMUONLocalTrigger(localtr);
+ fMUONData->AddLocalTrigger(*pLocTrig); // add a local trigger in the list
+ }
+ }
+}
+
+//_______________________________________________________________________
+void AliMUONTriggerDecision::Trigger2Trigger()
+{
+// copy trigger from TreeD to TreeR
+
+ fMUONData->SetTreeAddress("GLT");
+ fMUONData->GetTriggerD();
+}
+
+//_______________________________________________________________________
+void AliMUONTriggerDecision::Trigger2Trigger(AliRawReader* /*rawReader*/)
+{
+// call the Trigger Algorithm from raw data and fill TreeR
+
+ Fatal("Trigger2Trigger","Trigger not implemented for raw data input");
+
}
-*/