X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=HLT%2Fhough%2FAliL3HoughTransformerRow.cxx;h=b3fc745bc3c6cdffdff25e9d30f91a0dc87d62cf;hb=7e4eb45333fcf07247cd18f6ff149f2f82957c6e;hp=a1ea8e8b756a2f4fcae0952a04505b0123538e0c;hpb=8a9c0ba22de0bc230a5220e6c843f22ce995d1e6;p=u%2Fmrichter%2FAliRoot.git diff --git a/HLT/hough/AliL3HoughTransformerRow.cxx b/HLT/hough/AliL3HoughTransformerRow.cxx index a1ea8e8b756..b3fc745bc3c 100644 --- a/HLT/hough/AliL3HoughTransformerRow.cxx +++ b/HLT/hough/AliL3HoughTransformerRow.cxx @@ -1,8 +1,7 @@ // @(#) $Id$ -// Author: Anders Vestbo -//*-- Copyright © ALICE HLT Group +// Author: Cvetan Cheshkov #include "AliL3StandardIncludes.h" @@ -21,129 +20,218 @@ using namespace std; //_____________________________________________________________ // AliL3HoughTransformerRow // -// TPC rows Hough transformation class +// Impelementation of the so called "TPC rows Hough transformation" class // +// Transforms the TPC data into the hough space and counts the missed TPC +// rows corresponding to each track cnadidate - hough space bin ClassImp(AliL3HoughTransformerRow) -UChar_t **AliL3HoughTransformerRow::fgRowCount = 0; -UChar_t **AliL3HoughTransformerRow::fgGapCount = 0; -UChar_t **AliL3HoughTransformerRow::fgCurrentRowCount = 0; -#ifdef do_mc -AliL3TrackIndex **AliL3HoughTransformerRow::fgTrackID = 0; -#endif -UChar_t *AliL3HoughTransformerRow::fgTrackNRows = 0; -UChar_t *AliL3HoughTransformerRow::fgTrackFirstRow = 0; -UChar_t *AliL3HoughTransformerRow::fgTrackLastRow = 0; - -Float_t AliL3HoughTransformerRow::fgBeta1 = AliL3Transform::Row2X(79)/pow(AliL3Transform::Row2X(79),2); -Float_t AliL3HoughTransformerRow::fgBeta2 = (AliL3Transform::Row2X(158)+6.0)/pow((AliL3Transform::Row2X(158)+6.0),2); +Float_t AliL3HoughTransformerRow::fgBeta1 = 1.0/AliL3Transform::Row2X(84); +Float_t AliL3HoughTransformerRow::fgBeta2 = 1.0/(AliL3Transform::Row2X(158)*(1.0+tan(AliL3Transform::Pi()*10/180)*tan(AliL3Transform::Pi()*10/180))); AliL3HoughTransformerRow::AliL3HoughTransformerRow() { //Default constructor fParamSpace = 0; - fDoMC = kFALSE;; - fLUTforwardZ=0; - fLUTforwardZ2=0; - fLUTbackwardZ=0; - fLUTbackwardZ2=0; + fGapCount = 0; + fCurrentRowCount = 0; +#ifdef do_mc + fTrackID = 0; +#endif + fTrackNRows = 0; + fTrackFirstRow = 0; + fTrackLastRow = 0; + fInitialGapCount = 0; + + fPrevBin = 0; + fNextBin = 0; + fNextRow = 0; + + fStartPadParams = 0; + fEndPadParams = 0; + fLUTr2 = 0; + fLUTforwardZ = 0; + fLUTforwardZ2 = 0; + fLUTbackwardZ = 0; + fLUTbackwardZ2 = 0; + } AliL3HoughTransformerRow::AliL3HoughTransformerRow(Int_t slice,Int_t patch,Int_t netasegments,Bool_t /*DoMC*/,Float_t zvertex) : AliL3HoughBaseTransformer(slice,patch,netasegments,zvertex) { //Normal constructor fParamSpace = 0; - fDoMC = kFALSE; - fDoMC=kFALSE; + + fGapCount = 0; + fCurrentRowCount = 0; #ifdef do_mc - fDoMC = kTRUE; + fTrackID = 0; #endif - fLUTforwardZ=0; - fLUTforwardZ2=0; - fLUTbackwardZ=0; - fLUTbackwardZ2=0; + fTrackNRows = 0; + fTrackFirstRow = 0; + fTrackLastRow = 0; + fInitialGapCount = 0; + + fPrevBin = 0; + fNextBin = 0; + fNextRow = 0; + + fStartPadParams = 0; + fEndPadParams = 0; + fLUTr2 = 0; + fLUTforwardZ = 0; + fLUTforwardZ2 = 0; + fLUTbackwardZ = 0; + fLUTbackwardZ2 = 0; + } AliL3HoughTransformerRow::~AliL3HoughTransformerRow() { //Destructor + if(fLastTransformer) return; DeleteHistograms(); #ifdef do_mc - if(fgTrackID) + if(fTrackID) { for(Int_t i=0; iGetNbinsX()+3)/2; - Int_t ncellsy = (hist->GetNbinsY()+3)/2; - Int_t ncells = ncellsx*ncellsy; - if(!fgTrackID) - { - LOG(AliL3Log::kInformational,"AliL3HoughTransformerRow::CreateHistograms()","") - <<"Transformer: Allocating "<GetNbinsX()+3)/2; + Int_t ncellsy = (hist->GetNbinsY()+3)/2; + Int_t ncells = ncellsx*ncellsy; + if(!fTrackID) + { + LOG(AliL3Log::kInformational,"AliL3HoughTransformerRow::CreateHistograms()","") + <<"Transformer: Allocating "<GetNbinsX()+2)*(hist->GetNbinsY()+2); - if(!fgRowCount) + if(!fGapCount) { LOG(AliL3Log::kInformational,"AliL3HoughTransformerRow::CreateHistograms()","") - <<"Transformer: Allocating "<GetNbinsY()+2; + if(!fNextRow) + { + LOG(AliL3Log::kInformational,"AliL3HoughTransformerRow::CreateHistograms()","") + <<"Transformer: Allocating "<GetFirstXbin(); Int_t xmax = hist->GetLastXbin(); + Int_t xmiddle = (hist->GetNbinsX()+1)/2; Int_t ymin = hist->GetFirstYbin(); Int_t ymax = hist->GetLastYbin(); Int_t nxbins = hist->GetNbinsX()+2; - for(Int_t ybin=ymin; ybin<=ymax; ybin++) + Int_t nxgrid = (hist->GetNbinsX()+3)/2+1; + Int_t nygrid = hist->GetNbinsY()+3; + + AliL3TrackLength *tracklength = new AliL3TrackLength[nxgrid*nygrid]; + memset(tracklength,0,nxgrid*nygrid*sizeof(AliL3TrackLength)); + + for(Int_t ybin=ymin-1; ybin<=(ymax+1); ybin++) { - for(Int_t xbin=xmin; xbin<=xmax; xbin++) + for(Int_t xbin=xmin-1; xbin<=xmiddle; xbin++) { - //cvetan: we get strange warning on gcc-2.95 - //warning: large integer implicitly truncated to unsigned type - fgTrackNRows[xbin + ybin*nxbins] = 99999; - for(Int_t deltay = -1; deltay <= 1; deltay += 2) { - for(Int_t deltax = -1; deltax <= 1; deltax += 2) { - - Float_t xtrack = hist->GetPreciseBinCenterX((Float_t)xbin+0.5*(Float_t)deltax); - Float_t ytrack = hist->GetPreciseBinCenterY((Float_t)ybin+0.5*(Float_t)deltay); - - Float_t psi = atan((xtrack-ytrack)/(fgBeta1-fgBeta2)); - Float_t kappa = 2.0*(xtrack*cos(psi)-fgBeta1*sin(psi)); - track.SetTrackParameters(kappa,psi,1); - Bool_t firstrow = kFALSE; + fTrackNRows[xbin + ybin*nxbins] = 255; + for(Int_t deltay = 0; deltay <= 1; deltay++) { + for(Int_t deltax = 0; deltax <= 1; deltax++) { + + AliL3TrackLength *curtracklength = &tracklength[(xbin + deltax) + (ybin + deltay)*nxgrid]; UInt_t maxfirstrow = 0; UInt_t maxlastrow = 0; - UInt_t curfirstrow = 0; - UInt_t curlastrow = 0; - for(Int_t j=AliL3Transform::GetFirstRow(0); j<=AliL3Transform::GetLastRow(5); j++) - { - Float_t hit[3]; - if(!track.GetCrossingPoint(j,hit)) continue; - AliL3Transform::LocHLT2Raw(hit,0,j); - if(hit[1]>=0 && hit[1]= (maxlastrow-maxfirstrow)) { - maxfirstrow = curfirstrow; - maxlastrow = curlastrow; + Float_t maxtrackpt = 0; + if(curtracklength->fIsFilled) { + maxfirstrow = curtracklength->fFirstRow; + maxlastrow = curtracklength->fLastRow; + maxtrackpt = curtracklength->fTrackPt; + } + else { + Float_t xtrack = hist->GetPreciseBinCenterX((Float_t)xbin+0.5*(Float_t)(2*deltax-1)); + Float_t ytrack = hist->GetPreciseBinCenterY((Float_t)ybin+0.5*(Float_t)(2*deltay-1)); + + Float_t psi = atan((xtrack-ytrack)/(fgBeta1-fgBeta2)); + Float_t kappa = 2.0*(xtrack*cos(psi)-fgBeta1*sin(psi)); + track.SetTrackParameters(kappa,psi,1); + maxtrackpt = track.GetPt(); + if(maxtrackpt < 0.9*0.1*AliL3Transform::GetSolenoidField()) + { + maxfirstrow = maxlastrow = 0; + curtracklength->fIsFilled = kTRUE; + curtracklength->fFirstRow = maxfirstrow; + curtracklength->fLastRow = maxlastrow; + curtracklength->fTrackPt = maxtrackpt; + } + else + { + Bool_t firstrow = kFALSE; + UInt_t curfirstrow = 0; + UInt_t curlastrow = 0; + + Double_t centerx = track.GetCenterX(); + Double_t centery = track.GetCenterY(); + Double_t radius = track.GetRadius(); + + for(Int_t j=AliL3Transform::GetFirstRow(0); j<=AliL3Transform::GetLastRow(5); j++) + { + Float_t hit[3]; + // if(!track.GetCrossingPoint(j,hit)) continue; + hit[0] = AliL3Transform::Row2X(j); + Double_t aa = (hit[0] - centerx)*(hit[0] - centerx); + Double_t r2 = radius*radius; + if(aa > r2) + continue; + + Double_t aa2 = sqrt(r2 - aa); + Double_t y1 = centery + aa2; + Double_t y2 = centery - aa2; + hit[1] = y1; + if(fabs(y2) < fabs(y1)) hit[1] = y2; + + hit[2] = 0; + + AliL3Transform::LocHLT2Raw(hit,0,j); + hit[1] += 0.5; + if(hit[1]>=0 && hit[1]= (maxlastrow-maxfirstrow)) { + maxfirstrow = curfirstrow; + maxlastrow = curlastrow; + } + } + } } + if((curlastrow-curfirstrow) >= (maxlastrow-maxfirstrow)) { + maxfirstrow = curfirstrow; + maxlastrow = curlastrow; } + + curtracklength->fIsFilled = kTRUE; + curtracklength->fFirstRow = maxfirstrow; + curtracklength->fLastRow = maxlastrow; + curtracklength->fTrackPt = maxtrackpt; } - } - if((curlastrow-curfirstrow) >= (maxlastrow-maxfirstrow)) { - maxfirstrow = curfirstrow; - maxlastrow = curlastrow; } - if((maxlastrow-maxfirstrow) < fgTrackNRows[xbin + ybin*nxbins]) { - fgTrackNRows[xbin + ybin*nxbins] = maxlastrow-maxfirstrow; - fgTrackFirstRow[xbin + ybin*nxbins] = maxfirstrow; - fgTrackLastRow[xbin + ybin*nxbins] = maxlastrow; + if((maxlastrow-maxfirstrow) < fTrackNRows[xbin + ybin*nxbins]) { + fTrackNRows[xbin + ybin*nxbins] = maxlastrow-maxfirstrow; + fInitialGapCount[xbin + ybin*nxbins] = 1; + if((maxlastrow-maxfirstrow+1)GetYmin(); + Float_t histbin = hist->GetBinWidthY(); + Float_t xmin = hist->GetXmin(); + Float_t xmax = hist->GetXmax(); + Float_t xbin = (xmax-xmin)/hist->GetNbinsX(); + Int_t firstbinx = hist->GetFirstXbin(); + Int_t lastbinx = hist->GetLastXbin(); + Int_t nbinx = hist->GetNbinsX()+2; + Int_t firstbin = hist->GetFirstYbin(); + Int_t lastbin = hist->GetLastYbin(); + for(Int_t i=AliL3Transform::GetFirstRow(0); i<=AliL3Transform::GetLastRow(5); i++) + { + Int_t npads = AliL3Transform::GetNPads(i); + Int_t ipatch = AliL3Transform::GetPatch(i); + Double_t padpitch = AliL3Transform::GetPadPitchWidth(ipatch); + Float_t x = AliL3Transform::Row2X(i); + Float_t x2 = x*x; + + fStartPadParams[i] = new AliL3PadHoughParams[npads]; + fEndPadParams[i] = new AliL3PadHoughParams[npads]; + fLUTr2[i] = new Float_t[npads]; + for(Int_t pad=0; pad=0) + alpha2 += deltaalpha2; + + fStartPadParams[i][pad].fAlpha = alpha1; + fStartPadParams[i][pad].fDeltaAlpha = deltaalpha1; + fEndPadParams[i][pad].fAlpha = alpha2; + fEndPadParams[i][pad].fDeltaAlpha = deltaalpha2; + + //Find the first and last bin rows to be filled + Bool_t binfound1 = kFALSE; + Bool_t binfound2 = kFALSE; + Int_t firstbin1 = lastbin; + Int_t firstbin2 = lastbin; + Int_t lastbin1 = firstbin; + Int_t lastbin2 = firstbin; + for(Int_t b=firstbin; b<=lastbin; b++, alpha1 += deltaalpha1, alpha2 += deltaalpha2) + { + Int_t binx1 = 1 + (Int_t)alpha1; + if(binx1<=lastbinx) { + UChar_t initialgapcount; + if(binx1>=firstbinx) + initialgapcount = fInitialGapCount[binx1 + b*nbinx]; + else + initialgapcount = fInitialGapCount[firstbinx + b*nbinx]; + if(initialgapcount != MAX_N_GAPS) { + if(!binfound1) { + firstbin1 = b; + binfound1 = kTRUE; + } + lastbin1 = b; + } + } + Int_t binx2 = 1 + (Int_t)alpha2; + if(binx2>=firstbin) { + UChar_t initialgapcount; + if(binx2<=lastbinx) + initialgapcount = fInitialGapCount[binx2 + b*nbinx]; + else + initialgapcount = fInitialGapCount[lastbinx + b*nbinx]; + if(initialgapcount != MAX_N_GAPS) { + if(!binfound2) { + firstbin2 = b; + binfound2 = kTRUE; + } + lastbin2 = b; + } + } + } + fStartPadParams[i][pad].fFirstBin=firstbin1; + fStartPadParams[i][pad].fLastBin=lastbin1; + fEndPadParams[i][pad].fFirstBin=firstbin2; + fEndPadParams[i][pad].fLastBin=lastbin2; + } + } + } + //create lookup table for z of the digits - Int_t ntimebins = AliL3Transform::GetNTimeBins(); - fLUTforwardZ = new Float_t[ntimebins]; - fLUTforwardZ2 = new Float_t[ntimebins]; - fLUTbackwardZ = new Float_t[ntimebins]; - fLUTbackwardZ2 = new Float_t[ntimebins]; - for(Int_t i=0; iReset(); #ifdef do_mc - if(fDoMC) - { - AliL3Histogram *hist = fParamSpace[0]; - Int_t ncellsx = (hist->GetNbinsX()+3)/2; - Int_t ncellsy = (hist->GetNbinsY()+3)/2; - Int_t ncells = ncellsx*ncellsy; - for(Int_t i=0; iGetNbinsX()+3)/2; + Int_t ncellsy = (hist->GetNbinsY()+3)/2; + Int_t ncells = ncellsx*ncellsy; + for(Int_t i=0; iGetNbinsX()+2)*(hist->GetNbinsY()+2); for(Int_t i=0; iGetYmin(); - //Float_t y_max = h->GetYmax(); - Float_t histbin = h->GetBinWidthY(); - Int_t firstbin = h->GetFirstYbin(); - Int_t lastbin = h->GetLastYbin(); - Float_t xmin = h->GetXmin(); - Float_t xmax = h->GetXmax(); - Float_t xbin = (xmax-xmin)/h->GetNbinsX(); - Int_t firstbinx = h->GetFirstXbin()-1; - Int_t lastbinx = h->GetLastXbin()+1; + Int_t firstbiny = h->GetFirstYbin(); + Int_t firstbinx = h->GetFirstXbin(); + Int_t lastbinx = h->GetLastXbin(); Int_t nbinx = h->GetNbinsX()+2; UChar_t lastpad; @@ -442,31 +723,29 @@ void AliL3HoughTransformerRow::TransformCircle() } Int_t ipatch = GetPatch(); - Double_t padpitch = AliL3Transform::GetPadPitchWidth(ipatch); + Int_t ilastpatch = GetLastPatch(); Int_t islice = GetSlice(); - Float_t *fLUTz; - Float_t *fLUTz2; + Float_t *lutz; + Float_t *lutz2; if(islice < 18) { - fLUTz = fLUTforwardZ; - fLUTz2 = fLUTforwardZ2; + lutz = fLUTforwardZ; + lutz2 = fLUTforwardZ2; } else { - fLUTz = fLUTbackwardZ; - fLUTz2 = fLUTbackwardZ2; + lutz = fLUTbackwardZ; + lutz2 = fLUTbackwardZ2; } //Loop over the padrows: for(UChar_t i=AliL3Transform::GetFirstRow(ipatch); i<=AliL3Transform::GetLastRow(ipatch); i++) { - Int_t npads = AliL3Transform::GetNPads((Int_t)i)-1; - lastpad = 255; //Flush eta clusters array memset(etaclust,0,netasegments*sizeof(AliL3EtaRow)); Float_t x = AliL3Transform::Row2X((Int_t)i); Float_t x2 = x*x; - Float_t y=0,r2=0; + Float_t radius2=0; //Get the data on this padrow: AliL3DigitData *digPt = tempPt->fDigitData; @@ -488,17 +767,18 @@ void AliL3HoughTransformerRow::TransformCircle() if(pad != lastpad) { - y = (pad-0.5*npads)*padpitch; - Float_t y2 = y*y; - r2 = x2 + y2; + radius2 = fLUTr2[(Int_t)i][(Int_t)pad]; lastetaindex = -1; } //Transform data to local cartesian coordinates: - Float_t z = fLUTz[(Int_t)time]; - Float_t z2 = fLUTz2[(Int_t)time]; + Float_t z = lutz[(Int_t)time]; + Float_t z2 = lutz2[(Int_t)time]; + // Acceptance cut : to be verified + // if(radius2<0.72406166*z2) continue; + if(x2<0.8464*z2) continue; //Calculate the eta: - Double_t r = sqrt(r2+z2); + Double_t r = sqrt(radius2+z2); Double_t eta = 0.5 * log((r+z)/(r-z)); //Get the corresponding index, which determines which histogram to fill: Int_t etaindex = (Int_t)((eta-etamin)/etaslice); @@ -515,23 +795,9 @@ void AliL3HoughTransformerRow::TransformCircle() { etaclust[etaindex].fStartPad = pad; etaclust[etaindex].fEndPad = pad; - etaclust[etaindex].fStartY = y - padpitch/2.0; etaclust[etaindex].fIsFound = 1; #ifdef do_mc - if(fDoMC) - { - for(Int_t t=0; t<3; t++) - { - Int_t label = digPt[j].fTrackID[t]; - if(label < 0) break; - UInt_t c; - for(c=0; c<(MaxTrack-1); c++) - if(etaclust[etaindex].fMcLabels[c] == label || etaclust[etaindex].fMcLabels[c] == 0) - break; - // if(c == MaxTrack-1) cerr<<"AliL3HoughTransformer::TransformCircle : Cluster array reached maximum!! "<=0) - kappa2 += deltaalpha2; - - //Fill the histogram along the phirange - for(Int_t b=firstbin; b<=lastbin; b++, kappa1 += deltaalpha1, kappa2 += deltaalpha2) - { - Int_t binx1 = 1 + (Int_t)kappa1; - if(binx1>lastbinx) continue; - if(binx1lastbinx) binx2 = lastbinx; -#ifdef do_mc - if(binx2 (currentrow2[bin] + MAX_GAP_SIZE) && i < lastrow2[bin]) { - ngaps2[bin] = MAX_N_GAPS; - continue; - } - if(i > currentrow2[bin] && i < lastrow2[bin]) - { - nrows2[bin]++; - if(i > (currentrow2[bin] + 1)) - ngaps2[bin]++; - currentrow2[bin]=i; - } -#ifdef do_mc - if(fDoMC) - { - for(UInt_t t=0;t<(MaxTrack-1); t++) - { - Int_t label = etaclust[etaindex].fMcLabels[t]; - if(label == 0) break; - UInt_t c; - Int_t tempbin2 = ((Int_t)(b/2))*((Int_t)((nbinx+1)/2)) + (Int_t)(bin/2); - for(c=0; c<(MaxTrack-1); c++) - if(fgTrackID[etaindex][tempbin2].fLabel[c] == label || fgTrackID[etaindex][tempbin2].fNHits[c] == 0) - break; - // if(c == MaxTrack-1) cerr<<"AliL3HoughTransformer::TransformCircle : Array reached maximum!! "<=0) - kappa2 += deltaalpha2; - - //Fill the histogram along the phirange - for(Int_t b=firstbin; b<=lastbin; b++, kappa1 += deltaalpha1, kappa2 += deltaalpha2) - { - Int_t binx1 = 1 + (Int_t)kappa1; - if(binx1>lastbinx) continue; - if(binx1lastbinx) binx2 = lastbinx; -#ifdef do_mc - if(binx2 (currentrow2[bin] + MAX_GAP_SIZE) && i < lastrow2[bin]) { - ngaps2[bin] = MAX_N_GAPS; - continue; - } - if(i > currentrow2[bin] && i < lastrow2[bin]) - { - nrows2[bin]++; - if(i > (currentrow2[bin] + 1)) - ngaps2[bin]++; - currentrow2[bin]=i; - } -#ifdef do_mc - if(fDoMC) - { - for(UInt_t t=0;t<(MaxTrack-1); t++) - { - Int_t label = etaclust[etaindex].fMcLabels[t]; - if(label == 0) break; - UInt_t c; - Int_t tempbin2 = ((Int_t)(b/2))*((Int_t)((nbinx+1)/2)) + (Int_t)(bin/2); - for(c=0; c<(MaxTrack-1); c++) - if(fgTrackID[etaindex][tempbin2].fLabel[c] == label || fgTrackID[etaindex][tempbin2].fNHits[c] == 0) - break; - // if(c == MaxTrack-1) cout<<"AliL3HoughTransformer::TransformCircle : Array reached maximum!! "<GetFirstYbin(); + Int_t firstbinx = h->GetFirstXbin(); + Int_t lastbinx = h->GetLastXbin(); + Int_t nbinx = h->GetNbinsX()+2; + + Int_t lastetaindex; + AliL3EtaRow *etaclust = new AliL3EtaRow[netasegments]; + + if(!fTPCRawStream) { - LOG(AliL3Log::kWarning,"AliL3HoughTransformerRow::GetTrackID","Data") - <<"Flag switched off"<Next()) { + + if(fTPCRawStream->IsNewSector() || fTPCRawStream->IsNewRow()) { + + //Write remaining clusters + for(Int_t etaindex = 0;etaindex < netasegments;etaindex++) + { + //Check for empty row + if((etaclust[etaindex].fStartPad == 0) && (etaclust[etaindex].fEndPad == 0)) continue; + + FillCluster(i,etaindex,etaclust,ilastpatch,firstbinx,lastbinx,nbinx,firstbiny); + } + + Int_t sector=fTPCRawStream->GetSector(); + Int_t row=fTPCRawStream->GetRow(); + Int_t slice,srow; + AliL3Transform::Sector2Slice(slice,srow,sector,row); + if(slice!=islice){ + LOG(AliL3Log::kError,"AliL3DDLDataFileHandler::DDLDigits2Memory","Slice") + <rowmax))continue; + + // cout<<" Starting row "<<(UInt_t)i<IsNewRow() || fTPCRawStream->IsNewPad()) { + pad=fTPCRawStream->GetPad(); + /* + if((pad<0)||(pad>=(npads+1))){ + LOG(AliL3Log::kError,"AliL3DDLDataFileHandler::DDLDigits2Memory","Pad") + <GetTime(); + /* + if((time<0)||(time>=ntimebins)){ + LOG(AliL3Log::kError,"AliL3DDLDataFileHandler::DDLDigits2Memory","Time") + <GetSignal() <= lowerthreshold) + continue; + + //Transform data to local cartesian coordinates: + Float_t z = lutz[(Int_t)time]; + Float_t z2 = lutz2[(Int_t)time]; + // if(radius2<0.72406166*z2) continue; + if(x2<0.8464*z2) continue; + //Calculate the eta: + Double_t r = sqrt(radius2+z2); + Double_t eta = 0.5 * log((r+z)/(r-z)); + //Get the corresponding index, which determines which histogram to fill: + Int_t etaindex = (Int_t)((eta-etamin)/etaslice); + +#ifndef do_mc + if(etaindex == lastetaindex) continue; +#endif + // cout<<" Digit at patch "<= netasegments) + continue; + + if(!etaclust[etaindex].fIsFound) + { + etaclust[etaindex].fStartPad = pad; + etaclust[etaindex].fEndPad = pad; + etaclust[etaindex].fIsFound = 1; + continue; + } + else + { + if(pad <= (etaclust[etaindex].fEndPad + 1)) + { + etaclust[etaindex].fEndPad = pad; + } + else + { + FillCluster(i,etaindex,etaclust,ilastpatch,firstbinx,lastbinx,nbinx,firstbiny); + + etaclust[etaindex].fStartPad = pad; + etaclust[etaindex].fEndPad = pad; + + } + } + lastetaindex = etaindex; + } + + //Write remaining clusters + for(Int_t etaindex = 0;etaindex < netasegments;etaindex++) + { + //Check for empty row + if((etaclust[etaindex].fStartPad == 0) && (etaclust[etaindex].fEndPad == 0)) continue; + + FillCluster(i,etaindex,etaclust,ilastpatch,firstbinx,lastbinx,nbinx,firstbiny); } -#ifdef do_mc + delete [] etaclust; +} + +Int_t AliL3HoughTransformerRow::GetTrackID(Int_t etaindex,Double_t alpha1,Double_t alpha2) const +{ + // Returns the MC label for a given peak found in the Hough space +#ifndef do_mc + LOG(AliL3Log::kWarning,"AliL3HoughTransformerRow::GetTrackID","Data") + <<"Flag switched off"< GetNEtaSegments()) { LOG(AliL3Log::kWarning,"AliL3HoughTransformerRow::GetTrackID","Data") @@ -807,41 +1034,41 @@ Int_t AliL3HoughTransformerRow::GetTrackID(Int_t etaindex,Double_t kappa,Double_ return -1; } AliL3Histogram *hist = fParamSpace[etaindex]; - Int_t bin = hist->FindLabelBin(kappa,psi); + Int_t bin = hist->FindLabelBin(alpha1,alpha2); if(bin==-1) { LOG(AliL3Log::kWarning,"AliL3HoughTransformerRow::GetTrackID()","") - <<"Track candidate outside Hough space boundaries: "< max) { max = nhits; - label = fgTrackID[etaindex][bin].fLabel[i]; + label = fTrackID[etaindex][bin].fLabel[i]; } } Int_t label2=-1; Int_t max2=0; for(UInt_t i=0; i<(MaxTrack-1); i++) { - Int_t nhits=fgTrackID[etaindex][bin].fNHits[i]; + Int_t nhits=fTrackID[etaindex][bin].fNHits[i]; if(nhits == 0) break; if(nhits > max2) { - if(fgTrackID[etaindex][bin].fLabel[i]!=label) { + if(fTrackID[etaindex][bin].fLabel[i]!=label) { max2 = nhits; - label2 = fgTrackID[etaindex][bin].fLabel[i]; + label2 = fTrackID[etaindex][bin].fLabel[i]; } } } if(max2 !=0 ) { LOG(AliL3Log::kDebug,"AliL3HoughTransformerRow::GetTrackID()","") - <<" TrackID"<<" label "< currentrow2[bin]) { + ngaps2[bin] += (i-currentrow2[bin]-1); + currentrow2[bin]=i; + } +#ifdef do_mc + if(i < lastrow2[bin] && i >= currentrow2[bin]) { + for(UInt_t t=0;t<(MaxTrack-1); t++) + { + Int_t label = etaclust.fMcLabels[t]; + if(label == 0) break; + UInt_t c; + Int_t tempbin2 = (Int_t)(bin/2); + for(c=0; c<(MaxTrack-1); c++) + if(trackid[tempbin2].fLabel[c] == label || trackid[tempbin2].fNHits[c] == 0) + break; + trackid[tempbin2].fLabel[c] = label; + if(trackid[tempbin2].fCurrentRow[c] != i) { + trackid[tempbin2].fNHits[c]++; + trackid[tempbin2].fCurrentRow[c] = i; + } + } + } +#endif + } + } + } -UChar_t *AliL3HoughTransformerRow::GetGapCount(Int_t etaindex) +inline void AliL3HoughTransformerRow::FillCluster(UChar_t i,Int_t etaindex,AliL3EtaRow *etaclust,Int_t ilastpatch,Int_t firstbinx,Int_t lastbinx,Int_t nbinx,Int_t firstbiny) { - return fgGapCount[etaindex]; + // The method is a part of the fast hough transform. + // It fills a TPC cluster into the hough space. + + UChar_t *ngaps = fGapCount[etaindex]; + UChar_t *currentrow = fCurrentRowCount[etaindex]; + UChar_t *lastrow = fTrackLastRow; + UChar_t *prevbin = fPrevBin[etaindex]; + UChar_t *nextbin = fNextBin[etaindex]; + UChar_t *nextrow = fNextRow[etaindex]; +#ifdef do_mc + AliL3TrackIndex *trackid = fTrackID[etaindex]; +#endif + + //Do the transformation: + AliL3PadHoughParams *startparams = &fStartPadParams[(Int_t)i][etaclust[etaindex].fStartPad]; + AliL3PadHoughParams *endparams = &fEndPadParams[(Int_t)i][etaclust[etaindex].fEndPad]; + + Float_t alpha1 = startparams->fAlpha; + Float_t deltaalpha1 = startparams->fDeltaAlpha; + Float_t alpha2 = endparams->fAlpha; + Float_t deltaalpha2 = endparams->fDeltaAlpha; + + Int_t firstbin1 = startparams->fFirstBin; + Int_t firstbin2 = endparams->fFirstBin; + Int_t firstbin = firstbin1; + if(firstbin>firstbin2) firstbin = firstbin2; + + Int_t lastbin1 = startparams->fLastBin; + Int_t lastbin2 = endparams->fLastBin; + Int_t lastbin = lastbin1; + if(lastbinlastbinx) continue; + if(binx1lastbinx) binx2 = lastbinx; +#ifdef do_mc + if(binx2lastbinx) continue; + if(binx1lastbinx) binx2 = lastbinx; +#ifdef do_mc + if(binx2 (b + 1)) { + Int_t deltab = (nextrow[b] - b - 1); + b += deltab; + alpha1 += deltaalpha1*deltab; + alpha2 += deltaalpha2*deltab; + continue; + } + Int_t tempbin = b*nbinx; + binx1 = (UInt_t)nextbin[binx1 + tempbin]; + binx2 = (UInt_t)prevbin[binx2 + tempbin]; + if(binx2fMcLabels[c] == label || etaclust->fMcLabels[c] == 0) + break; + + etaclust->fMcLabels[c] = label; + } } +#endif -UChar_t *AliL3HoughTransformerRow::GetTrackNRows() +void AliL3HoughTransformerRow::SetTransformerArrays(AliL3HoughTransformerRow *tr) { - return fgTrackNRows; -} + // In case of sequential filling of the hough space, the method is used to + // transmit the pointers to the hough arrays from one transformer to the + // following one. + fGapCount = tr->fGapCount; + fCurrentRowCount = tr->fCurrentRowCount; +#ifdef do_mc + fTrackID = tr->fTrackID; +#endif + fTrackNRows = tr->fTrackNRows; + fTrackFirstRow = tr->fTrackFirstRow; + fTrackLastRow = tr->fTrackLastRow; + fInitialGapCount = tr->fInitialGapCount; -UChar_t *AliL3HoughTransformerRow::GetTrackFirstRow() -{ - return fgTrackFirstRow; -} + fPrevBin = tr->fPrevBin; + fNextBin = tr->fNextBin; + fNextRow = tr->fNextRow; -UChar_t *AliL3HoughTransformerRow::GetTrackLastRow() -{ - return fgTrackLastRow; + fStartPadParams = tr->fStartPadParams; + fEndPadParams = tr->fEndPadParams; + fLUTr2 = tr->fLUTr2; + fLUTforwardZ = tr->fLUTforwardZ; + fLUTforwardZ2 = tr->fLUTforwardZ2; + fLUTbackwardZ = tr->fLUTbackwardZ; + fLUTbackwardZ2 = tr->fLUTbackwardZ2; + + fParamSpace = tr->fParamSpace; + + return; }