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 **************************************************************************/
16 //-----------------------------------------------------//
18 // Date : March 25 2004 //
19 // This reads the file PMD.RecPoints.root(TreeR), //
20 // calls the Clustering algorithm and stores the //
21 // clustering output in PMD.RecPoints.root(TreeR) //
23 //-----------------------------------------------------//
25 #include <Riostream.h>
28 #include <TObjArray.h>
29 #include <TClonesArray.h>
33 #include <TParticle.h>
35 #include <TGeoMatrix.h>
37 #include "AliGeomManager.h"
39 #include "AliPMDcluster.h"
40 #include "AliPMDclupid.h"
41 #include "AliPMDrecpoint1.h"
42 #include "AliPMDrecdata.h"
43 #include "AliPMDrechit.h"
44 #include "AliPMDUtility.h"
45 #include "AliPMDDiscriminator.h"
46 #include "AliPMDEmpDiscriminator.h"
47 #include "AliPMDtracker.h"
49 #include "AliESDPmdTrack.h"
50 #include "AliESDEvent.h"
53 ClassImp(AliPMDtracker)
55 AliPMDtracker::AliPMDtracker():
57 fRecpoints(new TClonesArray("AliPMDrecpoint1", 10)),
58 fRechits(new TClonesArray("AliPMDrechit", 10)),
59 fPMDcontin(new TObjArray()),
60 fPMDcontout(new TObjArray()),
61 fPMDutil(new AliPMDUtility()),
73 // Default Constructor
76 //--------------------------------------------------------------------//
77 AliPMDtracker:: AliPMDtracker(const AliPMDtracker & /* tracker */):
78 TObject(/* tracker */),
96 AliError("Copy constructor not allowed");
99 //--------------------------------------------------------------------//
100 AliPMDtracker& AliPMDtracker::operator=(const AliPMDtracker & /* tracker */)
102 // assignment operator
103 AliError("Assignment operator not allowed");
107 //--------------------------------------------------------------------//
108 AliPMDtracker::~AliPMDtracker()
122 fPMDcontin->Delete();
129 fPMDcontout->Delete();
136 //--------------------------------------------------------------------//
137 void AliPMDtracker::LoadClusters(TTree *treein)
139 // Load the Reconstructed tree
142 //--------------------------------------------------------------------//
143 void AliPMDtracker::Clusters2Tracks(AliESDEvent *event)
145 // Converts digits to recpoints after running clustering
146 // algorithm on CPV plane and PREshower plane
151 Int_t trackno = 1, trackpid = 0;
152 Float_t clusdata[6] = {0.,0.,0.,0.,0.,0.};
160 AliPMDrechit *rechit = 0x0;
162 TBranch *branch = fTreeR->GetBranch("PMDRecpoint");
165 AliError("PMDRecpoint branch not found");
168 branch->SetAddress(&fRecpoints);
170 TBranch *branch1 = fTreeR->GetBranch("PMDRechit");
173 AliError("PMDRechit branch not found");
176 branch1->SetAddress(&fRechits);
179 Int_t nmodules = (Int_t) branch->GetEntries();
181 AliDebug(1,Form("Number of modules filled in treeR = %d",nmodules));
182 for (Int_t imodule = 0; imodule < nmodules; imodule++)
184 branch->GetEntry(imodule);
185 Int_t nentries = fRecpoints->GetLast();
186 AliDebug(2,Form("Number of clusters per modules filled in treeR = %d"
189 for(Int_t ient = 0; ient < nentries+1; ient++)
191 fPMDrecpoint = (AliPMDrecpoint1*)fRecpoints->UncheckedAt(ient);
192 idet = fPMDrecpoint->GetDetector();
193 ismn = fPMDrecpoint->GetSMNumber();
194 clusdata[0] = fPMDrecpoint->GetClusX();
195 clusdata[1] = fPMDrecpoint->GetClusY();
196 clusdata[2] = fPMDrecpoint->GetClusADC();
197 clusdata[3] = fPMDrecpoint->GetClusCells();
198 clusdata[4] = fPMDrecpoint->GetClusSigmaX();
199 clusdata[5] = fPMDrecpoint->GetClusSigmaY();
201 if (clusdata[4] >= 0. && clusdata[5] >= 0.)
203 // extract the associated cell information
204 branch1->GetEntry(ncrhit);
205 Int_t nenbr1 = fRechits->GetLast() + 1;
207 irow = new Int_t[nenbr1];
208 icol = new Int_t[nenbr1];
209 itra = new Int_t[nenbr1];
210 ipid = new Int_t[nenbr1];
211 cadc = new Float_t[nenbr1];
213 for (Int_t ient1 = 0; ient1 < nenbr1; ient1++)
215 rechit = (AliPMDrechit*)fRechits->UncheckedAt(ient1);
216 //irow[ient1] = rechit->GetCellX();
217 //icol[ient1] = rechit->GetCellY();
218 itra[ient1] = rechit->GetCellTrack();
219 ipid[ient1] = rechit->GetCellPid();
220 cadc[ient1] = rechit->GetCellAdc();
224 AssignTrPidToCluster(nenbr1, itra, ipid, cadc,
239 fPMDclin = new AliPMDrecdata(idet,ismn,trackno,trackpid,clusdata);
240 fPMDcontin->Add(fPMDclin);
247 AliPMDEmpDiscriminator pmddiscriminator;
248 pmddiscriminator.Discrimination(fPMDcontin,fPMDcontout);
250 // alignment implemention
252 Double_t sectr[4][3] = { {0.,0.,0.},{0.,0.,0.},{0.,0.,0.},{0.,0.,0.}};
253 TString snsector="PMD/Sector";
257 for(Int_t isector=1; isector<=4; isector++)
261 TGeoHMatrix *gpmdal = AliGeomManager::GetMatrix(symname);
262 Double_t *tral = gpmdal->GetTranslation();
264 AliGeomManager::GetOrigGlobalMatrix(symname, gpmdor);
265 Double_t *tror = gpmdor.GetTranslation();
267 for(Int_t ixyz=0; ixyz<3; ixyz++)
269 sectr[isector-1][ixyz] = tral[ixyz] - tror[ixyz];
273 const Float_t kzpos = 361.5; // middle of the PMD
275 Int_t ix = -1, iy = -1;
276 Int_t det = 0, smn = 0, trno = 1, trpid = 0, mstat = 0;
277 Float_t xpos = 0., ypos = 0.;
278 Float_t adc = 0., ncell = 0., radx = 0., rady = 0.;
279 Float_t xglobal = 0., yglobal = 0., zglobal = 0;
282 fPMDutil->ApplyAlignment(sectr);
284 Int_t nentries2 = fPMDcontout->GetEntries();
285 AliDebug(1,Form("Number of clusters coming after discrimination = %d"
287 for (Int_t ient1 = 0; ient1 < nentries2; ient1++)
289 fPMDclout = (AliPMDclupid*)fPMDcontout->UncheckedAt(ient1);
291 det = fPMDclout->GetDetector();
292 smn = fPMDclout->GetSMN();
293 trno = fPMDclout->GetClusTrackNo();
294 trpid = fPMDclout->GetClusTrackPid();
295 mstat = fPMDclout->GetClusMatching();
296 xpos = fPMDclout->GetClusX();
297 ypos = fPMDclout->GetClusY();
298 adc = fPMDclout->GetClusADC();
299 ncell = fPMDclout->GetClusCells();
300 radx = fPMDclout->GetClusSigmaX();
301 // Here in the variable "rady" we are keeping the row and col
302 // of the single isolated cluster having ncell = 1 for offline
305 if ((radx > 999. && radx < 1000.) && ncell == 1)
309 ix = (Int_t) (ypos +0.5);
312 else if (smn > 12 && smn < 24)
315 iy = (Int_t) (ypos +0.5);
317 rady = (Float_t) (ix*100 + iy);
321 rady = fPMDclout->GetClusSigmaY();
323 pid = fPMDclout->GetClusPID();
326 /**********************************************************************
327 * det : Detector, 0: PRE & 1:CPV *
328 * smn : Serial Module Number 0 to 23 for each plane *
329 * xpos : x-position of the cluster *
330 * ypos : y-position of the cluster *
331 * THESE xpos & ypos are not the true xpos and ypos *
332 * for some of the unit modules. They are rotated. *
333 * adc : ADC contained in the cluster *
334 * ncell : Number of cells contained in the cluster *
335 * rad : radius of the cluster (1d fit) *
336 **********************************************************************/
342 zglobal = kzpos + 1.65; // PREshower plane
346 zglobal = kzpos - 1.65; // CPV plane
349 fPMDutil->RectGeomCellPos(smn,xpos,ypos,xglobal,yglobal,zglobal);
353 AliESDPmdTrack *esdpmdtr = new AliESDPmdTrack();
355 esdpmdtr->SetDetector(det);
356 esdpmdtr->SetSmn(smn);
357 esdpmdtr->SetClusterTrackNo(trno);
358 esdpmdtr->SetClusterTrackPid(trpid);
359 esdpmdtr->SetClusterMatching(mstat);
361 esdpmdtr->SetClusterX(xglobal);
362 esdpmdtr->SetClusterY(yglobal);
363 esdpmdtr->SetClusterZ(zglobal);
364 esdpmdtr->SetClusterADC(adc);
365 esdpmdtr->SetClusterCells(ncell);
366 esdpmdtr->SetClusterPID(pid);
367 esdpmdtr->SetClusterSigmaX(radx);
368 esdpmdtr->SetClusterSigmaY(rady);
370 event->AddPmdTrack(esdpmdtr);
374 fPMDcontin->Delete();
375 fPMDcontout->Delete();
378 //--------------------------------------------------------------------//
379 void AliPMDtracker::AssignTrPidToCluster(Int_t nentry, Int_t *itra,
380 Int_t *ipid, Float_t *cadc,
381 Int_t &trackno, Int_t &trackpid)
383 // assign the track number and the corresponding pid to a cluster
384 // split cluster part will be done at the time of calculating eff/pur
386 Int_t *phentry = new Int_t [nentry];
387 Int_t *hadentry = new Int_t [nentry];
388 Int_t *trenergy = 0x0;
390 Int_t *sortcoord = 0x0;
394 for (Int_t i = 0; i < nentry; i++)
401 phentry[ngtrack] = i;
404 else if (ipid[i] != 22)
406 hadentry[nhtrack] = i;
411 Int_t nghadtrack = ngtrack + nhtrack;
416 // no need of track number, set to -1
420 else if (ngtrack >= 1)
422 // one or more than one photon track + charged track
423 // find out which track deposits maximum energy and
424 // assign that track number and track pid
426 trenergy = new Int_t [nghadtrack];
427 trpid = new Int_t [nghadtrack];
428 sortcoord = new Int_t [nghadtrack];
429 for (Int_t i = 0; i < ngtrack; i++)
433 for (Int_t j = 0; j < nentry; j++)
435 if (ipid[j] == 22 && itra[j] == itra[phentry[i]])
437 trenergy[i] += cadc[j];
442 for (Int_t i = ngtrack; i < nghadtrack; i++)
446 for (Int_t j = 0; j < nentry; j++)
448 if (ipid[j] != 22 && itra[j] == itra[hadentry[i-ngtrack]])
450 trenergy[i] += cadc[j];
457 TMath::Sort(nghadtrack,trenergy,sortcoord,jsort);
459 Int_t gtr = sortcoord[0];
460 if (trpid[gtr] == 22)
463 trackno = itra[phentry[gtr]]; // highest adc track
475 } // end of ngtrack >= 1
478 //--------------------------------------------------------------------//
479 void AliPMDtracker::SetVertex(Double_t vtx[3], Double_t evtx[3])
488 //--------------------------------------------------------------------//
489 void AliPMDtracker::ResetClusters()
491 if (fRecpoints) fRecpoints->Clear();
493 //--------------------------------------------------------------------//