ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/
/* $Id$ */

/* History of cvs commits:
 *
 * $Log$
 * Revision 1.9  2007/10/10 09:05:10  schutz
 * Changing name QualAss to QA
 *
 * Revision 1.8  2007/08/28 12:55:08  policheh
 * Loaders removed from the reconstruction code (C.Cheshkov)
 *
 * Revision 1.7  2007/08/07 14:12:03  kharlov
 * Quality assurance added (Yves Schutz)
 *
 * Revision 1.6  2007/08/03 14:41:37  cvetan
 * Missing header files
 *
 * Revision 1.5  2007/08/03 13:52:16  kharlov
 * Working skeleton of matching the ESD tracks and ESD clusters (Iouri Belikov)
 *
 */

#include <TClonesArray.h>
#include <TMath.h>

#include <AliLog.h>
#include "AliPHOSTracker.h"
#include "AliPHOSEmcRecPoint.h"
#include "AliPHOSGeometry.h"
#include "AliESDEvent.h"
#include "AliESDtrack.h"
#include "AliPHOSTrackSegmentMakerv1.h"
#include "AliPHOSPIDv1.h"

//-------------------------------------------------------------------------
//                          PHOS tracker.
// Matches ESD tracks with the PHOS and makes the PID.  
//
//-------------------------------------------------------------------------

ClassImp(AliPHOSTracker)

Bool_t AliPHOSTracker::fgDebug = kFALSE ;  

//____________________________________________________________________________
AliPHOSTracker::AliPHOSTracker(): 
  AliTracker()
{
  //--------------------------------------------------------------------
  // The default constructor
  //--------------------------------------------------------------------
  for (Int_t i=0; i<5; i++) 
      fModules[i]=new TClonesArray("AliPHOSEmcRecPoint",777);

}

//____________________________________________________________________________
AliPHOSTracker::~AliPHOSTracker() 
{
  //--------------------------------------------------------------------
  // The destructor
  //--------------------------------------------------------------------
  for (Int_t i=0; i<5; i++) {
      (fModules[i])->Delete();
      delete fModules[i];
  }
}

//____________________________________________________________________________
Int_t AliPHOSTracker::LoadClusters(TTree *cTree) {
  //--------------------------------------------------------------------
  // This function loads the PHOS clusters
  //--------------------------------------------------------------------

  TObjArray *arr=NULL;
  TBranch *branch=cTree->GetBranch("PHOSEmcRP");
  if (branch==0) {
    AliError("No branch with the EMC clusters found !");
    return 1;
  }
  branch->SetAddress(&arr);

  for(Int_t m=0;m<5; m++) fModules[m]->Clear("C") ;

  Int_t nclusters=0;
  Int_t nentr=(Int_t)branch->GetEntries();
  for (Int_t i=0; i<nentr; i++) {
    if (!branch->GetEvent(i)) continue;
    Int_t ncl=arr->GetEntriesFast();
    while (ncl--) {
      AliPHOSEmcRecPoint *cl=(AliPHOSEmcRecPoint*)arr->UncheckedAt(ncl);

      Int_t m=cl->GetPHOSMod();
      if ((m<1)||(m>5)) {
         AliError(Form("Wrong module index: %d !",m));
         continue ;
      }

      // Here is how the alignment is treated
      // Misalignment is already in cluster coordinates
//      if (!cl->Misalign()) AliWarning("Can't misalign this cluster !");

      cl->SetBit(14,kFALSE); // The clusters are not yet attached to any track

      TClonesArray &module=*fModules[m-1];
      Int_t idx=module.GetEntriesFast();
      new (module[idx]) AliPHOSEmcRecPoint(*cl); 

      nclusters++;

    }
  }  
  arr->Delete();
  Info("LoadClusters","Number of loaded clusters: %d",nclusters);

  return 0;

}

//____________________________________________________________________________
Int_t AliPHOSTracker::PropagateBack(AliESDEvent *esd) {
  //--------------------------------------------------------------------
  // Called by AliReconstruction 
  // Performs the track matching with the PHOS modules
  // Makes the PID
  //--------------------------------------------------------------------

  Int_t nt=esd->GetNumberOfTracks();

  // *** Select and sort the ESD track in accordance with their quality
  Double_t *quality=new Double_t[nt];
  Int_t *index=new Int_t[nt];  
  for (Int_t i=0; i<nt; i++) {
     AliESDtrack *esdTrack=esd->GetTrack(i);
     quality[i] = esdTrack->GetSigmaY2() + esdTrack->GetSigmaZ2();
  }
  TMath::Sort(nt,quality,index,kFALSE);

  AliPHOSGeometry * geom = AliPHOSGeometry::GetInstance() ;

  // *** Start the matching
  TVector3 vecEmc ;   // Local position of EMC recpoint
  Double_t bz = GetBz() ; //For approximate matching
  Double_t b[3];  //For final matching
  Double_t gposTrack[3] ;
  Int_t matched=0;
  for (Int_t i=0; i<nt; i++) {
     AliESDtrack *esdTrack=esd->GetTrack(index[i]);

     // Skip the tracks having "wrong" status (has to be checked/tuned)
     ULong_t status = esdTrack->GetStatus();
     if ((status & AliESDtrack::kTPCout)   == 0) continue;
//     if ((status & AliESDtrack::kTRDout)   == 0) continue;
//     if ((status & AliESDtrack::kTRDrefit) == 1) continue;

     //Continue extrapolation from TPC outer surface
     const AliExternalTrackParam *outerParam=esdTrack->GetOuterParam();
     if (!outerParam) continue;
     AliExternalTrackParam t(*outerParam);

     t.GetBxByBz(b) ;

     //Loop over PHOS modules
     Double_t dx=0,dz=0;
     Double_t minDistance=999. ;
     Int_t emcIndex=0  ;
     for(Int_t mod=1; mod<=5; mod++){
       if(fModules[mod-1]->GetEntriesFast()==0) //no PHOS clusters in this module or module does not exist
         continue ;
       
       //Approximate direction to the current PHOS module
       Double_t phiMod=(330.-20.*mod)/180.*TMath::Pi() ;
       if(!t.Rotate(phiMod))
         continue ;
       TVector3 globaPos ;
       geom->Local2Global(mod, 0.,0., globaPos) ;
       const Double_t rPHOS = globaPos.Pt() ; //Distance to center of  PHOS module
       const Double_t kYmax = 72.+10. ; //Size of the module (with some reserve) in phi direction
       const Double_t kZmax = 64.+20. ; //Size of the module (with some reserve) in z direction
 
       Double_t y;                       // Some tracks do not reach the PHOS
       if (!t.GetYAt(rPHOS,bz,y)) continue; //    because of the bending

       Double_t z;
       if(!t.GetZAt(rPHOS,bz,z))
         continue ;
       if (TMath::Abs(z) > kZmax)
         continue; // Some tracks miss the PHOS in Z
       if(TMath::Abs(y) < kYmax){
         t.PropagateToBxByBz(rPHOS,b);        // Propagate to the matching module
      //t.CorrectForMaterial(...); // Correct for the TOF material, if needed
         t.GetXYZ(gposTrack) ;
         TVector3 globalPositionTr(gposTrack) ;
         TVector3 localPositionTr ;
         geom->Global2Local(localPositionTr,globalPositionTr,mod) ;
         for(Int_t icl=0;icl<fModules[mod-1]->GetEntriesFast();icl++){
           AliPHOSEmcRecPoint * clu =static_cast<AliPHOSEmcRecPoint*>(fModules[mod-1]->At(icl)) ;
           clu->GetLocalPosition(vecEmc) ;
           Double_t ddx = vecEmc.X()-localPositionTr.X();
           Double_t ddz = vecEmc.Z()-localPositionTr.Z();
           Double_t d2 = ddx*ddx + ddz*ddz;
           if(d2 < minDistance) {
             dx = ddx ;
             dz = ddz ;
             emcIndex=clu->GetIndexInList() ;
             minDistance=d2 ;
           }
         }
         break ;
       }
     } //Loop over modules
 
     if(minDistance<999.){
       //found some match
       esdTrack->SetStatus(AliESDtrack::kPHOSmatch) ;
       esdTrack->SetPHOScluster(-emcIndex) ; //Should be ESDCaloCluster index which is not known yet. Will be transformed later in FillESD().
       esdTrack->SetPHOSdxdz(dx,dz) ;
       matched++;
     }

  }
    
  Info("PropagateBack","Number of matched tracks: %d",matched);

  delete[] quality;
  delete[] index;

  return 0;

}

//____________________________________________________________________________
AliCluster *AliPHOSTracker::GetCluster(Int_t index) const {
  //--------------------------------------------------------------------
  // Returns the pointer to a given cluster
  //--------------------------------------------------------------------
  Int_t m=(index & 0xf0000000) >> 28;  // Module number
  Int_t i=(index & 0x0fffffff) >> 00;  // Index within the module
  
  return (AliCluster*)(fModules[m])->UncheckedAt(i);
}

//____________________________________________________________________________
void AliPHOSTracker::UnloadClusters() {
  //--------------------------------------------------------------------
  // This function unloads the PHOS clusters
  //--------------------------------------------------------------------
//  for (Int_t i=0; i<5; i++) (fModules[i])->Delete();
}
 AliPHOSTracker.cxx:1
 AliPHOSTracker.cxx:2
 AliPHOSTracker.cxx:3
 AliPHOSTracker.cxx:4
 AliPHOSTracker.cxx:5
 AliPHOSTracker.cxx:6
 AliPHOSTracker.cxx:7
 AliPHOSTracker.cxx:8
 AliPHOSTracker.cxx:9
 AliPHOSTracker.cxx:10
 AliPHOSTracker.cxx:11
 AliPHOSTracker.cxx:12
 AliPHOSTracker.cxx:13
 AliPHOSTracker.cxx:14
 AliPHOSTracker.cxx:15
 AliPHOSTracker.cxx:16
 AliPHOSTracker.cxx:17
 AliPHOSTracker.cxx:18
 AliPHOSTracker.cxx:19
 AliPHOSTracker.cxx:20
 AliPHOSTracker.cxx:21
 AliPHOSTracker.cxx:22
 AliPHOSTracker.cxx:23
 AliPHOSTracker.cxx:24
 AliPHOSTracker.cxx:25
 AliPHOSTracker.cxx:26
 AliPHOSTracker.cxx:27
 AliPHOSTracker.cxx:28
 AliPHOSTracker.cxx:29
 AliPHOSTracker.cxx:30
 AliPHOSTracker.cxx:31
 AliPHOSTracker.cxx:32
 AliPHOSTracker.cxx:33
 AliPHOSTracker.cxx:34
 AliPHOSTracker.cxx:35
 AliPHOSTracker.cxx:36
 AliPHOSTracker.cxx:37
 AliPHOSTracker.cxx:38
 AliPHOSTracker.cxx:39
 AliPHOSTracker.cxx:40
 AliPHOSTracker.cxx:41
 AliPHOSTracker.cxx:42
 AliPHOSTracker.cxx:43
 AliPHOSTracker.cxx:44
 AliPHOSTracker.cxx:45
 AliPHOSTracker.cxx:46
 AliPHOSTracker.cxx:47
 AliPHOSTracker.cxx:48
 AliPHOSTracker.cxx:49
 AliPHOSTracker.cxx:50
 AliPHOSTracker.cxx:51
 AliPHOSTracker.cxx:52
 AliPHOSTracker.cxx:53
 AliPHOSTracker.cxx:54
 AliPHOSTracker.cxx:55
 AliPHOSTracker.cxx:56
 AliPHOSTracker.cxx:57
 AliPHOSTracker.cxx:58
 AliPHOSTracker.cxx:59
 AliPHOSTracker.cxx:60
 AliPHOSTracker.cxx:61
 AliPHOSTracker.cxx:62
 AliPHOSTracker.cxx:63
 AliPHOSTracker.cxx:64
 AliPHOSTracker.cxx:65
 AliPHOSTracker.cxx:66
 AliPHOSTracker.cxx:67
 AliPHOSTracker.cxx:68
 AliPHOSTracker.cxx:69
 AliPHOSTracker.cxx:70
 AliPHOSTracker.cxx:71
 AliPHOSTracker.cxx:72
 AliPHOSTracker.cxx:73
 AliPHOSTracker.cxx:74
 AliPHOSTracker.cxx:75
 AliPHOSTracker.cxx:76
 AliPHOSTracker.cxx:77
 AliPHOSTracker.cxx:78
 AliPHOSTracker.cxx:79
 AliPHOSTracker.cxx:80
 AliPHOSTracker.cxx:81
 AliPHOSTracker.cxx:82
 AliPHOSTracker.cxx:83
 AliPHOSTracker.cxx:84
 AliPHOSTracker.cxx:85
 AliPHOSTracker.cxx:86
 AliPHOSTracker.cxx:87
 AliPHOSTracker.cxx:88
 AliPHOSTracker.cxx:89
 AliPHOSTracker.cxx:90
 AliPHOSTracker.cxx:91
 AliPHOSTracker.cxx:92
 AliPHOSTracker.cxx:93
 AliPHOSTracker.cxx:94
 AliPHOSTracker.cxx:95
 AliPHOSTracker.cxx:96
 AliPHOSTracker.cxx:97
 AliPHOSTracker.cxx:98
 AliPHOSTracker.cxx:99
 AliPHOSTracker.cxx:100
 AliPHOSTracker.cxx:101
 AliPHOSTracker.cxx:102
 AliPHOSTracker.cxx:103
 AliPHOSTracker.cxx:104
 AliPHOSTracker.cxx:105
 AliPHOSTracker.cxx:106
 AliPHOSTracker.cxx:107
 AliPHOSTracker.cxx:108
 AliPHOSTracker.cxx:109
 AliPHOSTracker.cxx:110
 AliPHOSTracker.cxx:111
 AliPHOSTracker.cxx:112
 AliPHOSTracker.cxx:113
 AliPHOSTracker.cxx:114
 AliPHOSTracker.cxx:115
 AliPHOSTracker.cxx:116
 AliPHOSTracker.cxx:117
 AliPHOSTracker.cxx:118
 AliPHOSTracker.cxx:119
 AliPHOSTracker.cxx:120
 AliPHOSTracker.cxx:121
 AliPHOSTracker.cxx:122
 AliPHOSTracker.cxx:123
 AliPHOSTracker.cxx:124
 AliPHOSTracker.cxx:125
 AliPHOSTracker.cxx:126
 AliPHOSTracker.cxx:127
 AliPHOSTracker.cxx:128
 AliPHOSTracker.cxx:129
 AliPHOSTracker.cxx:130
 AliPHOSTracker.cxx:131
 AliPHOSTracker.cxx:132
 AliPHOSTracker.cxx:133
 AliPHOSTracker.cxx:134
 AliPHOSTracker.cxx:135
 AliPHOSTracker.cxx:136
 AliPHOSTracker.cxx:137
 AliPHOSTracker.cxx:138
 AliPHOSTracker.cxx:139
 AliPHOSTracker.cxx:140
 AliPHOSTracker.cxx:141
 AliPHOSTracker.cxx:142
 AliPHOSTracker.cxx:143
 AliPHOSTracker.cxx:144
 AliPHOSTracker.cxx:145
 AliPHOSTracker.cxx:146
 AliPHOSTracker.cxx:147
 AliPHOSTracker.cxx:148
 AliPHOSTracker.cxx:149
 AliPHOSTracker.cxx:150
 AliPHOSTracker.cxx:151
 AliPHOSTracker.cxx:152
 AliPHOSTracker.cxx:153
 AliPHOSTracker.cxx:154
 AliPHOSTracker.cxx:155
 AliPHOSTracker.cxx:156
 AliPHOSTracker.cxx:157
 AliPHOSTracker.cxx:158
 AliPHOSTracker.cxx:159
 AliPHOSTracker.cxx:160
 AliPHOSTracker.cxx:161
 AliPHOSTracker.cxx:162
 AliPHOSTracker.cxx:163
 AliPHOSTracker.cxx:164
 AliPHOSTracker.cxx:165
 AliPHOSTracker.cxx:166
 AliPHOSTracker.cxx:167
 AliPHOSTracker.cxx:168
 AliPHOSTracker.cxx:169
 AliPHOSTracker.cxx:170
 AliPHOSTracker.cxx:171
 AliPHOSTracker.cxx:172
 AliPHOSTracker.cxx:173
 AliPHOSTracker.cxx:174
 AliPHOSTracker.cxx:175
 AliPHOSTracker.cxx:176
 AliPHOSTracker.cxx:177
 AliPHOSTracker.cxx:178
 AliPHOSTracker.cxx:179
 AliPHOSTracker.cxx:180
 AliPHOSTracker.cxx:181
 AliPHOSTracker.cxx:182
 AliPHOSTracker.cxx:183
 AliPHOSTracker.cxx:184
 AliPHOSTracker.cxx:185
 AliPHOSTracker.cxx:186
 AliPHOSTracker.cxx:187
 AliPHOSTracker.cxx:188
 AliPHOSTracker.cxx:189
 AliPHOSTracker.cxx:190
 AliPHOSTracker.cxx:191
 AliPHOSTracker.cxx:192
 AliPHOSTracker.cxx:193
 AliPHOSTracker.cxx:194
 AliPHOSTracker.cxx:195
 AliPHOSTracker.cxx:196
 AliPHOSTracker.cxx:197
 AliPHOSTracker.cxx:198
 AliPHOSTracker.cxx:199
 AliPHOSTracker.cxx:200
 AliPHOSTracker.cxx:201
 AliPHOSTracker.cxx:202
 AliPHOSTracker.cxx:203
 AliPHOSTracker.cxx:204
 AliPHOSTracker.cxx:205
 AliPHOSTracker.cxx:206
 AliPHOSTracker.cxx:207
 AliPHOSTracker.cxx:208
 AliPHOSTracker.cxx:209
 AliPHOSTracker.cxx:210
 AliPHOSTracker.cxx:211
 AliPHOSTracker.cxx:212
 AliPHOSTracker.cxx:213
 AliPHOSTracker.cxx:214
 AliPHOSTracker.cxx:215
 AliPHOSTracker.cxx:216
 AliPHOSTracker.cxx:217
 AliPHOSTracker.cxx:218
 AliPHOSTracker.cxx:219
 AliPHOSTracker.cxx:220
 AliPHOSTracker.cxx:221
 AliPHOSTracker.cxx:222
 AliPHOSTracker.cxx:223
 AliPHOSTracker.cxx:224
 AliPHOSTracker.cxx:225
 AliPHOSTracker.cxx:226
 AliPHOSTracker.cxx:227
 AliPHOSTracker.cxx:228
 AliPHOSTracker.cxx:229
 AliPHOSTracker.cxx:230
 AliPHOSTracker.cxx:231
 AliPHOSTracker.cxx:232
 AliPHOSTracker.cxx:233
 AliPHOSTracker.cxx:234
 AliPHOSTracker.cxx:235
 AliPHOSTracker.cxx:236
 AliPHOSTracker.cxx:237
 AliPHOSTracker.cxx:238
 AliPHOSTracker.cxx:239
 AliPHOSTracker.cxx:240
 AliPHOSTracker.cxx:241
 AliPHOSTracker.cxx:242
 AliPHOSTracker.cxx:243
 AliPHOSTracker.cxx:244
 AliPHOSTracker.cxx:245
 AliPHOSTracker.cxx:246
 AliPHOSTracker.cxx:247
 AliPHOSTracker.cxx:248
 AliPHOSTracker.cxx:249
 AliPHOSTracker.cxx:250
 AliPHOSTracker.cxx:251
 AliPHOSTracker.cxx:252
 AliPHOSTracker.cxx:253
 AliPHOSTracker.cxx:254
 AliPHOSTracker.cxx:255
 AliPHOSTracker.cxx:256
 AliPHOSTracker.cxx:257
 AliPHOSTracker.cxx:258
 AliPHOSTracker.cxx:259
 AliPHOSTracker.cxx:260
 AliPHOSTracker.cxx:261
 AliPHOSTracker.cxx:262
 AliPHOSTracker.cxx:263