]>
Commit | Line | Data |
---|---|---|
52c9bc11 | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
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 | **************************************************************************/ | |
15 | ||
16 | /* $Id$ */ | |
17 | ||
d19b6003 | 18 | // ----------------------------------- |
19 | // Class AliMUONClusterReconstructor | |
20 | // ---------------------------------- | |
cf464691 | 21 | // MUON cluster reconstructor for MUON |
d19b6003 | 22 | // Should implement a virtual class ClusterFinder to choose between VS and AZ method |
52c9bc11 | 23 | |
d2f8e464 | 24 | #include <Riostream.h> |
52c9bc11 | 25 | #include "AliMUONClusterReconstructor.h" |
cf464691 | 26 | #include "AliRunLoader.h" |
27 | #include "AliLoader.h" | |
28 | ||
52c9bc11 | 29 | #include "AliMUONDigit.h" |
30 | #include "AliMUONConstants.h" | |
31 | #include "AliMUONData.h" | |
32 | #include "AliMUONClusterFinderVS.h" | |
52c9bc11 | 33 | #include "AliMUONClusterInput.h" |
34 | #include "AliMUONRawCluster.h" | |
f9247068 | 35 | #include "AliMUONVClusterFinder.h" |
36 | #include "AliMUONCluster.h" | |
66f4c572 | 37 | #include "AliMpDEManager.h" |
f9247068 | 38 | #include "AliMpSegmentation.h" |
866c3232 | 39 | #include "AliMpCathodType.h" |
f9247068 | 40 | #include "AliMUONGeometryTransformer.h" |
8c343c7c | 41 | #include "AliLog.h" |
cf464691 | 42 | |
7945aae7 | 43 | /// \cond CLASSIMP |
52c9bc11 | 44 | ClassImp(AliMUONClusterReconstructor) // Class implementation in ROOT context |
7945aae7 | 45 | /// \endcond |
dd20215d | 46 | |
52c9bc11 | 47 | //__________________________________________________________________________ |
f9247068 | 48 | AliMUONClusterReconstructor::AliMUONClusterReconstructor(AliMUONData* data, |
49 | AliMUONVClusterFinder* clusterFinder, | |
50 | const AliMUONGeometryTransformer* transformer) | |
dd20215d | 51 | : TObject(), |
f9247068 | 52 | fClusterFinder(clusterFinder), |
dd20215d | 53 | fMUONData(data), |
54 | fRecModel(new AliMUONClusterFinderVS()), | |
55 | fDigitsCath0(new TClonesArray("AliMUONDigit",1000)), | |
f9247068 | 56 | fDigitsCath1(new TClonesArray("AliMUONDigit",1000)), |
57 | fTransformer(transformer) | |
52c9bc11 | 58 | { |
d19b6003 | 59 | /// Standard Constructor |
52c9bc11 | 60 | |
dd20215d | 61 | fDigitsCath0->SetOwner(kTRUE); |
62 | fDigitsCath1->SetOwner(kTRUE); | |
f9247068 | 63 | if (!transformer && clusterFinder) |
64 | { | |
65 | AliFatal("I require a geometry transformer, otherwise I cannot compute " | |
66 | "global coordinates of the clusters !"); | |
67 | } | |
52c9bc11 | 68 | } |
30178c30 | 69 | |
52c9bc11 | 70 | //__________________________________________________________________________ |
71 | AliMUONClusterReconstructor::~AliMUONClusterReconstructor(void) | |
72 | { | |
d19b6003 | 73 | /// Destructor |
74 | ||
dd20215d | 75 | delete fRecModel; |
76 | delete fDigitsCath0; | |
77 | delete fDigitsCath1; | |
78 | } | |
7e4a628d | 79 | |
f9247068 | 80 | //______________________________________________________________________________ |
81 | void | |
82 | AliMUONClusterReconstructor::ClusterizeOneDEV2(Int_t detElemId) | |
83 | { | |
866c3232 | 84 | /// Clusterize one detection element, and let fMUONData know about |
85 | /// the results. | |
86 | ||
f9247068 | 87 | AliDebug(1,Form("DE %d",detElemId)); |
88 | const AliMpVSegmentation* seg[2] = | |
866c3232 | 89 | { AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,AliMp::kCath0), |
90 | AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,AliMp::kCath1) | |
f9247068 | 91 | }; |
92 | ||
93 | ||
94 | TClonesArray* digits[2] = { fDigitsCath0, fDigitsCath1 }; | |
95 | ||
96 | Bool_t ok = fClusterFinder->Prepare(seg,digits); | |
97 | if ( !ok ) | |
98 | { | |
99 | AliWarning(Form("No hit pad for DE %d ?",detElemId)); | |
100 | } | |
101 | ||
102 | AliMUONCluster* cluster; | |
103 | ||
104 | Int_t chamber = detElemId/100 - 1; | |
105 | ||
106 | while ( ( cluster = fClusterFinder->NextCluster() ) ) | |
107 | { | |
1a3b5b04 | 108 | // StdoutToAliDebug(1,cout << "From AliMUONClusterReconstructor::ClusterizeOneDEV2 : cluster->Print():" << endl; |
109 | // cluster->Print();); | |
f9247068 | 110 | |
111 | // Converts cluster objects into ones suitable for output | |
112 | // | |
113 | AliMUONRawCluster rawCluster; | |
114 | ||
115 | rawCluster.SetDetElemId(detElemId); | |
116 | ||
117 | for ( Int_t cathode = 0; cathode < 2; ++cathode ) | |
118 | { | |
119 | rawCluster.SetMultiplicity(cathode,cluster->Multiplicity(cathode)); | |
120 | rawCluster.SetCharge(cathode,cluster->Charge()); // both cathode get the total cluster charge | |
121 | Double_t xg, yg, zg; | |
122 | ||
123 | fTransformer->Local2Global(detElemId, | |
124 | cluster->Position().X(), cluster->Position().Y(), | |
125 | 0, xg, yg, zg); | |
126 | ||
127 | if ( cathode == 0 ) | |
128 | { | |
129 | AliDebug(1,Form("Adding RawCluster detElemId %4d mult %2d charge %e (xl,yl,zl)=(%e,%e,%e) (xg,yg,zg)=(%e,%e,%e)", | |
130 | detElemId,cluster->Multiplicity(),cluster->Charge(), | |
131 | cluster->Position().X(),cluster->Position().Y(),0.0, | |
132 | xg,yg,zg)); | |
133 | } | |
134 | rawCluster.SetX(cathode,xg); | |
135 | rawCluster.SetY(cathode,yg); | |
136 | rawCluster.SetZ(cathode,zg); | |
137 | } | |
138 | fMUONData->AddRawCluster(chamber,rawCluster); | |
f9247068 | 139 | } |
140 | } | |
141 | ||
dd20215d | 142 | //______________________________________________________________________________ |
143 | void | |
144 | AliMUONClusterReconstructor::ClusterizeOneDE(Int_t detElemId) | |
145 | { | |
d19b6003 | 146 | /// Clusterize one detection element, and let fMUONData know about |
147 | /// the results. | |
dd20215d | 148 | |
149 | if ( fDigitsCath0->GetEntriesFast() || fDigitsCath1->GetEntriesFast() ) | |
150 | { | |
f9247068 | 151 | if ( fClusterFinder ) |
dd20215d | 152 | { |
f9247068 | 153 | ClusterizeOneDEV2(detElemId); |
154 | } | |
155 | else | |
156 | { | |
157 | Int_t iChamber = AliMpDEManager::GetChamberId(detElemId); | |
158 | AliMUONClusterInput::Instance()->SetDigits(iChamber, detElemId, | |
159 | fDigitsCath0,fDigitsCath1); | |
160 | AliDebug(3,Form("ClusterizeOneDE iChamber=%d DE=%d",iChamber,detElemId)); | |
1a3b5b04 | 161 | // StdoutToAliDebug(3,cout << "DigitsCath0=" << endl; |
162 | // fDigitsCath0->Print(); | |
163 | // cout << "DigitsCath1=" << endl; | |
164 | // fDigitsCath1->Print();); | |
f9247068 | 165 | fRecModel->FindRawClusters(); |
166 | ||
167 | // copy results into the output container | |
168 | TClonesArray* tmp = fRecModel->GetRawClusters(); | |
169 | for (Int_t id = 0; id < tmp->GetEntriesFast(); ++id) | |
170 | { | |
171 | AliMUONRawCluster* pClus = (AliMUONRawCluster*) tmp->At(id); | |
172 | fMUONData->AddRawCluster(iChamber, *pClus); | |
173 | } | |
174 | } | |
dd20215d | 175 | // Reset the arrays |
176 | fDigitsCath0->Clear("C"); | |
177 | fDigitsCath1->Clear("C"); | |
178 | } | |
52c9bc11 | 179 | } |
dd20215d | 180 | |
52c9bc11 | 181 | //____________________________________________________________________ |
cc87ebcd | 182 | void AliMUONClusterReconstructor::Digits2Clusters(Int_t chBeg) |
a713db22 | 183 | { |
d19b6003 | 184 | /// Clusterize all the tracking chamber digits. |
185 | /// | |
186 | /// For each chamber, we loop *once* on that chamber digits, and store them | |
187 | /// in 2 temporary arrays (one pair of arrays per detection element, | |
188 | /// one array per cathode). Once a pair of arrays is full (i.e. all the digits | |
189 | /// of that detection element have been stored), we clusterize this DE, and | |
190 | /// move to the next one. | |
a713db22 | 191 | |
f9247068 | 192 | if (!fRecModel && !fClusterFinder) |
dd20215d | 193 | { |
194 | AliWarning("No reco model defined. Nothing to do..."); | |
195 | return; | |
196 | } | |
197 | ||
198 | Int_t iChamber(-1); | |
199 | Int_t currentDE(-1); | |
200 | ||
201 | // Loop on chambers | |
202 | for ( iChamber = chBeg; iChamber < AliMUONConstants::NTrackingCh(); ++iChamber ) | |
203 | { | |
204 | TClonesArray* muonDigits = fMUONData->Digits(iChamber); | |
205 | ||
206 | Int_t ndig = muonDigits->GetEntriesFast(); | |
207 | if (!ndig) continue; | |
208 | ||
209 | muonDigits->Sort(); // the sort *must* be per DE (at least), otherwise | |
210 | // the following logic with currentDE will fail. | |
211 | ||
212 | currentDE = -1; // initialize the DE counter (that is used to track | |
213 | // when we change of DE in the following loop over | |
214 | // all digits) to an invalid value. | |
215 | ||
216 | for ( Int_t k = 0; k < ndig; ++k ) | |
217 | { | |
218 | AliMUONDigit* digit = (AliMUONDigit*) muonDigits->UncheckedAt(k); | |
219 | if ( ! digit->Signal() > 0 ) continue; // skip void digits. | |
220 | ||
221 | if ( digit->DetElemId() != currentDE ) | |
222 | { | |
223 | AliDebug(3,Form("Switching DE from %d to %d",currentDE,digit->DetElemId())); | |
224 | // we get to a new DE, so clusterize the previous one before | |
225 | // moving on. | |
226 | ClusterizeOneDE(currentDE); | |
227 | currentDE = digit->DetElemId(); | |
a713db22 | 228 | } |
dd20215d | 229 | |
230 | // Add the digit to the array with the right cathode number. | |
231 | if (digit->Cathode() == 0) | |
232 | { | |
dd20215d | 233 | new((*fDigitsCath0)[fDigitsCath0->GetLast()+1]) AliMUONDigit(*digit); |
234 | } | |
235 | else | |
236 | { | |
dd20215d | 237 | new((*fDigitsCath1)[fDigitsCath1->GetLast()+1]) AliMUONDigit(*digit); |
238 | } | |
239 | } // end of loop on chamber digits | |
240 | ||
241 | // As the above logic is based on detecting a change in DE number, | |
242 | // the last DE of each chamber has not been clusterized, so we do | |
243 | // it here. | |
244 | ClusterizeOneDE(currentDE); | |
245 | } // end of loop over chambers | |
52c9bc11 | 246 | } |
cf464691 | 247 | |
dd20215d | 248 | //_______________________________________________________________________ |
249 | void | |
250 | AliMUONClusterReconstructor::SetRecoModel(AliMUONClusterFinderVS* rec) | |
251 | { | |
d19b6003 | 252 | /// Set reconstruction model |
253 | ||
dd20215d | 254 | delete fRecModel; |
255 | fRecModel = rec; | |
256 | } | |
257 | ||
7e4a628d | 258 | //_______________________________________________________________________ |
259 | void AliMUONClusterReconstructor::Trigger2Trigger() | |
260 | { | |
d19b6003 | 261 | /// Copy trigger from TreeD to TreeR |
cc87ebcd | 262 | |
263 | fMUONData->SetTreeAddress("GLT"); | |
7e4a628d | 264 | fMUONData->GetTriggerD(); |
265 | } |