96{
97 {
98
99 string subdir;
100 for (map<string, map<string, map<int, TH1*>>>::iterator is =
101 m_subdir.begin(); is != m_subdir.end(); ++is) {
102 map<string, map<int, TH1*>>& dirlist = is->second;
103 map<string, TH1*>& mergelist = m_mergedir[is->first];
104
105 gROOT->cd();
106
107
108 subdir = is->first;
109
110
111
112
113
114
115
116
117
118
119 for (map<string, std::map<int, TH1*> >::iterator it = dirlist.begin();
120 it != dirlist.end(); ++it) {
121 string name = it->first;
122 map<int, TH1*>& hmap = it->second;
123 if (mergelist[name] != NULL) {
124 TH1* merge_hist = mergelist[name];
125 merge_hist->Reset();
126
127 }
128
129 for (map<int, TH1*>::iterator ih = hmap.begin(); ih != hmap.end();
130 ++ih) {
131
132 TH1* hist = ih->second;
133
134
135
136 if (mergelist[name] == NULL) {
137
138
139 string newname;
140 if (subdir != "")
141 newname = subdir + "/" + string(hist->GetName());
142 else
143 newname = string(hist->GetName());
144 hist->SetName(newname.c_str());
145 TH1* mhist = (TH1*)hist->Clone();
146 mergelist[name] = mhist;
147
148
149
150 }
151
152 else {
153 TH1* merge_hist = mergelist[name];
154 merge_hist->Add(hist);
155 merge_hist->SetTitle(hist->GetTitle());
156 }
157 }
158 }
159 }
160 }
161 TFile* fh;
162 fh = new TFile(("/dev/shm/tmp_" + m_name).c_str(), "RECREATE");
163 if (fh) {
164 if (!fh->IsOpen()) {
165 printf("HistoManager2 cannot open file : %s\n", ("/dev/shm/tmp_" + m_name).c_str());
166 return false;
167 }
168
169
170 for (map<string, map<string, map<int, TH1*>>>::iterator is =
171 m_subdir.begin(); is != m_subdir.end(); ++is) {
172 map<string, map<int, TH1*>>& dirlist = is->second;
173 map<string, TH1*>& mergelist = m_mergedir[is->first];
174
175 for (map<string, std::map<int, TH1*> >::iterator it = dirlist.begin();
176 it != dirlist.end(); ++it) {
177 string name = it->first;
178 TH1* merge_hist = mergelist[name];
179 if (merge_hist) merge_hist->Write();
180 }
181 }
182 fh->Close();
183 delete fh;
184 }
185
186 if (rename(("/dev/shm/tmp_" + m_name).c_str(), ("/dev/shm/" + m_name).c_str())) {
187 perror("Rename dhm file failed ");
188 return false;
189 }
190
191 return true;
192}