fnbadmatch(0),
fnunmatch(0),
fnmatch(0),
+ fESDEv(0),
fTracks(new TClonesArray("AliTOFtrack")),
fSeeds(new TObjArray(100)),
fTOFtrackPoints(new TObjArray(10)),
// Getting the geometry
fGeom = new AliTOFGeometry();
-
+ /* RS?
+ for(Int_t i=0; i< 20000;i++){
+ fClusterESD[i] = NULL;
+ fHit[i] = NULL;
+ }
+ */
InitCheckHists();
}
for (Int_t ii=0; ii<kMaxCluster; ii++)
if (fClusters[ii]) fClusters[ii]->Delete();
- for(Int_t i=0; i< 20000;i++){
- if(fClusterESD[i]){
- delete fClusterESD[i];
- fClusterESD[i] = NULL;
- }
- }
-
+ /* RS?
+ for(Int_t i=0; i< 20000;i++){
+ if(fClusterESD[i]){
+ delete fClusterESD[i];
+ fClusterESD[i] = NULL;
+ }
+ if(fHit[i]){
+ delete fHit[i];
+ fHit[i] = NULL;
+ }
+ }
+ */
}
//_____________________________________________________________________________
//
// Gets seeds from ESD event and Match with TOF Clusters
//
-
- if(fNTOFmatched==0)
- event->SetTOFcluster(1,fClusterESD);
-
- if (fNTOFmatched==0) {
+ fESDEv = event;
+ //
+ if (fN==0) {
AliInfo("No TOF recPoints to be matched with reconstructed tracks");
return 0;
}
//if(fkRecoParam->GetApplyPbPbCuts())fkRecoParam=fkRecoParam->GetPbPbparam();
//fkRecoParam->PrintParameters();
+ /* RS?
+ // create clusters from hit
+ for(Int_t i=0;i < fNTOFmatched;i++){
+ fClusterESD[i] = new AliESDTOFCluster(fHit[i],event);
+ fClusterESD[i]->SetStatus(fClusters[i]->GetStatus());
+ }
+ */
//Initialise some counters
fNseeds=0;
//Load ESD tracks into a local Array of ESD Seeds
- for (Int_t i=0; i<fNseeds; i++)
+ for (Int_t i=0; i<fNseeds; i++){
fSeeds->AddLast(event->GetTrack(i));
-
+ // event->GetTrack(i)->SetESDEvent(event); // RS: Why this is needed? The event is already set
+ }
//Prepare ESD tracks candidates for TOF Matching
CollectESD();
if (fNseeds==0 || fNseedsTOF==0) {
- event->SetTOFcluster(1,fClusterESD);
AliInfo("No seeds to try TOF match");
+ fSeeds->Clear();
+ fTracks->Clear();
return 0 ;
}
//Third Step without kTOFout flag (just to update clusters)
MatchTracks(2);
- event->SetTOFcluster(fNTOFmatched,fClusterESD);
+ //RS? event->SetTOFcluster(fNTOFmatched,fClusterESD);
- if (fNTOFmatched==0) {
+ if (fN==0) {
AliInfo("No TOF recPoints to be matched with reconstructed tracks");
+ fSeeds->Clear();
+ fTracks->Clear();
return 0;
}
//Update the matched ESD tracks
for (Int_t i=0; i<ntrk; i++) {
- AliESDtrack *t=event->GetTrack(i);
+ // RS: This is a bogus code since t and seed are the same object
+ // AliESDtrack *t=event->GetTrack(i);
AliESDtrack *seed =(AliESDtrack*)fSeeds->At(i);
-
if ( (seed->GetStatus()&AliESDtrack::kTOFin)!=0 ) {
- t->SetStatus(AliESDtrack::kTOFin);
+ //t->SetStatus(AliESDtrack::kTOFin);
//if(seed->GetTOFsignal()>0){
if ( (seed->GetStatus()&AliESDtrack::kTOFout)!=0 ) {
- t->SetStatus(AliESDtrack::kTOFout);
- t->SetTOFsignal(seed->GetTOFsignal());
- t->SetTOFcluster(seed->GetTOFcluster());
- t->SetTOFsignalToT(seed->GetTOFsignalToT());
- t->SetTOFsignalRaw(seed->GetTOFsignalRaw());
- t->SetTOFsignalDz(seed->GetTOFsignalDz());
- t->SetTOFsignalDx(seed->GetTOFsignalDx());
- t->SetTOFDeltaBC(seed->GetTOFDeltaBC());
- t->SetTOFL0L1(seed->GetTOFL0L1());
- t->SetTOFCalChannel(seed->GetTOFCalChannel());
+ //t->SetStatus(AliESDtrack::kTOFout);
+ //t->SetTOFsignal(seed->GetTOFsignal());
+ //t->SetTOFcluster(seed->GetTOFcluster());
+ //t->SetTOFsignalToT(seed->GetTOFsignalToT());
+ //t->SetTOFsignalRaw(seed->GetTOFsignalRaw());
+ //t->SetTOFsignalDz(seed->GetTOFsignalDz());
+ //t->SetTOFsignalDx(seed->GetTOFsignalDx());
+ //t->SetTOFDeltaBC(seed->GetTOFDeltaBC());
+ //t->SetTOFL0L1(seed->GetTOFL0L1());
+ //t->SetTOFCalChannel(seed->GetTOFCalChannel());
Int_t tlab[3]; seed->GetTOFLabel(tlab);
- t->SetTOFLabel(tlab);
+ //t->SetTOFLabel(tlab);
- Double_t alphaA = (Double_t)t->GetAlpha();
- Double_t xA = (Double_t)t->GetX();
- Double_t yA = (Double_t)t->GetY();
- Double_t zA = (Double_t)t->GetZ();
- Double_t p1A = (Double_t)t->GetSnp();
- Double_t p2A = (Double_t)t->GetTgl();
- Double_t p3A = (Double_t)t->GetSigned1Pt();
- const Double_t *covA = (Double_t*)t->GetCovariance();
+ Double_t alphaA = (Double_t)seed->GetAlpha();
+ Double_t xA = (Double_t)seed->GetX();
+ Double_t yA = (Double_t)seed->GetY();
+ Double_t zA = (Double_t)seed->GetZ();
+ Double_t p1A = (Double_t)seed->GetSnp();
+ Double_t p2A = (Double_t)seed->GetTgl();
+ Double_t p3A = (Double_t)seed->GetSigned1Pt();
+ const Double_t *covA = (Double_t*)seed->GetCovariance();
// Make attention, please:
// AliESDtrack::fTOFInfo array does not be stored in the AliESDs.root file
// it is there only for a check during the reconstruction step.
Float_t info[10]; seed->GetTOFInfo(info);
- t->SetTOFInfo(info);
+ //t->SetTOFInfo(info);
AliDebug(3,Form(" distance=%f; residual in the pad reference frame: dX=%f, dZ=%f", info[0],info[1],info[2]));
// Check done:
Double_t time[AliPID::kSPECIESC]; t->GetIntegratedTimes(time);
*/
- Double_t time[AliPID::kSPECIESC]; seed->GetIntegratedTimes(time);
- t->SetIntegratedTimes(time);
+ Double_t time[AliPID::kSPECIESC]; seed->GetIntegratedTimes(time,AliPID::kSPECIESC);
+ //t->SetIntegratedTimes(time);
- Double_t length = seed->GetIntegratedLength();
- t->SetIntegratedLength(length);
+ //Double_t length = seed->GetIntegratedLength();
+ //t->SetIntegratedLength(length);
- Double_t alphaB = (Double_t)t->GetAlpha();
- Double_t xB = (Double_t)t->GetX();
- Double_t yB = (Double_t)t->GetY();
- Double_t zB = (Double_t)t->GetZ();
- Double_t p1B = (Double_t)t->GetSnp();
- Double_t p2B = (Double_t)t->GetTgl();
- Double_t p3B = (Double_t)t->GetSigned1Pt();
- const Double_t *covB = (Double_t*)t->GetCovariance();
+ Double_t alphaB = (Double_t)seed->GetAlpha();
+ Double_t xB = (Double_t)seed->GetX();
+ Double_t yB = (Double_t)seed->GetY();
+ Double_t zB = (Double_t)seed->GetZ();
+ Double_t p1B = (Double_t)seed->GetSnp();
+ Double_t p2B = (Double_t)seed->GetTgl();
+ Double_t p3B = (Double_t)seed->GetSigned1Pt();
+ const Double_t *covB = (Double_t*)seed->GetCovariance();
AliDebug(3,"Track params -now(before)-:");
AliDebug(3,Form(" X: %f(%f), Y: %f(%f), Z: %f(%f) --- alpha: %f(%f)",
xB,xA,
));
AliDebug(2,Form(" TOF params: %6d %f %f %f %f %f %6d %3d %f",
i,
- t->GetTOFsignalRaw(),
- t->GetTOFsignal(),
- t->GetTOFsignalToT(),
- t->GetTOFsignalDz(),
- t->GetTOFsignalDx(),
- t->GetTOFCalChannel(),
- t->GetTOFcluster(),
- t->GetIntegratedLength()));
+ seed->GetTOFsignalRaw(),
+ seed->GetTOFsignal(),
+ seed->GetTOFsignalToT(),
+ seed->GetTOFsignalDz(),
+ seed->GetTOFsignalDx(),
+ seed->GetTOFCalChannel(),
+ seed->GetTOFcluster(),
+ seed->GetIntegratedLength()));
AliDebug(2,Form(" %f %f %f %f %f %f %f %f %f",
time[0], time[1], time[2], time[3], time[4], time[5], time[6], time[7], time[8]));
}
}
}
-
+ /* RS?
if(fNTOFmatched){
Int_t *matchmap = new Int_t[fNTOFmatched];
event->SetTOFcluster(fNTOFmatched,fClusterESD,matchmap);
delete[] matchmap;
}
+ */
//Make TOF PID
// Now done in AliESDpid
nfound++;
AliDebug(3,Form(" C - istep=%d ~ %d %d ~ nfound=%d",istep,trackInsideCluster,i,nfound));
-
-
- if(clind[i] < 20000 && mLastStep==2 && !isClusterMatchable[i]){ // add TOF clusters to the track
+
+ // store the match in the ESD
+ if (mLastStep==2 && !isClusterMatchable[i]) { // add TOF clusters to the track
+ //
isClusterMatchable[i] = kTRUE;
-
//Tracking info
Double_t mom=t->GetP();
AliDebug(3,Form(" Momentum for track %d -> %f", iseed,mom));
time[isp]+=(trackPos[3][istep]-trackPos[3][0])/kSpeedOfLight*TMath::Sqrt(momz*momz+mass*mass)/momz;
//time[isp]+=(trackPos[3][istep]-trackPos[3][0])/kSpeedOfLight*TMath::Sqrt(mom*mom+mass*mass)/mom;
}
-
- if(!fClusterESD[clind[i]]->Update(t->GetID(),dist3d[1],dist3d[0],dist3d[2],trackPos[3][istep],time))//x,y,z -> tracking RF
- t->AddTOFcluster(clind[i]);
+ //
+ AliESDTOFCluster* esdTOFCl = GetESDTOFCluster(clind[i]);
+ if(!esdTOFCl->Update(t->GetID(),dist3d[0],dist3d[1],dist3d[2],trackPos[3][istep],time))//x,y,z -> tracking RF
+ t->AddTOFcluster(esdTOFCl->GetESDID());
}
// ***** NEW *****
// Store quantities to be used in the TOF Calibration
Float_t tToT=AliTOFGeometry::ToTBinWidth()*c->GetToT()*1E-3; // in ns
- t->SetTOFsignalToT(tToT);
+// t->SetTOFsignalToT(tToT);
Float_t rawTime=AliTOFGeometry::TdcBinWidth()*c->GetTDCRAW()+kTimeOffset; // RAW time,in ps
- t->SetTOFsignalRaw(rawTime);
- t->SetTOFsignalDz(mindistZ);
- t->SetTOFsignalDx(mindistY);
- t->SetTOFDeltaBC(c->GetDeltaBC());
- t->SetTOFL0L1(c->GetL0L1Latency());
+// t->SetTOFsignalRaw(rawTime);
+// t->SetTOFsignalDz(mindistZ);
+// t->SetTOFsignalDx(mindistY);
+// t->SetTOFDeltaBC(c->GetDeltaBC());
+// t->SetTOFL0L1(c->GetL0L1Latency());
Float_t info[10] = {mindist,mindistY,mindistZ,
0.,0.,0.,0.,0.,0.,0.};
ind[3]=c->GetDetInd(3);
ind[4]=c->GetDetInd(4);
Int_t calindex = AliTOFGeometry::GetIndex(ind);
- t->SetTOFCalChannel(calindex);
+// t->SetTOFCalChannel(calindex);
// keep track of the track labels in the matched cluster
Int_t tlab[3];
if(timeWalkCorr)tofcorr=CorrectTimeWalk(mindistZ,tof);
AliDebug(3,Form(" tof time of the matched track, after TW corr: %f = ",tofcorr));
//Set TOF time signal and pointer to the matched cluster
- t->SetTOFsignal(tofcorr);
+// t->SetTOFsignal(tofcorr);
t->SetTOFcluster(idclus); // pointing to the recPoints tree
AliDebug(3,Form(" Setting TOF raw time: %f, z distance: %f corrected time: %f ",rawTime,mindistZ,tofcorr));
// t->SetIntegratedTimes(time);
// t->SetTOFLabel(tlab);
- // add tof cluster to the track also for step 2
+ // add tof cluster to the track also for step 2
+ AliESDTOFCluster* esdTOFCl = GetESDTOFCluster(idclus);
+ esdTOFCl->Update(t->GetID(),mindistY,mindist,mindistZ,recL,time);
+ t->AddTOFcluster(esdTOFCl->GetESDID());
+ /* RS?
if(idclus < 20000){
fClusterESD[idclus]->Update(t->GetID(),mindistY,mindist,mindistZ,recL,time);//x,y,z -> tracking RF
else{
AliInfo("Too many TOF clusters matched with tracks (> 20000)");
}
-
+ */
}
// Fill Reco-QA histos for Reconstruction
fHRecNClus->Fill(nc);
fN = 0;
fNTOFmatched = 0;
- for(Int_t i=0; i< 20000;i++){
- if(fClusterESD[i]){
- delete fClusterESD[i];
- fClusterESD[i] = NULL;
- }
- }
for (Int_t i=0; i<nc; i++) {
AliTOFcluster *c=(AliTOFcluster*)clusters->UncheckedAt(i);
//PH fClusters[i]=new AliTOFcluster(*c); fN++;
fClusters[i]=c; fN++;
-
+ c->SetESDID(-1);
// Fill Digits QA histos
Int_t isector = c->GetDetInd(0);
Float_t time =(AliTOFGeometry::TdcBinWidth()*c->GetTDC())*1E-3; // in ns
Float_t tot = (AliTOFGeometry::TdcBinWidth()*c->GetToT())*1E-3;//in ns
+ /* RS?
Int_t ind[5];
ind[0]=isector;
ind[1]=iplate;
ind[2]=istrip;
- ind[3]=ipadX;
- ind[4]=ipadZ;
-
+ ind[3]=ipadZ;
+ ind[4]=ipadX;
Int_t calindex = AliTOFGeometry::GetIndex(ind);
Int_t tofLabels[3]={c->GetLabel(0),c->GetLabel(1),c->GetLabel(2)};
-
+ */
Int_t stripOffset = 0;
switch (iplate) {
case 0:
fHDigClusTime->Fill(time);
fHDigClusToT->Fill(tot);
+ fNTOFmatched++; // RS: Actually number of clusters
+ /* RS?
if(fNTOFmatched < 20000){
- fClusterESD[fNTOFmatched] = new AliESDTOFcluster(i,calindex,
- AliTOFGeometry::TdcBinWidth()*c->GetTDC()/*ps*/,
- AliTOFGeometry::TdcBinWidth()*c->GetTDCRAW()/*ps*/,
- AliTOFGeometry::ToTBinWidth()*c->GetToT()*1E-3/*ns*/,
- tofLabels,
- c->GetDeltaBC(),c->GetL0L1Latency(),
- c->GetStatus(),c->GetZ(),c->GetPhi(),c->GetR());
+ fHit[fNTOFmatched] = new AliESDTOFHit(AliTOFGeometry::TdcBinWidth()*c->GetTDC(),
+ AliTOFGeometry::TdcBinWidth()*c->GetTDCRAW(),
+ AliTOFGeometry::ToTBinWidth()*c->GetToT()*1E-3,
+ calindex,tofLabels,c->GetL0L1Latency(),
+ c->GetDeltaBC(),i,c->GetZ(),c->GetR(),c->GetPhi());
fNTOFmatched++;
}
-
+ */
}
-
- if(fNTOFmatched == 0)
- fClusterESD[0] = new AliESDTOFcluster();
-
return 0;
}
//_________________________________________________________________________
//PH delete fClusters[i];
fClusters[i] = 0x0;
}
+ /* RS
+ for(Int_t i=0; i< 20000;i++){
+ if(fClusterESD[i]){
+ delete fClusterESD[i];
+ fClusterESD[i] = NULL;
+ }
+ if(fHit[i]){
+ delete fHit[i];
+ fHit[i] = NULL;
+ }
+ }
+ */
fN=0;
+ fNTOFmatched = 0;
}
//_________________________________________________________________________
for (Int_t i=0; i<fN; ++i) arr->Add(fClusters[i]);
}
-//_________________________________________________________________________
+//_________________________________________________________________________
+AliESDTOFCluster* AliTOFtracker::GetESDTOFCluster(int clID)
+{
+ // get ESDTOFcluster corresponding to fClusters[clID]. If the original cluster
+ // was not stored yet in the ESD, first do this
+ AliTOFcluster *c = fClusters[clID];
+ AliESDTOFCluster *clESD = 0;
+ int esdID = c->GetESDID(); // was this cluster already stored in the ESD clusters?
+ TClonesArray* esdTOFClArr = fESDEv->GetESDTOFClusters();
+ if (esdID<0) { // cluster was not stored yet, do this
+ esdID = esdTOFClArr->GetEntriesFast();
+ c->SetESDID(esdID);
+ // first store the hits of the cluster
+ TClonesArray* esdTOFHitArr = fESDEv->GetESDTOFHits();
+ int nh = esdTOFHitArr->GetEntriesFast();
+ Int_t tofLabels[3]={c->GetLabel(0),c->GetLabel(1),c->GetLabel(2)};
+ Int_t ind[5] = {c->GetDetInd(0), c->GetDetInd(1), c->GetDetInd(2), c->GetDetInd(3), c->GetDetInd(4) };
+ Int_t calindex = AliTOFGeometry::GetIndex(ind);
+ /*AliESDTOFHit* esdHit = */
+ new ( (*esdTOFHitArr)[nh] )
+ AliESDTOFHit( AliTOFGeometry::TdcBinWidth()*c->GetTDC(),
+ AliTOFGeometry::TdcBinWidth()*c->GetTDCRAW(),
+ AliTOFGeometry::ToTBinWidth()*c->GetToT()*1E-3,
+ calindex,tofLabels,c->GetL0L1Latency(),
+ c->GetDeltaBC(),esdID,c->GetZ(),c->GetR(),c->GetPhi());
+ //
+ clESD = new( (*esdTOFClArr)[esdID] ) AliESDTOFCluster( clID );
+ clESD->SetEvent(fESDEv);
+ clESD->SetStatus( c->GetStatus() );
+ clESD->SetESDID(esdID);
+ //
+ // register hits in the cluster
+ clESD->AddESDTOFHitIndex(nh);
+ }
+ else clESD = (AliESDTOFCluster*)esdTOFClArr->At(esdID); // cluster is aready stored in the ESD
+ //
+ return clESD;
+ //
+}