]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
SDD calibration aware local reconstruction. Absolute calibration of charge needs...
authormasera <masera@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 23 Mar 2007 18:00:17 +0000 (18:00 +0000)
committermasera <masera@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 23 Mar 2007 18:00:17 +0000 (18:00 +0000)
ITS/AliITSCalibrationSDD.h
ITS/AliITSClusterFinderSDD.cxx
ITS/AliITSClusterFinderSDD.h
ITS/AliITSClusterFinderV2SDD.cxx

index e0107acc20f1e09a437c7bae231569494b810a6c..b8374d762ca98e1795578e3a90c8a95ded2f8d2a 100644 (file)
@@ -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:
 
index 89faf245156be49011797e12ec446f02b86f59b4..3c825108f6218886fb624bd9bd8f9c07b31c5956 100644 (file)
@@ -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<nofClusters; j++ ){ 
         // get cluster information
@@ -819,11 +819,15 @@ void AliITSClusterFinderSDD::ResolveClusters(){
                     //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 );
@@ -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;
+
+}
index a77e961324315e20d72c77362829e03745c9eb9d..6612bcf9d7386c04867a4ad451c35339f245863f 100644 (file)
@@ -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
index a40da4f7a662541f454f8de0b90615ce06b469e9..d2379b277c7970a621f83383980db4272f9b6c89 100644 (file)
@@ -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; 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);
@@ -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;
 
 
 }