/* $Id$ */
-////////////////////////////////////
-//
-// 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
-//
-////////////////////////////////////
-
-#include <Riostream.h> // for cout
-#include <stdlib.h> // for exit()
-
-#include <TTree.h>
+// -----------------------------------
+// Class AliMUONClusterReconstructor
+// ----------------------------------
+// MUON cluster reconstructor for MUON
+// Should implement a virtual class ClusterFinder to choose between VS and AZ method
-#include "AliMUON.h"
#include "AliMUONClusterReconstructor.h"
+#include "AliRun.h" // for gAlice
+#include "AliRunLoader.h"
+#include "AliLoader.h"
+
+#include "AliMUON.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"
-static const Int_t kDefaultPrintLevel = 0;
+#include "AliMpDEManager.h"
-ClassImp(AliMUONClusterReconstructor) // Class implementation in ROOT context
+#include "AliLog.h"
+ClassImp(AliMUONClusterReconstructor) // Class implementation in ROOT context
+
//__________________________________________________________________________
-AliMUONClusterReconstructor::AliMUONClusterReconstructor(AliLoader* loader)
+AliMUONClusterReconstructor::AliMUONClusterReconstructor(AliMUONData* data)
+: TObject(),
+ fMUONData(data),
+ fRecModel(new AliMUONClusterFinderVS()),
+ fDigitsCath0(new TClonesArray("AliMUONDigit",1000)),
+ fDigitsCath1(new TClonesArray("AliMUONDigit",1000))
{
- // Default Constructor
-
- fDebug = 0;
- fNCh = 0;
- fNTrackingCh = 0;
- fChambers = 0;
- fMUONData = 0;
- fChambers = new TObjArray(AliMUONConstants::NCh());
-
- fPrintLevel = kDefaultPrintLevel;
-
- // initialize loader's
- fLoader = loader;
-
- // initialize container
- fMUONData = new AliMUONData(fLoader,"MUON","MUON");
-
- // Loading AliRun master
- AliRunLoader* runloader = fLoader->GetRunLoader();
- if (runloader->GetAliRun() == 0x0) runloader->LoadgAlice();
- gAlice = runloader->GetAliRun();
-
- // getting MUON
- fMUON = (AliMUON*) gAlice->GetDetector("MUON");
+/// Standard Constructor
- return;
+ fDigitsCath0->SetOwner(kTRUE);
+ fDigitsCath1->SetOwner(kTRUE);
}
-//____________________________________________________________________
-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 (const AliMUONClusterReconstructor& Reconstructor):TObject(Reconstructor)
+//__________________________________________________________________________
+AliMUONClusterReconstructor::~AliMUONClusterReconstructor(void)
{
- // Dummy copy constructor
+/// Destructor
+
+ delete fRecModel;
+ delete fDigitsCath0;
+ delete fDigitsCath1;
}
-AliMUONClusterReconstructor & AliMUONClusterReconstructor::operator=(const AliMUONClusterReconstructor& /*Reconstructor*/)
+//______________________________________________________________________________
+void
+AliMUONClusterReconstructor::ClusterizeOneDE(Int_t detElemId)
{
- // Dummy assignment operator
- return *this;
+/// Clusterize one detection element, and let fMUONData know about
+/// the results.
+
+ if ( fDigitsCath0->GetEntriesFast() || fDigitsCath1->GetEntriesFast() )
+ {
+ Int_t iChamber = AliMpDEManager::GetChamberId(detElemId);
+ AliMUONClusterInput::Instance()->SetDigits(iChamber, detElemId,
+ fDigitsCath0,fDigitsCath1);
+ AliDebug(3,Form("ClusterizeOneDE iChamber=%d DE=%d",iChamber,detElemId));
+ StdoutToAliDebug(3,cout << "DigitsCath0=" << endl;
+ fDigitsCath0->Print();
+ cout << "DigitsCath1=" << endl;
+ fDigitsCath1->Print(););
+ fRecModel->FindRawClusters();
+
+ // copy results into the output container
+ TClonesArray* tmp = fRecModel->GetRawClusters();
+ for (Int_t id = 0; id < tmp->GetEntriesFast(); ++id)
+ {
+ AliMUONRawCluster* pClus = (AliMUONRawCluster*) tmp->At(id);
+ fMUONData->AddRawCluster(iChamber, *pClus);
+ }
+
+ // Reset the arrays
+ fDigitsCath0->Clear("C");
+ fDigitsCath1->Clear("C");
+ }
}
-//__________________________________________________________________________
-AliMUONClusterReconstructor::~AliMUONClusterReconstructor(void)
+//____________________________________________________________________
+void AliMUONClusterReconstructor::Digits2Clusters(Int_t chBeg)
{
- if (fChambers){
- fChambers->Delete();
- delete fChambers;
- }
- if (fMUONData)
- delete fMUONData;
-
- return;
+/// Clusterize all the tracking chamber digits.
+///
+/// For each chamber, we loop *once* on that chamber digits, and store them
+/// in 2 temporary arrays (one pair of arrays per detection element,
+/// one array per cathode). Once a pair of arrays is full (i.e. all the digits
+/// of that detection element have been stored), we clusterize this DE, and
+/// move to the next one.
+
+ if (!fRecModel)
+ {
+ AliWarning("No reco model defined. Nothing to do...");
+ return;
+ }
+
+ Int_t iChamber(-1);
+ Int_t currentDE(-1);
+
+ // Loop on chambers
+ for ( iChamber = chBeg; iChamber < AliMUONConstants::NTrackingCh(); ++iChamber )
+ {
+ TClonesArray* muonDigits = fMUONData->Digits(iChamber);
+
+ Int_t ndig = muonDigits->GetEntriesFast();
+ if (!ndig) continue;
+
+ muonDigits->Sort(); // the sort *must* be per DE (at least), otherwise
+ // the following logic with currentDE will fail.
+
+ currentDE = -1; // initialize the DE counter (that is used to track
+ // when we change of DE in the following loop over
+ // all digits) to an invalid value.
+
+ for ( Int_t k = 0; k < ndig; ++k )
+ {
+ AliMUONDigit* digit = (AliMUONDigit*) muonDigits->UncheckedAt(k);
+ if ( ! digit->Signal() > 0 ) continue; // skip void digits.
+
+ if ( digit->DetElemId() != currentDE )
+ {
+ AliDebug(3,Form("Switching DE from %d to %d",currentDE,digit->DetElemId()));
+ // we get to a new DE, so clusterize the previous one before
+ // moving on.
+ ClusterizeOneDE(currentDE);
+ currentDE = digit->DetElemId();
+ }
+
+ // Add the digit to the array with the right cathode number.
+ if (digit->Cathode() == 0)
+ {
+ new((*fDigitsCath0)[fDigitsCath0->GetLast()+1]) AliMUONDigit(*digit);
+ }
+ else
+ {
+ new((*fDigitsCath1)[fDigitsCath1->GetLast()+1]) AliMUONDigit(*digit);
+ }
+ } // end of loop on chamber digits
+
+ // As the above logic is based on detecting a change in DE number,
+ // the last DE of each chamber has not been clusterized, so we do
+ // it here.
+ ClusterizeOneDE(currentDE);
+ } // end of loop over chambers
}
-//____________________________________________________________________
-void AliMUONClusterReconstructor::Digits2Clusters()
+
+//_______________________________________________________________________
+void
+AliMUONClusterReconstructor::SetRecoModel(AliMUONClusterFinderVS* rec)
+{
+/// Set reconstruction model
+
+ delete fRecModel;
+ fRecModel = rec;
+}
+
+//_______________________________________________________________________
+void AliMUONClusterReconstructor::Trigger2Trigger()
{
-//
-// Perform cluster finding
-//
- TClonesArray *dig1, *dig2;
- Int_t ndig, k;
- 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, 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);
- }
- fMUONData->ResetDigits();
- fMUONData->GetCathode(1);
- muonDigits = fMUONData->Digits(ich);
- ndig=muonDigits->GetEntriesFast();
- if(fDebug)
- printf("\n 2 Found %d digits in %p %d", ndig, muonDigits, ich);
- 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);
- }
-
- if (rec) {
- AliMUONClusterInput::Instance()->SetDigits(ich, dig1, dig2);
- rec->FindRawClusters();
- }
- // copy into the container
- TClonesArray* tmp = rec->GetRawClusters();
- for (Int_t id = 0; id < tmp->GetEntriesFast(); id++) {
- AliMUONRawCluster* pClus = (AliMUONRawCluster*) tmp->At(id);
- fMUONData->AddRawCluster(ich, *pClus);
- }
- dig1->Delete();
- dig2->Delete();
- } // for ich
- delete dig1;
- delete dig2;
+/// Copy trigger from TreeD to TreeR
+
+ fMUONData->SetTreeAddress("GLT");
+ fMUONData->GetTriggerD();
}