////////////////////////////////////
//
-// MUON event reconstructor in ALICE
-//
-// This class contains as data:
-// * the parameters for the event reconstruction
-// * a pointer to the array of hits to be reconstructed (the event)
-// * a pointer to the array of segments made with these hits inside each station
-// * a pointer to the array of reconstructed tracks
-//
-// It contains as methods, among others:
-// * MakeEventToBeReconstructed to build the array of hits to be reconstructed
-// * MakeSegments to build the segments
-// * MakeTracks to build the tracks
+// MUON cluster reconstructor for MUON
//
+// Should implement a virtual class ClusterFinder to chose between VS and AZ method
////////////////////////////////////
-#include <Riostream.h> // for cout
-#include <stdlib.h> // for exit()
-
-#include <TTree.h>
+#include "AliMUONClusterReconstructor.h"
+#include "AliRun.h" // for gAlice
+#include "AliRunLoader.h"
+#include "AliLoader.h"
#include "AliMUON.h"
-#include "AliMUONClusterReconstructor.h"
#include "AliMUONDigit.h"
#include "AliMUONConstants.h"
#include "AliMUONData.h"
#include "AliMUONClusterFinderVS.h"
-#include "AliMUONClusterFinderAZ.h"
#include "AliMUONClusterInput.h"
#include "AliMUONRawCluster.h"
-#include "AliRun.h" // for gAlice
-#include "AliConfig.h"
-#include "AliRunLoader.h"
-#include "AliLoader.h"
+#include "AliRawReader.h" // for raw data
+#include "AliLog.h"
+
-static const Int_t kDefaultPrintLevel = 0;
+const Int_t AliMUONClusterReconstructor::fgkDefaultPrintLevel = 0;
ClassImp(AliMUONClusterReconstructor) // Class implementation in ROOT context
//__________________________________________________________________________
-AliMUONClusterReconstructor::AliMUONClusterReconstructor(AliLoader* loader)
+ AliMUONClusterReconstructor::AliMUONClusterReconstructor(AliLoader* loader, AliMUONData* data)
+ : TObject(),
+ fMUONData(0),
+ fPrintLevel(fgkDefaultPrintLevel),
+ fDebug(0)
{
- // Default Constructor
-
- fDebug = 0;
- fNCh = 0;
- fNTrackingCh = 0;
- fChambers = 0;
- fMUONData = 0;
- fChambers = new TObjArray(AliMUONConstants::NCh());
-
- fPrintLevel = kDefaultPrintLevel;
+ // Standard Constructor
// initialize loader's
fLoader = loader;
// initialize container
- fMUONData = new AliMUONData(fLoader,"MUON","MUON");
+ if (data == 0x0)
+ fMUONData = new AliMUONData(fLoader,"MUON","MUON");
+ else
+ fMUONData = data;
+
+ // reconstruction model
+ fRecModel = new AliMUONClusterFinderVS();
+ //fRecModel = new AliMUONClusterFinderAZ();
- // Loading AliRun master
- AliRunLoader* runloader = fLoader->GetRunLoader();
- if (runloader->GetAliRun() == 0x0) runloader->LoadgAlice();
- gAlice = runloader->GetAliRun();
-
- // getting MUON
- fMUON = (AliMUON*) gAlice->GetDetector("MUON");
-
- return;
}
-//____________________________________________________________________
-void AliMUONClusterReconstructor::SetReconstructionModel(Int_t id, AliMUONClusterFinderVS *reconst)
-{
- // take infos chambers from AliMUON
- AliMUONChamber* pCh = 0;
- pCh = &(fMUON->Chamber(id));
-
- fChambers->AddAt(pCh, id);
- // Set ClusterFinder for chamber id
- ((AliMUONChamber*) fChambers->At(id))->SetReconstructionModel(reconst);
+//__________________________________________________________________________
+AliMUONClusterReconstructor::AliMUONClusterReconstructor()
+ : TObject(),
+ fMUONData(0),
+ fPrintLevel(fgkDefaultPrintLevel),
+ fDebug(0),
+ fLoader(0)
+{
+ // Default Constructor
}
+
//_______________________________________________________________________
-AliMUONClusterReconstructor::AliMUONClusterReconstructor (const AliMUONClusterReconstructor& Reconstructor):TObject(Reconstructor)
+AliMUONClusterReconstructor::AliMUONClusterReconstructor (const AliMUONClusterReconstructor& rhs)
+ : TObject(rhs)
{
- // Dummy copy constructor
+// Protected copy constructor
+
+ AliFatal("Not implemented.");
}
-AliMUONClusterReconstructor & AliMUONClusterReconstructor::operator=(const AliMUONClusterReconstructor& /*Reconstructor*/)
+//_______________________________________________________________________
+AliMUONClusterReconstructor &
+AliMUONClusterReconstructor::operator=(const AliMUONClusterReconstructor& rhs)
{
- // Dummy assignment operator
- return *this;
+// Protected assignement operator
+
+ if (this == &rhs) return *this;
+
+ AliFatal("Not implemented.");
+
+ return *this;
}
//__________________________________________________________________________
AliMUONClusterReconstructor::~AliMUONClusterReconstructor(void)
{
- if (fChambers){
- fChambers->Clear(); // Sets pointers to 0 sinche it is not the owner
- delete fChambers;
- }
+
if (fMUONData)
delete fMUONData;
//____________________________________________________________________
void AliMUONClusterReconstructor::Digits2Clusters()
{
-//
-// Perform cluster finding
-//
- TClonesArray *dig1, *dig2;
- Int_t ndig, k;
+
+ TClonesArray *dig1, *dig2, *digAll;
+ Int_t ndig, k, idDE, idDE_prev;
dig1 = new TClonesArray("AliMUONDigit",1000);
dig2 = new TClonesArray("AliMUONDigit",1000);
- AliMUONDigit *digit;
-// Loop on chambers and on cathode planes
-//
-// fMUONData->ResetRawClusters();
- TClonesArray * muonDigits;
-
- for (Int_t ich = 0; ich < 10; ich++) {
- AliMUONChamber* iChamber = (AliMUONChamber*) fChambers->At(ich);
- AliMUONClusterFinderVS* rec = iChamber->ReconstructionModel();
- //AliMUONClusterFinderAZ* rec = (AliMUONClusterFinderAZ*)iChamber->ReconstructionModel();
-
- fMUONData->ResetDigits();
- fMUONData->GetCathode(0);
- //TClonesArray *
- muonDigits = fMUONData->Digits(ich);
- ndig=muonDigits->GetEntriesFast();
- if(fDebug)
- printf("1 Found %d digits in %p chamber %d\n", ndig, (void*)muonDigits,ich);
- TClonesArray &lhits1 = *dig1;
- Int_t n = 0;
- for (k = 0; k < ndig; k++) {
- digit = (AliMUONDigit*) muonDigits->UncheckedAt(k);
- if (rec->TestTrack(digit->Track(0)))
- new(lhits1[n++]) AliMUONDigit(*digit);
+ digAll = new TClonesArray("AliMUONDigit",2000);
+
+ AliMUONDigit* digit;
+
+ TArrayI id(200); // contains the different IdDE
+
+
+// Loop on chambers and on cathode planes
+ TClonesArray* muonDigits;
+ Int_t n2;
+ Int_t n1;
+
+ for (Int_t ich = 0; ich < AliMUONConstants::NTrackingCh(); ich++) {
+
+ id.Reset();
+ n1 = 0;
+ n2 = 0;
+ //cathode 0 & 1
+ fMUONData->ResetDigits();
+ fMUONData->GetDigits();
+ muonDigits = fMUONData->Digits(ich);
+ ndig = muonDigits->GetEntriesFast();
+ TClonesArray &lDigit = *digAll;
+
+ idDE_prev = 0;
+ muonDigits->Sort();
+ for (k = 0; k < ndig; k++) {
+
+ digit = (AliMUONDigit*) muonDigits->UncheckedAt(k);
+ new(lDigit[n1++]) AliMUONDigit(*digit);
+ idDE = digit->DetElemId();
+ if (idDE != idDE_prev) {
+ id.AddAt(idDE,n2++);
}
- fMUONData->ResetDigits();
- fMUONData->GetCathode(1);
- muonDigits = fMUONData->Digits(ich);
- ndig=muonDigits->GetEntriesFast();
- if(fDebug)
- printf("\n 2 Found %d digits in %p %d", ndig, (void*)muonDigits, ich);
+ idDE_prev = idDE;
+ }
+
+
+ Int_t idSize = n2;
+
+ // loop over id DE
+ for (idDE = 0; idDE < idSize; idDE++) {
+ TClonesArray &lhits1 = *dig1;
TClonesArray &lhits2 = *dig2;
- n=0;
-
- for (k=0; k<ndig; k++) {
- digit= (AliMUONDigit*) muonDigits->UncheckedAt(k);
- if (rec->TestTrack(digit->Track(0)))
- new(lhits2[n++]) AliMUONDigit(*digit);
+ dig1->Clear();
+ dig2->Clear();
+ n1 = n2 = 0;
+
+ for (k = 0; k < digAll->GetEntriesFast(); k++) {
+ digit = (AliMUONDigit*) digAll->UncheckedAt(k);
+ // printf("digit idDE %d\n", digit->DetElemId());
+ if (id[idDE] == digit->DetElemId()) {
+ if (digit->Cathode() == 0)
+ new(lhits1[n1++]) AliMUONDigit(*digit);
+ else
+ new(lhits2[n2++]) AliMUONDigit(*digit);
+ }
}
- if (rec) {
- AliMUONClusterInput::Instance()->SetDigits(ich, dig1, dig2);
- rec->FindRawClusters();
+ // if (id[idDE] < 500 && id[idDE] > 299) continue; // temporary patch til St2 geometry is not yet ok (CF)
+
+ // cluster finder
+ if (fRecModel) {
+ AliMUONClusterInput::Instance()->SetDigits(ich, id[idDE], dig1, dig2);
+ fRecModel->FindRawClusters();
}
// copy into the container
- TClonesArray* tmp = rec->GetRawClusters();
+ TClonesArray* tmp = fRecModel->GetRawClusters();
for (Int_t id = 0; id < tmp->GetEntriesFast(); id++) {
AliMUONRawCluster* pClus = (AliMUONRawCluster*) tmp->At(id);
fMUONData->AddRawCluster(ich, *pClus);
}
dig1->Delete();
dig2->Delete();
+ } // idDE
+ digAll->Delete();
} // for ich
delete dig1;
delete dig2;
+ delete digAll;
+}
+
+//_______________________________________________________________________
+void AliMUONClusterReconstructor::Trigger2Trigger()
+{
+// copy trigger from TreeD to TreeR
+
+ fMUONData->SetTreeAddress("GLT");
+ fMUONData->GetTriggerD();
}