////////////////////////////////////////////////////////////////////////////
+#include <TGeoGlobalMagField.h>
#include "AliITSCalibrationSPD.h"
#include "AliITSClusterFinderV2SPD.h"
#include "AliITSRecPoint.h"
#include "AliITSdigitSPD.h"
#include "AliITSFOSignalsSPD.h"
#include "AliITSRecPointContainer.h"
+#include "AliMagF.h"
+#include "AliITSsegmentationSPD.h"
ClassImp(AliITSClusterFinderV2SPD)
// This function creates ITS clusters from raw data
//------------------------------------------------------------
rawReader->Reset();
+ fNClusters = 0; //RS
AliITSRawStreamSPD inputSPD(rawReader);
FindClustersSPD(&inputSPD);
Int_t AliITSClusterFinderV2SPD::ClustersSPD(AliBin* bins, TClonesArray* digits,TClonesArray* clusters,Int_t maxBins,Int_t nzbins,Int_t iModule,Bool_t rawdata){
//Cluster finder for SPD (from digits and from rawdata)
+ const Double_t kmictocm = 1.0e-4; // convert microns to cm.
+ const Double_t defaultField = 5.0; // default Bz value at which Tan(theta_Lorentz) is given in RecoParam
static AliITSRecoParam *repa = NULL;
if(!repa){
}
const TGeoHMatrix *mT2L=AliITSgeomTGeo::GetTracking2LocalMatrix(iModule);
+ // Lorentz angle correction
+ Double_t tanLorentzAngle=0;
+ AliITSsegmentationSPD *seg = (AliITSsegmentationSPD*)(GetDetTypeRec()->GetSegmentationModel(0));
+ Double_t thick = 0.5*kmictocm*seg->Dy(); // Half Thickness in cm
+ if(repa->GetCorrectLorentzAngleSPD()) { // only if CorrectLorentzAngleSPD required
+ // here retrieve the value of the field
+ AliMagF* field = dynamic_cast<AliMagF*>(TGeoGlobalMagField::Instance()->GetField());
+ if (field == 0) {
+ AliError("Cannot get magnetic field from TGeoGlobalMagField");
+ }
+ else {
+ Float_t magField = field->SolenoidField();
+ tanLorentzAngle=repa->GetTanLorentzAngleHolesSPD() * magField / defaultField ;
+ }
+ }
+ //
+
if (repa->GetSPDRemoveNoisyFlag()) {
// Loop on noisy pixels and reset them
AliITSCalibrationSPD *cal =
bins[index].SetQ(0);
bins[index].SetMask(0xFFFFFFFE);
}
+ AliITSCalibrationSPD *calSparse = (AliITSCalibrationSPD*) fDetTypeRec->GetSPDSparseDeadModel(iModule);
+ for(Int_t ipix = 0; ipix<calSparse->GetNrBad(); ipix++){
+ Int_t row, col;
+ calSparse->GetBadPixel(ipix,row,col);
+ Int_t index = (row+1) * nzbins + (col+1);
+ bins[index].SetQ(0);
+ bins[index].SetMask(0xFFFFFFFE);
+ }
+
}
Int_t nclu=0;
idy=ymax-ymin+1;
idz=zmax-zmin+1;
}
-
+ //
for(Int_t iiz=zmin; iiz<=zmax;iiz+=idz){
for(Int_t iiy=ymin;iiy<=ymax;iiy+=idy){
}
ndigits++;
Float_t qBin=0.;
- if(rawdata) qBin = bins[idxBins[idx]].GetQ();
+ if(rawdata) {
+ qBin = bins[idxBins[idx]].GetQ();
+ if (fRawID2ClusID) { // RS: Register cluster id in raw words list
+ int rwid = bins[idxBins[idx]].GetRawID();
+ if (fRawID2ClusID->GetSize()<=rwid) fRawID2ClusID->Set( (rwid+10)<<1 );
+ (*fRawID2ClusID)[rwid] = milab[0] = fNClusters+1; // RS: store clID+1 as a reference to the cluster
+ }
+ }
if(!rawdata){
AliITSdigitSPD* dig = (AliITSdigitSPD*)digits->UncheckedAt(idxBins[idx]);
qBin = (Float_t)dig->GetSignal();
y -= fHwSPD;
z -= fHlSPD;
- Float_t hit[5]; //y,z,sigma(y)^2, sigma(z)^2, charge
+ // Lorentz drift effect in local y
+ y -= tanLorentzAngle*thick;
+ //
+
+ Float_t hit[6]; //y,z,sigma(y)^2, sigma(z)^2, charge
{
Double_t loc[3]={y,0.,z},trk[3]={0.,0.,0.};
mT2L->MasterToLocal(loc,trk);
hit[2] = fYpitchSPD*fYpitchSPD/12.;
hit[3] = fZ1pitchSPD*fZ1pitchSPD/12.;
hit[4] = 1.;
+ hit[5] = 0.;
if(!rawdata) milab[3]=fNdet[iModule];
Int_t info[3] = {ymax-ymin+1,zmax-zmin+1,fNlayer[iModule]};
AliITSRecPoint(cl);
}
nclu++;
+ fNClusters++;
}// for iiy
}// for iiz
}//end for iBin
AliBin* bins = NULL;
// read raw data input stream
+ int countRW = 0; //RS
+ if (fRawID2ClusID) fRawID2ClusID->Reset(); //RS if array was provided, we shall store the rawID -> ClusterID
+ //
while (kTRUE) {
Bool_t next = input->Next();
if (!next || input->IsNewModule()) {
memcpy(binsSPD,binsSPDInit,sizeof(AliBin)*kMaxBin);
}
- if (next && bins) {
+ if (next && bins) {
// fill the current digit into the bins array
Int_t index = (input->GetCoord2()+1) * kNzBins + (input->GetCoord1()+1);
bins[index].SetIndex(index);
bins[index].SetQ(1);
bins[index].SetMask(1);
+ bins[index].SetRawID(countRW); //RS register raw id
}
+ countRW++; //RS
}
delete [] binsSPDInit;