ROOT logo
/**************************************************************************
 * Copyright(c) 1998-2000, 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.                  *
 **************************************************************************/

//====================================================================================================================================================
//
//      Digitizer class for the ALICE Muon Forward Tracker
//
//      Contact author: antonio.uras@cern.ch
//
//====================================================================================================================================================

#include "AliRun.h"
#include "AliRunLoader.h"
#include "AliDigitizationInput.h"
#include "AliLoader.h"
#include "AliLog.h"
#include "AliMFTDigitizer.h"
#include "AliMFTDigit.h"
#include "AliMFT.h"
#include "AliMFTSegmentation.h"
#include "TObjArray.h"
#include "TClonesArray.h"
#include "AliDigitizer.h"

ClassImp(AliMFTDigitizer)

//====================================================================================================================================================
    
AliMFTDigitizer::AliMFTDigitizer():
  AliDigitizer(),
  fNPlanes(0),
  fSegmentation(0)
{

  // default constructor 

}

//====================================================================================================================================================

AliMFTDigitizer::AliMFTDigitizer(AliDigitizationInput *digInp):
  AliDigitizer(digInp),
  fNPlanes(0),
  fSegmentation(0)
{

}

//====================================================================================================================================================

void AliMFTDigitizer::Digitize(Option_t*) {

  // This method is responsible for merging sdigits to a list of digits

  AliDebug(1, "************************************************************************");
  AliDebug(1, "************************ AliMFTDigitizer::Digitize *********************");
  AliDebug(1, "************************************************************************");
  
  if (!fSegmentation) {
    fSegmentation = new AliMFTSegmentation("AliMFTGeometry.root");
    fNPlanes = fSegmentation -> GetNPlanes();
  }

  AliDebug(1, Form("nPlanes = %d",fNPlanes));

  AliDebug(1,Form("Start with %i input(s) for event %i", fDigInput->GetNinputs(), fDigInput->GetOutputEventNr()));
    
  AliRunLoader *pInRunLoader=0;
  AliLoader    *pInMFTLoader=0;
  
  TClonesArray sDigits[fNMaxPlanes];
  for (Int_t iPlane=0; iPlane<fNMaxPlanes; iPlane++) sDigits[iPlane].SetClass("AliMFTDigit");  // tmp storage for sdigits sum up from all input files
  
  // filling the arrays of sdigits...

  for (Int_t iFile=0; iFile<fDigInput->GetNinputs(); iFile++) {
    
    pInRunLoader = AliRunLoader::GetRunLoader(fDigInput->GetInputFolderName(iFile));
    pInMFTLoader = pInRunLoader->GetLoader("MFTLoader"); 
    if (!pInMFTLoader) {
      AliDebug(1,"no MFT lodader, checking in the other input \n"); 
      continue;
    }
    
    if (!pInRunLoader->GetAliRun()) pInRunLoader->LoadgAlice();
    AliMFT *pInMFT = (AliMFT*) pInRunLoader->GetAliRun()->GetDetector("MFT"); 
    
    AliDebug(1, "pInMFTLoader->LoadSDigits()...");
    pInMFTLoader->LoadSDigits();
    AliDebug(1, "... done!");
    AliDebug(1, "    pInMFTLoader->TreeS()->GetEntry(0);");
    pInMFTLoader->TreeS()->GetEntry(0);
    AliDebug(1, "... done!");
    
    for (Int_t iPlane=0; iPlane<pInMFT->GetSDigitsList()->GetEntries(); iPlane++) {      
      for(Int_t iSDig=0; iSDig<((TClonesArray*)pInMFT->GetSDigitsList()->At(iPlane))->GetEntries(); iSDig++) {
	AliDebug(2, Form("Reading digit %03d of plane %02d (A)", iSDig, iPlane));
	AliMFTDigit *pSDig = (AliMFTDigit*) ((TClonesArray*)pInMFT->GetSDigitsList()->At(iPlane))->At(iSDig);
	AliDebug(2, Form("Reading digit %03d of plane %02d (B)", iSDig, iPlane));
	pSDig->AddOffset2TrackID(fDigInput->GetMask(iFile));   // -> To be introduced for merging (since all inputs count tracks independently from 0)
	AliDebug(2, Form("Reading digit %03d of plane %02d (C)", iSDig, iPlane));
	new ((sDigits[iPlane])[sDigits[iPlane].GetEntries()]) AliMFTDigit(*pSDig);  
	AliDebug(2, Form("Reading digit %03d of plane %02d (D)", iSDig, iPlane));
      }
    }
    
    pInMFTLoader->UnloadSDigits();   
    pInMFT->ResetSDigits();

  }
  
  AliRunLoader *pOutRunLoader = AliRunLoader::GetRunLoader(fDigInput->GetOutputFolderName());  // open output stream (only 1 possible)
  AliLoader    *pOutMFTLoader = pOutRunLoader->GetLoader("MFTLoader");                        
  AliRun       *pAliRun       = pOutRunLoader->GetAliRun();
  AliMFT       *pOutMFT       = (AliMFT*) pAliRun->GetDetector("MFT");      
  pOutMFTLoader->MakeTree("D");   
  pOutMFT->MakeBranch("D");
  pOutMFT->SetTreeAddress();
  
  SDigits2Digits(sDigits, pOutMFT->GetDigitsList());   // here the sdigits are merged into digits
  
  pOutMFTLoader->TreeD()->Fill();              // fill the output tree with the list of digits
  pOutMFTLoader->WriteDigits("OVERWRITE");     // serialize them to file
  
  for (Int_t iPlane=0; iPlane<fNPlanes; iPlane++) sDigits[iPlane].Clear();   // remove all tmp sdigits
  pOutMFTLoader->UnloadDigits();   
  pOutMFT->ResetDigits(); 

}

//====================================================================================================================================================

void AliMFTDigitizer::SDigits2Digits(TClonesArray *pSDigitList, TObjArray *pDigitList) {   

  TClonesArray *myDigitList[fNMaxPlanes] = {0};
 
  for (Int_t iPlane=0; iPlane<fNPlanes; iPlane++) { 
    myDigitList[iPlane] = (TClonesArray*)(*pDigitList)[iPlane];
    if (myDigitList[iPlane]->GetEntries()!=0) AliErrorClass("Some of digits lists is not empty");   // in principle those lists should be empty 
  }
   
  AliDebug(1,"starting loop over planes");
   
  for (Int_t iPlane=0; iPlane<fNPlanes; iPlane++) {
     
    AliMFTDigit *newDig=NULL;
    AliMFTDigit *oldDig=NULL;
    pSDigitList[iPlane].Sort();

    Int_t nDetElem = fSegmentation->GetPlane(iPlane)->GetNActiveElements();
    TClonesArray *digitsPerDetElem[fNMaxDetElemPerPlane] = {0};
    for (Int_t iDetElem=0; iDetElem<nDetElem; iDetElem++) digitsPerDetElem[iDetElem] = new TClonesArray("AliMFTDigit");

    AliDebug(1,"starting loop over sdigits to create digits");
    AliDebug(1, Form("MFT plane #%02d has %d SDigits", iPlane, Int_t(pSDigitList[iPlane].GetEntries())));

    for (Int_t iSDig=0; iSDig<pSDigitList[iPlane].GetEntries(); iSDig++) {

      newDig = (AliMFTDigit*) (pSDigitList[iPlane].At(iSDig));
      Int_t localDetElemID = fSegmentation->GetDetElemLocalID(newDig->GetDetElemID());
      Bool_t digitExists = kFALSE;
      Int_t nDigits = digitsPerDetElem[localDetElemID]->GetEntries();
      
      for (Int_t iDig=0; iDig<nDigits; iDig++) {
	oldDig = (AliMFTDigit*) (digitsPerDetElem[localDetElemID]->At(iDig));
	if (newDig->GetDetElemID()==oldDig->GetDetElemID() &&
	    newDig->GetPixelX()==oldDig->GetPixelX() &&
	    newDig->GetPixelY()==oldDig->GetPixelY() &&
	    newDig->GetPixelZ()==oldDig->GetPixelZ()) {
	  digitExists = kTRUE;
	  MergeDigits(oldDig, newDig);
	  break;
	}
      }
      
      if (!digitExists) new ((*digitsPerDetElem[localDetElemID])[digitsPerDetElem[localDetElemID]->GetEntries()]) AliMFTDigit(*newDig);

    }

    // Now we merge the digit lists coming from each detection element, to have an ordered final list

    for (Int_t iDetElem=0; iDetElem<nDetElem; iDetElem++) {
      for (Int_t iSDig=0; iSDig<digitsPerDetElem[iDetElem]->GetEntries(); iSDig++) {
	newDig = (AliMFTDigit*) (digitsPerDetElem[iDetElem]->At(iSDig));
	new ((*myDigitList[iPlane])[myDigitList[iPlane]->GetEntries()]) AliMFTDigit(*newDig);
      }
    }

    for (Int_t iDetElem=0; iDetElem<nDetElem; iDetElem++) delete digitsPerDetElem[iDetElem];
    
    AliDebug(1, Form("MFT plane #%02d has %d Digits", iPlane, Int_t(myDigitList[iPlane]->GetEntries())));
    
//     for (Int_t iDigit=0; iDigit<myDigitList[iPlane]->GetEntries(); iDigit++) {
//       AliDebug(1, Form("Digit %03d of MFT plane %02d has pixel coordinates (%05d, %05d)", 
// 		       iDigit, iPlane, ((AliMFTDigit*) myDigitList[iPlane]->At(iDigit))->GetPixelX(), ((AliMFTDigit*) myDigitList[iPlane]->At(iDigit))->GetPixelY()) );
//     }

    AliDebug(1, "ending loop over sdigits to create digits");

  }

  AliDebug(1,"ending loop over layers");  

}

//====================================================================================================================================================

void AliMFTDigitizer::MergeDigits(AliMFTDigit *mainDig, AliMFTDigit *digToSum) {
  
  mainDig -> SetEloss(mainDig->GetEloss() + digToSum->GetEloss());
  
  Bool_t trackExists = kFALSE;
  for (Int_t iTrack=0; iTrack<mainDig->GetNMCTracks(); iTrack++) {
    if (digToSum->GetMCLabel(0) == mainDig->GetMCLabel(iTrack)) {
      trackExists = kTRUE;
      break;
    }
  }
  
  if (!trackExists) mainDig->AddMCLabel(digToSum->GetMCLabel(0));
  
}

//====================================================================================================================================================

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