fDeconvPad(kFALSE),
fStdout(kFALSE),
fCalcerr(kTRUE),
- fRawSP(kFALSE),
+ fFillRawClusters(kFALSE),
fFirstRow(0),
fLastRow(0),
fCurrentRow(0),
fClusters(),
fClustersMCInfo(),
fMCDigits(),
+ fRawClusters(),
fNumberOfPadsInRow(NULL),
fNumberOfRows(0),
fRowOfFirstCandidate(0),
fDoMC(kFALSE),
fClusterMCVector(),
fOfflineTransform(NULL),
+ fOfflineTPCParam( NULL ),
fOfflineTPCRecoParam(*AliTPCRecoParam::GetHLTParam()),
fTimeMeanDiff(2),
fReleaseMemory(0)
{
//constructor
+
+ //uptate the transform class
+
fOfflineTransform = AliTPCcalibDB::Instance()->GetTransform();
if(!fOfflineTransform){
- HLTError("AliHLTTPCClusterFinder(): Offline transform not in AliTPCcalibDB.");
+ HLTError("AliHLTTPCClusterFinder()::UpdateCAlibDB:: Offline transform not in AliTPCcalibDB.");
}
else{
- fOfflineTPCRecoParam.SetUseExBCorrection(1);
- fOfflineTPCRecoParam.SetUseTOFCorrection(1);
fOfflineTransform->SetCurrentRecoParam(&fOfflineTPCRecoParam);
}
+
+ fOfflineTPCParam = AliTPCcalibDB::Instance()->GetParameters();
+ if( !fOfflineTPCParam ){
+ HLTError("AliHLTTPCClusterFinder()::UpdateCAlibDB:: Offline TPC parameters not in AliTPCcalibDB.");
+ } else {
+ fOfflineTPCParam->Update();
+ fOfflineTPCParam->ReadGeoMatrices();
+ }
+
}
AliHLTTPCClusterFinder::~AliHLTTPCClusterFinder(){
fClustersMCInfo.clear();
fMCDigits.clear();
fClusterMCVector.clear();
+ fRawClusters.clear();
}
void AliHLTTPCClusterFinder::InitializePadArray(){
// The same is true for the function ReadDataUnsorted() above.
// In addition the signals are organized in the opposite direction
if(f32BitFormat){
- indexInBunchData = fDigitReader->GetBunchSize();
+ indexInBunchData = fDigitReader->GetBunchSize()-1;
const UShort_t *bunchData= fDigitReader->GetSignalsShort();
-
+
do{
AliHLTTPCClusters candidate;
//for(Int_t i=indexInBunchData;i<fDigitReader->GetBunchSize();i++){
for(Int_t i=indexInBunchData;i>=0;i--){
+
// Checks if one need to deconvolute the signals
if(bunchData[i]>prevSignal && signalFalling==kTRUE){
if(i<fDigitReader->GetBunchSize()-1){ // means there are more than one signal left in the bunch
if(bunchData[i]>candidate.fQMax){
candidate.fQMax=bunchData[i];
}
-
prevSignal=bunchData[i];
time++;
indexInBunchData--;
candidate.fLastMergedPad=pad;
candidate.fRowNumber=row+fDigitReader->GetRowOffset();
}
- fRowPadVector[row][pad]->AddClusterCandidate(candidate);
- fRowPadVector[row][pad]->AddCandidateDigits(fMCDigits);
+ fRowPadVector[row][pad]->AddClusterCandidate(candidate);
if(indexInBunchData<fDigitReader->GetBunchSize()-1){
moreDataInBunch=kFALSE;
}
const UInt_t *bunchData= fDigitReader->GetSignals();
do{
AliHLTTPCClusters candidate;
+ const AliHLTTPCDigitData* digits = fDigitReader->GetBunchDigits();
+ if(fDoMC) fMCDigits.clear();
+
for(Int_t i=indexInBunchData;i<fDigitReader->GetBunchSize();i++){
// Checks if one need to deconvolute the signals
if(bunchData[i]>prevSignal && signalFalling==kTRUE){
if(prevSignal>bunchData[i]){//means the peak of the signal has been reached and deconvolution will happen if the signal rise again.
signalFalling=kTRUE;
}
-
candidate.fTotalCharge+=bunchData[i];
candidate.fTime += time*bunchData[i];
candidate.fTime2 += time*time*bunchData[i];
if(bunchData[i]>candidate.fQMax){
candidate.fQMax=bunchData[i];
}
+ if( fDoMC ) fMCDigits.push_back(digits[i]);
prevSignal=bunchData[i];
time++;
candidate.fRowNumber=row+fDigitReader->GetRowOffset();
}
fRowPadVector[row][pad]->AddClusterCandidate(candidate);
+ if(fDoMC){
+ fRowPadVector[row][pad]->AddCandidateDigits(fMCDigits);
+ fMCDigits.clear();
+ }
if(indexInBunchData<fDigitReader->GetBunchSize()-1){
moreDataInBunch=kFALSE;
}
}
-Int_t AliHLTTPCClusterFinder::FillOutputMCInfo(AliHLTTPCClusterFinder::ClusterMCInfo * outputMCInfo, Int_t maxNumberOfClusterMCInfo){
+Int_t AliHLTTPCClusterFinder::FillOutputMCInfo(AliHLTTPCClusterMCLabel * outputMCInfo, Int_t maxNumberOfClusterMCInfo){
// see header file for class documentation
Int_t counter=0;
return counter;
}
+Int_t AliHLTTPCClusterFinder::FillOutputRaw(AliHLTTPCRawCluster* rawClusters, unsigned sizeInByte) const
+{
+ // fill the raw clusters
+ if (fRawClusters.size()*sizeof(AliHLTTPCRawCluster)>sizeInByte) {
+ HLTError("not enough space to write raw clusters");
+ return 0;
+ }
+ memcpy(rawClusters, &fRawClusters[0], fRawClusters.size()*sizeof(AliHLTTPCRawCluster));
+ return fRawClusters.size();
+}
+
void AliHLTTPCClusterFinder::FindClusters(){
// see header file for function documentation
fClusters.push_back(*tmpCandidate);
if(fDoMC){
//sort the vector (large->small) according to weight and remove elements above 2 (keep 0 1 and 2)
- sort(fClusterMCVector.begin(),fClusterMCVector.end(), MCWeight::CompareWeights );
- ClusterMCInfo tmpClusterMCInfo;
+ sort(fClusterMCVector.begin(),fClusterMCVector.end(), CompareWeights );
+ AliHLTTPCClusterMCLabel tmpClusterMCInfo;
- MCWeight zeroMC;
+ AliHLTTPCClusterMCWeight zeroMC;
zeroMC.fMCID=-1;
zeroMC.fWeight=0;
//update the db
AliTPCcalibDB::Instance()->Update();
+ Bool_t ret = 1;
+
//uptate the transform class
- AliTPCTransform * tmp = AliTPCcalibDB::Instance()->GetTransform();
- if(!tmp){
- HLTError("AliHLTTPCClusterFinder::UpdateCAlibDB: Offline transform not in AliTPCcalibDB.");
- return 0;
+
+ fOfflineTransform = AliTPCcalibDB::Instance()->GetTransform();
+ if(!fOfflineTransform){
+ HLTError("AliHLTTPCClusterFinder()::UpdateCAlibDB:: Offline transform not in AliTPCcalibDB.");
+ ret = 0;
}
- fOfflineTransform = tmp;
- return 1;
+ else{
+ fOfflineTransform->SetCurrentRecoParam(&fOfflineTPCRecoParam);
+ }
+
+ fOfflineTPCParam = AliTPCcalibDB::Instance()->GetParameters();
+ if( !fOfflineTPCParam ){
+ HLTError("AliHLTTPCClusterFinder()::UpdateCAlibDB:: Offline TPC parameters not in AliTPCcalibDB.");
+ ret = 0;
+ } else {
+ fOfflineTPCParam->Update();
+ fOfflineTPCParam->ReadGeoMatrices();
+ }
+
+ return ret;
}
//---------------------------------- Under this line the old sorted clusterfinder functions can be found --------------------------------
}
}
-void AliHLTTPCClusterFinder::FillMCClusterVector(vector<AliHLTTPCDigitData> digitData){
+void AliHLTTPCClusterFinder::FillMCClusterVector(vector<AliHLTTPCDigitData> *digitData){
// see header file for class documentation
-
- for(UInt_t d=0;d<digitData.size();d++){
- Int_t nIDsInDigit = (digitData.at(d).fTrackID[0]>=0) + (digitData.at(d).fTrackID[1]>=0) + (digitData.at(d).fTrackID[2]>=0);
+ if( !digitData ) return;
+ for(UInt_t d=0;d<digitData->size();d++){
+ Int_t nIDsInDigit = (digitData->at(d).fTrackID[0]>=0) + (digitData->at(d).fTrackID[1]>=0) + (digitData->at(d).fTrackID[2]>=0);
for(Int_t id=0; id<3; id++){
- if(digitData.at(d).fTrackID[id]>=0){
+ if(digitData->at(d).fTrackID[id]>=0){
Bool_t matchFound = kFALSE;
- MCWeight mc;
- mc.fMCID = digitData.at(d).fTrackID[id];
- mc.fWeight = ((Float_t)digitData.at(d).fCharge)/nIDsInDigit;
+ AliHLTTPCClusterMCWeight mc;
+ mc.fMCID = digitData->at(d).fTrackID[id];
+ mc.fWeight = ((Float_t)digitData->at(d).fCharge)/nIDsInDigit;
for(UInt_t i=0;i<fClusterMCVector.size();i++){
if(mc.fMCID == fClusterMCVector.at(i).fMCID){
fClusterMCVector.at(i).fWeight += mc.fWeight;
Int_t thisrow=-1,thissector=-1;
UInt_t counter = fNClusters;
+ if (fFillRawClusters) {
+ fRawClusters.resize(nclusters);
+ }
+
for(int j=0; j<nclusters; j++)
{
UInt_t q2=list[j].fTotalCharge*list[j].fTotalCharge;
// Float_t sy2=list[j].fPad2 * list[j].fTotalCharge - list[j].fPad * list[j].fPad;
Float_t sy2=(Float_t)list[j].fPad2 * list[j].fTotalCharge - (Float_t)list[j].fPad * list[j].fPad;
+ if(q2 == 0) {
+ LOG(AliHLTTPCLog::kError,"AliHLTTPCClusterFinder::WriteClusters","Cluster width")
+ <<"zero charge "<< list[j].fTotalCharge <<" on row "<<fCurrentRow<<" "<<fpad<<" "<<ftime<<ENDLOG;
+ continue;
+ }
sy2/=q2;
if(sy2 < 0) {
LOG(AliHLTTPCLog::kError,"AliHLTTPCClusterFinder::WriteClusters","Cluster width")
<<"SigmaY2 negative "<<sy2<<" on row "<<fCurrentRow<<" "<<fpad<<" "<<ftime<<ENDLOG;
continue;
} else {
- if(!fRawSP){
+ {
fpad2 = (sy2 + 1./12)*AliHLTTPCTransform::GetPadPitchWidth(patch)*AliHLTTPCTransform::GetPadPitchWidth(patch);
if(sy2 != 0){
fpad2*=0.108; //constants are from offline studies
if(patch<2)
fpad2*=2.07;
}
- } else fpad2=sy2; //take the width not the error
+ }
}
// Float_t sz2=list[j].fTime2*list[j].fTotalCharge - list[j].fTime*list[j].fTime;
Float_t sz2=(Float_t)list[j].fTime2*list[j].fTotalCharge - (Float_t)list[j].fTime*list[j].fTime;
<<"SigmaZ2 negative "<<sz2<<" on row "<<fCurrentRow<<" "<<fpad<<" "<<ftime<<ENDLOG;
continue;
} else {
- if(!fRawSP){
+ {
ftime2 = (sz2 + 1./12)*AliHLTTPCTransform::GetZWidth()*AliHLTTPCTransform::GetZWidth();
if(sz2 != 0) {
ftime2 *= 0.169; //constants are from offline studies
if(patch<2)
ftime2 *= 1.77;
}
- } else ftime2=sz2; //take the width, not the error
+ }
}
}
if(fStdout==kTRUE)
HLTInfo("WriteCluster: padrow %d pad %d +- %d time +- %d charge %d",fCurrentRow, fpad, fpad2, ftime, ftime2, list[j].fTotalCharge);
- if(!fRawSP){
+ if (fFillRawClusters && fRawClusters.size()>(unsigned)counter) {
+ fRawClusters[counter].SetPadRow(fCurrentRow);
+ fRawClusters[counter].SetPad(fpad);
+ fRawClusters[counter].SetTime(ftime);
+ }
+ {
AliHLTTPCTransform::Slice2Sector(fCurrentSlice,fCurrentRow,thissector,thisrow);
if(fOfflineTransform == NULL){
Int_t iSector[1]={thissector};
fOfflineTransform->Transform(x,iSector,0,1);
double y[3] = {x[0], x[1], x[2] };
- {
- const AliTPCParam * tpcPar = AliTPCcalibDB::Instance()->GetParameters();
- if( tpcPar ){
- TGeoHMatrix *alignment = tpcPar->GetClusterMatrix( thissector );
- if ( alignment ) alignment->LocalToMaster( x, y);
- }
- }
+
+ if( fOfflineTPCParam && thissector<fOfflineTPCParam->GetNSector() ){
+ TGeoHMatrix *alignment = fOfflineTPCParam->GetClusterMatrix( thissector );
+ if ( alignment ) alignment->LocalToMaster( x, y);
+ }
fSpacePointData[counter].fX = y[0];
fSpacePointData[counter].fY = y[1];
}
}
- else {
- fSpacePointData[counter].fX = fCurrentRow;
- fSpacePointData[counter].fY = fpad;
- fSpacePointData[counter].fZ = ftime;
- }
fSpacePointData[counter].fCharge = list[j].fTotalCharge;
fSpacePointData[counter].fPadRow = fCurrentRow;
fSpacePointData[counter].fQMax = list[j].fQMax;
- fSpacePointData[counter].fUsed = kFALSE; // only used / set in AliHLTTPCDisplay
- fSpacePointData[counter].fTrackN = -1; // only used / set in AliHLTTPCDisplay
+ fSpacePointData[counter].SetUsed(kFALSE); // only used / set in AliHLTTPCDisplay
+ fSpacePointData[counter].SetTrackNumber(-1); // only used / set in AliHLTTPCDisplay
Int_t patch=fCurrentPatch;
if(patch==-1) patch=0; //never store negative patch number
- fSpacePointData[counter].fID = counter
- +((fCurrentSlice&0x7f)<<25)+((patch&0x7)<<22);//Uli
+ fSpacePointData[counter].SetID( fCurrentSlice, patch, counter );
+
+ if (fFillRawClusters && fRawClusters.size()>(unsigned)counter) {
+ fRawClusters[counter].SetSigmaY2(fSpacePointData[counter].fSigmaY2);
+ fRawClusters[counter].SetSigmaZ2(fSpacePointData[counter].fSigmaZ2);
+ fRawClusters[counter].SetCharge(fSpacePointData[counter].fCharge);
+ fRawClusters[counter].SetQMax(fSpacePointData[counter].fQMax);
+ }
#ifdef do_mc
Int_t trackID[3];
//write cluster to output pointer
Int_t thisrow,thissector;
UInt_t counter = fNClusters;
+
+ if (fFillRawClusters) {
+ fRawClusters.resize(nclusters);
+ }
for(int j=0; j<nclusters; j++)
{
<<"SigmaY2 negative "<<sy2<<" on row "<<fCurrentRow<<" "<<fpad<<" "<<ftime<<ENDLOG;
continue;
} else {
- if(!fRawSP){
+ {
fpad2 = (sy2 + 1./12)*AliHLTTPCTransform::GetPadPitchWidth(patch)*AliHLTTPCTransform::GetPadPitchWidth(patch);
if(sy2 != 0){
fpad2*=0.108; //constants are from offline studies
if(patch<2)
fpad2*=2.07;
}
- } else fpad2=sy2; //take the width not the error
+ }
}
Float_t sz2=list[j].fTime2*list[j].fTotalCharge - list[j].fTime*list[j].fTime;
sz2/=q2;
<<"SigmaZ2 negative "<<sz2<<" on row "<<fCurrentRow<<" "<<fpad<<" "<<ftime<<ENDLOG;
continue;
} else {
- if(!fRawSP){
+ {
ftime2 = (sz2 + 1./12)*AliHLTTPCTransform::GetZWidth()*AliHLTTPCTransform::GetZWidth();
if(sz2 != 0) {
ftime2 *= 0.169; //constants are from offline studies
if(patch<2)
ftime2 *= 1.77;
}
- } else ftime2=sz2; //take the width, not the error
+ }
}
}
if(fStdout==kTRUE)
HLTInfo("WriteCluster: padrow %d pad %d +- %d time +- %d charge %d",fCurrentRow, fpad, fpad2, ftime, ftime2, list[j].fTotalCharge);
- if(!fRawSP){
+ if (fFillRawClusters && fRawClusters.size()>(unsigned)counter) {
+ fRawClusters[counter].SetPadRow(fCurrentRow);
+ fRawClusters[counter].SetPad(fpad);
+ fRawClusters[counter].SetTime(ftime);
+ }
+ {
AliHLTTPCTransform::Slice2Sector(fCurrentSlice,fCurrentRow,thissector,thisrow);
AliHLTTPCTransform::Raw2Local(xyz,thissector,thisrow,fpad,ftime);
}
fSpacePointData[counter].fZ = xyz[2];
- } else {
- fSpacePointData[counter].fX = fCurrentRow;
- fSpacePointData[counter].fY = fpad;
- fSpacePointData[counter].fZ = ftime;
}
fSpacePointData[counter].fCharge = list[j].fTotalCharge;
fSpacePointData[counter].fQMax = list[j].fQMax;
- fSpacePointData[counter].fUsed = kFALSE; // only used / set in AliHLTTPCDisplay
- fSpacePointData[counter].fTrackN = -1; // only used / set in AliHLTTPCDisplay
+ fSpacePointData[counter].SetUsed(kFALSE); // only used / set in AliHLTTPCDisplay
+ fSpacePointData[counter].SetTrackNumber(-1); // only used / set in AliHLTTPCDisplay
Int_t patch=fCurrentPatch;
if(patch==-1) patch=0; //never store negative patch number
- fSpacePointData[counter].fID = counter
- +((fCurrentSlice&0x7f)<<25)+((patch&0x7)<<22);//Uli
+ fSpacePointData[counter].SetID( fCurrentSlice, patch, counter );
+
+ if (fFillRawClusters && fRawClusters.size()>(unsigned)counter) {
+ fRawClusters[counter].SetSigmaY2(fSpacePointData[counter].fSigmaY2);
+ fRawClusters[counter].SetSigmaZ2(fSpacePointData[counter].fSigmaZ2);
+ fRawClusters[counter].SetCharge(fSpacePointData[counter].fCharge);
+ fRawClusters[counter].SetQMax(fSpacePointData[counter].fQMax);
+ }
#ifdef do_mc
Int_t trackID[3];