X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PMD%2FAliPMDtracker.cxx;h=016f5fe2489ecaf31f24d22dd2c356feaf342d24;hb=362d9d98621fd11847a2f96695da8d9e496415e9;hp=279aaddd2f55b54ce101cffcee707b2c1d71666f;hpb=01c4d84aade032222c95f9b2dfbb915c46b1a134;p=u%2Fmrichter%2FAliRoot.git diff --git a/PMD/AliPMDtracker.cxx b/PMD/AliPMDtracker.cxx index 279aaddd2f5..016f5fe2489 100644 --- a/PMD/AliPMDtracker.cxx +++ b/PMD/AliPMDtracker.cxx @@ -24,10 +24,7 @@ #include #include -#include -#include #include -#include #include #include #include @@ -38,20 +35,23 @@ #include "AliPMDcluster.h" #include "AliPMDclupid.h" #include "AliPMDrecpoint1.h" +#include "AliPMDrecdata.h" +#include "AliPMDrechit.h" #include "AliPMDUtility.h" #include "AliPMDDiscriminator.h" #include "AliPMDEmpDiscriminator.h" #include "AliPMDtracker.h" #include "AliESDPmdTrack.h" -#include "AliESD.h" +#include "AliESDEvent.h" #include "AliLog.h" ClassImp(AliPMDtracker) 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()), @@ -69,28 +69,65 @@ AliPMDtracker::AliPMDtracker(): // Default Constructor // } +//--------------------------------------------------------------------// +AliPMDtracker:: AliPMDtracker(const AliPMDtracker & /* tracker */): + TObject(/* tracker */), + fTreeR(0), + fRecpoints(NULL), + fRechits(NULL), + fPMDcontin(NULL), + fPMDcontout(NULL), + fPMDutil(NULL), + fPMDrecpoint(0), + fPMDclin(0), + fPMDclout(0), + fXvertex(0.), + fYvertex(0.), + fZvertex(0.), + fSigmaX(0.), + fSigmaY(0.), + fSigmaZ(0.) +{ + // copy constructor + AliError("Copy constructor not allowed"); +} + +//--------------------------------------------------------------------// +AliPMDtracker& AliPMDtracker::operator=(const AliPMDtracker & /* tracker */) +{ + // assignment operator + AliError("Assignment operator not allowed"); + return *this; +} + //--------------------------------------------------------------------// AliPMDtracker::~AliPMDtracker() { // 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; } //--------------------------------------------------------------------// void AliPMDtracker::LoadClusters(TTree *treein) @@ -99,7 +136,7 @@ void AliPMDtracker::LoadClusters(TTree *treein) fTreeR = treein; } //--------------------------------------------------------------------// -void AliPMDtracker::Clusters2Tracks(AliESD *event) +void AliPMDtracker::Clusters2Tracks(AliESDEvent *event) { // Converts digits to recpoints after running clustering // algorithm on CPV plane and PREshower plane @@ -107,7 +144,16 @@ void AliPMDtracker::Clusters2Tracks(AliESD *event) 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) @@ -116,7 +162,16 @@ void AliPMDtracker::Clusters2Tracks(AliESD *event) 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)); @@ -126,6 +181,7 @@ void AliPMDtracker::Clusters2Tracks(AliESD *event) 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); @@ -137,9 +193,42 @@ void AliPMDtracker::Clusters2Tracks(AliESD *event) clusdata[3] = fPMDrecpoint->GetClusCells(); clusdata[4] = fPMDrecpoint->GetClusSigmaX(); clusdata[5] = fPMDrecpoint->GetClusSigmaY(); + + if (clusdata[4] >= 0. && clusdata[5] >= 0.) + { + // extract the associated cell information + branch1->GetEntry(ncrhit); + Int_t nenbr1 = fRechits->GetLast() + 1; - fPMDclin = new AliPMDrecpoint1(idet,ismn,clusdata); - fPMDcontin->Add(fPMDclin); + 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); + + delete [] irow; + delete [] icol; + delete [] itra; + delete [] ipid; + delete [] cadc; + + fPMDclin = new AliPMDrecdata(idet,ismn,trackno,trackpid,clusdata); + fPMDcontin->Add(fPMDclin); + + ncrhit++; + } } } @@ -148,9 +237,9 @@ void AliPMDtracker::Clusters2Tracks(AliESD *event) 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; @@ -164,11 +253,15 @@ void AliPMDtracker::Clusters2Tracks(AliESD *event) 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(); // @@ -201,15 +294,96 @@ void AliPMDtracker::Clusters2Tracks(AliESD *event) 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])