ROOT logo
#if !defined(__CINT__) || defined(__MAKECINT__)

#include "iostream.h"
#include "TDatetime.h"
#include "STEER/AliRun.h"
#include "STEER/AliRunDigitizer.h"
#include "ITS/AliITSDigitizer.h"
#include "ITS/AliITS.h"
#include "ITS/AliITSDetType.h"
#include "ITS/AliITSresponseSDD.h"
#include "TStopwatch.h"

#endif

TFile* AccessFile(TString inFile="galice.root", TString acctype="R");
void writeAR(TFile * fin, TFile *fou);
Int_t ChangeITSDefaults(TFile *hitfile,AliITS *ITS,TString opt="");
//#define DEBUG
Int_t AliITSMerge(TString digFile="galiceMD.root", 
	    TString sdigFileSig="galiceS_sig.root", 
	    TString sdigFileBg="",TString opt=""){
    // Standeard ITS SDigits to Digits, with posible merging.

    // Dynamically link some shared libs
    if (gClassTable->GetID("AliRun") < 0) {
	gROOT->LoadMacro("loadlibs.C");
	loadlibs();
    } // end if
    // Connect the Root Galice file containing Geometry, Kine and Hits
    if (gAlice) {delete gAlice; gAlice = 0;}

    TFile *sdigfilesig = 0;   // pointer to signal input file.
    TFile *sdigfilebg  = 0;   // pointer to background input file.
    TFile *digfile = 0;  // possible output file for TreeD

    // Setup to copy gAlice and the event tree to the output file.

    if(digFile.CompareTo(sdigFileSig)==0){//write output to same file as input.
	sdigfilesig = AccessFile(sdigFileSig,"U");//input file open for update.
    }else{ // different output file then input file.
	sdigfilesig = AccessFile(sdigFileSig,"R");//input file open read only
	digfile = new TFile(digFile,"NEW");
    } // end if digFile == hitFile.

    AliITS *ITS = (AliITS*)gAlice->GetDetector("ITS");      
    if (!ITS) {
	cerr<<"AliITSHits2DigitsDefault.C : AliITS object not found on file"
	    << endl;
	return 3;
    }  // end if !ITS

    ChangeITSDefaults(sdigfilesig,ITS,opt);
    // write the AliRun object to the output file if different from input file.
    if(digfile){
	writeAR(sdigfilesig,digfile);
	digfile->Close(); // Manager will open in update mode.
	digfile = 0;
    } // end if digfile
    sdigfilesig->Close();
    sdigfilesig = 0;
//    delete gAlice; gAlice=0;   // there is a problem with deleting gAlice????

    AliRunDigitizer *manager;
    if(sdigFileBg.CompareTo("")==0) { // do not merge.
	manager = new AliRunDigitizer(1,1);
    }else{
	manager = new AliRunDigitizer(2,1);
	manager->SetInputStream(0,sdigFileSig.Data());
	manager->SetInputStream(1,sdigFileBg.Data());
    } // end if
    if (digFile.CompareTo(sdigFileSig) !=0) {
	manager->SetOutputFile(digFile);
    } // end if
//    manager->SetCopyTreesFromInput(0);
    AliITSDigitizer *dITS = new AliITSDigitizer(manager);
    if(opt.Contains("ROI")){
	cout << "Region of Interest selected" << endl;
	dITS->SetByRegionOfInterestFlag(1);
    }else{
	cout << "Digizing everthing" << endl;
	dITS->SetByRegionOfInterestFlag(0);
    } // end if

    TStopwatch timer;
    timer.Start();
    manager->Exec("all");
    timer.Stop(); 
    timer.Print();

    if(digfile!=0){
	cout << digFile << " size =" << digfile->GetSize() << endl;
    }else if(sdigfilesig!=0){
	cout << sdigFileSig << " size =" << sdigfilesig->GetSize() << endl;
    } // end if sdigfile!=0


    if(digfile) digfile->Close();
    if(sdigfilesig) sdigfilesig->Close();
    if(sdigfilebg)  sdigfilebg->Close();

    // There is a problem deleting gAlice. It is related to the destructor
    // and the fTreeE in AliRun. So for now it is not deleted.
//    delete gAlice; // digfile is closed by deleting gAlice if != hitfile.
//    gAlice = 0;
    delete manager;
}
//______________________________________________________________________
TFile * AccessFile(TString FileName, TString acctype){
    // Function used to open the input file and fetch the AliRun object

    TFile *retfil = 0;
    TFile *file = (TFile*)gROOT->GetListOfFiles()->FindObject(FileName);
    if(file) {
	file->Close();
	delete file;
	file = 0;
    } // end if file
    if(acctype.Contains("U")){
	file = new TFile(FileName,"UPDATE");
    } // end if open for update
    if(acctype.Contains("N") && !file){
	file = new TFile(FileName,"RECREATE");
    } // end if open a new file
    if(!file) file = new TFile(FileName,"READ");   // default readonly
    if (!file->IsOpen()) {
	cerr << "Can't open " << FileName << " !" << endl;
	return retfil;
    } // end if error opeing file

    // Get AliRun object from file or return if not on file
    if (gAlice) {delete gAlice; gAlice = 0;}
    gAlice = (AliRun*)file->Get("gAlice");
    if (!gAlice) {
	cerr << "AliRun object not found on file "<< FileName << "!" << endl;
	file->Close();  // close file and return error.
	return retfil;
    } // end if !gAlice
    return file;
}
//______________________________________________________________________
void writeAR(TFile * fin, TFile *fou) {
    TDirectory *current = gDirectory;
    TTree *TeOld;
    TTree *TeNew;
    AliHeader *alhe = new AliHeader();
    TeOld = (TTree*)fin->Get("TE");
    TeOld->SetBranchAddress("Header",&alhe);
    TeOld->SetBranchStatus("*",1);
    fou->cd();
    TeNew = TeOld->CloneTree();
    TeNew->Write(0,TObject::kOverwrite);
    gAlice->Write(0,TObject::kOverwrite);
    current->cd();
    delete alhe;
#ifdef DEBUG
    cout << "AliRun object written to file" << endl;
#endif
}
//______________________________________________________________________
Int_t ChangeITSDefaults(TFile *hitfile,AliITS *ITS,TString opt){

    TDatime *ct0 = new TDatime(2002,04,26,00,00,00);
    TDatime ct = hitfile->GetCreationDate();

    if(ct0->GetDate()>ct.GetDate()){
	// For old files, must change SDD noise.
	AliITSresponseSDD *resp1 = (AliITSresponseSDD*)ITS->DetType(1)->
	    GetResponseModel();
	resp1 = new AliITSresponseSDD();
	ITS->SetResponseModel(1,resp1);
	cout << "Changed response class for SDD:" << endl;
	resp1->Print();
    } // end if

    if(opt.Contains("Dubna")){
	AliITSresponseSPDdubna *resp0 = new AliITSresponseSPDdubna();
	if(ITS->DetType(0)->GetResponseModel() !=0){
	    delete ((AliITSresponse*)ITS->DetType(0)->GetResponseModel());
	    ITS->DetType(0)->ResponseModel(0);
	} // end if
	ITS->DetType(0)->ResponseModel(resp0);
	AliITSsegmentationSPD *seg0 = (AliITSsegmentationSPD*)ITS->
	    DetType(0)->GetSegmentationModel();
	AliITSsimulationSPDdubna *sim0 = new AliITSsimulationSPDdubna(seg0,
								      resp0);
	if(ITS->DetType(0)->GetSimulationModel() !=0){
	    delete ((AliITSsimulation*)ITS->DetType(0)->GetSimulationModel());
	    ITS->DetType(0)->SimulationModel(0);
	} // end if
	ITS->DetType(0)->SimulationModel(sim0);
    } // end if Dubna
}
 AliITSMerge.C:1
 AliITSMerge.C:2
 AliITSMerge.C:3
 AliITSMerge.C:4
 AliITSMerge.C:5
 AliITSMerge.C:6
 AliITSMerge.C:7
 AliITSMerge.C:8
 AliITSMerge.C:9
 AliITSMerge.C:10
 AliITSMerge.C:11
 AliITSMerge.C:12
 AliITSMerge.C:13
 AliITSMerge.C:14
 AliITSMerge.C:15
 AliITSMerge.C:16
 AliITSMerge.C:17
 AliITSMerge.C:18
 AliITSMerge.C:19
 AliITSMerge.C:20
 AliITSMerge.C:21
 AliITSMerge.C:22
 AliITSMerge.C:23
 AliITSMerge.C:24
 AliITSMerge.C:25
 AliITSMerge.C:26
 AliITSMerge.C:27
 AliITSMerge.C:28
 AliITSMerge.C:29
 AliITSMerge.C:30
 AliITSMerge.C:31
 AliITSMerge.C:32
 AliITSMerge.C:33
 AliITSMerge.C:34
 AliITSMerge.C:35
 AliITSMerge.C:36
 AliITSMerge.C:37
 AliITSMerge.C:38
 AliITSMerge.C:39
 AliITSMerge.C:40
 AliITSMerge.C:41
 AliITSMerge.C:42
 AliITSMerge.C:43
 AliITSMerge.C:44
 AliITSMerge.C:45
 AliITSMerge.C:46
 AliITSMerge.C:47
 AliITSMerge.C:48
 AliITSMerge.C:49
 AliITSMerge.C:50
 AliITSMerge.C:51
 AliITSMerge.C:52
 AliITSMerge.C:53
 AliITSMerge.C:54
 AliITSMerge.C:55
 AliITSMerge.C:56
 AliITSMerge.C:57
 AliITSMerge.C:58
 AliITSMerge.C:59
 AliITSMerge.C:60
 AliITSMerge.C:61
 AliITSMerge.C:62
 AliITSMerge.C:63
 AliITSMerge.C:64
 AliITSMerge.C:65
 AliITSMerge.C:66
 AliITSMerge.C:67
 AliITSMerge.C:68
 AliITSMerge.C:69
 AliITSMerge.C:70
 AliITSMerge.C:71
 AliITSMerge.C:72
 AliITSMerge.C:73
 AliITSMerge.C:74
 AliITSMerge.C:75
 AliITSMerge.C:76
 AliITSMerge.C:77
 AliITSMerge.C:78
 AliITSMerge.C:79
 AliITSMerge.C:80
 AliITSMerge.C:81
 AliITSMerge.C:82
 AliITSMerge.C:83
 AliITSMerge.C:84
 AliITSMerge.C:85
 AliITSMerge.C:86
 AliITSMerge.C:87
 AliITSMerge.C:88
 AliITSMerge.C:89
 AliITSMerge.C:90
 AliITSMerge.C:91
 AliITSMerge.C:92
 AliITSMerge.C:93
 AliITSMerge.C:94
 AliITSMerge.C:95
 AliITSMerge.C:96
 AliITSMerge.C:97
 AliITSMerge.C:98
 AliITSMerge.C:99
 AliITSMerge.C:100
 AliITSMerge.C:101
 AliITSMerge.C:102
 AliITSMerge.C:103
 AliITSMerge.C:104
 AliITSMerge.C:105
 AliITSMerge.C:106
 AliITSMerge.C:107
 AliITSMerge.C:108
 AliITSMerge.C:109
 AliITSMerge.C:110
 AliITSMerge.C:111
 AliITSMerge.C:112
 AliITSMerge.C:113
 AliITSMerge.C:114
 AliITSMerge.C:115
 AliITSMerge.C:116
 AliITSMerge.C:117
 AliITSMerge.C:118
 AliITSMerge.C:119
 AliITSMerge.C:120
 AliITSMerge.C:121
 AliITSMerge.C:122
 AliITSMerge.C:123
 AliITSMerge.C:124
 AliITSMerge.C:125
 AliITSMerge.C:126
 AliITSMerge.C:127
 AliITSMerge.C:128
 AliITSMerge.C:129
 AliITSMerge.C:130
 AliITSMerge.C:131
 AliITSMerge.C:132
 AliITSMerge.C:133
 AliITSMerge.C:134
 AliITSMerge.C:135
 AliITSMerge.C:136
 AliITSMerge.C:137
 AliITSMerge.C:138
 AliITSMerge.C:139
 AliITSMerge.C:140
 AliITSMerge.C:141
 AliITSMerge.C:142
 AliITSMerge.C:143
 AliITSMerge.C:144
 AliITSMerge.C:145
 AliITSMerge.C:146
 AliITSMerge.C:147
 AliITSMerge.C:148
 AliITSMerge.C:149
 AliITSMerge.C:150
 AliITSMerge.C:151
 AliITSMerge.C:152
 AliITSMerge.C:153
 AliITSMerge.C:154
 AliITSMerge.C:155
 AliITSMerge.C:156
 AliITSMerge.C:157
 AliITSMerge.C:158
 AliITSMerge.C:159
 AliITSMerge.C:160
 AliITSMerge.C:161
 AliITSMerge.C:162
 AliITSMerge.C:163
 AliITSMerge.C:164
 AliITSMerge.C:165
 AliITSMerge.C:166
 AliITSMerge.C:167
 AliITSMerge.C:168
 AliITSMerge.C:169
 AliITSMerge.C:170
 AliITSMerge.C:171
 AliITSMerge.C:172
 AliITSMerge.C:173
 AliITSMerge.C:174
 AliITSMerge.C:175
 AliITSMerge.C:176
 AliITSMerge.C:177
 AliITSMerge.C:178
 AliITSMerge.C:179
 AliITSMerge.C:180
 AliITSMerge.C:181
 AliITSMerge.C:182
 AliITSMerge.C:183
 AliITSMerge.C:184
 AliITSMerge.C:185
 AliITSMerge.C:186
 AliITSMerge.C:187
 AliITSMerge.C:188
 AliITSMerge.C:189
 AliITSMerge.C:190
 AliITSMerge.C:191
 AliITSMerge.C:192
 AliITSMerge.C:193