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$

#include <TClonesArray.h>
#include <TParticle.h>
#include <TTree.h>

#include "AliMUONSDigitizerV2.h"

#include "AliMUON.h"
#include "AliMUONChamber.h"
#include "AliMUONVDigit.h"
#include "AliMUONHit.h"
#include "AliMUONVDigitStore.h"
#include "AliMUONVHitStore.h"
#include "AliMUONResponseTrigger.h"
#include "AliMUONConstants.h"

#include "AliMpCDB.h"
#include "AliMpDEManager.h"

#include "AliLog.h"
#include "AliCDBManager.h"
#include "AliLoader.h"
#include "AliRun.h"
#include "AliRunLoader.h"

#include "AliHeader.h"
#include "AliGenCocktailEventHeader.h"

//-----------------------------------------------------------------------------
/// The sdigitizer performs the transformation from hits (energy deposits by
/// the transport code) to sdigits (equivalent of charges on pad).
///
/// It does so by converting the energy deposit into a charge and then spreading
/// this charge over several pads, according to the response function (a 
/// Mathieson distribution, basically).
/// 
/// See also AliMUONResponseV0, which is doing the real job (in DisIntegrate
/// method), while this sdigitizer is just "steering" the process.
///
/// Please note that we do *not* merge sdigits after creation, which means
/// that after sdigitization, a given pad can have several sdigits. This
/// merging is taken care of later on by the digitizer(V3).
//-----------------------------------------------------------------------------

ClassImp(AliMUONSDigitizerV2)

Float_t  AliMUONSDigitizerV2::fgkMaxIntTime = 10.0;
Float_t  AliMUONSDigitizerV2::fgkMaxPosTimeDif = 1.22E-6;
Float_t  AliMUONSDigitizerV2::fgkMaxNegTimeDif = -3.5E-6;
Float_t  AliMUONSDigitizerV2::fgkMinTimeDif = 25E-9;

//_____________________________________________________________________________
AliMUONSDigitizerV2::AliMUONSDigitizerV2() 
: TNamed("AliMUONSDigitizerV2","From Hits to SDigits for MUON")
{
  ///
  /// ctor.
  ///

  // Load mapping
  if ( ! AliMpCDB::LoadMpSegmentation() ) {
    AliFatal("Could not access mapping from OCDB !");
  }
}

//_____________________________________________________________________________
AliMUONSDigitizerV2::~AliMUONSDigitizerV2()
{
  ///
  /// dtor.
  ///
}

//_____________________________________________________________________________
void
AliMUONSDigitizerV2::Digitize(Option_t*)
{
  ///
  /// Go from hits to sdigits.
  ///
  /// In the code below, apart from the loop itself (which look complicated
  /// but is really only a loop on each hit in the input file) the main
  /// work is done in AliMUONResponse::DisIntegrate method, which converts
  /// a single hit in (possibly) several sdigits.
  ///
  
  AliDebug(1,"");
  
  AliRunLoader* runLoader = AliRunLoader::Instance();
  AliLoader* loader = runLoader->GetDetectorLoader("MUON");
  
  loader->LoadHits("READ");
  
  AliMUON* muon = static_cast<AliMUON*>(gAlice->GetModule("MUON"));
  
  Int_t nofEvents(runLoader->GetNumberOfEvents());
  
  TString classname = muon->DigitStoreClassName();
  
  AliMUONVDigitStore* sDigitStore = AliMUONVDigitStore::Create(classname.Data());
  
  if (!sDigitStore)
  {
    AliFatal(Form("Could not create digitstore of class %s",classname.Data()));
  }
  
  AliDebug(1,Form("Will use digitStore of type %s",sDigitStore->ClassName()));
  
  // average arrival time to chambers, for pileup studies
  
  for ( Int_t iEvent = 0; iEvent < nofEvents; ++iEvent ) 
  {    
    // Loop over events.
    TObjArray tdlist;
    tdlist.SetOwner(kTRUE);
    
    AliDebug(1,Form("iEvent=%d",iEvent));
    runLoader->GetEvent(iEvent);
    
    // for pile up studies
    float t0=fgkMaxIntTime;  int aa=0;
    AliHeader* header = runLoader->GetHeader();   
    AliGenCocktailEventHeader* cocktailHeader =
    dynamic_cast<AliGenCocktailEventHeader*>(header->GenEventHeader());
    if (cocktailHeader) {
      AliGenCocktailEventHeader* genEventHeader = (AliGenCocktailEventHeader*) (header->GenEventHeader());
      TList* headers = genEventHeader->GetHeaders();
      TIter nextH(headers);
      AliGenEventHeader *entry; 
      while((entry = (AliGenEventHeader*)nextH())) {
        float t = entry->InteractionTime();	
        if (TMath::Abs(t)<TMath::Abs(t0)) t0 = t;      
        aa++;
      }
    } else {
      AliGenEventHeader* evtHeader = 
      (AliGenEventHeader*)(header->GenEventHeader());
      if (evtHeader)
      {  
        float t = evtHeader->InteractionTime();		
        if (TMath::Abs(t)<TMath::Abs(t0)) t0 = t;           
        aa++;
      }
      else
      {
        // some generators may not offer a header, if which
        // case we cannot get the interaction time, so we assume zero
        t0 = 0.;
      }
    }
    
    loader->MakeSDigitsContainer();
    
    TTree* treeS = loader->TreeS();
    
    if ( !treeS )
    {
      AliFatal("");
    }
    
    sDigitStore->Connect(*treeS);
    
    TTree* treeH = loader->TreeH();
    
    AliMUONVHitStore* hitStore = AliMUONVHitStore::Create(*treeH);
    hitStore->Connect(*treeH);
    
    Long64_t nofTracks = treeH->GetEntries();
    
    for ( Long64_t iTrack = 0; iTrack < nofTracks; ++iTrack )
    {
      // Loop over the tracks of this event.
      treeH->GetEvent(iTrack);
      
      AliMUONHit* hit;
      TIter next(hitStore->CreateIterator());
      Int_t ihit(0);
      
      while ( ( hit = static_cast<AliMUONHit*>(next()) ) )       
      {
        Int_t chamberId = hit->Chamber()-1;
        Float_t age = hit->Age()-t0;
        
        AliMUONChamber& chamber = muon->Chamber(chamberId);
        AliMUONResponse* response = chamber.ResponseModel();
        
        // This is the heart of this method : the dis-integration
        TList digits;        
        if (aa>1){  // if there are pileup events
          Float_t chamberTime = AliMUONConstants::AverageChamberT(chamberId);
          Float_t timeDif=age-chamberTime;	  
          if (timeDif>fgkMaxPosTimeDif || timeDif<fgkMaxNegTimeDif) {
            continue;
          }
          if(TMath::Abs(timeDif)>fgkMinTimeDif){
            response->DisIntegrate(*hit,digits,timeDif);
          }
          else{
            response->DisIntegrate(*hit,digits,0.);
          }
        }
        else{
          response->DisIntegrate(*hit,digits,0.);
        }
        
        TIter nextd(&digits);
        AliMUONVDigit* d;
        while ( ( d = (AliMUONVDigit*)nextd() ) )
        {
          // Update some sdigit information that could not be known
          // by the DisIntegrate method
          d->SetHit(ihit);
          d->SetTime(age);
          d->AddTrack(hit->GetTrack(),d->Charge());
          tdlist.Add(d);
        }
        ++ihit;
      }
      hitStore->Clear();
    } // end of loop on tracks within an event
    
    TIter next(&tdlist);
    AliMUONVDigit* d;
    
    while ( ( d = static_cast<AliMUONVDigit*>(next()) ) )
    {
      d->ChargeInFC(kTRUE);
      
      AliMUONVDigit* added = sDigitStore->Add(*d,AliMUONVDigitStore::kMerge);
      if (!added)
      {
        AliError("Could not add digit to digitStore");
      }
    }
    
    treeS->Fill();
    
    loader->WriteSDigits("OVERWRITE");
    
    sDigitStore->Clear();
    
    loader->UnloadSDigits();
    
    delete hitStore;
    
  } // loop on events
  
  loader->UnloadHits();  
  
  delete sDigitStore;
  
}
 AliMUONSDigitizerV2.cxx:1
 AliMUONSDigitizerV2.cxx:2
 AliMUONSDigitizerV2.cxx:3
 AliMUONSDigitizerV2.cxx:4
 AliMUONSDigitizerV2.cxx:5
 AliMUONSDigitizerV2.cxx:6
 AliMUONSDigitizerV2.cxx:7
 AliMUONSDigitizerV2.cxx:8
 AliMUONSDigitizerV2.cxx:9
 AliMUONSDigitizerV2.cxx:10
 AliMUONSDigitizerV2.cxx:11
 AliMUONSDigitizerV2.cxx:12
 AliMUONSDigitizerV2.cxx:13
 AliMUONSDigitizerV2.cxx:14
 AliMUONSDigitizerV2.cxx:15
 AliMUONSDigitizerV2.cxx:16
 AliMUONSDigitizerV2.cxx:17
 AliMUONSDigitizerV2.cxx:18
 AliMUONSDigitizerV2.cxx:19
 AliMUONSDigitizerV2.cxx:20
 AliMUONSDigitizerV2.cxx:21
 AliMUONSDigitizerV2.cxx:22
 AliMUONSDigitizerV2.cxx:23
 AliMUONSDigitizerV2.cxx:24
 AliMUONSDigitizerV2.cxx:25
 AliMUONSDigitizerV2.cxx:26
 AliMUONSDigitizerV2.cxx:27
 AliMUONSDigitizerV2.cxx:28
 AliMUONSDigitizerV2.cxx:29
 AliMUONSDigitizerV2.cxx:30
 AliMUONSDigitizerV2.cxx:31
 AliMUONSDigitizerV2.cxx:32
 AliMUONSDigitizerV2.cxx:33
 AliMUONSDigitizerV2.cxx:34
 AliMUONSDigitizerV2.cxx:35
 AliMUONSDigitizerV2.cxx:36
 AliMUONSDigitizerV2.cxx:37
 AliMUONSDigitizerV2.cxx:38
 AliMUONSDigitizerV2.cxx:39
 AliMUONSDigitizerV2.cxx:40
 AliMUONSDigitizerV2.cxx:41
 AliMUONSDigitizerV2.cxx:42
 AliMUONSDigitizerV2.cxx:43
 AliMUONSDigitizerV2.cxx:44
 AliMUONSDigitizerV2.cxx:45
 AliMUONSDigitizerV2.cxx:46
 AliMUONSDigitizerV2.cxx:47
 AliMUONSDigitizerV2.cxx:48
 AliMUONSDigitizerV2.cxx:49
 AliMUONSDigitizerV2.cxx:50
 AliMUONSDigitizerV2.cxx:51
 AliMUONSDigitizerV2.cxx:52
 AliMUONSDigitizerV2.cxx:53
 AliMUONSDigitizerV2.cxx:54
 AliMUONSDigitizerV2.cxx:55
 AliMUONSDigitizerV2.cxx:56
 AliMUONSDigitizerV2.cxx:57
 AliMUONSDigitizerV2.cxx:58
 AliMUONSDigitizerV2.cxx:59
 AliMUONSDigitizerV2.cxx:60
 AliMUONSDigitizerV2.cxx:61
 AliMUONSDigitizerV2.cxx:62
 AliMUONSDigitizerV2.cxx:63
 AliMUONSDigitizerV2.cxx:64
 AliMUONSDigitizerV2.cxx:65
 AliMUONSDigitizerV2.cxx:66
 AliMUONSDigitizerV2.cxx:67
 AliMUONSDigitizerV2.cxx:68
 AliMUONSDigitizerV2.cxx:69
 AliMUONSDigitizerV2.cxx:70
 AliMUONSDigitizerV2.cxx:71
 AliMUONSDigitizerV2.cxx:72
 AliMUONSDigitizerV2.cxx:73
 AliMUONSDigitizerV2.cxx:74
 AliMUONSDigitizerV2.cxx:75
 AliMUONSDigitizerV2.cxx:76
 AliMUONSDigitizerV2.cxx:77
 AliMUONSDigitizerV2.cxx:78
 AliMUONSDigitizerV2.cxx:79
 AliMUONSDigitizerV2.cxx:80
 AliMUONSDigitizerV2.cxx:81
 AliMUONSDigitizerV2.cxx:82
 AliMUONSDigitizerV2.cxx:83
 AliMUONSDigitizerV2.cxx:84
 AliMUONSDigitizerV2.cxx:85
 AliMUONSDigitizerV2.cxx:86
 AliMUONSDigitizerV2.cxx:87
 AliMUONSDigitizerV2.cxx:88
 AliMUONSDigitizerV2.cxx:89
 AliMUONSDigitizerV2.cxx:90
 AliMUONSDigitizerV2.cxx:91
 AliMUONSDigitizerV2.cxx:92
 AliMUONSDigitizerV2.cxx:93
 AliMUONSDigitizerV2.cxx:94
 AliMUONSDigitizerV2.cxx:95
 AliMUONSDigitizerV2.cxx:96
 AliMUONSDigitizerV2.cxx:97
 AliMUONSDigitizerV2.cxx:98
 AliMUONSDigitizerV2.cxx:99
 AliMUONSDigitizerV2.cxx:100
 AliMUONSDigitizerV2.cxx:101
 AliMUONSDigitizerV2.cxx:102
 AliMUONSDigitizerV2.cxx:103
 AliMUONSDigitizerV2.cxx:104
 AliMUONSDigitizerV2.cxx:105
 AliMUONSDigitizerV2.cxx:106
 AliMUONSDigitizerV2.cxx:107
 AliMUONSDigitizerV2.cxx:108
 AliMUONSDigitizerV2.cxx:109
 AliMUONSDigitizerV2.cxx:110
 AliMUONSDigitizerV2.cxx:111
 AliMUONSDigitizerV2.cxx:112
 AliMUONSDigitizerV2.cxx:113
 AliMUONSDigitizerV2.cxx:114
 AliMUONSDigitizerV2.cxx:115
 AliMUONSDigitizerV2.cxx:116
 AliMUONSDigitizerV2.cxx:117
 AliMUONSDigitizerV2.cxx:118
 AliMUONSDigitizerV2.cxx:119
 AliMUONSDigitizerV2.cxx:120
 AliMUONSDigitizerV2.cxx:121
 AliMUONSDigitizerV2.cxx:122
 AliMUONSDigitizerV2.cxx:123
 AliMUONSDigitizerV2.cxx:124
 AliMUONSDigitizerV2.cxx:125
 AliMUONSDigitizerV2.cxx:126
 AliMUONSDigitizerV2.cxx:127
 AliMUONSDigitizerV2.cxx:128
 AliMUONSDigitizerV2.cxx:129
 AliMUONSDigitizerV2.cxx:130
 AliMUONSDigitizerV2.cxx:131
 AliMUONSDigitizerV2.cxx:132
 AliMUONSDigitizerV2.cxx:133
 AliMUONSDigitizerV2.cxx:134
 AliMUONSDigitizerV2.cxx:135
 AliMUONSDigitizerV2.cxx:136
 AliMUONSDigitizerV2.cxx:137
 AliMUONSDigitizerV2.cxx:138
 AliMUONSDigitizerV2.cxx:139
 AliMUONSDigitizerV2.cxx:140
 AliMUONSDigitizerV2.cxx:141
 AliMUONSDigitizerV2.cxx:142
 AliMUONSDigitizerV2.cxx:143
 AliMUONSDigitizerV2.cxx:144
 AliMUONSDigitizerV2.cxx:145
 AliMUONSDigitizerV2.cxx:146
 AliMUONSDigitizerV2.cxx:147
 AliMUONSDigitizerV2.cxx:148
 AliMUONSDigitizerV2.cxx:149
 AliMUONSDigitizerV2.cxx:150
 AliMUONSDigitizerV2.cxx:151
 AliMUONSDigitizerV2.cxx:152
 AliMUONSDigitizerV2.cxx:153
 AliMUONSDigitizerV2.cxx:154
 AliMUONSDigitizerV2.cxx:155
 AliMUONSDigitizerV2.cxx:156
 AliMUONSDigitizerV2.cxx:157
 AliMUONSDigitizerV2.cxx:158
 AliMUONSDigitizerV2.cxx:159
 AliMUONSDigitizerV2.cxx:160
 AliMUONSDigitizerV2.cxx:161
 AliMUONSDigitizerV2.cxx:162
 AliMUONSDigitizerV2.cxx:163
 AliMUONSDigitizerV2.cxx:164
 AliMUONSDigitizerV2.cxx:165
 AliMUONSDigitizerV2.cxx:166
 AliMUONSDigitizerV2.cxx:167
 AliMUONSDigitizerV2.cxx:168
 AliMUONSDigitizerV2.cxx:169
 AliMUONSDigitizerV2.cxx:170
 AliMUONSDigitizerV2.cxx:171
 AliMUONSDigitizerV2.cxx:172
 AliMUONSDigitizerV2.cxx:173
 AliMUONSDigitizerV2.cxx:174
 AliMUONSDigitizerV2.cxx:175
 AliMUONSDigitizerV2.cxx:176
 AliMUONSDigitizerV2.cxx:177
 AliMUONSDigitizerV2.cxx:178
 AliMUONSDigitizerV2.cxx:179
 AliMUONSDigitizerV2.cxx:180
 AliMUONSDigitizerV2.cxx:181
 AliMUONSDigitizerV2.cxx:182
 AliMUONSDigitizerV2.cxx:183
 AliMUONSDigitizerV2.cxx:184
 AliMUONSDigitizerV2.cxx:185
 AliMUONSDigitizerV2.cxx:186
 AliMUONSDigitizerV2.cxx:187
 AliMUONSDigitizerV2.cxx:188
 AliMUONSDigitizerV2.cxx:189
 AliMUONSDigitizerV2.cxx:190
 AliMUONSDigitizerV2.cxx:191
 AliMUONSDigitizerV2.cxx:192
 AliMUONSDigitizerV2.cxx:193
 AliMUONSDigitizerV2.cxx:194
 AliMUONSDigitizerV2.cxx:195
 AliMUONSDigitizerV2.cxx:196
 AliMUONSDigitizerV2.cxx:197
 AliMUONSDigitizerV2.cxx:198
 AliMUONSDigitizerV2.cxx:199
 AliMUONSDigitizerV2.cxx:200
 AliMUONSDigitizerV2.cxx:201
 AliMUONSDigitizerV2.cxx:202
 AliMUONSDigitizerV2.cxx:203
 AliMUONSDigitizerV2.cxx:204
 AliMUONSDigitizerV2.cxx:205
 AliMUONSDigitizerV2.cxx:206
 AliMUONSDigitizerV2.cxx:207
 AliMUONSDigitizerV2.cxx:208
 AliMUONSDigitizerV2.cxx:209
 AliMUONSDigitizerV2.cxx:210
 AliMUONSDigitizerV2.cxx:211
 AliMUONSDigitizerV2.cxx:212
 AliMUONSDigitizerV2.cxx:213
 AliMUONSDigitizerV2.cxx:214
 AliMUONSDigitizerV2.cxx:215
 AliMUONSDigitizerV2.cxx:216
 AliMUONSDigitizerV2.cxx:217
 AliMUONSDigitizerV2.cxx:218
 AliMUONSDigitizerV2.cxx:219
 AliMUONSDigitizerV2.cxx:220
 AliMUONSDigitizerV2.cxx:221
 AliMUONSDigitizerV2.cxx:222
 AliMUONSDigitizerV2.cxx:223
 AliMUONSDigitizerV2.cxx:224
 AliMUONSDigitizerV2.cxx:225
 AliMUONSDigitizerV2.cxx:226
 AliMUONSDigitizerV2.cxx:227
 AliMUONSDigitizerV2.cxx:228
 AliMUONSDigitizerV2.cxx:229
 AliMUONSDigitizerV2.cxx:230
 AliMUONSDigitizerV2.cxx:231
 AliMUONSDigitizerV2.cxx:232
 AliMUONSDigitizerV2.cxx:233
 AliMUONSDigitizerV2.cxx:234
 AliMUONSDigitizerV2.cxx:235
 AliMUONSDigitizerV2.cxx:236
 AliMUONSDigitizerV2.cxx:237
 AliMUONSDigitizerV2.cxx:238
 AliMUONSDigitizerV2.cxx:239
 AliMUONSDigitizerV2.cxx:240
 AliMUONSDigitizerV2.cxx:241
 AliMUONSDigitizerV2.cxx:242
 AliMUONSDigitizerV2.cxx:243
 AliMUONSDigitizerV2.cxx:244
 AliMUONSDigitizerV2.cxx:245
 AliMUONSDigitizerV2.cxx:246
 AliMUONSDigitizerV2.cxx:247
 AliMUONSDigitizerV2.cxx:248
 AliMUONSDigitizerV2.cxx:249
 AliMUONSDigitizerV2.cxx:250
 AliMUONSDigitizerV2.cxx:251
 AliMUONSDigitizerV2.cxx:252
 AliMUONSDigitizerV2.cxx:253
 AliMUONSDigitizerV2.cxx:254
 AliMUONSDigitizerV2.cxx:255
 AliMUONSDigitizerV2.cxx:256
 AliMUONSDigitizerV2.cxx:257
 AliMUONSDigitizerV2.cxx:258
 AliMUONSDigitizerV2.cxx:259
 AliMUONSDigitizerV2.cxx:260
 AliMUONSDigitizerV2.cxx:261
 AliMUONSDigitizerV2.cxx:262
 AliMUONSDigitizerV2.cxx:263
 AliMUONSDigitizerV2.cxx:264
 AliMUONSDigitizerV2.cxx:265
 AliMUONSDigitizerV2.cxx:266
 AliMUONSDigitizerV2.cxx:267
 AliMUONSDigitizerV2.cxx:268