#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", 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),
if (fRecpoints)
{
fRecpoints->Clear();
- /*
- fRecpoints->Delete();
- delete fRecpoints;
- fRecpoints=0;
- */
}
+ if (fRechits)
+ {
+ fRechits->Clear();
+ }
+
if (fPMDcontin)
{
- fPMDcontin->Clear();
- /*
fPMDcontin->Delete();
delete fPMDcontin;
fPMDcontin=0;
- */
+
}
if (fPMDcontout)
{
- fPMDcontout->Clear();
- /*
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 nmodules = (Int_t) branch->GetEntries();
Int_t nentries = fRecpoints->GetLast();
AliDebug(2,Form("Number of clusters per modules filled in treeR = %d"
,nentries));
+
+ Int_t ncrhit = 0;
+
for(Int_t ient = 0; ient < nentries+1; ient++)
{
fPMDrecpoint = (AliPMDrecpoint1*)fRecpoints->UncheckedAt(ient);
clusdata[3] = fPMDrecpoint->GetClusCells();
clusdata[4] = fPMDrecpoint->GetClusSigmaX();
clusdata[5] = fPMDrecpoint->GetClusSigmaY();
+
+ if (clusdata[4] != -99. && clusdata[5] != -99.)
+ {
+ // 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();
+ }
+ AssignTrPidToCluster(nenbr1, itra, ipid, cadc,
+ trackno, trackpid);
- fPMDclin = new AliPMDrecpoint1(idet,ismn,clusdata);
- fPMDcontin->Add(fPMDclin);
+ 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 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();
+ 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 *trenergy = 0x0;
+ Int_t *sortcoord = 0x0;
+
+ Int_t ngtrack = 0;
+ for (Int_t i = 0; i < nentry; i++)
+ {
+ phentry[i] = -1;
+ if (ipid[i] == 22)
+ {
+ phentry[ngtrack] = i;
+ ngtrack++;
+ }
+ }
+
+ if (ngtrack == 0)
+ {
+ // hadron track
+ // no need of track number, set to -1
+ trackpid = 8;
+ trackno = -1;
+ }
+ else if (ngtrack == 1)
+ {
+ // only one photon track
+ // track number set to photon track
+ trackpid = 1;
+ trackno = itra[phentry[0]];
+ }
+ else if (ngtrack > 1)
+ {
+ // more than one photon track
+
+ trenergy = new Int_t [ngtrack];
+ sortcoord = new Int_t [ngtrack];
+ for (Int_t i = 0; i < ngtrack; i++)
+ {
+ trenergy[i] = 0.;
+ for (Int_t j = 0; j < nentry; j++)
+ {
+ if (ipid[j] == 22 && itra[j] == itra[phentry[i]])
+ {
+ trenergy[i] += cadc[j];
+ }
+ }
+ }
+
+ Bool_t jsort = true;
+ TMath::Sort(ngtrack,trenergy,sortcoord,jsort);
+
+ Int_t gtr = sortcoord[0];
+ trackno = itra[phentry[gtr]]; // highest adc track
+ trackpid = 1;
+
+ delete [] trenergy;
+ delete [] sortcoord;
+
+ } // end of ngtrack > 1
+
+
+
}
//--------------------------------------------------------------------//
void AliPMDtracker::SetVertex(Double_t vtx[3], Double_t evtx[3])