Line data Source code
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 :
18 : #include "AliMUONTriggerTrackToTrackerClusters.h"
19 :
20 : ///\class AliMUONTriggerTrackToTrackerClusters
21 : ///
22 : /// Class to convert trigger tracks into "fake" clusters in stations 4 and 5
23 : ///
24 : /// Only intent is to be able to reconstruct data where stations 4 and 5 were
25 : /// not functionning, typically early cosmic runs
26 : ///
27 : ///\author Laurent Aphecetche, Subatech
28 :
29 : #include "AliCodeTimer.h"
30 : #include "AliLog.h"
31 : #include "AliMUONConstants.h"
32 : #include "AliMUONGeometryTransformer.h"
33 : #include "AliMUONTrack.h"
34 : #include "AliMUONTrackExtrap.h"
35 : #include "AliMUONTriggerTrack.h"
36 : #include "AliMUONVCluster.h"
37 : #include "AliMUONVClusterStore.h"
38 : #include "AliMUONVTriggerTrackStore.h"
39 : #include "AliMUONTrackParam.h"
40 : #include "AliMpArea.h"
41 : #include "AliMpDEManager.h"
42 : #include <TMath.h>
43 :
44 : ///\cond CLASSIMP
45 18 : ClassImp(AliMUONTriggerTrackToTrackerClusters)
46 : ///\endcond
47 :
48 : //_____________________________________________________________________________
49 : AliMUONTriggerTrackToTrackerClusters::AliMUONTriggerTrackToTrackerClusters(const AliMUONGeometryTransformer& transformer,
50 : AliMUONVTriggerTrackStore* trackStore)
51 0 : : TObject(), fkTransformer(transformer), fTriggerTrackStore(trackStore)
52 0 : {
53 : /// ctor. We do not take ownership of the trigger track store.
54 0 : }
55 :
56 : //_____________________________________________________________________________
57 : AliMUONTriggerTrackToTrackerClusters::~AliMUONTriggerTrackToTrackerClusters()
58 0 : {
59 : /// dtor
60 0 : }
61 :
62 : //_____________________________________________________________________________
63 : Int_t
64 : AliMUONTriggerTrackToTrackerClusters::DetElemId(Int_t chamber, Double_t x, Double_t y,
65 : Double_t ex, Double_t ey,
66 : Double_t& z) const
67 : {
68 : /// Find in which detection element (x,y) (global) position is.
69 :
70 0 : AliMpDEIterator it;
71 :
72 0 : AliMpArea a(x, y, ex, ey);
73 :
74 0 : it.First(chamber);
75 :
76 0 : while ( !it.IsDone() )
77 : {
78 0 : Int_t detElemId = it.CurrentDEId();
79 :
80 0 : AliMpArea* area = fkTransformer.GetDEArea(detElemId);
81 :
82 0 : if ( area->Overlap(a) )
83 : {
84 : // get z of the center of that DE.
85 0 : Double_t dummyx, dummyy;
86 0 : fkTransformer.Local2Global(detElemId,0,0,0,dummyx,dummyy,z);
87 : return detElemId;
88 0 : }
89 0 : it.Next();
90 0 : }
91 :
92 0 : return -1;
93 0 : }
94 :
95 : //_____________________________________________________________________________
96 : Int_t
97 : AliMUONTriggerTrackToTrackerClusters::GenerateClusters(Int_t iChamber,
98 : AliMUONVClusterStore& clusterStore) const
99 : {
100 : /// Generate clusters in given chamber
101 : /// Return the number of clusters added to the clusterStore
102 :
103 0 : AliCodeTimerAuto(Form("Chamber %d",iChamber),0);
104 :
105 0 : TIter next(fTriggerTrackStore->CreateIterator());
106 :
107 : AliMUONTriggerTrack* track;
108 : Int_t nadded(0);
109 :
110 0 : while ( ( track = static_cast<AliMUONTriggerTrack*>(next()) ) )
111 : {
112 0 : nadded += GenerateClusters(iChamber,*track,clusterStore);
113 : }
114 : return nadded;
115 0 : }
116 :
117 : //_____________________________________________________________________________
118 : Int_t
119 : AliMUONTriggerTrackToTrackerClusters::GenerateClusters(Int_t iChamber,
120 : const AliMUONTriggerTrack& track,
121 : AliMUONVClusterStore& clusterStore) const
122 : {
123 : /// From a trigger track, generate 1 cluster in given chamber
124 :
125 : /// Get a (rough) guestimate of the track momentum
126 :
127 : Int_t nadded(0);
128 :
129 0 : Double_t z = AliMUONConstants::DefaultChamberZ(10);
130 :
131 0 : Double_t bendingCoord = track.GetY11();
132 0 : Double_t bendingSlope = TMath::Tan(track.GetThetay());
133 :
134 0 : Double_t bendingImpact = bendingCoord - z * bendingSlope;
135 :
136 0 : AliDebug(1,Form("TriggerTrack impact parameter=%e",bendingImpact));
137 :
138 : // StdoutToAliDebug(1,track.Print());
139 :
140 0 : Double_t inverseBendingMomentum = 1. / AliMUONTrackExtrap::GetBendingMomentumFromImpactParam(bendingImpact);
141 :
142 : // Construct an AliMUONTrackParam from the trigger track, in order to be able to extrapolate it
143 : // to chambers 6..9 planes.
144 :
145 0 : AliMUONTrackParam trackParam;
146 :
147 0 : trackParam.SetZ(z);
148 0 : trackParam.SetNonBendingCoor(track.GetX11());
149 0 : trackParam.SetNonBendingSlope(TMath::Tan(track.GetThetax()));
150 0 : trackParam.SetBendingCoor(bendingCoord);
151 0 : trackParam.SetBendingSlope(bendingSlope);
152 0 : trackParam.SetInverseBendingMomentum(inverseBendingMomentum);
153 :
154 0 : Double_t dZ = AliMUONConstants::DefaultChamberZ(10) - AliMUONConstants::DefaultChamberZ(12);
155 :
156 0 : Double_t sigmaX = AliMUONConstants::TriggerNonBendingReso();
157 :
158 0 : Double_t sigmaY = AliMUONConstants::TriggerBendingReso();
159 :
160 : // Compute and set track parameters covariances
161 0 : TMatrixD paramCov(5,5);
162 0 : paramCov.Zero();
163 :
164 : // Non bending plane
165 0 : paramCov(0,0) = sigmaX*sigmaX;
166 0 : paramCov(0,1) = paramCov(0,0)/dZ;
167 0 : paramCov(1,0) = paramCov(0,1);
168 0 : paramCov(1,1) = 2.0*paramCov(0,0)/dZ/dZ;
169 :
170 : // Bending plane
171 0 : paramCov(2,2) = sigmaY*sigmaY;
172 0 : paramCov(2,3) = paramCov(2,2)/dZ;
173 0 : paramCov(3,2) = paramCov(2,3);
174 0 : paramCov(3,3) = 2.0*paramCov(2,2)/dZ/dZ;
175 :
176 : // Inverse bending momentum (50% error)
177 0 : paramCov(4,4) = 0.5*inverseBendingMomentum * 0.5*inverseBendingMomentum;
178 :
179 : // Set covariances
180 0 : trackParam.SetCovariances(paramCov);
181 :
182 : // add MCS effect in the iron wall
183 0 : const Float_t kFilterThickness = AliMUONConstants::MuonFilterZEnd()-AliMUONConstants::MuonFilterZBeg(); // cm
184 0 : AliMUONTrackExtrap::ExtrapToZCov(&trackParam, AliMUONConstants::MuonFilterZEnd()); // Extrap to iChamber
185 0 : AliMUONTrackExtrap::AddMCSEffect(&trackParam, kFilterThickness, AliMUONConstants::MuonFilterX0()); // Add MCS effects
186 :
187 : // Now we extrapolate this trackParam to chambers 6 -> 9
188 0 : Int_t nclusters = clusterStore.GetSize();
189 :
190 0 : AliMUONTrackParam tp(trackParam);
191 :
192 0 : Double_t zg = AliMUONConstants::DefaultChamberZ(iChamber);
193 0 : AliMUONTrackExtrap::ExtrapToZCov(&tp, zg); // Extrap to iChamber
194 :
195 :
196 0 : AliDebug(1,Form("iChamber=%d",iChamber));
197 :
198 0 : StdoutToAliDebug(1,tp.Print("FULLCOV"););
199 :
200 0 : Double_t x = tp.GetNonBendingCoor();
201 0 : Double_t y = tp.GetBendingCoor();
202 0 : const TMatrixD& cov = tp.GetCovariances();
203 0 : Double_t ex = TMath::Sqrt(cov(0,0));
204 0 : Double_t ey = TMath::Sqrt(cov(2,2));
205 :
206 0 : Double_t zde;
207 :
208 0 : Int_t detElemId = DetElemId(iChamber,x,y,ex,ey,zde);
209 :
210 0 : AliDebug(1,Form("zg = %e zde = %e",zg,zde));
211 :
212 0 : if ( AliMpDEManager::IsValidDetElemId(detElemId) )
213 : {
214 0 : AliMUONVCluster* rawCluster = clusterStore.Add(AliMpDEManager::GetChamberId(detElemId), detElemId, nclusters);
215 :
216 : ++nclusters;
217 : ++nadded;
218 :
219 0 : rawCluster->SetCharge(100.0);
220 0 : rawCluster->SetXYZ(x, y, zg);
221 0 : rawCluster->SetErrXY(ex,ey);
222 0 : }
223 : else
224 : {
225 0 : AliWarning(Form("No DE found at xg=%e yg=%e",x,y));
226 : }
227 :
228 : return nadded;
229 0 : }
|