From 404c1c297c072fb64512604eb4141dabc30cda4e Mon Sep 17 00:00:00 2001 From: masera Date: Fri, 23 Mar 2007 18:00:17 +0000 Subject: [PATCH] SDD calibration aware local reconstruction. Absolute calibration of charge needs a reassessment and should be equalized with SSD --- ITS/AliITSCalibrationSDD.h | 4 ++ ITS/AliITSClusterFinderSDD.cxx | 51 +++++++++++++++++++------ ITS/AliITSClusterFinderSDD.h | 2 +- ITS/AliITSClusterFinderV2SDD.cxx | 65 ++++++++++++++++++++------------ 4 files changed, 86 insertions(+), 36 deletions(-) diff --git a/ITS/AliITSCalibrationSDD.h b/ITS/AliITSCalibrationSDD.h index e0107acc20f..b8374d762ca 100644 --- a/ITS/AliITSCalibrationSDD.h +++ b/ITS/AliITSCalibrationSDD.h @@ -113,6 +113,10 @@ class AliITSCalibrationSDD : public AliITSCalibration { 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: diff --git a/ITS/AliITSClusterFinderSDD.cxx b/ITS/AliITSClusterFinderSDD.cxx index 89faf245156..3c825108f62 100644 --- a/ITS/AliITSClusterFinderSDD.cxx +++ b/ITS/AliITSClusterFinderSDD.cxx @@ -101,9 +101,8 @@ void AliITSClusterFinderSDD::Find1DClusters(){ 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); @@ -216,7 +215,7 @@ void AliITSClusterFinderSDD::Find1DClusters(){ 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 @@ -251,9 +250,8 @@ void AliITSClusterFinderSDD::Find1DClustersE(){ 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(); @@ -313,7 +311,8 @@ void AliITSClusterFinderSDD::Find1DClustersE(){ // 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., @@ -693,11 +692,12 @@ void AliITSClusterFinderSDD::ResolveClusters(){ 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=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 ); @@ -1004,3 +1008,28 @@ void AliITSClusterFinderSDD::PrintStatus() const{ 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; + +} diff --git a/ITS/AliITSClusterFinderSDD.h b/ITS/AliITSClusterFinderSDD.h index a77e9613243..6612bcf9d73 100644 --- a/ITS/AliITSClusterFinderSDD.h +++ b/ITS/AliITSClusterFinderSDD.h @@ -76,7 +76,7 @@ class AliITSClusterFinderSDD : public AliITSClusterFinder{ 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 diff --git a/ITS/AliITSClusterFinderV2SDD.cxx b/ITS/AliITSClusterFinderV2SDD.cxx index a40da4f7a66..d2379b277c7 100644 --- a/ITS/AliITSClusterFinderV2SDD.cxx +++ b/ITS/AliITSClusterFinderV2SDD.cxx @@ -25,7 +25,7 @@ #include "AliITSRecPoint.h" #include "AliITSDetTypeRec.h" #include "AliRawReader.h" -#include "AliITSRawStreamSDD.h" +#include "AliITSRawStreamSDDv3.h" #include "AliITSCalibrationSDD.h" #include "AliITSDetTypeRec.h" #include "AliITSsegmentationSDD.h" @@ -68,15 +68,23 @@ void AliITSClusterFinderV2SDD::FindClustersSDD(TClonesArray *digits) { 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; iUncheckedAt(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(qGetThresholdAnode(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); @@ -103,6 +111,7 @@ FindClustersSDD(AliBin* bins[2], Int_t nMaxBin, Int_t nzBins, //------------------------------------------------------------ // Actual SDD cluster finder //------------------------------------------------------------ + AliITSCalibrationSDD* cal = (AliITSCalibrationSDD*)GetResp(fModule); Int_t ncl=0; TClonesArray &cl=*clusters; for (Int_t s=0; s<2; s++) @@ -208,27 +217,38 @@ FindClustersSDD(AliBin* bins[2], Int_t nMaxBin, Int_t nzBins, //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]]; @@ -264,7 +284,7 @@ void AliITSClusterFinderV2SDD::RawdataToClusters(AliRawReader* rawReader,TClones // This function creates ITS clusters from raw data //------------------------------------------------------------ rawReader->Reset(); - AliITSRawStreamSDD inputSDD(rawReader); + AliITSRawStreamSDDv3 inputSDD(rawReader); FindClustersSDD(&inputSDD,clusters); } @@ -338,22 +358,19 @@ void AliITSClusterFinderV2SDD::CorrectPosition(Float_t &z, Float_t&y){ 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; } -- 2.39.3