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 /// \class AliMUONClusterReconstructor
20 /// This class is just a steering class to loop over detection elements of tracking chambers,
21 /// extract the relevant digits, and pass them to the actual clusterizer class,
22 /// which operate on a single detection element at a time.
24 /// \author C. Finck and L. Aphecetche, Subatech
27 #include "AliMUONClusterReconstructor.h"
30 #include "AliMUONCluster.h"
31 #include "AliMUONGeometryTransformer.h"
32 #include "AliMUONRawCluster.h"
33 #include "AliMUONVClusterFinder.h"
34 #include "AliMUONVClusterStore.h"
35 #include "AliMUONVDigit.h"
36 #include "AliMUONVDigitStore.h"
37 #include "AliMpDEIterator.h"
38 #include "AliMpDEManager.h"
39 #include "AliMpSegmentation.h"
40 #include <Riostream.h>
43 ClassImp(AliMUONClusterReconstructor) // Class implementation in ROOT context
46 //__________________________________________________________________________
47 AliMUONClusterReconstructor::AliMUONClusterReconstructor(AliMUONVClusterFinder* clusterFinder,
48 const AliMUONGeometryTransformer* transformer)
50 fClusterFinder(clusterFinder),
51 fTransformer(transformer),
54 /// Standard Constructor
56 if (!transformer && clusterFinder)
58 AliFatal("I require a geometry transformer, otherwise I cannot compute "
59 "global coordinates of the clusters !");
62 // fRecModel->SetGhostChi2Cut(10);
65 //__________________________________________________________________________
66 AliMUONClusterReconstructor::~AliMUONClusterReconstructor(void)
71 //______________________________________________________________________________
73 AliMUONClusterReconstructor::ClusterizeOneDE(Int_t detElemId,
74 const AliMUONVDigitStore& digitStore)
76 /// Clusterize one detection element, which digits are in digitStore
78 if ( digitStore.IsEmpty() ) return;
80 const AliMpVSegmentation* seg[2] =
81 { AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,AliMp::kCath0),
82 AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,AliMp::kCath1)
85 Bool_t ok = fClusterFinder->Prepare(seg,digitStore);
88 AliWarning(Form("No hit pad for DE %d ?",detElemId));
91 AliMUONCluster* cluster;
93 while ( ( cluster = fClusterFinder->NextCluster() ) )
95 // Converts cluster objects into ones suitable for output
97 AliMUONRawCluster rawCluster;
99 rawCluster.SetDetElemId(detElemId);
101 for ( Int_t cathode = 0; cathode < 2; ++cathode )
103 rawCluster.SetMultiplicity(cathode,cluster->Multiplicity(cathode));
104 rawCluster.SetCharge(cathode,cluster->Charge()); // both cathode get the total cluster charge
107 fTransformer->Local2Global(detElemId,
108 cluster->Position().X(), cluster->Position().Y(),
113 AliDebug(1,Form("Adding RawCluster detElemId %4d mult %2d charge %e (xl,yl,zl)=(%e,%e,%e) (xg,yg,zg)=(%e,%e,%e)",
114 detElemId,cluster->Multiplicity(),cluster->Charge(),
115 cluster->Position().X(),cluster->Position().Y(),0.0,
118 rawCluster.SetX(cathode,xg);
119 rawCluster.SetY(cathode,yg);
120 rawCluster.SetZ(cathode,zg);
122 fClusterStore->Add(rawCluster);
126 //____________________________________________________________________
127 void AliMUONClusterReconstructor::Digits2Clusters(const AliMUONVDigitStore& digitStore,
128 AliMUONVClusterStore& clusterStore)
130 /// Clusterize the digitStore to produce a clusterStore
132 fClusterStore = &clusterStore;
133 fClusterStore->Clear();
135 AliMpDEIterator deIt;
139 while (!deIt.IsDone())
141 AliMUONVDigitStore* deDigits = digitStore.Create();
143 Int_t currentDE = deIt.CurrentDEId();
144 AliMp::StationType stationType = AliMpDEManager::GetStationType(currentDE);
145 if (stationType!=AliMp::kStationTrigger)
147 TIter next(digitStore.CreateIterator(currentDE,currentDE));
148 AliMUONVDigit* digit;
150 while ( ( digit = static_cast<AliMUONVDigit*>(next()) ) )
152 if ( ! digit->Charge() > 0 ) continue; // skip void digits.
154 deDigits->Add(*digit,AliMUONVDigitStore::kIgnore);
156 ClusterizeOneDE(currentDE,*deDigits);