1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 // -----------------------------------
19 // Class AliMUONClusterReconstructor
20 // ----------------------------------
21 // MUON cluster reconstructor for MUON
22 // Should implement a virtual class ClusterFinder to choose between VS and AZ method
24 #include "AliMUONClusterReconstructor.h"
25 #include "AliRun.h" // for gAlice
26 #include "AliRunLoader.h"
27 #include "AliLoader.h"
30 #include "AliMUONDigit.h"
31 #include "AliMUONConstants.h"
32 #include "AliMUONData.h"
33 #include "AliMUONClusterFinderVS.h"
34 #include "AliMUONClusterInput.h"
35 #include "AliMUONRawCluster.h"
38 ClassImp(AliMUONClusterReconstructor) // Class implementation in ROOT context
40 //__________________________________________________________________________
41 AliMUONClusterReconstructor::AliMUONClusterReconstructor(AliMUONData* data)
44 fRecModel(new AliMUONClusterFinderVS()),
45 fDigitsCath0(new TClonesArray("AliMUONDigit",1000)),
46 fDigitsCath1(new TClonesArray("AliMUONDigit",1000))
48 /// Standard Constructor
50 fDigitsCath0->SetOwner(kTRUE);
51 fDigitsCath1->SetOwner(kTRUE);
54 //_______________________________________________________________________
55 AliMUONClusterReconstructor::AliMUONClusterReconstructor (const AliMUONClusterReconstructor& rhs)
58 /// Protected copy constructor
60 AliFatal("Not implemented.");
63 //_______________________________________________________________________
64 AliMUONClusterReconstructor &
65 AliMUONClusterReconstructor::operator=(const AliMUONClusterReconstructor& rhs)
67 /// Protected assignement operator
69 if (this == &rhs) return *this;
71 AliFatal("Not implemented.");
76 //__________________________________________________________________________
77 AliMUONClusterReconstructor::~AliMUONClusterReconstructor(void)
86 //______________________________________________________________________________
88 AliMUONClusterReconstructor::CheckSize(TClonesArray& a)
90 /// Check if one can adds a new element, or if a is already full.
91 /// If full, it is resized.
93 if ( a.GetLast()+1 >= a.GetSize() )
95 AliInfo(Form("Increasing array size from %d to %d",
96 a.GetSize(),a.GetSize()*2));
97 a.Expand(a.GetSize()*2);
101 //______________________________________________________________________________
103 AliMUONClusterReconstructor::ClusterizeOneDE(Int_t detElemId)
105 /// Clusterize one detection element, and let fMUONData know about
108 if ( fDigitsCath0->GetEntriesFast() || fDigitsCath1->GetEntriesFast() )
110 Int_t iChamber = detElemId/100 - 1;
111 AliMUONClusterInput::Instance()->SetDigits(iChamber, detElemId,
112 fDigitsCath0,fDigitsCath1);
113 AliDebug(3,Form("ClusterizeOneDE iChamber=%d DE=%d",iChamber,detElemId));
114 StdoutToAliDebug(3,cout << "DigitsCath0=" << endl;
115 fDigitsCath0->Print();
116 cout << "DigitsCath1=" << endl;
117 fDigitsCath1->Print(););
118 fRecModel->FindRawClusters();
120 // copy results into the output container
121 TClonesArray* tmp = fRecModel->GetRawClusters();
122 for (Int_t id = 0; id < tmp->GetEntriesFast(); ++id)
124 AliMUONRawCluster* pClus = (AliMUONRawCluster*) tmp->At(id);
125 fMUONData->AddRawCluster(iChamber, *pClus);
129 fDigitsCath0->Clear("C");
130 fDigitsCath1->Clear("C");
134 //____________________________________________________________________
135 void AliMUONClusterReconstructor::Digits2Clusters(Int_t chBeg)
137 /// Clusterize all the tracking chamber digits.
139 /// For each chamber, we loop *once* on that chamber digits, and store them
140 /// in 2 temporary arrays (one pair of arrays per detection element,
141 /// one array per cathode). Once a pair of arrays is full (i.e. all the digits
142 /// of that detection element have been stored), we clusterize this DE, and
143 /// move to the next one.
147 AliWarning("No reco model defined. Nothing to do...");
155 for ( iChamber = chBeg; iChamber < AliMUONConstants::NTrackingCh(); ++iChamber )
157 TClonesArray* muonDigits = fMUONData->Digits(iChamber);
159 Int_t ndig = muonDigits->GetEntriesFast();
162 muonDigits->Sort(); // the sort *must* be per DE (at least), otherwise
163 // the following logic with currentDE will fail.
165 currentDE = -1; // initialize the DE counter (that is used to track
166 // when we change of DE in the following loop over
167 // all digits) to an invalid value.
169 for ( Int_t k = 0; k < ndig; ++k )
171 AliMUONDigit* digit = (AliMUONDigit*) muonDigits->UncheckedAt(k);
172 if ( ! digit->Signal() > 0 ) continue; // skip void digits.
174 if ( digit->DetElemId() != currentDE )
176 AliDebug(3,Form("Switching DE from %d to %d",currentDE,digit->DetElemId()));
177 // we get to a new DE, so clusterize the previous one before
179 ClusterizeOneDE(currentDE);
180 currentDE = digit->DetElemId();
183 // Add the digit to the array with the right cathode number.
184 if (digit->Cathode() == 0)
186 CheckSize(*fDigitsCath0);
187 new((*fDigitsCath0)[fDigitsCath0->GetLast()+1]) AliMUONDigit(*digit);
191 CheckSize(*fDigitsCath1);
192 new((*fDigitsCath1)[fDigitsCath1->GetLast()+1]) AliMUONDigit(*digit);
194 } // end of loop on chamber digits
196 // As the above logic is based on detecting a change in DE number,
197 // the last DE of each chamber has not been clusterized, so we do
199 ClusterizeOneDE(currentDE);
200 } // end of loop over chambers
203 //_______________________________________________________________________
205 AliMUONClusterReconstructor::SetRecoModel(AliMUONClusterFinderVS* rec)
207 /// Set reconstruction model
213 //_______________________________________________________________________
214 void AliMUONClusterReconstructor::Trigger2Trigger()
216 /// Copy trigger from TreeD to TreeR
218 fMUONData->SetTreeAddress("GLT");
219 fMUONData->GetTriggerD();