]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PHOS/AliPHOSTrackSegmentMakerv1.cxx
Compilation warnings fixed.
[u/mrichter/AliRoot.git] / PHOS / AliPHOSTrackSegmentMakerv1.cxx
CommitLineData
d15a28e7 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 **************************************************************************/
b2a60966 15/* $Id$ */
702ab87e 16
17/* History of cvs commits:
18 *
19 * $Log$
04236e67 20 * Revision 1.93 2007/10/10 09:05:10 schutz
21 * Changing name QualAss to QA
22 *
b8274834 23 * Revision 1.92 2007/08/28 12:55:08 policheh
24 * Loaders removed from the reconstruction code (C.Cheshkov)
25 *
9a2cdbdf 26 * Revision 1.91 2007/08/07 14:12:03 kharlov
27 * Quality assurance added (Yves Schutz)
28 *
ddd1a39c 29 * Revision 1.90 2007/07/11 13:43:30 hristov
30 * New class AliESDEvent, backward compatibility with the old AliESD (Christian)
31 *
af885e0f 32 * Revision 1.89 2007/07/03 08:13:04 kharlov
33 * Bug fix in CPV local coordinates
34 *
b22f5347 35 * Revision 1.88 2007/06/27 09:11:07 kharlov
36 * Bug fix for CPV-EMC distance
37 *
78881c42 38 * Revision 1.87 2007/05/04 14:49:29 policheh
39 * AliPHOSRecPoint inheritance from AliCluster
40 *
9ee9f78d 41 * Revision 1.86 2007/04/02 15:00:16 cvetan
42 * No more calls to gAlice in the reconstruction
43 *
999f9a8f 44 * Revision 1.85 2007/03/28 19:18:15 kharlov
45 * RecPoints recalculation in TSM removed
46 *
8c1fb709 47 * Revision 1.84 2007/03/07 07:01:21 hristov
48 * Fixing copy/paste erro. Additional protections
49 *
b89c16b2 50 * Revision 1.83 2007/03/06 21:07:37 kharlov
51 * DP: xz CPV-EMC distance filled to TS
52 *
d7ddbb70 53 * Revision 1.82 2007/03/06 06:54:48 kharlov
54 * DP:Calculation of cluster properties dep. on vertex added
55 *
e84d3def 56 * Revision 1.81 2007/02/05 10:02:40 kharlov
57 * Module numbering is corrected
58 *
a2ee5b34 59 * Revision 1.80 2006/08/28 10:01:56 kharlov
60 * Effective C++ warnings fixed (Timur Pocheptsov)
61 *
3663622c 62 * Revision 1.79 2006/04/25 12:41:15 hristov
63 * Moving non-persistent data to AliESDfriend (Yu.Belikov)
64 *
15e85efa 65 * Revision 1.78 2005/11/18 13:04:51 hristov
66 * Bug fix
67 *
a494460a 68 * Revision 1.77 2005/11/17 23:34:36 hristov
69 * Corrected logics
70 *
f74a631d 71 * Revision 1.76 2005/11/17 22:29:12 hristov
72 * Faster version, no attempt to match tracks outside the PHOS acceptance
73 *
0d9aa319 74 * Revision 1.75 2005/11/17 12:35:27 hristov
75 * Use references instead of objects. Avoid to create objects when they are not really needed
76 *
7b51037f 77 * Revision 1.74 2005/07/08 14:01:36 hristov
78 * Tracking in non-uniform nmagnetic field (Yu.Belikov)
79 *
c84a5e9e 80 * Revision 1.73 2005/05/28 14:19:05 schutz
81 * Compilation warnings fixed by T.P.
82 *
702ab87e 83 */
84
d15a28e7 85//_________________________________________________________________________
b2a60966 86// Implementation version 1 of algorithm class to construct PHOS track segments
f035f6ce 87// Track segment for PHOS is list of
194f9939 88// EMC RecPoint + (possibly) CPV RecPoint
a4e98857 89// To find TrackSegments we do the following:
90// for each EMC RecPoints we look at
194f9939 91// CPV RecPoints in the radious fRcpv.
a4e98857 92// If there is such a CPV RecPoint,
194f9939 93// we make "Link" it is just indexes of EMC and CPV RecPoint and distance
a4e98857 94// between them in the PHOS plane.
95// Then we sort "Links" and starting from the
96// least "Link" pointing to the unassined EMC and CPV RecPoints assing them to
97// new TrackSegment.
194f9939 98// If there is no CPV RecPoint we make TrackSegment
a4e98857 99// consisting from EMC alone. There is no TrackSegments without EMC RecPoint.
f444a19f 100//// In principle this class should be called from AliPHOSReconstructor, but
a4e98857 101// one can use it as well in standalone mode.
102// Use case:
fc12304f 103// root [0] AliPHOSTrackSegmentMakerv1 * t = new AliPHOSTrackSegmentMaker("galice.root", "tracksegmentsname", "recpointsname")
a4e98857 104// Warning in <TDatabasePDG::TDatabasePDG>: object already instantiated
fc12304f 105// // reads gAlice from header file "galice.root", uses recpoints stored in the branch names "recpointsname" (default = "Default")
106// // and saves recpoints in branch named "tracksegmentsname" (default = "recpointsname")
a4e98857 107// root [1] t->ExecuteTask()
a4e98857 108// root [3] t->SetTrackSegmentsBranch("max distance 5 cm")
109// root [4] t->ExecuteTask("deb all time")
f035f6ce 110//
fc12304f 111//*-- Author: Dmitri Peressounko (RRC Ki & SUBATECH) & Yves Schutz (SUBATECH)
b2a60966 112//
d15a28e7 113
114// --- ROOT system ---
f96711b8 115#include "TVector3.h"
2731cd1e 116#include "TTree.h"
2731cd1e 117#include "TBenchmark.h"
d15a28e7 118
21cd0c07 119// --- Standard library ---
194f9939 120#include "Riostream.h"
d15a28e7 121// --- AliRoot header files ---
e957fea8 122#include "AliPHOSGeometry.h"
d15a28e7 123#include "AliPHOSTrackSegmentMakerv1.h"
124#include "AliPHOSTrackSegment.h"
125#include "AliPHOSLink.h"
af885e0f 126#include "AliESDEvent.h"
aa0b9641 127#include "AliESDtrack.h"
9a2cdbdf 128#include "AliPHOSEmcRecPoint.h"
129#include "AliPHOSCpvRecPoint.h"
96351742 130#include "AliLog.h"
f96711b8 131#include "AliMagF.h"
c5a539a3 132#include "AliMagF.h"
133#include "AliTracker.h"
134#include "AliGeomManager.h"
135#include "AliCluster.h"
136#include "AliKalmanTrack.h"
137#include "AliGlobalQADataMaker.h"
138#include "AliVParticle.h"
139
d15a28e7 140
141ClassImp( AliPHOSTrackSegmentMakerv1)
142
143
144//____________________________________________________________________________
3663622c 145AliPHOSTrackSegmentMakerv1::AliPHOSTrackSegmentMakerv1() :
146 AliPHOSTrackSegmentMaker(),
147 fDefaultInit(kTRUE),
148 fWrite(kFALSE),
149 fNTrackSegments(0),
150 fRcpv(0.f),
151 fRtpc(0.f),
ddd1a39c 152 fVtx(0.f),
3663622c 153 fLinkUpArray(0),
154 fEmcFirst(0),
155 fEmcLast(0),
156 fCpvFirst(0),
157 fCpvLast(0),
158 fModule(0),
9a2cdbdf 159 fTrackSegments(NULL)
d15a28e7 160{
7b7c1533 161 // default ctor (to be used mainly by Streamer)
8d0f3f77 162 InitParameters() ;
d15a28e7 163}
7b7c1533 164
9f616d61 165//____________________________________________________________________________
9a2cdbdf 166AliPHOSTrackSegmentMakerv1::AliPHOSTrackSegmentMakerv1(AliPHOSGeometry *geom) :
167 AliPHOSTrackSegmentMaker(geom),
3663622c 168 fDefaultInit(kFALSE),
169 fWrite(kFALSE),
170 fNTrackSegments(0),
171 fRcpv(0.f),
172 fRtpc(0.f),
ddd1a39c 173 fVtx(0.f),
3663622c 174 fLinkUpArray(0),
175 fEmcFirst(0),
176 fEmcLast(0),
177 fCpvFirst(0),
178 fCpvLast(0),
179 fModule(0),
9a2cdbdf 180 fTrackSegments(NULL)
2731cd1e 181{
182 // ctor
8d0f3f77 183 InitParameters() ;
7b7c1533 184 Init() ;
aa0b9641 185 fESD = 0;
2731cd1e 186}
98cbd830 187
3663622c 188
189AliPHOSTrackSegmentMakerv1::AliPHOSTrackSegmentMakerv1(const AliPHOSTrackSegmentMakerv1 & tsm) :
190 AliPHOSTrackSegmentMaker(tsm),
191 fDefaultInit(kFALSE),
192 fWrite(kFALSE),
193 fNTrackSegments(0),
194 fRcpv(0.f),
195 fRtpc(0.f),
ddd1a39c 196 fVtx(0.f),
3663622c 197 fLinkUpArray(0),
198 fEmcFirst(0),
199 fEmcLast(0),
200 fCpvFirst(0),
201 fCpvLast(0),
202 fModule(0),
9a2cdbdf 203 fTrackSegments(NULL)
3663622c 204{
205 // cpy ctor: no implementation yet
206 // requested by the Coding Convention
207 Fatal("cpy ctor", "not implemented") ;
208}
209
210
2731cd1e 211//____________________________________________________________________________
212 AliPHOSTrackSegmentMakerv1::~AliPHOSTrackSegmentMakerv1()
213{
214 // dtor
92f521a9 215 // fDefaultInit = kTRUE if TrackSegmentMaker created by default ctor (to get just the parameters)
88cb7938 216 if (!fDefaultInit)
217 delete fLinkUpArray ;
9a2cdbdf 218 if (fTrackSegments) {
219 fTrackSegments->Delete();
220 delete fTrackSegments;
221 }
fc12304f 222}
223
d15a28e7 224//____________________________________________________________________________
2731cd1e 225void AliPHOSTrackSegmentMakerv1::FillOneModule()
9f616d61 226{
f035f6ce 227 // Finds first and last indexes between which
228 // clusters from one PHOS module are
88cb7938 229
2731cd1e 230 //First EMC clusters
9a2cdbdf 231 Int_t totalEmc = fEMCRecPoints->GetEntriesFast() ;
2731cd1e 232 for(fEmcFirst = fEmcLast; (fEmcLast < totalEmc) &&
9a2cdbdf 233 ((dynamic_cast<AliPHOSRecPoint *>(fEMCRecPoints->At(fEmcLast)))->GetPHOSMod() == fModule );
2731cd1e 234 fEmcLast ++) ;
235
2731cd1e 236 //Now CPV clusters
9a2cdbdf 237 Int_t totalCpv = fCPVRecPoints->GetEntriesFast() ;
6ad0bfa0 238
2731cd1e 239 for(fCpvFirst = fCpvLast; (fCpvLast < totalCpv) &&
9a2cdbdf 240 ((dynamic_cast<AliPHOSRecPoint *>(fCPVRecPoints->At(fCpvLast)))->GetPHOSMod() == fModule );
88cb7938 241 fCpvLast ++) ;
9688c1dd 242
d15a28e7 243}
7b7c1533 244
d15a28e7 245//____________________________________________________________________________
e84d3def 246void AliPHOSTrackSegmentMakerv1::GetDistanceInPHOSPlane(AliPHOSEmcRecPoint * emcClu,
247 AliPHOSCpvRecPoint * cpvClu,
248 Int_t &trackindex,
249 Float_t &dx, Float_t &dz) const
d15a28e7 250{
194f9939 251 // Calculates the distance between the EMC RecPoint and the CPV RecPoint
e44c41e9 252 // If no CPV, calculates the distance between the EMC RecPoint and the track
253 // prolongation to the PHOS module plane.
a4e98857 254 // Clusters are sorted in "rows" and "columns" of width 1 cm
f035f6ce 255
e84d3def 256// Float_t delta = 1 ; // Width of the rows in sorting of RecPoints (in cm)
257// // if you change this value, change it as well in xxxRecPoint::Compare()
194f9939 258
e44c41e9 259 if(!cpvClu) {
96351742 260
261 trackindex = -1;
262 dx=999.;
263 dz=999.;
264
265 if(!emcClu) {
266 return;
267 }
e44c41e9 268
f96711b8 269 // *** Start the matching
270 Int_t nt=fESD->GetNumberOfTracks();
271 Int_t iPHOSMod = emcClu->GetPHOSMod() ;
272 //Calculate actual distance to PHOS module
273 TVector3 globaPos ;
274 fGeom->Local2Global(iPHOSMod, 0.,0., globaPos) ;
275 const Double_t rPHOS = globaPos.Pt() ; //Distance to PHOS module
276 const Double_t kYmax = 72.+10. ; //Size of the module (with some reserve) in phi direction
277 const Double_t kZmax = 64.+10. ; //Size of the module (with some reserve) in z direction
278 const Double_t kAlpha= 20./180.*TMath::Pi() ; //TPC sector angular size
279 Double_t minDistance = 1.e6;
280
281 TMatrixF gmat;
282 TVector3 gposRecPoint; // global (in ALICE frame) position of rec. point
283 emcClu->GetGlobalPosition(gposRecPoint,gmat);
284 Double_t gposTrack[3] ;
285
286 Double_t bz = GetBz() ; //B-Field for approximate matching
287 Double_t b[3];
288 for (Int_t i=0; i<nt; i++) {
289 AliESDtrack *esdTrack=fESD->GetTrack(i);
290
291// // Skip the tracks having "wrong" status (has to be checked/tuned)
292// ULong_t status = esdTrack->GetStatus();
293// if ((status & AliESDtrack::kTRDout) == 0) continue;
294// if ((status & AliESDtrack::kTRDrefit) == 1) continue;
295
296 AliExternalTrackParam t(*esdTrack);
297 Int_t isec=Int_t(t.GetAlpha()/kAlpha);
298 Int_t imod=-isec-2; // PHOS module
299
300 Double_t y; // Some tracks do not reach the PHOS
301 if (!t.GetYAt(rPHOS,bz,y)) continue; // because of the bending
302
303 Double_t z; t.GetZAt(rPHOS,bz,z);
304 if (TMath::Abs(z) > kZmax) continue; // Some tracks miss the PHOS in Z
305
306 Bool_t ok=kTRUE;
307 while (TMath::Abs(y) > kYmax) { // Find the matching module
308 Double_t alp=t.GetAlpha();
309 if (y > kYmax) {
310 if (!t.Rotate(alp+kAlpha)) {ok=kFALSE; break;}
311 imod--;
312 } else if (y < -kYmax) {
313 if (!t.Rotate(alp-kAlpha)) {ok=kFALSE; break;}
314 imod++;
315 }
316 if (!t.GetYAt(rPHOS,bz,y)) {ok=kFALSE; break;}
b2e9b669 317 }
318 if (!ok) continue; // Track rotation failed
f96711b8 319
f96711b8 320
b2e9b669 321 if(imod!= iPHOSMod-1)
322 continue; //not even approximate coincidence
f96711b8 323
b2e9b669 324 //t.CorrectForMaterial(...); // Correct for the TOF material, if needed
325 t.GetBxByBz(b) ;
326 t.PropagateToBxByBz(rPHOS,b); // Propagate to the matching module
327 t.GetXYZ(gposTrack) ;
328
329 Double_t ddx = gposTrack[0] - gposRecPoint.X(), ddy = gposTrack[1] - gposRecPoint.Y(), ddz = gposTrack[2] - gposRecPoint.Z();
330 Double_t d2 = ddx*ddx + ddy*ddy + ddz*ddz;
331 if(d2 < minDistance) {
332 dx = TMath::Sign(TMath::Sqrt(ddx*ddx + ddy*ddy),ddx) ;
333 dz = ddz ;
334 trackindex=i;
335 minDistance=d2 ;
336 }
337 }
338 return ;
339 }
f96711b8 340
341
b2e9b669 342 TVector3 emcGlobal;
343 fGeom->GetGlobalPHOS((AliPHOSRecPoint*)emcClu,emcGlobal);
96351742 344
b2e9b669 345 // Radius from IP to current point
346 Double_t rEMC = TMath::Abs(emcGlobal.Pt());
96351742 347
b2e9b669 348 // Extrapolate the global track direction to EMC
349 // and find the closest track
96351742 350
b2e9b669 351 Int_t nTracks = fESD->GetNumberOfTracks();
e44c41e9 352
b2e9b669 353 AliESDtrack *track;
354 Double_t xyz[] = {-1,-1,-1};
355 Double_t pxyz[3];
356 Double_t zEMC,xEMC;
357 Int_t module;
358 TVector3 vecP;
359 TVector3 locClu;
360
361 Float_t minDistance = 1.e6;
362 Float_t dr;
363
364 for (Int_t iTrack=0; iTrack<nTracks; iTrack++) {
365 track = fESD->GetTrack(iTrack);
366 if (!track->GetXYZAt(rEMC, fESD->GetMagneticField(), xyz)) continue;
367
368 AliDebug(1,Form("Event %d, iTrack: %d, (%.3f,%.3f,%.3f)",
369 fESD->GetEventNumberInFile(),iTrack,xyz[0],xyz[1],xyz[2]));
96351742 370
b2e9b669 371 if (track->GetPxPyPzAt(rEMC,fESD->GetMagneticField(),pxyz)) {
96351742 372
b2e9b669 373 vecP.SetXYZ(pxyz[0],pxyz[1],pxyz[2]);
374 fGeom->ImpactOnEmc(xyz,vecP.Theta(),vecP.Phi(),module,zEMC,xEMC) ;
96351742 375
b2e9b669 376 if(!module) continue;
377 AliDebug(1,Form("\t\tTrack hit PHOS! Module: %d, (x,z)=(%.3f,%.3f)",module,xEMC,zEMC));
96351742 378
b2e9b669 379 if(emcClu->GetPHOSMod() != module) continue;
96351742 380
b2e9b669 381 // match track to EMC cluster
382 emcClu->GetLocalPosition(locClu);
96351742 383
b2e9b669 384 Float_t delta_x = xEMC - locClu.X();
385 Float_t delta_z = zEMC - locClu.Z();
386 dr = TMath::Sqrt(delta_x*delta_x + delta_z*delta_z);
387 AliDebug(1,Form("\tMatch iTrack=%d: (dx,dz)=(%.3f,%.3f)",iTrack,delta_x,delta_z));
96351742 388
b2e9b669 389 if(dr<minDistance) {
390 trackindex = iTrack;
391 minDistance = dr;
392 dx = delta_x;
393 dz = delta_z;
e44c41e9 394 }
395 }
b2e9b669 396
e44c41e9 397 }
b2e9b669 398
399 if(trackindex>=0)
400 AliDebug(1,Form("\t\tBest match for (xClu,zClu,eClu)=(%.3f,%.3f,%.3f): iTrack=%d, dR=%.3f",
401 locClu.X(),locClu.Z(),emcClu->GetEnergy(),
402 trackindex,TMath::Sqrt(dx*dx+dz*dz)));
403 return;
e44c41e9 404
405 Float_t distance2Track = fRtpc ;
406
194f9939 407 trackindex = -1 ; // closest track within fRCpv
b2e9b669 408
aa0b9641 409 TVector3 vecEmc ; // Local position of EMC recpoint
e84d3def 410 TVector3 vecPloc ; // Momentum direction at CPV plain
2731cd1e 411
194f9939 412 //toofar = kTRUE ;
e84d3def 413 if(emcClu->GetPHOSMod() != cpvClu->GetPHOSMod()){
414 dx=999. ;
415 dz=999. ;
416 return ;
417 }
b2e9b669 418
e84d3def 419 emcClu->GetLocalPosition(vecEmc) ;
b2e9b669 420
e84d3def 421 Double_t xCPV,zCPV ; //EMC-projected coordinates of CPV cluster
422 TVector3 cpvGlobal; // Global position of the CPV recpoint
9a2cdbdf 423 fGeom->GetGlobalPHOS((AliPHOSRecPoint*)cpvClu,cpvGlobal);
e84d3def 424 Double_t vtxCPV[3]={cpvGlobal.X(),cpvGlobal.Y(),cpvGlobal.Z()} ;
78881c42 425 Int_t dummyMod ;
e84d3def 426
427 if (fESD == 0x0) {
b2e9b669 428 //if no track information available, assume straight line from IP to emcal
429 fGeom->ImpactOnEmc(vtxCPV,cpvGlobal.Theta(),cpvGlobal.Phi(),dummyMod,zCPV,xCPV) ;
430 dx=xCPV - vecEmc.X() ;
431 dz=zCPV - vecEmc.Z() ;
432 return ;
e84d3def 433 }
b2e9b669 434
e84d3def 435 //if there is ESD try to correct distance using TPC information on particle direct in CPV
436 if (fESD != 0x0) {
0d9aa319 437
e84d3def 438 Double_t rCPV = cpvGlobal.Pt() ;// Radius from IP to current point
439
440 // Extrapolate the global track direction if any to CPV and find the closest track
e84d3def 441 Int_t iClosestTrack = -1;
e84d3def 442 TVector3 inPHOS ;
443
e84d3def 444 for (Int_t iTrack=0; iTrack<nTracks; iTrack++) {
445 track = fESD->GetTrack(iTrack);
446 if (!track->GetXYZAt(rCPV, fESD->GetMagneticField(), xyz))
b2e9b669 447 continue; //track coord on the cylinder of PHOS radius
e84d3def 448 if ((TMath::Abs(xyz[0])+TMath::Abs(xyz[1])+TMath::Abs(xyz[2]))<=0)
b2e9b669 449 continue;
e84d3def 450 //Check if this track hits PHOS
451 inPHOS.SetXYZ(xyz[0],xyz[1],xyz[2]);
452 distance2Track = inPHOS.Angle(cpvGlobal) ;
453 // Find the closest track to the CPV recpoint
454 if (distance2Track < minDistance) {
b2e9b669 455 minDistance = distance2Track;
456 iClosestTrack = iTrack;
aa0b9641 457 }
e84d3def 458 }
aa0b9641 459
e84d3def 460 if (iClosestTrack != -1) {
461 track = fESD->GetTrack(iClosestTrack);
462 if (track->GetPxPyPzAt(rCPV, fESD->GetMagneticField(), pxyz)) { // track momentum ibid.
463 vecP.SetXYZ(pxyz[0],pxyz[1],pxyz[2]);
9a2cdbdf 464 fGeom->ImpactOnEmc(vtxCPV,vecP.Theta(),vecP.Phi(),dummyMod,zCPV,xCPV) ;
aa0b9641 465 }
e84d3def 466 }
194f9939 467
e84d3def 468 if(minDistance < fRtpc ){
469 trackindex = iClosestTrack ;
aa0b9641 470 }
bfc17d18 471 }
e84d3def 472 if(trackindex!=-1){
78881c42 473 // If the closest global track is found, calculate EMC-CPV distance from it
e84d3def 474 dx=xCPV - vecEmc.X() ;
475 dz=zCPV - vecEmc.Z() ;
476 }
477 else{
78881c42 478 // If no global track was found, just take the nearest CPV point
9a2cdbdf 479 fGeom->ImpactOnEmc(vtxCPV,cpvGlobal.Theta(),cpvGlobal.Phi(),dummyMod,zCPV,xCPV) ;
78881c42 480 dx=xCPV - vecEmc.X() ;
481 dz=zCPV - vecEmc.Z() ;
e84d3def 482 }
483 return ;
d15a28e7 484}
7b7c1533 485//____________________________________________________________________________
486void AliPHOSTrackSegmentMakerv1::Init()
487{
488 // Make all memory allocations that are not possible in default constructor
489
7b7c1533 490 fLinkUpArray = new TClonesArray("AliPHOSLink", 1000);
9a2cdbdf 491 fTrackSegments = new TClonesArray("AliPHOSTrackSegment",100);
492 fTrackSegments->SetName("TRACKS");
7b7c1533 493}
494
8d0f3f77 495//____________________________________________________________________________
496void AliPHOSTrackSegmentMakerv1::InitParameters()
497{
e957fea8 498 //Initializes parameters
743cb288 499 fRcpv = 10. ;
500 fRtpc = 4. ;
8d0f3f77 501 fEmcFirst = 0 ;
502 fEmcLast = 0 ;
503 fCpvFirst = 0 ;
504 fCpvLast = 0 ;
505 fLinkUpArray = 0 ;
adcca1e6 506 fWrite = kTRUE ;
8d0f3f77 507}
508
509
d15a28e7 510//____________________________________________________________________________
baef0810 511void AliPHOSTrackSegmentMakerv1::MakeLinks()const
d15a28e7 512{
194f9939 513 // Finds distances (links) between all EMC and CPV clusters,
fbf811ec 514 // which are not further apart from each other than fRcpv
f035f6ce 515 // and sort them in accordance with this distance
9688c1dd 516
2731cd1e 517 fLinkUpArray->Clear() ;
2731cd1e 518
2bb500e5 519 AliPHOSCpvRecPoint * cpv ;
92862013 520 AliPHOSEmcRecPoint * emcclu ;
28c3a259 521
d15a28e7 522 Int_t iLinkUp = 0 ;
523
28c3a259 524 Int_t iEmcRP;
2731cd1e 525 for(iEmcRP = fEmcFirst; iEmcRP < fEmcLast; iEmcRP++ ) {
9a2cdbdf 526 emcclu = dynamic_cast<AliPHOSEmcRecPoint *>(fEMCRecPoints->At(iEmcRP)) ;
2731cd1e 527
194f9939 528 //Bool_t toofar ;
2731cd1e 529 Int_t iCpv = 0 ;
530 for(iCpv = fCpvFirst; iCpv < fCpvLast;iCpv++ ) {
28c3a259 531
9a2cdbdf 532 cpv = dynamic_cast<AliPHOSCpvRecPoint *>(fCPVRecPoints->At(iCpv)) ;
194f9939 533 Int_t track = -1 ;
e84d3def 534 Float_t dx,dz ;
535 GetDistanceInPHOSPlane(emcclu, cpv, track,dx,dz) ;
536 if(TMath::Sqrt(dx*dx+dz*dz) < fRcpv ){
537 new ((*fLinkUpArray)[iLinkUp++]) AliPHOSLink(dx, dz, iEmcRP, iCpv, track) ;
28c3a259 538 }
d15a28e7 539 }
28c3a259 540 }
d15a28e7 541
9688c1dd 542 fLinkUpArray->Sort() ; //first links with smallest distances
d15a28e7 543}
28c3a259 544
d15a28e7 545//____________________________________________________________________________
2731cd1e 546void AliPHOSTrackSegmentMakerv1::MakePairs()
6ad0bfa0 547{
f035f6ce 548 // Using the previously made list of "links", we found the smallest link - i.e.
a4e98857 549 // link with the least distance between EMC and CPV and pointing to still
f035f6ce 550 // unassigned RecParticles. We assign these RecPoints to TrackSegment and
551 // remove them from the list of "unassigned".
88cb7938 552
01a599c9 553 //Make arrays to mark clusters already chosen
2731cd1e 554 Int_t * emcExist = 0;
555 if(fEmcLast > fEmcFirst)
556 emcExist = new Int_t[fEmcLast-fEmcFirst] ;
557
558 Int_t index;
559 for(index = 0; index <fEmcLast-fEmcFirst; index ++)
560 emcExist[index] = 1 ;
561
562 Bool_t * cpvExist = 0;
563 if(fCpvLast > fCpvFirst)
564 cpvExist = new Bool_t[fCpvLast-fCpvFirst] ;
565 for(index = 0; index <fCpvLast-fCpvFirst; index ++)
566 cpvExist[index] = kTRUE ;
567
2731cd1e 568
569 // Finds the smallest links and makes pairs of CPV and EMC clusters with smallest distance
2731cd1e 570 TIter nextUp(fLinkUpArray) ;
d15a28e7 571
d15a28e7 572 AliPHOSLink * linkUp ;
9688c1dd 573
2bb500e5 574 AliPHOSCpvRecPoint * nullpointer = 0 ;
9688c1dd 575
29b077b5 576 while ( (linkUp = static_cast<AliPHOSLink *>(nextUp()) ) ){
9688c1dd 577
194f9939 578 if(emcExist[linkUp->GetEmc()-fEmcFirst] != -1){
d15a28e7 579
194f9939 580 if(cpvExist[linkUp->GetCpv()-fCpvFirst]){ //CPV still exist
d7ddbb70 581 Float_t dx,dz ;
582 linkUp->GetXZ(dx,dz) ;
9a2cdbdf 583 new ((* fTrackSegments)[fNTrackSegments])
584 AliPHOSTrackSegment(dynamic_cast<AliPHOSEmcRecPoint *>(fEMCRecPoints->At(linkUp->GetEmc())) ,
585 dynamic_cast<AliPHOSCpvRecPoint *>(fCPVRecPoints->At(linkUp->GetCpv())) ,
d7ddbb70 586 linkUp->GetTrack(),dx,dz) ;
194f9939 587
9a2cdbdf 588 (dynamic_cast<AliPHOSTrackSegment *>(fTrackSegments->At(fNTrackSegments)))->SetIndexInList(fNTrackSegments);
88cb7938 589 fNTrackSegments++ ;
88cb7938 590 emcExist[linkUp->GetEmc()-fEmcFirst] = -1 ; //Mark emc that Cpv was found
591 //mark CPV recpoint as already used
194f9939 592 cpvExist[linkUp->GetCpv()-fCpvFirst] = kFALSE ;
593 } //if CpvUp still exist
28c3a259 594 }
88cb7938 595 }
28c3a259 596
194f9939 597 //look through emc recPoints left without CPV
2731cd1e 598 if(emcExist){ //if there is emc rec point
599 Int_t iEmcRP ;
600 for(iEmcRP = 0; iEmcRP < fEmcLast-fEmcFirst ; iEmcRP++ ){
601 if(emcExist[iEmcRP] > 0 ){
e44c41e9 602 Int_t track = -1 ;
603 Float_t dx,dz ;
604 AliPHOSEmcRecPoint *emcclu = dynamic_cast<AliPHOSEmcRecPoint *>(fEMCRecPoints->At(iEmcRP+fEmcFirst));
605 GetDistanceInPHOSPlane(emcclu, 0, track,dx,dz);
606 if(track<0)
607 new ((*fTrackSegments)[fNTrackSegments]) AliPHOSTrackSegment(emcclu,nullpointer) ;
608 else
609 new ((*fTrackSegments)[fNTrackSegments]) AliPHOSTrackSegment(emcclu,0,track,dx,dz);
610 (dynamic_cast<AliPHOSTrackSegment *>(fTrackSegments->At(fNTrackSegments)))->SetIndexInList(fNTrackSegments);
611 fNTrackSegments++;
2731cd1e 612 }
d15a28e7 613 }
d15a28e7 614 }
780a31c1 615 delete [] emcExist ;
616 delete [] cpvExist ;
d15a28e7 617}
618
619//____________________________________________________________________________
9a2cdbdf 620void AliPHOSTrackSegmentMakerv1::Clusters2TrackSegments(Option_t *option)
d15a28e7 621{
9a2cdbdf 622 // Steering method to perform track segment construction for the current event
623 // Returns an array with the found track-segments.
88cb7938 624
2731cd1e 625 if(strstr(option,"tim"))
b3f97575 626 gBenchmark->Start("PHOSTSMaker");
7b7c1533 627
628 if(strstr(option,"print")) {
88cb7938 629 Print() ;
7b7c1533 630 return ;
631 }
88cb7938 632
9a2cdbdf 633 //Make some initializations
634 fNTrackSegments = 0 ;
635 fEmcFirst = 0 ;
636 fEmcLast = 0 ;
637 fCpvFirst = 0 ;
638 fCpvLast = 0 ;
55ea5766 639
9a2cdbdf 640 fTrackSegments->Clear();
7b7c1533 641
9a2cdbdf 642 // if(!ReadRecPoints(ievent)) continue; //reads RecPoints for event ievent
f96711b8 643
9a2cdbdf 644 for(fModule = 1; fModule <= fGeom->GetNModules() ; fModule++ ) {
645 FillOneModule() ;
646 MakeLinks() ;
647 MakePairs() ;
2731cd1e 648 }
9a2cdbdf 649
650 if(strstr(option,"deb"))
651 PrintTrackSegments(option);
652
2731cd1e 653 if(strstr(option,"tim")){
654 gBenchmark->Stop("PHOSTSMaker");
9a2cdbdf 655 Info("Exec", "took %f seconds for making TS",
656 gBenchmark->GetCpuTime("PHOSTSMaker"));
657 }
d15a28e7 658}
7b7c1533 659
d15a28e7 660//____________________________________________________________________________
702ab87e 661void AliPHOSTrackSegmentMakerv1::Print(const Option_t *)const
a4e98857 662{
baef0810 663 // Print TrackSegmentMaker parameters
664
21cd0c07 665 TString message("") ;
7b7c1533 666 if( strcmp(GetName(), "") != 0 ) {
21cd0c07 667 message = "\n======== AliPHOSTrackSegmentMakerv1 ========\n" ;
668 message += "Making Track segments\n" ;
669 message += "with parameters:\n" ;
194f9939 670 message += " Maximal EMC - CPV distance (cm) %f\n" ;
21cd0c07 671 message += "============================================\n" ;
672 Info("Print", message.Data(),fRcpv) ;
2731cd1e 673 }
674 else
21cd0c07 675 Info("Print", "AliPHOSTrackSegmentMakerv1 not initialized ") ;
d15a28e7 676}
7b7c1533 677
2731cd1e 678//____________________________________________________________________________
a4e98857 679void AliPHOSTrackSegmentMakerv1::PrintTrackSegments(Option_t * option)
680{
f035f6ce 681 // option deb - prints # of found TrackSegments
682 // option deb all - prints as well indexed of found RecParticles assigned to the TS
9688c1dd 683
88cb7938 684 Info("PrintTrackSegments", "Results from TrackSegmentMaker:") ;
9a2cdbdf 685 printf(" Found %d TrackSegments\n", fTrackSegments->GetEntriesFast() );
88cb7938 686
2731cd1e 687 if(strstr(option,"all")) { // printing found TS
88cb7938 688 printf("TrackSegment # EMC RP# CPV RP#\n") ;
2731cd1e 689 Int_t index;
9a2cdbdf 690 for (index = 0 ; index <fTrackSegments->GetEntriesFast() ; index++) {
691 AliPHOSTrackSegment * ts = (AliPHOSTrackSegment * )fTrackSegments->At(index) ;
88cb7938 692 printf(" %d %d %d \n", ts->GetIndexInList(), ts->GetEmcIndex(), ts->GetCpvIndex() ) ;
2731cd1e 693 }
d15a28e7 694 }
2731cd1e 695}
f96711b8 696//__________________________________________________________________________
697Double_t AliPHOSTrackSegmentMakerv1::GetBz()const
698{
f96711b8 699 AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
700 if (!fld) return 0.5*kAlmost0Field;
701 Double_t bz = fld->SolenoidField();
702 return TMath::Sign(0.5*kAlmost0Field,bz) + bz;
703}
704//__________________________________________________________________________
705void AliPHOSTrackSegmentMakerv1::GetBxByBz(const Double_t r[3], Double_t b[3])const {
706 //------------------------------------------------------------------
707 // Returns Bx, By and Bz (kG) at the point "r" .
708 //------------------------------------------------------------------
f96711b8 709 AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
710 if (!fld) {
711 b[0] = b[1] = 0.;
712 b[2] = 0.5*kAlmost0Field;
713 return;
714 }
715
716 if (fld->IsUniform()) {
717 b[0] = b[1] = 0.;
718 b[2] = fld->SolenoidField();
719 } else {
720 fld->Field(r,b);
721 }
722 b[2] = (TMath::Sign(0.5*kAlmost0Field,b[2]) + b[2]);
723 return;
724}
725
726