#include <Riostream.h>
#include <TMath.h>
-#include <TBRIK.h>
-#include <TNode.h>
#include <TTree.h>
-#include <TGeometry.h>
#include <TObjArray.h>
#include <TClonesArray.h>
#include <TFile.h>
#include "AliPMDcluster.h"
#include "AliPMDclupid.h"
#include "AliPMDrecpoint1.h"
+#include "AliPMDrecdata.h"
+#include "AliPMDrechit.h"
#include "AliPMDUtility.h"
#include "AliPMDDiscriminator.h"
#include "AliPMDEmpDiscriminator.h"
AliPMDtracker::AliPMDtracker():
fTreeR(0),
- fRecpoints(new TClonesArray("AliPMDrecpoint1", 1000)),
+ fRecpoints(new TClonesArray("AliPMDrecpoint1", 10)),
+ fRechits(new TClonesArray("AliPMDrechit", 10)),
fPMDcontin(new TObjArray()),
fPMDcontout(new TObjArray()),
fPMDutil(new AliPMDUtility()),
TObject(/* tracker */),
fTreeR(0),
fRecpoints(NULL),
+ fRechits(NULL),
fPMDcontin(NULL),
fPMDcontout(NULL),
fPMDutil(NULL),
// Destructor
if (fRecpoints)
{
- fRecpoints->Delete();
- delete fRecpoints;
- fRecpoints=0;
+ fRecpoints->Clear();
}
+ if (fRechits)
+ {
+ fRechits->Clear();
+ }
+
if (fPMDcontin)
{
fPMDcontin->Delete();
delete fPMDcontin;
fPMDcontin=0;
+
}
if (fPMDcontout)
- {
+ {
fPMDcontout->Delete();
delete fPMDcontout;
fPMDcontout=0;
+
}
delete fPMDutil;
}
Int_t idet;
Int_t ismn;
+ Int_t trackno, trackpid;
Float_t clusdata[6];
+
+ Int_t *irow;
+ Int_t *icol;
+ Int_t *itra;
+ Int_t *ipid;
+ Float_t *cadc;
+
+ AliPMDrechit *rechit = 0x0;
TBranch *branch = fTreeR->GetBranch("PMDRecpoint");
if (!branch)
return;
}
branch->SetAddress(&fRecpoints);
-
+
+ TBranch *branch1 = fTreeR->GetBranch("PMDRechit");
+ if (!branch1)
+ {
+ AliError("PMDRechit branch not found");
+ return;
+ }
+ branch1->SetAddress(&fRechits);
+
+ Int_t ncrhit = 0;
Int_t nmodules = (Int_t) branch->GetEntries();
AliDebug(1,Form("Number of modules filled in treeR = %d",nmodules));
Int_t nentries = fRecpoints->GetLast();
AliDebug(2,Form("Number of clusters per modules filled in treeR = %d"
,nentries));
+
for(Int_t ient = 0; ient < nentries+1; ient++)
{
fPMDrecpoint = (AliPMDrecpoint1*)fRecpoints->UncheckedAt(ient);
clusdata[4] = fPMDrecpoint->GetClusSigmaX();
clusdata[5] = fPMDrecpoint->GetClusSigmaY();
- fPMDclin = new AliPMDrecpoint1(idet,ismn,clusdata);
- fPMDcontin->Add(fPMDclin);
+ if (clusdata[4] >= 0. && clusdata[5] >= 0.)
+ {
+ // extract the associated cell information
+ branch1->GetEntry(ncrhit);
+ Int_t nenbr1 = fRechits->GetLast() + 1;
+
+ irow = new Int_t[nenbr1];
+ icol = new Int_t[nenbr1];
+ itra = new Int_t[nenbr1];
+ ipid = new Int_t[nenbr1];
+ cadc = new Float_t[nenbr1];
+
+ for (Int_t ient1 = 0; ient1 < nenbr1; ient1++)
+ {
+ rechit = (AliPMDrechit*)fRechits->UncheckedAt(ient1);
+ //irow[ient1] = rechit->GetCellX();
+ //icol[ient1] = rechit->GetCellY();
+ itra[ient1] = rechit->GetCellTrack();
+ ipid[ient1] = rechit->GetCellPid();
+ cadc[ient1] = rechit->GetCellAdc();
+ }
+ if (idet == 0)
+ {
+ AssignTrPidToCluster(nenbr1, itra, ipid, cadc,
+ trackno, trackpid);
+ }
+ else if (idet == 1)
+ {
+ trackno = itra[0];
+ trackpid = ipid[0];
+ }
+
+ delete [] irow;
+ delete [] icol;
+ delete [] itra;
+ delete [] ipid;
+ delete [] cadc;
+
+ fPMDclin = new AliPMDrecdata(idet,ismn,trackno,trackpid,clusdata);
+ fPMDcontin->Add(fPMDclin);
+
+ ncrhit++;
+ }
}
}
const Float_t kzpos = 361.5; // middle of the PMD
- Int_t det,smn;
+ Int_t ix = -1, iy = -1;
+ Int_t det,smn,trno,trpid,mstat;
Float_t xpos,ypos;
- Float_t adc, ncell, rad;
+ Float_t adc, ncell, radx, rady;
Float_t xglobal = 0., yglobal = 0., zglobal = 0;
Float_t pid;
det = fPMDclout->GetDetector();
smn = fPMDclout->GetSMN();
+ trno = fPMDclout->GetClusTrackNo();
+ trpid = fPMDclout->GetClusTrackPid();
+ mstat = fPMDclout->GetClusMatching();
xpos = fPMDclout->GetClusX();
ypos = fPMDclout->GetClusY();
adc = fPMDclout->GetClusADC();
ncell = fPMDclout->GetClusCells();
- rad = fPMDclout->GetClusRadius();
+ radx = fPMDclout->GetClusSigmaX();
+ // Here in the variable "rady" we are keeping the row and col
+ // of the single isolated cluster having ncell = 1 for offline
+ // calibration
+
+ if ((radx > 999. && radx < 1000.) && ncell == 1)
+ {
+ if (smn < 12)
+ {
+ ix = (Int_t) (ypos +0.5);
+ iy = (Int_t) xpos;
+ }
+ else if (smn > 12 && smn < 24)
+ {
+ ix = (Int_t) xpos;
+ iy = (Int_t) (ypos +0.5);
+ }
+ rady = (Float_t) (ix*100 + iy);
+ }
+ else
+ {
+ rady = fPMDclout->GetClusSigmaY();
+ }
pid = fPMDclout->GetClusPID();
//
AliESDPmdTrack *esdpmdtr = new AliESDPmdTrack();
esdpmdtr->SetDetector(det);
+ esdpmdtr->SetSmn(smn);
+ esdpmdtr->SetClusterTrackNo(trno);
+ esdpmdtr->SetClusterTrackPid(trpid);
+ esdpmdtr->SetClusterMatching(mstat);
+
esdpmdtr->SetClusterX(xglobal);
esdpmdtr->SetClusterY(yglobal);
esdpmdtr->SetClusterZ(zglobal);
esdpmdtr->SetClusterADC(adc);
esdpmdtr->SetClusterCells(ncell);
esdpmdtr->SetClusterPID(pid);
+ esdpmdtr->SetClusterSigmaX(radx);
+ esdpmdtr->SetClusterSigmaY(rady);
event->AddPmdTrack(esdpmdtr);
}
+
+ fPMDcontin->Delete();
+ fPMDcontout->Delete();
+
+}
+//--------------------------------------------------------------------//
+void AliPMDtracker::AssignTrPidToCluster(Int_t nentry, Int_t *itra,
+ Int_t *ipid, Float_t *cadc,
+ Int_t &trackno, Int_t &trackpid)
+{
+ // assign the track number and the corresponding pid to a cluster
+ // split cluster part will be done at the time of calculating eff/pur
+
+ Int_t *phentry = new Int_t [nentry];
+ Int_t *hadentry = new Int_t [nentry];
+ Int_t *trenergy = 0x0;
+ Int_t *trpid = 0x0;
+ Int_t *sortcoord = 0x0;
+
+ Int_t ngtrack = 0;
+ Int_t nhtrack = 0;
+ for (Int_t i = 0; i < nentry; i++)
+ {
+ phentry[i] = -1;
+ hadentry[i] = -1;
+
+ if (ipid[i] == 22)
+ {
+ phentry[ngtrack] = i;
+ ngtrack++;
+ }
+ else if (ipid[i] != 22)
+ {
+ hadentry[nhtrack] = i;
+ nhtrack++;
+ }
+ }
+
+ Int_t nghadtrack = ngtrack + nhtrack;
+
+ if (ngtrack == 0)
+ {
+ // hadron track
+ // no need of track number, set to -1
+ trackpid = 8;
+ trackno = -1;
+ }
+ else if (ngtrack >= 1)
+ {
+ // one or more than one photon track + charged track
+ // find out which track deposits maximum energy and
+ // assign that track number and track pid
+
+ trenergy = new Int_t [nghadtrack];
+ trpid = new Int_t [nghadtrack];
+ sortcoord = new Int_t [nghadtrack];
+ for (Int_t i = 0; i < ngtrack; i++)
+ {
+ trenergy[i] = 0.;
+ trpid[i] = -1;
+ for (Int_t j = 0; j < nentry; j++)
+ {
+ if (ipid[j] == 22 && itra[j] == itra[phentry[i]])
+ {
+ trenergy[i] += cadc[j];
+ trpid[i] = 22;
+ }
+ }
+ }
+ for (Int_t i = ngtrack; i < nghadtrack; i++)
+ {
+ trenergy[i] = 0.;
+ trpid[i] = -1;
+ for (Int_t j = 0; j < nentry; j++)
+ {
+ if (ipid[j] != 22 && itra[j] == itra[hadentry[i-ngtrack]])
+ {
+ trenergy[i] += cadc[j];
+ trpid[i] = ipid[j];
+ }
+ }
+ }
+
+ Bool_t jsort = true;
+ TMath::Sort(nghadtrack,trenergy,sortcoord,jsort);
+
+ Int_t gtr = sortcoord[0];
+ if (trpid[gtr] == 22)
+ {
+ trackpid = 22;
+ trackno = itra[phentry[gtr]]; // highest adc track
+ }
+ else
+ {
+ trackpid = 8;
+ trackno = -1;
+ }
+
+ delete [] trenergy;
+ delete [] trpid;
+ delete [] sortcoord;
+
+ } // end of ngtrack >= 1
+
}
//--------------------------------------------------------------------//
void AliPMDtracker::SetVertex(Double_t vtx[3], Double_t evtx[3])