Added cross-talk from the wires beyond the first and the last rows
[u/mrichter/AliRoot.git] / TPC / AliTPC.cxx
index a71d5c712ba4957a5caf85a77245d217ca44fbe9..992cc5e94ccaf0f37f5eed9c972669c5eed372da 100644 (file)
@@ -15,6 +15,9 @@
 
 /*
 $Log$
 
 /*
 $Log$
+Revision 1.58  2002/05/27 14:33:14  hristov
+The new class AliTrackReference used (M.Ivanov)
+
 Revision 1.57  2002/05/07 17:23:11  kowal2
 Linear gain inefficiency instead of the step one at the wire edges.
 
 Revision 1.57  2002/05/07 17:23:11  kowal2
 Linear gain inefficiency instead of the step one at the wire edges.
 
@@ -1857,7 +1860,7 @@ void AliTPC::Hits2DigitsSector(Int_t isec)
 
       Int_t nrows =fTPCParam->GetNRow(isec);
 
 
       Int_t nrows =fTPCParam->GetNRow(isec);
 
-      row= new TObjArray* [nrows];
+      row= new TObjArray* [nrows+2]; // 2 extra rows for cross talk
     
       MakeSector(isec,nrows,tH,ntracks,row);
 
     
       MakeSector(isec,nrows,tH,ntracks,row);
 
@@ -1915,7 +1918,7 @@ void AliTPC::DigitizeRow(Int_t irow,Int_t isec,TObjArray **rows)
  
 
   Float_t zerosup = fTPCParam->GetZeroSup();
  
 
   Float_t zerosup = fTPCParam->GetZeroSup();
-  Int_t nrows =fTPCParam->GetNRow(isec);
+  //  Int_t nrows =fTPCParam->GetNRow(isec);
   fCurrentIndex[1]= isec;
   
 
   fCurrentIndex[1]= isec;
   
 
@@ -1943,14 +1946,16 @@ void AliTPC::DigitizeRow(Int_t irow,Int_t isec,TObjArray **rows)
   //
   //calculate signal 
   //
   //
   //calculate signal 
   //
-  Int_t row1 = TMath::Max(irow-fTPCParam->GetNCrossRows(),0);
-  Int_t row2 = TMath::Min(irow+fTPCParam->GetNCrossRows(),nrows-1);
+  //Int_t row1 = TMath::Max(irow-fTPCParam->GetNCrossRows(),0);
+  //Int_t row2 = TMath::Min(irow+fTPCParam->GetNCrossRows(),nrows-1);
+  Int_t row1=irow;
+  Int_t row2=irow+2; 
   for (Int_t row= row1;row<=row2;row++){
     Int_t nTracks= rows[row]->GetEntries();
     for (i1=0;i1<nTracks;i1++){
       fCurrentIndex[2]= row;
   for (Int_t row= row1;row<=row2;row++){
     Int_t nTracks= rows[row]->GetEntries();
     for (i1=0;i1<nTracks;i1++){
       fCurrentIndex[2]= row;
-      fCurrentIndex[3]=irow;
-      if (row==irow){
+      fCurrentIndex[3]=irow+1;
+      if (row==irow+1){
        m2->Zero();  // clear single track signal matrix
        Float_t trackLabel = GetSignal(rows[row],i1,m2,m1,indexRange); 
        GetList(trackLabel,nofPads,m2,indexRange,pList);
        m2->Zero();  // clear single track signal matrix
        Float_t trackLabel = GetSignal(rows[row],i1,m2,m1,indexRange); 
        GetList(trackLabel,nofPads,m2,indexRange,pList);
@@ -2050,7 +2055,7 @@ Float_t AliTPC::GetSignal(TObjArray *p1, Int_t ntr,
   AliTPCFastVector &v = *tv;
   
   Float_t label = v(0);
   AliTPCFastVector &v = *tv;
   
   Float_t label = v(0);
-  Int_t centralPad = (fTPCParam->GetNPads(fCurrentIndex[1],fCurrentIndex[3])-1)/2;
+  Int_t centralPad = (fTPCParam->GetNPads(fCurrentIndex[1],fCurrentIndex[3]-1)-1)/2;
 
   Int_t nElectrons = (tv->GetNrows()-1)/4;
   indexRange[0]=9999; // min pad
 
   Int_t nElectrons = (tv->GetNrows()-1)/4;
   indexRange[0]=9999; // min pad
@@ -2221,10 +2226,10 @@ void AliTPC::MakeSector(Int_t isec,Int_t nrows,TTree *TH,
   // of electrons, one AliTPCFastVectors per each track.
   //---------------------------------------------- 
     
   // of electrons, one AliTPCFastVectors per each track.
   //---------------------------------------------- 
     
-  Int_t *nofElectrons = new Int_t [nrows]; // electron counter for each row
-  AliTPCFastVector **tracks = new AliTPCFastVector* [nrows]; //pointers to the track vectors
+  Int_t *nofElectrons = new Int_t [nrows+2]; // electron counter for each row
+  AliTPCFastVector **tracks = new AliTPCFastVector* [nrows+2]; //pointers to the track vectors
 
 
-  for(i=0; i<nrows; i++){
+  for(i=0; i<nrows+2; i++){
     row[i] = new TObjArray;
     nofElectrons[i]=0;
     tracks[i]=0;
     row[i] = new TObjArray;
     nofElectrons[i]=0;
     tracks[i]=0;
@@ -2271,7 +2276,7 @@ void AliTPC::MakeSector(Int_t isec,Int_t nrows,TTree *TH,
                           
            // store already filled fTrack
               
                           
            // store already filled fTrack
               
-          for(i=0;i<nrows;i++){
+          for(i=0;i<nrows+2;i++){
              if(previousTrack != -1){
               if(nofElectrons[i]>0){
                  AliTPCFastVector &v = *tracks[i];
              if(previousTrack != -1){
               if(nofElectrons[i]>0){
                  AliTPCFastVector &v = *tracks[i];
@@ -2324,14 +2329,16 @@ void AliTPC::MakeSector(Int_t isec,Int_t nrows,TTree *TH,
          xyz[3]= (Float_t) (-gasgain*TMath::Log(rn)); 
          index[0]=1;
          
          xyz[3]= (Float_t) (-gasgain*TMath::Log(rn)); 
          index[0]=1;
          
-         TransportElectron(xyz,index); //MI change -august       
+         TransportElectron(xyz,index);    
          Int_t rowNumber;
          Int_t rowNumber;
-         fTPCParam->GetPadRow(xyz,index); //MI change august
-         rowNumber = index[2];
+         fTPCParam->GetPadRow(xyz,index); 
+         // row 0 - cross talk from the innermost row
+         // row fNRow+1 cross talk from the outermost row
+         rowNumber = index[2]+1; 
          //transform position to local digit coordinates
          //relative to nearest pad row 
          //transform position to local digit coordinates
          //relative to nearest pad row 
-         if ((rowNumber<0)||rowNumber>=fTPCParam->GetNRow(isec)) continue;
-  Float_t x1,y1;
+         if ((rowNumber<0)||rowNumber>fTPCParam->GetNRow(isec)+1) continue;
+          Float_t x1,y1;
          if (isec <fTPCParam->GetNInnerSector()) {
            x1 = xyz[1]*fTPCParam->GetInnerPadPitchWidth();
            y1 = fTPCParam->GetYInner(rowNumber);
          if (isec <fTPCParam->GetNInnerSector()) {
            x1 = xyz[1]*fTPCParam->GetInnerPadPitchWidth();
            y1 = fTPCParam->GetYInner(rowNumber);
@@ -2340,9 +2347,7 @@ void AliTPC::MakeSector(Int_t isec,Int_t nrows,TTree *TH,
            x1=xyz[1]*fTPCParam->GetOuterPadPitchWidth();
            y1 = fTPCParam->GetYOuter(rowNumber);
          }
            x1=xyz[1]*fTPCParam->GetOuterPadPitchWidth();
            y1 = fTPCParam->GetYOuter(rowNumber);
          }
-
          // gain inefficiency at the wires edges - linear
          // gain inefficiency at the wires edges - linear
-
          x1=TMath::Abs(x1);
          y1-=1.;
           if(x1>y1) xyz[3]*=TMath::Max(1.e-6,(y1-x1+1.));      
          x1=TMath::Abs(x1);
          y1-=1.;
           if(x1>y1) xyz[3]*=TMath::Max(1.e-6,(y1-x1+1.));      
@@ -2375,7 +2380,7 @@ void AliTPC::MakeSector(Int_t isec,Int_t nrows,TTree *TH,
     //   store remaining track (the last one) if not empty
     //
 
     //   store remaining track (the last one) if not empty
     //
 
-     for(i=0;i<nrows;i++){
+     for(i=0;i<nrows+2;i++){
        if(nofElectrons[i]>0){
           AliTPCFastVector &v = *tracks[i];
          v(0) = previousTrack;
        if(nofElectrons[i]>0){
           AliTPCFastVector &v = *tracks[i];
          v(0) = previousTrack;
@@ -2592,13 +2597,10 @@ void AliTPC::TransportElectron(Float_t *xyz, Int_t *index)
   // ExB
   
   if (fTPCParam->GetMWPCReadout()==kTRUE){
   // ExB
   
   if (fTPCParam->GetMWPCReadout()==kTRUE){
-    Float_t x1=xyz[0];
-    fTPCParam->Transform2to2NearestWire(xyz,index);
-    Float_t dx=xyz[0]-x1;
+    Float_t dx = fTPCParam->Transform2to2NearestWire(xyz,index);
     xyz[1]+=dx*(fTPCParam->GetOmegaTau());
   }
     xyz[1]+=dx*(fTPCParam->GetOmegaTau());
   }
-  //add nonisochronity (not implemented yet)
-  
+  //add nonisochronity (not implemented yet)  
 }
   
 ClassImp(AliTPCdigit)
 }
   
 ClassImp(AliTPCdigit)