virtual Int_t Convert8to10(Int_t signal) const {return ((AliITSresponseSDD*)fResponse)->Convert8to10(signal);}
virtual void SetJitterError(Double_t jitter=20) {((AliITSresponseSDD*)fResponse)->SetJitterError(jitter);}
virtual Float_t GetJitterError() const {return ((AliITSresponseSDD*)fResponse)->JitterError();}
+ virtual Float_t GetDriftPath(Float_t time,Float_t /*anodecoord*/) const {return time*GetDriftSpeed();}
+ virtual Float_t GetThresholdAnode(Int_t anode,Int_t nsigma=3) const {
+ return fBaseline[anode]+nsigma*fNoise[anode];}
+
virtual void SetDo10to8(Bool_t bitcomp=kTRUE) {((AliITSresponseSDD*)fResponse)->SetDo10to8(bitcomp);}
protected:
Int_t dummy = 0;
Double_t fTimeStep = GetSeg()->Dpx(dummy);
Double_t fSddLength = GetSeg()->Dx();
- Double_t fDriftSpeed = GetResp(fModule)->GetDriftSpeed();
Double_t anodePitch = GetSeg()->Dpz(dummy);
-
+ AliITSCalibrationSDD* cal = (AliITSCalibrationSDD*)GetResp(fModule);
// map the signal
Map()->ClearMap();
Map()->SetThresholdArr(fCutAmplitude);
Double_t clusteranodePath = (clusterAnode - fNofAnodes/2)*
anodePitch;
- Double_t clusterDriftPath = clusterTime*fDriftSpeed;
+ Double_t clusterDriftPath = (Double_t)cal->GetDriftPath(clusterTime,clusteranodePath);
clusterDriftPath = fSddLength-clusterDriftPath;
if(clusterCharge <= 0.) break;
AliITSRawClusterSDD clust(j+1,//i
Int_t dummy=0;
Double_t fTimeStep = GetSeg()->Dpx( dummy );
Double_t fSddLength = GetSeg()->Dx();
- Double_t fDriftSpeed = GetResp(fModule)->GetDriftSpeed();
Double_t anodePitch = GetSeg()->Dpz( dummy );
-
+ AliITSCalibrationSDD* cal = (AliITSCalibrationSDD*)GetResp(fModule);
Map()->ClearMap();
Map()->SetThresholdArr( fCutAmplitude );
Map()->FillMap2();
// time = lmax*fTimeStep; // ns
if( time > fTimeCorr ) time -= fTimeCorr; // ns
Double_t anodePath =(anode-fNofAnodes/2)*anodePitch;
- Double_t driftPath = time*fDriftSpeed;
+
+ Double_t driftPath = (Double_t)cal->GetDriftPath(time,anodePath);
driftPath = fSddLength-driftPath;
AliITSRawClusterSDD clust(j+1,anode,time,charge,
fmax, peakpos,0.,0.,
Int_t dummy=0;
Double_t fTimeStep = GetSeg()->Dpx( dummy );
Double_t fSddLength = GetSeg()->Dx();
- Double_t fDriftSpeed = GetResp(fModule)->GetDriftSpeed();
Double_t anodePitch = GetSeg()->Dpz( dummy );
//Double_t n, baseline;
//GetResp(fModule)->GetNoiseParam( n, baseline );
Int_t electronics =GetResp(fModule)->GetElectronics(); // 1 = PASCAL, 2 = OLA
+ AliITSCalibrationSDD* cal = (AliITSCalibrationSDD*)GetResp(fModule);
+
for( Int_t j=0; j<nofClusters; j++ ){
// get cluster information
//if(AliDebugLevel()>=3) clusterI.PrintInfo();
continue;
}
- clusterI.SetPeakPos( peakpos );
- Double_t driftPath = fSddLength - newiTimef * fDriftSpeed;
+ clusterI.SetPeakPos( peakpos );
+ Float_t dp = cal->GetDriftPath(newiTimef,anodePath);
+ Double_t driftPath = fSddLength - (Double_t)dp;
Double_t sign = ( wing == 1 ) ? -1. : 1.;
- clusterI.SetX( driftPath*sign * 0.0001 );
- clusterI.SetZ( anodePath * 0.0001 );
+ Double_t xcoord = driftPath*sign * 0.0001;
+ Double_t zcoord = anodePath * 0.0001;
+ CorrectPosition(zcoord,xcoord);
+ clusterI.SetX( xcoord );
+ clusterI.SetZ( zcoord );
clusterI.SetAnode( newAnodef );
clusterI.SetTime( newiTimef );
clusterI.SetAsigma( sigma[i]*anodePitch );
cout << "Maximum number of cells/clusters: " << fMaxNCells << endl;
cout << "**************************************************" << endl;
}
+
+//_________________________________________________________________________
+void AliITSClusterFinderSDD::CorrectPosition(Double_t &z, Double_t&y){
+ //correction of coordinates using the maps stored in the DB
+
+ AliITSCalibrationSDD* cal = (AliITSCalibrationSDD*)GetResp(fModule);
+ static const Int_t nbint = cal->GetMapTimeNBin();
+ static const Int_t nbina = cal->Chips()*cal->Channels();
+ Float_t stepa = (GetSeg()->Dpz(0))/10000.; //anode pitch in cm
+ Float_t stept = (GetSeg()->Dx()/cal->GetMapTimeNBin()/2.)/10.;
+
+ Int_t bint = TMath::Abs((Int_t)(y/stept));
+ if(y>=0) bint+=(Int_t)(nbint/2.);
+ if(bint>nbint) AliError("Wrong bin number!");
+
+ Int_t bina = TMath::Abs((Int_t)(z/stepa));
+ if(z>=0) bina+=(Int_t)(nbina/2.);
+ if(bina>nbina) AliError("Wrong bin number!");
+
+ Double_t devz = (Double_t)cal->GetMapACell(bina,bint)/10000.;
+ Double_t devx = (Double_t)cal->GetMapTCell(bina,bint)/10000.;
+ z+=devz;
+ y+=devx;
+
+}
void PeakFunc( Int_t xdim, Int_t zdim, Double_t *par, Double_t *spe,
Double_t *Integral=0 );
void PrintStatus() const;
-
+ void CorrectPosition(Double_t &z, Double_t&y);
private:
virtual AliITSCalibrationSDD* GetResp(Int_t mod)const{
return (AliITSCalibrationSDD*) fDetTypeRec->GetCalibrationModel(mod);}//Return Response
#include "AliITSRecPoint.h"
#include "AliITSDetTypeRec.h"
#include "AliRawReader.h"
-#include "AliITSRawStreamSDD.h"
+#include "AliITSRawStreamSDDv3.h"
#include "AliITSCalibrationSDD.h"
#include "AliITSDetTypeRec.h"
#include "AliITSsegmentationSDD.h"
AliBin *bins[2];
bins[0]=new AliBin[kMAXBIN];
bins[1]=new AliBin[kMAXBIN];
-
+ AliITSCalibrationSDD* cal = (AliITSCalibrationSDD*)GetResp(fModule);
+
AliITSdigitSDD *d=0;
Int_t i, ndigits=digits->GetEntriesFast();
for (i=0; i<ndigits; i++) {
d=(AliITSdigitSDD*)digits->UncheckedAt(i);
+ Float_t baseline = cal->GetBaseline(d->GetCoord1());
+
Int_t y=d->GetCoord2()+1; //y
Int_t z=d->GetCoord1()+1; //z
Int_t q=d->GetSignal();
- if (q<3) continue;
+
+ if(q<cal->GetThresholdAnode(d->GetCoord1())) continue;
+ if(q>baseline) q-=(Int_t)baseline;
+ else q=0;
+
+ //if (q<3) continue;
if (z <= fNzSDD) {
bins[0][y*kNzBins+z].SetQ(q);
//------------------------------------------------------------
// Actual SDD cluster finder
//------------------------------------------------------------
+ AliITSCalibrationSDD* cal = (AliITSCalibrationSDD*)GetResp(fModule);
Int_t ncl=0;
TClonesArray &cl=*clusters;
for (Int_t s=0; s<2; s++)
//s2 = c.GetSigmaZ2()/c.GetQ() - z*z;
//c.SetSigmaZ2(s2);
//
- y=(y-0.5)*fYpitchSDD;
- y-=fHwSDD;
- y-=fYoffSDD; //delay ?
- if (s) y=-y;
+
+ Float_t yyyy = y;
+ //y=(y-0.5)*fYpitchSDD;
+ //y-=fHwSDD;
+ //y-=fYoffSDD; //delay ?
+ //if (s) y=-y;
z=(z-0.5)*fZpitchSDD;
z-=fHlSDD;
-
- y=-(-y+fYshift[fModule]);
- z= -z+fZshift[fModule];
+ Float_t zdet = z;
+ // y=-(-y+fYshift[fModule]);
+ // z= -z+fZshift[fModule];
// c.SetY(y);
// c.SetZ(z);
- CorrectPosition(z,y);
+ Float_t xdet = cal->GetDriftPath((yyyy-0.5)*25,0);
+ xdet=xdet/10000.-fHwSDD-fYoffSDD;
+ if (s) xdet=-xdet;
+
+ CorrectPosition(zdet,xdet);
+
+ y=-(-xdet+fYshift[fModule]);
+ z= -zdet+fZshift[fModule];
+
c.SetY(y);
c.SetZ(z);
c.SetNy(maxj-minj+1);
c.SetNz(maxi-mini+1);
c.SetType(npeaks);
- c.SetQ(q/12.7); //to be consistent with the SSD charges
+ c.SetQ(q/12.7); //this WAS consistent with SSD. To be reassessed
+ // 23-MAR-2007
- if (c.GetQ() < 20.) continue; //noise cluster
+ //if (c.GetQ() < 20.) continue; //noise cluster
if (digits) {
// AliBin *b=&bins[s][idx[k]];
// This function creates ITS clusters from raw data
//------------------------------------------------------------
rawReader->Reset();
- AliITSRawStreamSDD inputSDD(rawReader);
+ AliITSRawStreamSDDv3 inputSDD(rawReader);
FindClustersSDD(&inputSDD,clusters);
}
static const Int_t nbina = cal->Chips()*cal->Channels();
Float_t stepa = (GetSeg()->Dpz(0))/10000.; //anode pitch in cm
Float_t stept = (GetSeg()->Dx()/cal->GetMapTimeNBin()/2.)/10.;
- Float_t xdet,zdet;
- fDetTypeRec->GetITSgeom()->TrackingV2ToDetL(fModule,y,z,xdet,zdet);
-
- Int_t bint = TMath::Abs((Int_t)(xdet/stept));
- if(xdet>=0) bint+=(Int_t)(nbint/2.);
+
+ Int_t bint = TMath::Abs((Int_t)(y/stept));
+ if(y>=0) bint+=(Int_t)(nbint/2.);
if(bint>nbint) AliError("Wrong bin number!");
- Int_t bina = TMath::Abs((Int_t)(zdet/stepa));
- if(zdet>=0) bina+=(Int_t)(nbina/2.);
+ Int_t bina = TMath::Abs((Int_t)(z/stepa));
+ if(z>=0) bina+=(Int_t)(nbina/2.);
if(bina>nbina) AliError("Wrong bin number!");
Float_t devz = cal->GetMapACell(bina,bint)/10000.;
Float_t devx = cal->GetMapTCell(bina,bint)/10000.;
- zdet+=devz;
- xdet+=devx;
- fDetTypeRec->GetITSgeom()->DetLToTrackingV2(fModule,xdet,zdet,y,z);
+ z+=devz;
+ y+=devx;
}