]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONDigitizerv1.cxx
Code for simulation, sdigitization and digitization moved from macros to compiled...
[u/mrichter/AliRoot.git] / MUON / AliMUONDigitizerv1.cxx
index e0dd5a16328a87d8c634b7858ed3b2c7b2ad7b85..f8d542c778b2b8dce189c57ec2c427e9af9013a5 100644 (file)
@@ -6,6 +6,7 @@
 #include <TObjArray.h>
 #include <TPDGCode.h>
 #include <TTree.h> 
+#include <TMath.h>
 
 #include "AliMUON.h"
 #include "AliMUONChamber.h"
 #include "AliMUONTransientDigit.h"
 #include "AliRun.h"
 #include "AliRunDigitizer.h"
+#include "AliRunLoader.h"
+#include "AliLoader.h"
 
 ClassImp(AliMUONDigitizerv1)
 
 //___________________________________________
-AliMUONDigitizerv1::AliMUONDigitizerv1() :AliDigitizer()
+AliMUONDigitizerv1::AliMUONDigitizerv1() :
+  AliDigitizer(),
+  fHitMap(0),
+  fTDList(0),
+  fTDCounter(0),
+  fDebug(0),
+  fMask(0),
+  fSignal(0)
 {
 // Default ctor - don't use it
-  fHitMap = 0;
-  fTDList = 0;
   if (GetDebug()>2) 
     cerr<<"AliMUONDigitizerv1::AliMUONDigitizerv1"
        <<"(AliRunDigitizer* manager) was processed"<<endl;
 }
 
 //___________________________________________
-AliMUONDigitizerv1::AliMUONDigitizerv1(AliRunDigitizer* manager) 
-    :AliDigitizer(manager)
+AliMUONDigitizerv1::AliMUONDigitizerv1(AliRunDigitizer* manager):
+  AliDigitizer(manager),
+  fHitMap(0),
+  fTDList(0),
+  fTDCounter(0),
+  fDebug(0),
+  fMask(0),
+  fSignal(0)
 {
 // ctor which should be used
-  fHitMap  = 0;
-  fTDList  = 0;
-  fDebug   = 0; 
-  fHits = new TClonesArray("AliMUONHit",1000);
   if (GetDebug()>2) 
     cerr<<"AliMUONDigitizerv1::AliMUONDigitizerv1"
        <<"(AliRunDigitizer* manager) was processed"<<endl;
@@ -50,7 +60,6 @@ AliMUONDigitizerv1::AliMUONDigitizerv1(AliRunDigitizer* manager)
 AliMUONDigitizerv1::~AliMUONDigitizerv1()
 {
 // Destructor
-  delete fHits;
 }
 
 //------------------------------------------------------------------------
@@ -74,7 +83,25 @@ Bool_t AliMUONDigitizerv1::ExistTransientDigit(AliMUONTransientDigit * mTD)
 //------------------------------------------------------------------------
 Bool_t AliMUONDigitizerv1::Init()
 {
+
 // Initialization 
+  if (GetDebug()>2) Info("Init","AliMUONDigitizerv1::Init() starts");
+
+  //Loaders (We assume input0 to be the output too)
+  AliRunLoader * runloader;    // Input   loader
+  AliLoader    * gime; 
+  // Getting runloader
+  runloader    = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
+  if (runloader == 0x0) {
+    Error("Init","RunLoader is not in input file 0");
+    return kFALSE;  // RunDigitizer is not working.  
+  }
+  // Getting MUONloader
+  gime        = runloader->GetLoader("MUONLoader");
+  gime->LoadHits("READ");
+  gime->LoadDigits("RECREATE");
   return kTRUE;
 }
 
@@ -92,10 +119,12 @@ void AliMUONDigitizerv1::UpdateTransientDigit(Int_t track, AliMUONTransientDigit
   pdigit->AddPhysicsSignal(iqpad);             
   // update list of tracks
   //
-  Int_t charge;    
+  Int_t charge;   
   track=+ fMask;
   if (fSignal) charge = iqpad;
-  else         charge = kBgTag;
+  //else         charge = kBgTag;
+  else         charge = iqpad + fMask; 
+              
   pdigit->UpdateTrackList(track,charge);
 }
 
@@ -141,14 +170,15 @@ void AliMUONDigitizerv1::MakeTransientDigit(Int_t track, Int_t iHit, AliMUONHit
                        "Charge " << digits[3] <<" " <<
                        "Hit " << digits[5] << endl;
     // list of tracks
-    Int_t charge;    
+    Int_t charge;   
     track += fMask;
     if (fSignal) charge = digits[3];
-    else         charge = kBgTag;
+    //else         charge = kBgTag;
+    else         charge = digits[3] + fMask;
+                
     if (GetDebug()>2) cerr<<"AliMUONDigitizerv1::MakeTransientDigit Creating AliMUONTransientDigit"<<endl;
     AliMUONTransientDigit * mTD = new AliMUONTransientDigit(ichamber, digits);
     mTD->AddToTrackList(track,charge);
-
     if (!ExistTransientDigit(mTD)) {
       AddTransientDigit(mTD);
       if (GetDebug()>2) cerr<<"AliMUONDigitizerv1::MakeTransientDigit Adding TransientDigit"<<endl;
@@ -165,7 +195,7 @@ void AliMUONDigitizerv1::Exec(Option_t* option)
 {
   TString optionString = option;
   if (optionString.Data() == "deb") {
-    cout<<"AliMUONDigitizerv1::Exec: called with option deb "<<endl;
+    Info("Digitize","Called with option deb ");
     fDebug = 3;
   }
 
@@ -173,18 +203,61 @@ void AliMUONDigitizerv1::Exec(Option_t* option)
   AliSegmentation*  c1Segmentation; //Cathode plane c1 of the chamber
   AliSegmentation*  c2Segmentation; //Cathode place c2 of the chamber
 
-  if (GetDebug()>2) cerr<<"AliMUONDigitizerv1::Digitize() starts"<<endl;
+  if (GetDebug()>2) Info("Digitize","AliMUONDigitizerv1::Digitize() starts");
   fTDList = new TObjArray;
 
-  // Getting Module MUON
-  AliMUON *pMUON  = (AliMUON *) gAlice->GetModule("MUON");
+  //Loaders (We assume input0 to be the output too)
+  AliRunLoader * runloader;    // Input   loader
+  AliLoader    * gime; 
+  // Getting runloader
+  runloader    = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(0));
+  if (runloader == 0x0) {
+    Error("Digitize","RunLoader is not in input file 0");
+    return;  // RunDigitizer is not working.  
+  }
+  // Getting MUONloader
+  gime        = runloader->GetLoader("MUONLoader");
+  if (gime->TreeH()==0x0) {
+      if (GetDebug()>2) Info("Digitize","TreeH is not loaded yet. Loading...");
+     gime->LoadHits("READ");
+       if (GetDebug()>2) Info("Digitize","Now treeH is %#x. MUONLoader is %#x",gime->TreeH(),gime);
+  }
+
+  if (GetDebug()>2) Info("Digitize","Loaders ready");
+
+  if (runloader->GetAliRun() == 0x0) runloader->LoadgAlice();
+  gAlice = runloader->GetAliRun();
+
+  // Getting Module MUON  
+  AliMUON *pMUON  = (AliMUON *) gAlice->GetDetector("MUON");
   if (!pMUON) {
-    cerr<<"AliMUONDigitizerv1::Digitize Error:"
-       <<" module MUON not found in the input file"<<endl;
+    Error("Digitize","Module MUON not found in the input file");
     return;
   }
-  // New branch for MUON digit in the tree of digits
-  pMUON->MakeBranchInTreeD(fManager->GetTreeD());
+  // Getting Muon data
+  AliMUONData * muondata = pMUON->GetMUONData(); 
+  muondata->SetLoader(gime);
+  muondata->SetTreeAddress("H");
+
+  // Loading Event
+  Int_t currentevent = fManager->GetOutputEventNr();
+  
+  if (GetDebug()>2) cerr<<"AliMUONDigitizerv1::Digitize() Event Number is "<<currentevent <<endl;
+  if ( (currentevent<10)                                                 || 
+       (Int_t(TMath::Log10(currentevent)) == TMath::Log10(currentevent) ) )
+    cout <<"ALiMUONDigitizerv1::Digitize() Event Number is "<< currentevent <<endl;
+
+  // Output file for digits same as hits
+  //  AliRunLoader *  runloaderout  = AliRunLoader::GetRunLoader(fManager->GetOutputFolderName());
+  //AliLoader * gimeout         = runloaderout->GetLoader("MUONLoader"); 
+  // New branch per chamber for MUON digit in the tree of digits
+  if (gime->TreeD() == 0x0) {
+    gime->MakeDigitsContainer();
+  }
+  TTree* treeD = gime->TreeD();
+  muondata->MakeBranch("D");
+  muondata->SetTreeAddress("D");
 
   // Array of pointer of the AliMUONHitMapA1:
   //  two HitMaps per chamber, or one HitMap per cahtode plane
@@ -202,24 +275,35 @@ void AliMUONDigitizerv1::Exec(Option_t* option)
 // Loop over files to merge and to digitize
     fSignal = kTRUE;
     for (Int_t inputFile=0; inputFile<fManager->GetNinputs(); inputFile++) {
+      if (GetDebug()>2) cerr<<"AliMUONDigitizerv1::Digitize() Input File is "<<inputFile<<endl;
+
+
       // Connect MUON Hit branch
-      if (inputFile > 0 ) fSignal = kFALSE;
-      TBranch *branchHits = 0;
-      TTree *treeH = fManager->GetInputTreeH(inputFile);
+      if (inputFile > 0 ) {
+       fSignal = kFALSE;
+         runloader    = AliRunLoader::GetRunLoader(fManager->GetInputFolderName(inputFile));
+         if (runloader == 0x0) {
+           cerr<<"AliMUONDigitizerv1::Digitize() RunLoader for inputFile "<<inputFile<< " not found !!! "<<endl;
+         }
+         gime  = runloader->GetLoader("MUONLoader");
+         if (gime->TreeH() == 0x0) gime->LoadHits("READ");     
+        muondata->SetLoader(gime);
+        muondata->SetTreeAddress("H");
+      }
+
+      // Setting the address 
+      TTree *treeH = gime->TreeH();
+      if (treeH == 0x0) {
+       Error("Digitize","Can not get TreeH from input %d",inputFile);
+       Info("Digitize","Now treeH is %#x. MUONLoader is %#x",gime->TreeH(),gime);
+       return;
+      }
       if (GetDebug()>2) {
        cerr<<"AliMUONDigitizerv1::Exec inputFile is "<<inputFile<<" "<<endl;
-       cerr<<"AliMUONDigitizerv1::Exec treeH, fHits "<<treeH<<" "<<fHits<<endl;
-      }
-      if (treeH && fHits) {
-       branchHits = treeH->GetBranch("MUON");
-       if (branchHits) {
-         fHits->Delete();
-         branchHits->SetAddress(&fHits);
-       }
-       else
-         Error("Exec","branch MUON was not found");
+       cerr<<"AliMUONDigitizerv1::Exec treeH" << treeH <<endl;
       }
-      if (GetDebug()>2) cerr<<"AliMUONDigitizerv1::Exec branchHits = "<<branchHits<<endl;
+       
+      if (GetDebug()>2) cerr<<"AliMUONDigitizerv1::Exec Setting tree addresses"<<endl;
 
       fMask = fManager->GetMask(inputFile);
       //
@@ -228,14 +312,15 @@ void AliMUONDigitizerv1::Exec(Option_t* option)
       Int_t ntracks = (Int_t) treeH->GetEntries();
       for (itrack = 0; itrack < ntracks; itrack++) {
        if (GetDebug()>2) cerr<<"AliMUONDigitizerv1::Exec itrack = "<<itrack<<endl;
-       fHits->Clear();
-       branchHits->GetEntry(itrack);
+       muondata->ResetHits();
+       treeH->GetEvent(itrack);
        //
        //  Loop over hits
        Int_t ihit, ichamber;
        AliMUONHit* mHit;
-       for(ihit = 0; ihit < fHits->GetEntriesFast(); ihit++) {
-         mHit = static_cast<AliMUONHit*>(fHits->At(ihit));
+       TClonesArray* hits = muondata->Hits();
+       for(ihit = 0; ihit < hits->GetEntriesFast(); ihit++) {
+         mHit = static_cast<AliMUONHit*>(hits->At(ihit));
          ichamber = mHit->Chamber()-1;  // chamber number
          if (ichamber > AliMUONConstants::NCh()-1) {
            cerr<<"AliMUONDigitizer: ERROR: "
@@ -271,67 +356,73 @@ void AliMUONDigitizerv1::Exec(Option_t* option)
     } // end file loop
     if (GetDebug()>2) cerr<<"AliMUONDigitizer::Exec End of hits, track and file loops"<<endl;
 
-    //
-    // Filling Digit List
-    Int_t tracks[kMAXTRACKS];
-    Int_t charges[kMAXTRACKS];
-    Int_t nentries = fTDList->GetEntriesFast();
-    Int_t digits[6];
-    for (Int_t nent = 0; nent < nentries; nent++) {
-      AliMUONTransientDigit *address = (AliMUONTransientDigit*)fTDList->At(nent);
-      if (address == 0) continue; 
-      Int_t ich = address->Chamber();
-      Int_t   q = address->Signal(); 
-      chamber = &(pMUON->Chamber(ich));
+    // Loop on cathodes
+    Int_t icat;
+    for(icat=0; icat<2; icat++) {
       //
-      //  Digit Response (noise, threshold, saturation, ...)
-      AliMUONResponse * response = chamber->ResponseModel();
-      q = response->DigitResponse(q,address);
-      
-      if (!q) continue;
-      
-      digits[0] = address->PadX();
-      digits[1] = address->PadY();
-      digits[2] = address->Cathode();
-      digits[3] = q;
-      digits[4] = address->Physics();
-      digits[5] = address->Hit();
-      
-      Int_t nptracks = address->GetNTracks();
-      
-      if (nptracks > kMAXTRACKS) {
-       if (GetDebug() >0) {
-         cerr<<"AliMUONDigitizer:Exec  nptracks > 10 "<<nptracks;
-         cerr<<"reset to max value "<<kMAXTRACKS<<endl;
+      // Filling Digit List
+      Int_t tracks[kMAXTRACKS];
+      Int_t charges[kMAXTRACKS];
+      Int_t nentries = fTDList->GetEntriesFast();
+      Int_t digits[6];
+      for (Int_t nent = 0; nent < nentries; nent++) {
+       AliMUONTransientDigit *address = (AliMUONTransientDigit*)fTDList->At(nent);
+       if (address == 0) continue; 
+       Int_t ich = address->Chamber();
+       Int_t   q = address->Signal(); 
+       chamber = &(pMUON->Chamber(ich));
+       //
+       //  Digit Response (noise, threshold, saturation, ...)
+       AliMUONResponse * response = chamber->ResponseModel();
+       q = response->DigitResponse(q,address);
+       
+       if (!q) continue;
+       
+       digits[0] = address->PadX();
+       digits[1] = address->PadY();
+       digits[2] = address->Cathode()-1;
+       digits[3] = q;
+       digits[4] = address->Physics();
+       digits[5] = address->Hit();
+       
+       Int_t nptracks = address->GetNTracks();
+       
+       if (nptracks > kMAXTRACKS) {
+         if (GetDebug() >0) {
+           cerr<<"AliMUONDigitizer:Exec  nptracks > 10 "<<nptracks;
+           cerr<<"reset to max value "<<kMAXTRACKS<<endl;
+         }
+         nptracks = kMAXTRACKS;
        }
-       nptracks = kMAXTRACKS;
-      }
-      if (nptracks > 2 && GetDebug() >2) {
-       cerr<<"AliMUONDigitizer::Exec  nptracks > 2 "<<nptracks<<endl;
-       //      printf("cat,ich,ix,iy,q %d %d %d %d %d \n",icat,ich,digits[0],digits[1],q);
-      }
-      for (Int_t tr = 0; tr < nptracks; tr++) {
-       tracks[tr]   = address->GetTrack(tr);
-       charges[tr]  = address->GetCharge(tr);
-      }      //end loop over list of tracks for one pad
-      // Sort list of tracks according to charge
-      if (nptracks > 1) {
-       SortTracks(tracks,charges,nptracks);
-      }
-      if (nptracks < kMAXTRACKS ) {
-       for (Int_t i = nptracks; i < kMAXTRACKS; i++) {
-         tracks[i]  = 0;
-         charges[i] = 0;
+       if (nptracks > 2 && GetDebug() >2) {
+         cerr<<"AliMUONDigitizer::Exec  nptracks > 2 "<<nptracks<<endl;
+         //    printf("cat,ich,ix,iy,q %d %d %d %d %d \n",icat,ich,digits[0],digits[1],q);
+       }
+       for (Int_t tr = 0; tr < nptracks; tr++) {
+         tracks[tr]   = address->GetTrack(tr);
+         charges[tr]  = address->GetCharge(tr);
+       }      //end loop over list of tracks for one pad
+       // Sort list of tracks according to charge
+       if (nptracks > 1) {
+         SortTracks(tracks,charges,nptracks);
+       }
+       if (nptracks < kMAXTRACKS ) {
+         for (Int_t i = nptracks; i < kMAXTRACKS; i++) {
+           tracks[i]  = -1;
+           charges[i] = 0;
+         }
        }
+       
+       // Add digits
+       if (GetDebug()>3) cerr<<"AliMUONDigitzerv1::Exex TransientDigit to Digit"<<endl;
+       if ( digits[2] == icat ) muondata->AddDigit(ich,tracks,charges,digits);
+//     printf("test rm ich %d padX %d padY %d \n",ich, digits[0], digits[1]);
       }
-      
-      // fill digits
-      if (GetDebug()>2) cerr<<"AliMUONDigitzerv1::Exex TransientDigit to Digit"<<endl;
-      pMUON->AddDigits(ich,tracks,charges,digits);
-    }
-    fManager->GetTreeD()->Fill();
-    pMUON->ResetDigits();  //
-    fTDList->Delete();
+      // Filling list of digits per chamber for a given cathode.
+      muondata->Fill("D");
+      muondata->ResetDigits();    
+    } // end loop cathode
+    fTDList->Delete();  
     
     for(Int_t ii = 0; ii < 2*AliMUONConstants::NCh(); ++ii) {
       if (fHitMap[ii]) {
@@ -342,14 +433,15 @@ void AliMUONDigitizerv1::Exec(Option_t* option)
     
     if (GetDebug()>2) 
       cerr<<"AliMUONDigitizer::Exec: writing the TreeD: "
-         <<fManager->GetTreeD()->GetName()<<endl;
-    fManager->GetTreeD()->Write(0,TObject::kOverwrite);
+         <<treeD->GetName()<<endl;
+
+    gime->WriteDigits("OVERWRITE");
     delete [] fHitMap;
     delete fTDList;
-    
-    if (fHits)    fHits->Clear();
+    muondata->ResetHits();
+    gime->UnloadHits();
+    gime->UnloadDigits();
 }
-
 //------------------------------------------------------------------------
 void AliMUONDigitizerv1::SortTracks(Int_t *tracks,Int_t *charges,Int_t ntr)
 {
@@ -389,7 +481,7 @@ void AliMUONDigitizerv1::SortTracks(Int_t *tracks,Int_t *charges,Int_t ntr)
     if(qmax > 0) {
       idx[i]=jmax;
       jch[i]=charges[jmax]; 
-      jtr[i]=tracks[jmax]; 
+      jtr[i]=tracks[jmax];
     }
     
   }