X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TPC%2FAliTPCParamSR.cxx;h=77ad0cfda796fbe193c8819b1b566bbf6ebb0df5;hb=09bed5bfa9e4e12385cedad5adf92c368ec76a05;hp=11b1f58ed133f7e53187adc7a7a5f00733ee3fa6;hpb=f03e342345a8fa1862aa7bee50b2e9af9aabda45;p=u%2Fmrichter%2FAliRoot.git diff --git a/TPC/AliTPCParamSR.cxx b/TPC/AliTPCParamSR.cxx index 11b1f58ed13..77ad0cfda79 100644 --- a/TPC/AliTPCParamSR.cxx +++ b/TPC/AliTPCParamSR.cxx @@ -13,35 +13,7 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ -/* -$Log$ -Revision 1.6 2002/02/25 11:02:56 kowal2 -Changes towards speeding up the code. Thanks to Marian Ivanov. - -Revision 1.5 2001/12/06 07:49:30 kowal2 -corrected number of pads calculation - -Revision 1.4 2000/11/02 07:33:15 kowal2 -Improvements of the code. - -Revision 1.3 2000/06/30 12:07:50 kowal2 -Updated from the TPC-PreRelease branch - -Revision 1.2.4.2 2000/06/14 16:48:24 kowal2 -Parameter setting improved. Removed compiler warnings - -Revision 1.2.4.1 2000/06/09 07:55:39 kowal2 - -Updated defaults - -Revision 1.2 2000/04/17 09:37:33 kowal2 -removed obsolete AliTPCDigitsDisplay.C - -Revision 1.1.4.2 2000/04/10 11:36:13 kowal2 - -New Detector parameters handling class - -*/ +/* $Id$ */ /////////////////////////////////////////////////////////////////////// // Manager and of geomety classes for set: TPC // @@ -55,38 +27,67 @@ New Detector parameters handling class // // /////////////////////////////////////////////////////////////////////// - -#include +//#include #include -#include -#include + #include "AliTPCPRF2D.h" +#include "AliTPCParamSR.h" #include "AliTPCRF1D.h" #include "TH1.h" - +#include "AliTPCROC.h" +#include "TGeoManager.h" ClassImp(AliTPCParamSR) -const static Int_t kMaxRows=600; -const static Float_t kEdgeSectorSpace = 2.5; -const static Float_t kFacSigmaPadRow=3.; -const static Float_t kFacSigmaPad=3.; -const static Float_t kFacSigmaTime=3.; +static const Int_t kMaxRows=600; +static const Float_t kEdgeSectorSpace = 2.5; +static const Float_t kFacSigmaPadRow=3.; +static const Float_t kFacSigmaPad=3.; +static const Float_t kFacSigmaTime=3.; AliTPCParamSR::AliTPCParamSR() + :AliTPCParam(), + fInnerPRF(0), + fOuter1PRF(0), + fOuter2PRF(0), + fTimeRF(0), + fFacSigmaPadRow(0), + fFacSigmaPad(0), + fFacSigmaTime(0) { // //constructor set the default parameters - fInnerPRF=0; - fOuter1PRF=0; - fOuter2PRF=0; - fTimeRF = 0; + // + fFacSigmaPadRow = Float_t(kFacSigmaPadRow); fFacSigmaPad = Float_t(kFacSigmaPad); fFacSigmaTime = Float_t(kFacSigmaTime); SetDefault(); Update(); } +AliTPCParamSR::AliTPCParamSR(const AliTPCParamSR ¶m) + :AliTPCParam(), + fInnerPRF(0), + fOuter1PRF(0), + fOuter2PRF(0), + fTimeRF(0), + fFacSigmaPadRow(0), + fFacSigmaPad(0), + fFacSigmaTime(0) +{ + // + // copy constructor - dummy + // + fFacSigmaPadRow = param.fFacSigmaPadRow; +} +AliTPCParamSR & AliTPCParamSR::operator =(const AliTPCParamSR & param) +{ + // + // assignment operator - dummy + // + fZLength=param.fZLength; + return (*this); +} AliTPCParamSR::~AliTPCParamSR() { @@ -114,6 +115,7 @@ Int_t AliTPCParamSR::CalcResponse(Float_t* xyz, Int_t * index, Int_t row) //we suppose that coordinate is expressed in float digits // it's mean coordinate system 8 //xyz[0] - float padrow xyz[1] is float pad (center pad is number 0) and xyz[2] is float time bin + //xyz[3] - electron time in float time bin format if ( (fInnerPRF==0)||(fOuter1PRF==0)||(fOuter2PRF==0) ||(fTimeRF==0) ){ Error("AliTPCParamSR", "response function was not adjusted"); return -1; @@ -138,11 +140,11 @@ Int_t AliTPCParamSR::CalcResponse(Float_t* xyz, Int_t * index, Int_t row) Int_t fpadrow = TMath::Max(TMath::Nint(index[2]+xyz[0]-sfpadrow),0); //"first" padrow Int_t fpad = TMath::Nint(xyz[1]-sfpad); //first pad - Int_t ftime = TMath::Max(TMath::Nint(xyz[2]+GetZOffset()/GetZWidth()-sftime),0); // first time + Int_t ftime = TMath::Max(TMath::Nint(xyz[2]+xyz[3]+GetZOffset()/GetZWidth()-sftime-GetNTBinsL1()),0); // first time Int_t lpadrow = TMath::Min(TMath::Nint(index[2]+xyz[0]+sfpadrow),fpadrow+19); //"last" padrow lpadrow = TMath::Min(GetNRow(index[1])-1,lpadrow); Int_t lpad = TMath::Min(TMath::Nint(xyz[1]+sfpad),fpad+19); //last pad - Int_t ltime = TMath::Min(TMath::Nint(xyz[2]+GetZOffset()/GetZWidth()+sftime),ftime+19); // last time + Int_t ltime = TMath::Min(TMath::Nint(xyz[2]+xyz[3]+GetZOffset()/GetZWidth()+sftime-GetNTBinsL1()),ftime+19); // last time ltime = TMath::Min(ltime,GetMaxTBin()-1); // Int_t npads = GetNPads(index[1],row); @@ -184,7 +186,7 @@ Int_t AliTPCParamSR::CalcResponse(Float_t* xyz, Int_t * index, Int_t row) //calculate time response function Int_t time; for (time = ftime;time<=ltime;time++) - timeres[time-ftime]= fTimeRF->GetRF((-xyz[2]+Float_t(time))*fZWidth); + timeres[time-ftime]= fTimeRF->GetRF((-xyz[2]-xyz[3]+Float_t(time))*fZWidth+GetNTBinsL1()); //write over threshold values to stack for (padrow = fpadrow;padrow<=lpadrow;padrow++) for (pad = fpad;pad<=lpad;pad++) @@ -265,7 +267,7 @@ void AliTPCParamSR::XYZtoCRXYZ(Float_t *xyz, padrow = index[1]; } -Float_t AliTPCParamSR::GetPrimaryLoss(Float_t *x, Int_t *index, Float_t *angle) +Float_t AliTPCParamSR::GetPrimaryLoss(Float_t */*x*/, Int_t *index, Float_t *angle) { // // @@ -278,7 +280,7 @@ Float_t AliTPCParamSR::GetPrimaryLoss(Float_t *x, Int_t *index, Float_t *angle) return length*fNPrimLoss; } -Float_t AliTPCParamSR::GetTotalLoss(Float_t *x, Int_t *index, Float_t *angle) +Float_t AliTPCParamSR::GetTotalLoss(Float_t */*x*/, Int_t *index, Float_t *angle) { // // @@ -293,7 +295,7 @@ Float_t AliTPCParamSR::GetTotalLoss(Float_t *x, Int_t *index, Float_t *angle) } -void AliTPCParamSR::GetClusterSize(Float_t *x, Int_t *index, Float_t *angle, Int_t mode, Float_t *sigma) +void AliTPCParamSR::GetClusterSize(Float_t *x, Int_t *index, Float_t */*angle*/, Int_t /*mode*/, Float_t *sigma) { // //return cluster sigma2 (x,y) for particle at position x @@ -333,15 +335,15 @@ void AliTPCParamSR::GetClusterSize(Float_t *x, Int_t *index, Float_t *angle, Int -void AliTPCParamSR::GetSpaceResolution(Float_t *x, Int_t *index, Float_t *angle, - Float_t amplitude, Int_t mode, Float_t *sigma) +void AliTPCParamSR::GetSpaceResolution(Float_t */*x*/, Int_t */*index*/, Float_t */*angle*/, + Float_t /*amplitude*/, Int_t /*mode*/, Float_t */*sigma*/) { // // // } -Float_t AliTPCParamSR::GetAmp(Float_t *x, Int_t *index, Float_t *angle) +Float_t AliTPCParamSR::GetAmp(Float_t */*x*/, Int_t */*index*/, Float_t */*angle*/) { // // @@ -370,29 +372,35 @@ Bool_t AliTPCParamSR::Update() if (AliTPCParam::Update()==kFALSE) return kFALSE; fbStatus = kFALSE; - Float_t firstrow = fInnerRadiusLow + 2.225 ; + Float_t firstrow = fInnerRadiusLow + 1.575; for( i= 0;iGetNPads(0,i) ; // ROC implement } + // cross talk rows + fYInner[0]=(fPadRowLow[0]-fInnerPadPitchLength)*tan(fInnerAngle/2.)-fInnerWireMount; + fYInner[fNRowLow+1]=(fPadRowLow[fNRowLow-1]+fInnerPadPitchLength)*tan(fInnerAngle/2.)-fInnerWireMount; firstrow = fOuterRadiusLow + 1.6; for(i=0;iGetNPads(36,i) ; // ROC implement if(i==fNRowUp1-1) { - fLastWireUp1=fPadRowUp[i] +0.375; + fLastWireUp1=fPadRowUp[i] +0.625; firstrow = fPadRowUp[i] + 0.5*(fOuter1PadPitchLength+fOuter2PadPitchLength); } } @@ -400,12 +408,16 @@ Bool_t AliTPCParamSR::Update() { Float_t x = firstrow + fOuter2PadPitchLength*(Float_t)(i-64); fPadRowUp[i]=x; -Float_t y =(x-0.5*fOuter2PadPitchLength)*tan(fOuterAngle/2.)-fOuterWireMount- - fOuterPadPitchWidth/2.; - fNPadsUp[i] = 1+2*(Int_t)(y/fOuterPadPitchWidth) ; + //Float_t y =(x-0.5*fOuter2PadPitchLength)*tan(fOuterAngle/2.)-fOuterWireMount- + // fOuterPadPitchWidth/2.; + //fNPadsUp[i] = 1+2*(Int_t)(y/fOuterPadPitchWidth) ; + fNPadsUp[i] = AliTPCROC::Instance()->GetNPads(36,i) ; // ROC implement } - fYOuter[i] = fPadRowUp[i]*tan(fOuterAngle/2.)-fOuterWireMount; + fYOuter[i+1] = fPadRowUp[i]*tan(fOuterAngle/2.)-fOuterWireMount; } + // cross talk rows + fYOuter[0]=(fPadRowUp[0]-fOuter1PadPitchLength)*tan(fOuterAngle/2.)-fOuterWireMount; + fYOuter[fNRowUp+1]=(fPadRowUp[fNRowUp-1]+fOuter2PadPitchLength)*tan(fOuterAngle/2.)-fOuterWireMount; fNtRows = fNInnerSector*fNRowLow+fNOuterSector*fNRowUp; fbStatus = kTRUE; return kTRUE; @@ -429,6 +441,7 @@ void AliTPCParamSR::Streamer(TBuffer &R__b) AliTPCParam::Streamer(R__b); // if (R__v < 2) return; Update(); + if (gGeoManager) ReadGeoMatrices(); } else { R__b.WriteVersion(AliTPCParamSR::IsA()); //TObject::Streamer(R__b); @@ -443,26 +456,29 @@ Int_t AliTPCParamSR::CalcResponseFast(Float_t* xyz, Int_t * index, Int_t row) // //we suppose that coordinate is expressed in float digits // it's mean coordinate system 8 - //xyz[0] - float padrow xyz[1] is float pad (center pad is number 0) and xyz[2] is float time bin + //xyz[0] - electron position w.r.t. pad center, normalized to pad length, + //xyz[1] is float pad (center pad is number 0) and xyz[2] is float time bin + //xyz[3] - electron time in float time bin format if ( (fInnerPRF==0)||(fOuter1PRF==0)||(fOuter2PRF==0) ||(fTimeRF==0) ){ Error("AliTPCParamSR", "response function was not adjusted"); return -1; } - const Int_t padn = 500; - const Float_t fpadn = 500.; - const Int_t timen = 500; - const Float_t ftimen = 500.; - const Int_t padrn = 500; - const Float_t fpadrn = 500.; + const Int_t kpadn = 500; + const Float_t kfpadn = 500.; + const Int_t ktimen = 500; + const Float_t kftimen = 500.; + const Int_t kpadrn = 500; + const Float_t kfpadrn = 500.; - static Float_t prfinner[2*padrn][5*padn]; //pad divided by 50 - static Float_t prfouter1[2*padrn][5*padn]; //prfouter division - static Float_t prfouter2[2*padrn][5*padn]; + static Float_t prfinner[2*kpadrn][5*kpadn]; //pad divided by 50 + static Float_t prfouter1[2*kpadrn][5*kpadn]; //prfouter division + static Float_t prfouter2[2*kpadrn][5*kpadn]; + static Float_t kTanMax =0; - static Float_t rftime[5*timen]; //time division + static Float_t rftime[5*ktimen]; //time division static Int_t blabla=0; static Float_t zoffset=0; static Float_t zwidth=0; @@ -472,6 +488,7 @@ Int_t AliTPCParamSR::CalcResponseFast(Float_t* xyz, Int_t * index, Int_t row) static TH1F * hdiff2=0; if (blabla==0) { //calculate Response function - only at the begginning + kTanMax = TMath::ATan(10.*TMath::DegToRad()); hdiff =new TH1F("prf_diff","prf_diff",10000,-1,1); hdiff1 =new TH1F("no_repsonse1","no_response1",10000,-1,1); hdiff2 =new TH1F("no_response2","no_response2",10000,-1,1); @@ -480,35 +497,35 @@ Int_t AliTPCParamSR::CalcResponseFast(Float_t* xyz, Int_t * index, Int_t row) zoffset = GetZOffset(); zwidth = fZWidth; zoffset2 = zoffset/zwidth; - for (Int_t i=0;i<5*timen;i++){ - rftime[i] = fTimeRF->GetRF(((i-2.5*ftimen)/ftimen)*zwidth+zoffset); + for (Int_t i=0;i<5*ktimen;i++){ + rftime[i] = fTimeRF->GetRF(((i-2.5*kftimen)/kftimen)*zwidth+zoffset); } - for (Int_t i=0;i<5*padn;i++){ - for (Int_t j=0;j<2*padrn;j++){ + for (Int_t i=0;i<5*kpadn;i++){ + for (Int_t j=0;j<2*kpadrn;j++){ prfinner[j][i] = - fInnerPRF->GetPRF((i-2.5*fpadn)/fpadn - *fInnerPadPitchWidth,(j-fpadrn)/fpadrn*fInnerPadPitchLength); + fInnerPRF->GetPRF((i-2.5*kfpadn)/kfpadn + *fInnerPadPitchWidth,(j-kfpadrn)/kfpadrn*fInnerPadPitchLength); prfouter1[j][i] = - fOuter1PRF->GetPRF((i-2.5*fpadn)/fpadn - *fOuterPadPitchWidth,(j-fpadrn)/fpadrn*fOuter1PadPitchLength); + fOuter1PRF->GetPRF((i-2.5*kfpadn)/kfpadn + *fOuterPadPitchWidth,(j-kfpadrn)/kfpadrn*fOuter1PadPitchLength); // prfouter2[j][i] = - fOuter2PRF->GetPRF((i-2.5*fpadn)/fpadn - *fOuterPadPitchWidth,(j-fpadrn)/fpadrn*fOuter2PadPitchLength); + fOuter2PRF->GetPRF((i-2.5*kfpadn)/kfpadn + *fOuterPadPitchWidth,(j-kfpadrn)/kfpadrn*fOuter2PadPitchLength); } } } // the above is calculated only once // calculate central padrow, pad, time - Int_t npads = GetNPads(index[1],index[3]); + Int_t npads = GetNPads(index[1],index[3]-1); Int_t cpadrow = index[2]; // electrons are here Int_t cpad = TMath::Nint(xyz[1]); - Int_t ctime = TMath::Nint(xyz[2]+zoffset2); + Int_t ctime = TMath::Nint(xyz[2]+zoffset2+xyz[3]-GetNTBinsL1()); //calulate deviation Float_t dpadrow = xyz[0]; Float_t dpad = xyz[1]-cpad; - Float_t dtime = xyz[2]+zoffset2-ctime; + Float_t dtime = xyz[2]+zoffset2+xyz[3]-ctime-GetNTBinsL1(); Int_t cindex =0; Int_t cindex3 =0; Int_t maxt =GetMaxTBin(); @@ -523,62 +540,78 @@ Int_t AliTPCParamSR::CalcResponseFast(Float_t* xyz, Int_t * index, Int_t row) fpadrow = (index[2]>1) ? -1 :0; lpadrow = (index[2] -npads/2+1) ? -2: -npads/2-cpad; - Int_t lpad = (cpad < npads/2-1) ? 2: npads/2-cpad; + Int_t lpad = (cpad < npads/2-2) ? 2: npads/2-1-cpad; Int_t ftime = (ctime>1) ? -2: -ctime; Int_t ltime = (ctime=2*padrn)) + if ( (apadrow<0) || (apadrow>=2*kpadrn)) continue; - Int_t apad= TMath::Nint((dpad-fpad)*fpadn+2.5*fpadn); + // pad angular correction + Float_t angle = kTanMax*2.*(cpad+0.5)/Float_t(npads); + Float_t dpadangle =0; + if (index[1]fResponseThreshold) { fResponseBin[cindex3++]=cpadrow+ipadrow; fResponseBin[cindex3++]=cpad+ipad; fResponseBin[cindex3++]=ctime+itime; - fResponseWeight[cindex++]=cweight2; - - if (cweight2>100) - { - printf("Pici pici %d %f %d\n",ipad,dpad,apad); - } - + fResponseWeight[cindex++]=cweight2; } - atime-=timen; + atime-=ktimen; } - apad-= padn; + apad-= kpadn; } - apadrow-=padrn; + apadrow-=kpadrn; } fCurrentMax=cindex; return fCurrentMax;